LGTM. Reviewed-by: Jason Ekstrand <[email protected]>
Maybe we should consider making the orders of arguments a bit more consistent for a few functions so that we can use fill_common_atomic_sources for load and store too. --Jason On Wed, Sep 7, 2016 at 3:10 AM, Lionel Landwerlin <[email protected]> wrote: > Missing bits from 2afb950161f847d9b0a7be03dfb62cacc5ea51ba. > > Signed-off-by: Lionel Landwerlin <[email protected]> > Cc: Jason Ekstrand <[email protected]> > --- > src/compiler/spirv/spirv_to_nir.c | 35 ++++++++++++++++++++++++++++++ > ++++- > 1 file changed, 34 insertions(+), 1 deletion(-) > > diff --git a/src/compiler/spirv/spirv_to_nir.c > b/src/compiler/spirv/spirv_to_nir.c > index 4d88fdb..f1cd4be 100644 > --- a/src/compiler/spirv/spirv_to_nir.c > +++ b/src/compiler/spirv/spirv_to_nir.c > @@ -1920,11 +1920,44 @@ vtn_handle_ssbo_or_shared_atomic(struct > vtn_builder *b, SpvOp opcode, > */ > > if (chain->var->mode == vtn_variable_mode_workgroup) { > + struct vtn_type *type = chain->var->type; > nir_deref *deref = &vtn_access_chain_to_deref(b, chain)->deref; > nir_intrinsic_op op = get_shared_nir_atomic_op(opcode); > atomic = nir_intrinsic_instr_create(b->nb.shader, op); > atomic->variables[0] = nir_deref_as_var(nir_copy_deref(atomic, > deref)); > - fill_common_atomic_sources(b, opcode, w, &atomic->src[0]); > + > + switch (opcode) { > + case SpvOpAtomicLoad: > + atomic->num_components = glsl_get_vector_elements(type->type); > + break; > + > + case SpvOpAtomicStore: > + atomic->num_components = glsl_get_vector_elements(type->type); > + nir_intrinsic_set_write_mask(atomic, (1 << > atomic->num_components) - 1); > + atomic->src[0] = nir_src_for_ssa(vtn_ssa_value(b, w[4])->def); > + break; > + > + case SpvOpAtomicExchange: > + case SpvOpAtomicCompareExchange: > + case SpvOpAtomicCompareExchangeWeak: > + case SpvOpAtomicIIncrement: > + case SpvOpAtomicIDecrement: > + case SpvOpAtomicIAdd: > + case SpvOpAtomicISub: > + case SpvOpAtomicSMin: > + case SpvOpAtomicUMin: > + case SpvOpAtomicSMax: > + case SpvOpAtomicUMax: > + case SpvOpAtomicAnd: > + case SpvOpAtomicOr: > + case SpvOpAtomicXor: > + fill_common_atomic_sources(b, opcode, w, &atomic->src[0]); > + break; > + > + default: > + unreachable("Invalid SPIR-V atomic"); > + > + } > } else { > assert(chain->var->mode == vtn_variable_mode_ssbo); > struct vtn_type *type; > -- > 2.9.3 > > _______________________________________________ > mesa-dev mailing list > [email protected] > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
_______________________________________________ mesa-dev mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-dev
