From 3b642f74567ce87c68e4a891d78c669b54691d49 Mon Sep 17 00:00:00 2001 From: Nanley Chery Date: Thu, 2 Oct 2025 14:34:57 -0400 Subject: [PATCH] iris: Set missing flags on clear color changes When changing the clear color without a fast clear, use dirty bits to ensure that surfaces with inline clear colors are updated and that partial resolves are done as needed. Remove the flags at the bottom of fast_clear_color() as blorp_fast_clear() already sets them for us. Fixes: 64d861b700e ("iris: Skip some fast-clears even on color changes") Reviewed-by: Jianxun Zhang Part-of: --- src/gallium/drivers/iris/iris_clear.c | 28 +++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/iris/iris_clear.c b/src/gallium/drivers/iris/iris_clear.c index 1d138fa3585..5bd47ab0089 100644 --- a/src/gallium/drivers/iris/iris_clear.c +++ b/src/gallium/drivers/iris/iris_clear.c @@ -383,9 +383,28 @@ fast_clear_color(struct iris_context *ice, PIPE_CONTROL_RENDER_TARGET_FLUSH); } - /* Update the clear color now that previous rendering is complete. */ - if (color_changed && res->aux.clear_color_bo) - iris_resource_update_indirect_color(batch, res); + if (color_changed) { + if (devinfo->ver <= 12) { + /* A new clear color may require partial resolves later on. */ + ice->state.dirty |= IRIS_DIRTY_RENDER_RESOLVES_AND_FLUSHES | + IRIS_DIRTY_COMPUTE_RESOLVES_AND_FLUSHES; + ice->state.stage_dirty |= IRIS_ALL_STAGE_DIRTY_BINDINGS; + } + + if (devinfo->ver >= 20) { + /* The clear pixel is updated by hardware during fast clears. */ + assert(batch->screen->isl_dev.ss.clear_color_state_size == 0); + assert(batch->screen->isl_dev.ss.clear_value_size == 0); + } else if (devinfo->ver >= 11) { + /* Update dwords used for rendering and sampling. */ + assert(batch->screen->isl_dev.ss.clear_color_state_size > 0); + iris_resource_update_indirect_color(batch, res); + } else { + /* We've flagged surface states with inline clear colors as dirty. */ + assert(batch->screen->isl_dev.ss.clear_value_size > 0); + assert(ice->state.stage_dirty & IRIS_ALL_STAGE_DIRTY_BINDINGS); + } + } /* If the buffer is already in ISL_AUX_STATE_CLEAR, the clear is redundant * and can be skipped. @@ -468,9 +487,6 @@ fast_clear_color(struct iris_context *ice, box->depth, devinfo->ver < 20 ? ISL_AUX_STATE_CLEAR : ISL_AUX_STATE_COMPRESSED_NO_CLEAR); - ice->state.dirty |= IRIS_DIRTY_RENDER_BUFFER; - ice->state.stage_dirty |= IRIS_ALL_STAGE_DIRTY_BINDINGS; - return; } static void