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; }