diff options
author | Jason Ekstrand <[email protected]> | 2017-09-12 15:24:40 -0700 |
---|---|---|
committer | Jason Ekstrand <[email protected]> | 2017-09-18 12:16:50 -0700 |
commit | e97f4b748094466567c7f3bad1a02ecee13db9c8 (patch) | |
tree | 316bab5c566a7be5c2366ce819bcf8a22938c760 | |
parent | 400ffa748ec95bc8733f92084818cd073193669a (diff) |
i965: Reset miptree aux state on update_image_buffer
When we get a miptree in through glxBindImageEXT, we don't know the
current aux state so we have to assume the worst-case. If the image
gets recreated, everything is fine because miptreecreate_for_dri_image
sets it to the default. However, if our miptree is recycled, then we
may have stale aux_usage and we need to reset to the default otherwise
our aux_state tracking will get messed up.
Reviewed-by: Topi Pohjolainen <[email protected]>
Reviewed-by: Daniel Stone <[email protected]>
Reviewed-by: Chad Versace <[email protected]>
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_mipmap_tree.c | 19 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_mipmap_tree.h | 3 |
3 files changed, 25 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index ee1badd94b3..9cb16f3fb16 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -1592,8 +1592,10 @@ intel_update_image_buffer(struct brw_context *intel, else last_mt = rb->singlesample_mt; - if (last_mt && last_mt->bo == buffer->bo) + if (last_mt && last_mt->bo == buffer->bo) { + intel_miptree_finish_external(intel, last_mt); return; + } enum isl_colorspace colorspace; switch (_mesa_get_format_color_encoding(intel_rb_format(rb))) { diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c index 5b7cde82f65..5740f031c49 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.c @@ -2820,6 +2820,25 @@ intel_miptree_prepare_external(struct brw_context *brw, aux_usage, supports_fast_clear); } +void +intel_miptree_finish_external(struct brw_context *brw, + struct intel_mipmap_tree *mt) +{ + if (!mt->mcs_buf) + return; + + /* We just got this image in from the window system via glxBindTexImageEXT + * or similar and have no idea what the actual aux state is other than that + * we aren't in AUX_INVALID. Reset the aux state to the default for the + * image's modifier. + */ + enum isl_aux_state default_aux_state = + isl_drm_modifier_get_default_aux_state(mt->drm_modifier); + assert(mt->last_level == mt->first_level); + intel_miptree_set_aux_state(brw, mt, 0, 0, INTEL_REMAINING_LAYERS, + default_aux_state); +} + /** * Make it possible to share the BO backing the given miptree with another * process or another miptree. diff --git a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h index 2fce28c524b..08aa9a7b3b2 100644 --- a/src/mesa/drivers/dri/i965/intel_mipmap_tree.h +++ b/src/mesa/drivers/dri/i965/intel_mipmap_tree.h @@ -674,6 +674,9 @@ intel_miptree_finish_depth(struct brw_context *brw, void intel_miptree_prepare_external(struct brw_context *brw, struct intel_mipmap_tree *mt); +void +intel_miptree_finish_external(struct brw_context *brw, + struct intel_mipmap_tree *mt); void intel_miptree_make_shareable(struct brw_context *brw, |