From 34e1ccbfbe851ecf4ebbfc86d70da384d176d994 Mon Sep 17 00:00:00 2001 From: Ben Widawsky Date: Tue, 30 May 2017 17:23:58 +0530 Subject: [PATCH] i965/miptree: Allocate mt earlier in update winsys Later commits require intel_update_image_buffer() to have control over the miptree creation. However, intel_update_winsys_renderbuffer_miptree() currently creates it based on the given buffer object. This patch moves the creation to the caller side. Signed-off-by: Ben Widawsky Acked-by: Daniel Stone Reviewed-by: Jason Ekstrand Reviewed-by: Topi Pohjolainen Reviewed-by: Chad Versace --- src/mesa/drivers/dri/i965/brw_context.c | 37 ++++++++++++++++++++++++--- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 16 ++---------- src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 2 +- 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index 9d108fe..c1a429b 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1504,10 +1504,26 @@ 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; } @@ -1565,10 +1581,25 @@ intel_update_image_buffer(struct brw_context *intel, if (last_mt && last_mt->bo == buffer->bo) return; - if (!intel_update_winsys_renderbuffer_miptree(intel, rb, buffer->bo, + struct intel_mipmap_tree *mt = + intel_miptree_create_for_bo(intel, + buffer->bo, + intel_rb_format(rb), + 0, + buffer->width, + buffer->height, + 1, + buffer->pitch, + MIPTREE_LAYOUT_FOR_SCANOUT); + if (!mt) + return; + + 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_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index c018c7f..f1ac074 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -1115,11 +1115,10 @@ intel_miptree_create_for_dri_image(struct brw_context *brw, 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; @@ -1131,17 +1130,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); - if (!singlesample_mt) - goto fail; + assert(singlesample_mt); if (num_samples == 0) { intel_miptree_release(&irb->mt); @@ -1171,7 +1160,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 c588f25..4cc5c35 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h @@ -694,7 +694,7 @@ intel_miptree_create_for_dri_image(struct brw_context *brw, 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.7.4