summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Ekstrand <jason@jlekstrand.net>2020-03-05 17:17:40 -0600
committerEric Engestrom <eric@engestrom.ch>2020-03-06 22:59:46 +0100
commitee7a114d189416ca23c70937469d20b186346910 (patch)
treec362e980fedef5eeb51f072923325413d3352e3f
parentcecfe9b844f8f6ee6f4e26f41aad32f36d8e083f (diff)
iris: Don't skip fast depth clears if the color changed
We depend on BLORP to convert the clear color and write it into the clear color buffer for us. However, we weren't bothering to call blorp in the case where the state is ISL_AUX_STATE_CLEAR. This leads to the clear color not getting properly updated if we have back-to-back clears with different clear colors. Technically, we could go out of our way to set the clear color directly from iris in this case but this is a case we're unlikely to see in the wild so let's not bother. This matches what we already do for color surfaces. Cc: mesa-stable@lists.freedesktop.org Reported-by: Mark Janes <mark.a.janes@intel.com> Reviewed-by: Nanley Chery <nanley.g.chery@intel.com> Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4073> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4073> (cherry picked from commit 9d07d598423e4015bbc7beb7a2fdc4c657d5e0cf)
-rw-r--r--.pick_status.json2
-rw-r--r--src/gallium/drivers/iris/iris_clear.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/.pick_status.json b/.pick_status.json
index 219cfa51394..fe72a865d6e 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -175,7 +175,7 @@
"description": "iris: Don't skip fast depth clears if the color changed",
"nominated": true,
"nomination_type": 0,
- "resolution": 0,
+ "resolution": 1,
"master_sha": null,
"because_sha": null
},
diff --git a/src/gallium/drivers/iris/iris_clear.c b/src/gallium/drivers/iris/iris_clear.c
index 58c219e9af3..30a91ad0dcf 100644
--- a/src/gallium/drivers/iris/iris_clear.c
+++ b/src/gallium/drivers/iris/iris_clear.c
@@ -521,7 +521,11 @@ fast_clear_depth(struct iris_context *ice,
for (unsigned l = 0; l < box->depth; l++) {
enum isl_aux_state aux_state =
iris_resource_get_aux_state(res, level, box->z + l);
- if (aux_state != ISL_AUX_STATE_CLEAR) {
+ if (update_clear_depth || aux_state != ISL_AUX_STATE_CLEAR) {
+ if (aux_state == ISL_AUX_STATE_CLEAR) {
+ perf_debug(&ice->dbg, "Performing HiZ clear just to update the "
+ "depth clear value\n");
+ }
iris_hiz_exec(ice, batch, res, level,
box->z + l, 1, ISL_AUX_OP_FAST_CLEAR,
update_clear_depth);