Mesa (main): ir3: Force late-z if FS has global store/atomic

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 1 17:08:28 UTC 2022


Module: Mesa
Branch: main
Commit: 79e266fffc919bf9ef6ee0df71b6d02dbc873adc
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=79e266fffc919bf9ef6ee0df71b6d02dbc873adc

Author: Danylo Piliaiev <dpiliaiev at igalia.com>
Date:   Wed Jun  1 18:32:27 2022 +0300

ir3: Force late-z if FS has global store/atomic

No known tests are fixed.

Signed-off-by: Danylo Piliaiev <dpiliaiev at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16816>

---

 src/freedreno/ir3/ir3_compiler_nir.c | 26 ++++++++++++++------------
 1 file changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c
index 23dc383828c..507606b2af4 100644
--- a/src/freedreno/ir3/ir3_compiler_nir.c
+++ b/src/freedreno/ir3/ir3_compiler_nir.c
@@ -2026,6 +2026,14 @@ emit_intrinsic_reduce(struct ir3_context *ctx, nir_intrinsic_instr *intr)
 static void setup_input(struct ir3_context *ctx, nir_intrinsic_instr *intr);
 static void setup_output(struct ir3_context *ctx, nir_intrinsic_instr *intr);
 
+static void
+switch_to_late_z_if_fs(struct ir3_context *ctx)
+{
+   if ((ctx->so->type == MESA_SHADER_FRAGMENT) &&
+       !ctx->s->info.fs.early_fragment_tests)
+      ctx->so->no_earlyz = true;
+}
+
 static void
 emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
 {
@@ -2142,6 +2150,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
       break;
 
    case nir_intrinsic_store_global_ir3:
+      switch_to_late_z_if_fs(ctx);
       ctx->funcs->emit_intrinsic_store_global_ir3(ctx, intr);
       break;
    case nir_intrinsic_load_global_ir3:
@@ -2200,9 +2209,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
       emit_intrinsic_load_ssbo(ctx, intr, dst);
       break;
    case nir_intrinsic_store_ssbo_ir3:
-      if ((ctx->so->type == MESA_SHADER_FRAGMENT) &&
-          !ctx->s->info.fs.early_fragment_tests)
-         ctx->so->no_earlyz = true;
+      switch_to_late_z_if_fs(ctx);
       ctx->funcs->emit_intrinsic_store_ssbo(ctx, intr);
       break;
    case nir_intrinsic_get_ssbo_size:
@@ -2218,9 +2225,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
    case nir_intrinsic_ssbo_atomic_xor_ir3:
    case nir_intrinsic_ssbo_atomic_exchange_ir3:
    case nir_intrinsic_ssbo_atomic_comp_swap_ir3:
-      if ((ctx->so->type == MESA_SHADER_FRAGMENT) &&
-          !ctx->s->info.fs.early_fragment_tests)
-         ctx->so->no_earlyz = true;
+      switch_to_late_z_if_fs(ctx);
       dst[0] = ctx->funcs->emit_intrinsic_atomic_ssbo(ctx, intr);
       break;
    case nir_intrinsic_load_shared:
@@ -2253,9 +2258,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
       break;
    case nir_intrinsic_image_store:
    case nir_intrinsic_bindless_image_store:
-      if ((ctx->so->type == MESA_SHADER_FRAGMENT) &&
-          !ctx->s->info.fs.early_fragment_tests)
-         ctx->so->no_earlyz = true;
+      switch_to_late_z_if_fs(ctx);
       ctx->funcs->emit_intrinsic_store_image(ctx, intr);
       break;
    case nir_intrinsic_image_size:
@@ -2282,9 +2285,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
    case nir_intrinsic_bindless_image_atomic_exchange:
    case nir_intrinsic_image_atomic_comp_swap:
    case nir_intrinsic_bindless_image_atomic_comp_swap:
-      if ((ctx->so->type == MESA_SHADER_FRAGMENT) &&
-          !ctx->s->info.fs.early_fragment_tests)
-         ctx->so->no_earlyz = true;
+      switch_to_late_z_if_fs(ctx);
       dst[0] = ctx->funcs->emit_intrinsic_atomic_image(ctx, intr);
       break;
    case nir_intrinsic_scoped_barrier:
@@ -2630,6 +2631,7 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr)
    case nir_intrinsic_global_atomic_xor_ir3:
    case nir_intrinsic_global_atomic_exchange_ir3:
    case nir_intrinsic_global_atomic_comp_swap_ir3: {
+      switch_to_late_z_if_fs(ctx);
       dst[0] = ctx->funcs->emit_intrinsic_atomic_global(ctx, intr);
       break;
    }



More information about the mesa-commit mailing list