From 816f2dc67da72be8993e724aeda4c2ec2f5a2978 Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Mon, 30 Apr 2018 10:40:18 -0700 Subject: [PATCH] i965/miptree: Fix handling of uninitialized MCS buffers MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Before this patch, if we failed to initialize an MCS buffer, we'd end up in a state in which the miptree thinks it has an MCS buffer, but doesn't. We also leaked the clear_color_bo if it existed. With this patch, we now free the miptree aux buffer resources and let intel_miptree_alloc_mcs() know that the MCS buffer no longer exists. Cc: Reviewed-by: Tapani Pälli Reviewed-by: Jason Ekstrand --- src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 67086ee6c0e..dd851ff9b5c 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -1655,7 +1655,7 @@ intel_miptree_copy_teximage(struct brw_context *brw, intel_obj->needs_validate = true; } -static void +static bool intel_miptree_init_mcs(struct brw_context *brw, struct intel_mipmap_tree *mt, int init_value) @@ -1675,13 +1675,14 @@ intel_miptree_init_mcs(struct brw_context *brw, void *map = brw_bo_map(brw, mt->aux_buf->bo, MAP_WRITE | MAP_RAW); if (unlikely(map == NULL)) { fprintf(stderr, "Failed to map mcs buffer into GTT\n"); - brw_bo_unreference(mt->aux_buf->bo); - free(mt->aux_buf); - return; + intel_miptree_aux_buffer_free(mt->aux_buf); + mt->aux_buf = NULL; + return false; } void *data = map; memset(data, init_value, mt->aux_buf->surf.size); brw_bo_unmap(mt->aux_buf->bo); + return true; } static struct intel_miptree_aux_buffer * @@ -1759,15 +1760,14 @@ intel_miptree_alloc_mcs(struct brw_context *brw, const uint32_t alloc_flags = 0; mt->aux_buf = intel_alloc_aux_buffer(brw, "mcs-miptree", &temp_mcs_surf, alloc_flags, mt); - if (!mt->aux_buf) { + if (!mt->aux_buf || + !intel_miptree_init_mcs(brw, mt, 0xFF)) { free(aux_state); return false; } mt->aux_state = aux_state; - intel_miptree_init_mcs(brw, mt, 0xFF); - return true; } -- 2.30.2