nir: add ballot_relaxed and as_uniform intrinsics

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27116>
This commit is contained in:
Georg Lehmann 2024-01-17 12:03:41 +01:00 committed by Marge Bot
parent fc9ffb90fd
commit 1cb5bf7009
3 changed files with 11 additions and 0 deletions

View file

@ -93,6 +93,8 @@ visit_intrinsic(nir_shader *shader, nir_intrinsic_instr *instr)
/* Intrinsics which are always uniform */
case nir_intrinsic_shader_clock:
case nir_intrinsic_ballot:
case nir_intrinsic_ballot_relaxed:
case nir_intrinsic_as_uniform:
case nir_intrinsic_read_invocation:
case nir_intrinsic_read_first_invocation:
case nir_intrinsic_vote_any:

View file

@ -446,6 +446,14 @@ intrinsic("ballot", src_comp=[1], dest_comp=0, flags=[CAN_ELIMINATE])
intrinsic("read_invocation", src_comp=[0, 1], dest_comp=0, bit_sizes=src0, flags=[CAN_ELIMINATE])
intrinsic("read_first_invocation", src_comp=[0], dest_comp=0, bit_sizes=src0, flags=[CAN_ELIMINATE])
# Same as ballot, but inactive invocations contribute undefined bits.
intrinsic("ballot_relaxed", src_comp=[1], dest_comp=0, flags=[CAN_ELIMINATE])
# Allows the backend compiler to move this value to an uniform register.
# Result is undefined if src is not uniform.
# Unlike read_first_invocation, it may be replaced by a divergent move or CSE'd.
intrinsic("as_uniform", src_comp=[0], dest_comp=0, bit_sizes=src0, flags=[CAN_ELIMINATE])
# Returns the value of the first source for the lane where the second source is
# true. The second source must be true for exactly one lane.
intrinsic("read_invocation_cond_ir3", src_comp=[0, 1], dest_comp=0, flags=[CAN_ELIMINATE])

View file

@ -258,6 +258,7 @@ try_fold_intrinsic(nir_builder *b, nir_intrinsic_instr *intrin,
case nir_intrinsic_vote_all:
case nir_intrinsic_read_invocation:
case nir_intrinsic_read_first_invocation:
case nir_intrinsic_as_uniform:
case nir_intrinsic_shuffle:
case nir_intrinsic_shuffle_xor:
case nir_intrinsic_shuffle_up: