nir/opt_move_discards_to_top: don't schedule discard/demote across subgroup operations

Fixes: b447f5049b ('nir: Add a discard optimization pass')
Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18249>
(cherry picked from commit d434a127f9)
This commit is contained in:
Daniel Schürmann
2022-08-24 18:05:32 +02:00
committed by Eric Engestrom
parent 884ca57174
commit e7dd2637a5
2 changed files with 41 additions and 4 deletions

View File

@@ -444,7 +444,7 @@
"description": "nir/opt_move_discards_to_top: don't schedule discard/demote across subgroup operations",
"nominated": true,
"nomination_type": 1,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": "b447f5049b6d68fd80b7337bc1f7c79b1b1a4765",
"notes": null

View File

@@ -165,10 +165,47 @@ opt_move_discards_to_top_impl(nir_function_impl *impl)
instr->pass_flags = STOP_PROCESSING_INSTR_FLAG;
goto break_all;
}
if ((intrin->intrinsic == nir_intrinsic_discard_if && consider_discards) ||
intrin->intrinsic == nir_intrinsic_demote_if)
switch (intrin->intrinsic) {
case nir_intrinsic_quad_broadcast:
case nir_intrinsic_quad_swap_horizontal:
case nir_intrinsic_quad_swap_vertical:
case nir_intrinsic_quad_swap_diagonal:
case nir_intrinsic_quad_swizzle_amd:
consider_discards = false;
break;
case nir_intrinsic_vote_any:
case nir_intrinsic_vote_all:
case nir_intrinsic_vote_feq:
case nir_intrinsic_vote_ieq:
case nir_intrinsic_ballot:
case nir_intrinsic_first_invocation:
case nir_intrinsic_read_invocation:
case nir_intrinsic_read_first_invocation:
case nir_intrinsic_elect:
case nir_intrinsic_reduce:
case nir_intrinsic_inclusive_scan:
case nir_intrinsic_exclusive_scan:
case nir_intrinsic_shuffle:
case nir_intrinsic_shuffle_xor:
case nir_intrinsic_shuffle_up:
case nir_intrinsic_shuffle_down:
case nir_intrinsic_rotate:
case nir_intrinsic_masked_swizzle_amd:
instr->pass_flags = STOP_PROCESSING_INSTR_FLAG;
goto break_all;
case nir_intrinsic_discard_if:
if (!consider_discards) {
/* assume that a shader either uses discard or demote, but not both */
instr->pass_flags = STOP_PROCESSING_INSTR_FLAG;
goto break_all;
}
FALLTHROUGH;
case nir_intrinsic_demote_if:
moved = moved || try_move_discard(intrin);
break;
default:
break;
}
continue;
}