From: Ben Widawsky <b...@bwidawsk.net> Allows us to continue utilizing common miptree creation using __DRIimage without creating a new DRIimage (for the intel_process_dri2_buffer() case).
This is a bit ugly, but I think it's the best one can do. v2: This patch let's us remove the temporary no_aux variable since mt allocation should work correctly now. Unref the BO is miptree creation fails (Jason) v3: Rebase (Daniel) Cc: Jason Ekstrand <ja...@jlekstrand.net> Signed-off-by: Ben Widawsky <b...@bwidawsk.net> Acked-by: Daniel Stone <dani...@collabora.com> Signed-off-by: Daniel Stone <dani...@collabora.com> --- src/mesa/drivers/dri/i965/brw_context.c | 31 ++++++++++++++++++++++----- src/mesa/drivers/dri/i965/intel_fbo.h | 7 ------ src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 17 ++------------- src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 2 +- 4 files changed, 29 insertions(+), 28 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 4c94b99a11..d7e30cdc92 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1667,10 +1667,25 @@ intel_process_dri2_buffer(struct brw_context *brw, return; } - if (!intel_update_winsys_renderbuffer_miptree(brw, rb, bo, + struct intel_mipmap_tree *mt = intel_miptree_create_for_bo(brw, + bo, + intel_rb_format(rb), + 0, + drawable->w, + drawable->h, + 1, + buffer->pitch, + MIPTREE_LAYOUT_FOR_SCANOUT); + if (!mt) { + brw_bo_unreference(bo); + return; + } + + if (!intel_update_winsys_renderbuffer_miptree(brw, rb, mt, drawable->w, drawable->h, buffer->pitch)) { brw_bo_unreference(bo); + intel_miptree_release(&mt); return; } @@ -1728,13 +1743,19 @@ intel_update_image_buffer(struct brw_context *intel, if (last_mt && last_mt->bo == buffer->bo) return; - if (!buffer->aux_offset) - rb->no_aux = true; + struct intel_mipmap_tree *mt = intel_miptree_create_for_image(intel, + buffer, intel_rb_format(rb), 0, + buffer->width, buffer->height, + buffer->pitch, MIPTREE_LAYOUT_FOR_SCANOUT); + if (!mt) + return; - if (!intel_update_winsys_renderbuffer_miptree(intel, rb, buffer->bo, + if (!intel_update_winsys_renderbuffer_miptree(intel, rb, mt, buffer->width, buffer->height, - buffer->pitch)) + buffer->pitch)) { + intel_miptree_release(&mt); return; + } if (_mesa_is_front_buffer_drawing(fb) && buffer_type == __DRI_IMAGE_BUFFER_FRONT && diff --git a/src/mesa/drivers/dri/i965/intel_fbo.h b/src/mesa/drivers/dri/i965/intel_fbo.h index 7fd95bb816..2d2ef1ebc6 100644 --- a/src/mesa/drivers/dri/i965/intel_fbo.h +++ b/src/mesa/drivers/dri/i965/intel_fbo.h @@ -111,13 +111,6 @@ struct intel_renderbuffer * for the duration of a mapping. */ bool singlesample_mt_is_tmp; - - /** - * Set to true if this buffer definitely does not have auxiliary data, like - * CCS, associated with it. It's generally to be used when importing a - * DRIimage, where that DRIimage had no modifier. - */ - bool no_aux; }; diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index dff992c90f..0a3b6e2fa1 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -875,11 +875,10 @@ intel_miptree_create_for_image(struct brw_context *intel, bool intel_update_winsys_renderbuffer_miptree(struct brw_context *intel, struct intel_renderbuffer *irb, - struct brw_bo *bo, + struct intel_mipmap_tree *singlesample_mt, uint32_t width, uint32_t height, uint32_t pitch) { - struct intel_mipmap_tree *singlesample_mt = NULL; struct intel_mipmap_tree *multisample_mt = NULL; struct gl_renderbuffer *rb = &irb->Base.Base; mesa_format format = rb->Format; @@ -891,18 +890,7 @@ intel_update_winsys_renderbuffer_miptree(struct brw_context *intel, assert(_mesa_get_format_base_format(format) == GL_RGB || _mesa_get_format_base_format(format) == GL_RGBA); - singlesample_mt = intel_miptree_create_for_bo(intel, - bo, - format, - 0, - width, - height, - 1, - pitch, - MIPTREE_LAYOUT_FOR_SCANOUT | - irb->no_aux ? MIPTREE_LAYOUT_DISABLE_AUX: 0); - if (!singlesample_mt) - goto fail; + assert(singlesample_mt); /* If this miptree is not capable of supporting fast color clears, flag * mcs allocation disabled. @@ -942,7 +930,6 @@ intel_update_winsys_renderbuffer_miptree(struct brw_context *intel, return true; fail: - intel_miptree_release(&irb->singlesample_mt); intel_miptree_release(&irb->mt); return false; } diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h index 35dc56e7db..a5efe5e288 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h @@ -755,7 +755,7 @@ intel_miptree_create_for_image(struct brw_context *intel, bool intel_update_winsys_renderbuffer_miptree(struct brw_context *intel, struct intel_renderbuffer *irb, - struct brw_bo *bo, + struct intel_mipmap_tree *singlesample_mt, uint32_t width, uint32_t height, uint32_t pitch); -- 2.13.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev