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