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 <topi.pohjolainen@intel.com> Reviewed-by: Daniel Stone <daniels@collabora.com> Reviewed-by: Chad Versace <chadversary@chromium.org>
This commit is contained in:
parent
400ffa748e
commit
e97f4b7480
|
@ -1592,8 +1592,10 @@ intel_update_image_buffer(struct brw_context *intel,
|
||||||
else
|
else
|
||||||
last_mt = rb->singlesample_mt;
|
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;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
enum isl_colorspace colorspace;
|
enum isl_colorspace colorspace;
|
||||||
switch (_mesa_get_format_color_encoding(intel_rb_format(rb))) {
|
switch (_mesa_get_format_color_encoding(intel_rb_format(rb))) {
|
||||||
|
|
|
@ -2820,6 +2820,25 @@ intel_miptree_prepare_external(struct brw_context *brw,
|
||||||
aux_usage, supports_fast_clear);
|
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
|
* Make it possible to share the BO backing the given miptree with another
|
||||||
* process or another miptree.
|
* process or another miptree.
|
||||||
|
|
|
@ -674,6 +674,9 @@ intel_miptree_finish_depth(struct brw_context *brw,
|
||||||
void
|
void
|
||||||
intel_miptree_prepare_external(struct brw_context *brw,
|
intel_miptree_prepare_external(struct brw_context *brw,
|
||||||
struct intel_mipmap_tree *mt);
|
struct intel_mipmap_tree *mt);
|
||||||
|
void
|
||||||
|
intel_miptree_finish_external(struct brw_context *brw,
|
||||||
|
struct intel_mipmap_tree *mt);
|
||||||
|
|
||||||
void
|
void
|
||||||
intel_miptree_make_shareable(struct brw_context *brw,
|
intel_miptree_make_shareable(struct brw_context *brw,
|
||||||
|
|
Loading…
Reference in New Issue