Thanks,

I thought about that but the various nir_intrinsic_set_write_mask()/etc.. for load/store kind of discouraged me.
I'll give it a try though.

On 07/09/16 17:12, Jason Ekstrand wrote:
LGTM.

Reviewed-by: Jason Ekstrand <ja...@jlekstrand.net <mailto:ja...@jlekstrand.net>>

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 <llandwer...@gmail.com <mailto:llandwer...@gmail.com>> wrote:

    Missing bits from 2afb950161f847d9b0a7be03dfb62cacc5ea51ba.

    Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com
    <mailto:lionel.g.landwer...@intel.com>>
    Cc: Jason Ekstrand <jason.ekstr...@intel.com
    <mailto:jason.ekstr...@intel.com>>
    ---
     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
    mesa-dev@lists.freedesktop.org <mailto:mesa-dev@lists.freedesktop.org>
    https://lists.freedesktop.org/mailman/listinfo/mesa-dev
    <https://lists.freedesktop.org/mailman/listinfo/mesa-dev>



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to