Signed-off-by: Samuel Iglesias Gonsálvez <sigles...@igalia.com> --- src/compiler/spirv/spirv_to_nir.c | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+)
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index e8ab48012f5..dc00d853c39 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -2480,6 +2480,39 @@ vtn_handle_image(struct vtn_builder *b, SpvOp opcode, return; } + if (opcode == SpvOpAtomicLoad) { + 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; + + unsigned dest_components = nir_intrinsic_dest_components(intrin); + if (intrin->intrinsic == nir_intrinsic_image_deref_size) { + dest_components = intrin->num_components = + glsl_get_vector_elements(type->type); + } + + nir_ssa_dest_init(&intrin->instr, &intrin->dest, + dest_components, 32, NULL); + + nir_builder_instr_insert(&b->nb, &intrin->instr); + + /* Copy the vec4 value and get first component */ + nir_ssa_dest_init(&intrin->instr, &intrin->dest, + dest_components, 32, NULL); + + nir_alu_instr *mov = nir_alu_instr_create(b->shader, nir_op_imov); + nir_ssa_dest_init(&mov->instr, &mov->dest.dest, 1, + 32, NULL); + mov->dest.write_mask = (1 << 1) - 1; + mov->src[0].src = nir_src_for_ssa(&intrin->dest.ssa); + mov->src[0].swizzle[0] = 0; + nir_builder_instr_insert(&b->nb, &mov->instr); + + val->ssa = vtn_create_ssa_value(b, type->type); + val->ssa->def = &mov->dest.dest.ssa; + + 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