Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> --- src/compiler/spirv/spirv_to_nir.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index fb4211193fb..e8ab48012f5 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2462,6 +2462,24 @@ vtn_handle_image(struct vtn_builder *b, SpvOp opcode, vtn_fail("Invalid image opcode"); } + if (opcode == SpvOpAtomicStore) { + /* The image value to store is always 4 components but we may not have that + * many. Swizzle to compensate. + */ + nir_ssa_def *val = vtn_ssa_value(b, w[4])->def; + const struct glsl_type *val_type = vtn_ssa_value(b, w[4])->type; + struct vtn_type *mem_type = vtn_value(b, w[1], vtn_value_type_image_pointer)->type->image; + unsigned swiz[4] = {0, 0, 0, 0}; + + assert(mem_type->type == val_type); + + /* For nir_intrinsic_image_var_store, the value to write is a vec4 */ + intrin->src[3] = nir_src_for_ssa(nir_swizzle(&b->nb, val, + swiz, 4, false)); + nir_builder_instr_insert(&b->nb, &intrin->instr); + return; + } + if (opcode != SpvOpImageWrite) { struct vtn_value *val = vtn_push_value(b, w[2], vtn_value_type_ssa); struct vtn_type *type = vtn_value(b, w[1], vtn_value_type_type)->type; -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev