[Mesa-dev] [PATCH 13/16] nir: Fix OpAtomicCounterIDecrement for uniform atomic counters
Timothy Arceri
tarceri at itsqueeze.com
Tue Jul 3 00:28:27 UTC 2018
Thanks.
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
On 03/07/18 00:58, Alejandro Piñeiro wrote:
> From: Antia Puentes <apuentes at igalia.com>
>
> From the SPIR-V 1.0 specification, section 3.32.18, "Atomic
> Instructions":
>
> "OpAtomicIDecrement:
> <skip>
> The instruction's result is the Original Value."
>
> However, we were implementing it, for uniform atomic counters, as a
> pre-decrement operation, as was the one available from GLSL.
>
> Renamed the former nir intrinsic 'atomic_counter_dec*' to
> 'atomic_counter_pre_dec*' for clarification purposes, as it implements
> a pre-decrement operation as specified for GLSL. From GLSL 4.50 spec,
> section 8.10, "Atomic Counter Functions":
>
> "uint atomicCounterDecrement (atomic_uint c)
>
> Atomically
> 1. decrements the counter for c, and
> 2. returns the value resulting from the decrement operation.
>
> These two steps are done atomically with respect to the atomic
> counter functions in this table."
>
> Added a new nir intrinsic 'atomic_counter_post_dec*' which implements
> a post-decrement operation as required by SPIR-V.
>
> v2: (Timothy Arceri)
> * Add extra spec quotes on commit message
> * Use "post" instead "pos" to avoid confusion with "position"
>
> Signed-off-by: Antia Puentes <apuentes at igalia.com>
> Signed-off-by: Alejandro Piñeiro <apinheiro at igalia.com>
> ---
> src/compiler/glsl/gl_nir_lower_atomics.c | 8 ++++++--
> src/compiler/glsl/glsl_to_nir.cpp | 4 ++--
> src/compiler/nir/nir_intrinsics.py | 3 ++-
> src/compiler/nir/nir_lower_atomics_to_ssbo.c | 8 +++++---
> src/compiler/spirv/spirv_to_nir.c | 2 +-
> 5 files changed, 16 insertions(+), 9 deletions(-)
>
> diff --git a/src/compiler/glsl/gl_nir_lower_atomics.c b/src/compiler/glsl/gl_nir_lower_atomics.c
> index 293730966fd..36e273c45d2 100644
> --- a/src/compiler/glsl/gl_nir_lower_atomics.c
> +++ b/src/compiler/glsl/gl_nir_lower_atomics.c
> @@ -53,8 +53,12 @@ lower_deref_instr(nir_builder *b, nir_intrinsic_instr *instr,
> op = nir_intrinsic_atomic_counter_inc;
> break;
>
> - case nir_intrinsic_atomic_counter_dec_deref:
> - op = nir_intrinsic_atomic_counter_dec;
> + case nir_intrinsic_atomic_counter_pre_dec_deref:
> + op = nir_intrinsic_atomic_counter_pre_dec;
> + break;
> +
> + case nir_intrinsic_atomic_counter_post_dec_deref:
> + op = nir_intrinsic_atomic_counter_post_dec;
> break;
>
> case nir_intrinsic_atomic_counter_add_deref:
> diff --git a/src/compiler/glsl/glsl_to_nir.cpp b/src/compiler/glsl/glsl_to_nir.cpp
> index d3a3fb9b085..2d76c7e6cfe 100644
> --- a/src/compiler/glsl/glsl_to_nir.cpp
> +++ b/src/compiler/glsl/glsl_to_nir.cpp
> @@ -630,7 +630,7 @@ nir_visitor::visit(ir_call *ir)
> op = nir_intrinsic_atomic_counter_inc_deref;
> break;
> case ir_intrinsic_atomic_counter_predecrement:
> - op = nir_intrinsic_atomic_counter_dec_deref;
> + op = nir_intrinsic_atomic_counter_pre_dec_deref;
> break;
> case ir_intrinsic_atomic_counter_add:
> op = nir_intrinsic_atomic_counter_add_deref;
> @@ -831,7 +831,7 @@ nir_visitor::visit(ir_call *ir)
> switch (op) {
> case nir_intrinsic_atomic_counter_read_deref:
> case nir_intrinsic_atomic_counter_inc_deref:
> - case nir_intrinsic_atomic_counter_dec_deref:
> + case nir_intrinsic_atomic_counter_pre_dec_deref:
> case nir_intrinsic_atomic_counter_add_deref:
> case nir_intrinsic_atomic_counter_min_deref:
> case nir_intrinsic_atomic_counter_max_deref:
> diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py
> index d9d0bbdfccf..caef6f55d3f 100644
> --- a/src/compiler/nir/nir_intrinsics.py
> +++ b/src/compiler/nir/nir_intrinsics.py
> @@ -270,7 +270,8 @@ def atomic3(name):
> intrinsic(name, src_comp=[1, 1, 1], dest_comp=1, indices=[BASE])
>
> atomic("atomic_counter_inc")
> -atomic("atomic_counter_dec")
> +atomic("atomic_counter_pre_dec")
> +atomic("atomic_counter_post_dec")
> atomic("atomic_counter_read", flags=[CAN_ELIMINATE])
> atomic2("atomic_counter_add")
> atomic2("atomic_counter_min")
> diff --git a/src/compiler/nir/nir_lower_atomics_to_ssbo.c b/src/compiler/nir/nir_lower_atomics_to_ssbo.c
> index 934ae81d750..6ebd3632288 100644
> --- a/src/compiler/nir/nir_lower_atomics_to_ssbo.c
> +++ b/src/compiler/nir/nir_lower_atomics_to_ssbo.c
> @@ -71,7 +71,8 @@ lower_instr(nir_intrinsic_instr *instr, unsigned ssbo_offset, nir_builder *b)
> return true;
> case nir_intrinsic_atomic_counter_inc:
> case nir_intrinsic_atomic_counter_add:
> - case nir_intrinsic_atomic_counter_dec:
> + case nir_intrinsic_atomic_counter_pre_dec:
> + case nir_intrinsic_atomic_counter_post_dec:
> /* inc and dec get remapped to add: */
> op = nir_intrinsic_ssbo_atomic_add;
> break;
> @@ -119,7 +120,8 @@ lower_instr(nir_intrinsic_instr *instr, unsigned ssbo_offset, nir_builder *b)
> nir_src_copy(&new_instr->src[1], &instr->src[0], new_instr);
> new_instr->src[2] = nir_src_for_ssa(temp);
> break;
> - case nir_intrinsic_atomic_counter_dec:
> + case nir_intrinsic_atomic_counter_pre_dec:
> + case nir_intrinsic_atomic_counter_post_dec:
> /* remapped to ssbo_atomic_add: { buffer_idx, offset, -1 } */
> /* NOTE semantic difference so we adjust the return value below */
> temp = nir_imm_int(b, -1);
> @@ -148,7 +150,7 @@ lower_instr(nir_intrinsic_instr *instr, unsigned ssbo_offset, nir_builder *b)
> nir_instr_insert_before(&instr->instr, &new_instr->instr);
> nir_instr_remove(&instr->instr);
>
> - if (instr->intrinsic == nir_intrinsic_atomic_counter_dec) {
> + if (instr->intrinsic == nir_intrinsic_atomic_counter_pre_dec) {
> b->cursor = nir_after_instr(&new_instr->instr);
> nir_ssa_def *result = nir_iadd(b, &new_instr->dest.ssa, temp);
> nir_ssa_def_rewrite_uses(&instr->dest.ssa, nir_src_for_ssa(result));
> diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
> index 9d2f57cef94..fb4211193fb 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -2519,7 +2519,7 @@ get_uniform_nir_atomic_op(struct vtn_builder *b, SpvOp opcode)
> OP(AtomicExchange, exchange)
> OP(AtomicCompareExchange, comp_swap)
> OP(AtomicIIncrement, inc_deref)
> - OP(AtomicIDecrement, dec_deref)
> + OP(AtomicIDecrement, post_dec_deref)
> OP(AtomicIAdd, add_deref)
> OP(AtomicISub, add_deref)
> OP(AtomicUMin, min_deref)
>
More information about the mesa-dev
mailing list