diff options
author | Nanley Chery <nanley.g.chery@intel.com> | 2020-09-29 05:49:54 -0700 |
---|---|---|
committer | Eric Engestrom <eric@engestrom.ch> | 2020-10-14 19:29:30 +0200 |
commit | 93447c7381ac6ea6be951feb2b91ff3290301fa4 (patch) | |
tree | e77c889a396f2b4293561bb0156bcf041084ed99 | |
parent | fe747abc7c799cee752de9cf007266c26ec26644 (diff) |
iris: Fix a fast-clear skipping optimization
When support for multi-slice fast-clears was introduced for color
surfaces, an existing optimization for skipping fast-clears was not
updated (this optimization assumed single-slice fast-clears). As a
result, the driver began to skip multi-layer fast-clears if just the
first slice was in the CLEAR state (ignoring the state of the others).
A Civilization VI trace was the only workload I found to make use of
this optimization and it did so for 2D, non-array textures. Therefore,
this fix simply checks that the depth of the clear box is 1. It also
moves the single-slice aux-state query closer to the optimization to
clarify the need for the depth check.
Enables iris to pass a case of the fcc-write-after-clear piglit test,
[fast-clear tracking across layers 0 -> 1 -> (0,1)].
Fixes: 393f659ed83 ("iris: Enable fast clears on other miplevels and layers than 0.")
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6973>
(cherry picked from commit 3f3a5f3489f5df6061ea8e74e697287bbbb4e252)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/gallium/drivers/iris/iris_clear.c | 6 |
2 files changed, 4 insertions, 4 deletions
diff --git a/.pick_status.json b/.pick_status.json index 32aa971e72c..ad4812f2295 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -8194,7 +8194,7 @@ "description": "iris: Fix a fast-clear skipping optimization", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "393f659ed83abfc67d2a57ca1d962d53b22ec03f" }, diff --git a/src/gallium/drivers/iris/iris_clear.c b/src/gallium/drivers/iris/iris_clear.c index 6f8636c0fb5..449416a5172 100644 --- a/src/gallium/drivers/iris/iris_clear.c +++ b/src/gallium/drivers/iris/iris_clear.c @@ -197,8 +197,6 @@ fast_clear_color(struct iris_context *ice, { struct iris_batch *batch = &ice->batches[IRIS_BATCH_RENDER]; struct pipe_resource *p_res = (void *) res; - const enum isl_aux_state aux_state = - iris_resource_get_aux_state(res, level, box->z); color = convert_fast_clear_color(ice, res, format, color); @@ -277,7 +275,9 @@ fast_clear_color(struct iris_context *ice, /* If the buffer is already in ISL_AUX_STATE_CLEAR, and the color hasn't * changed, the clear is redundant and can be skipped. */ - if (!color_changed && aux_state == ISL_AUX_STATE_CLEAR) + const enum isl_aux_state aux_state = + iris_resource_get_aux_state(res, level, box->z); + if (!color_changed && box->depth == 1 && aux_state == ISL_AUX_STATE_CLEAR) return; /* Ivybrigde PRM Vol 2, Part 1, "11.7 MCS Buffer for Render Target(s)": |