summaryrefslogtreecommitdiff
path: root/src/compiler/spirv/spirv_to_nir.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/spirv/spirv_to_nir.c')
-rw-r--r--src/compiler/spirv/spirv_to_nir.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c
index 270a3a24eea..8c7e90a4d38 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -3056,28 +3056,28 @@ fill_common_atomic_sources(struct vtn_builder *b, SpvOp opcode,
}
static nir_ssa_def *
-get_image_coord(struct vtn_builder *b, uint32_t value)
+expand_to_vec4(nir_builder *b, nir_ssa_def *value)
{
- nir_ssa_def *coord = vtn_get_nir_ssa(b, value);
-
- /* The image_load_store intrinsics assume a 4-dim coordinate */
- unsigned swizzle[4];
- for (unsigned i = 0; i < 4; i++)
- swizzle[i] = MIN2(i, coord->num_components - 1);
+ nir_ssa_def *components[4];
+ if (value->num_components == 4)
+ return value;
- return nir_swizzle(&b->nb, coord, swizzle, 4);
+ nir_ssa_def *undef = nir_ssa_undef(b, 1, value->bit_size);
+ for (unsigned i = 0; i < 4; i++) {
+ if (i < value->num_components)
+ components[i] = nir_channel(b, value, i);
+ else
+ components[i] = undef;
+ }
+ return nir_vec(b, components, 4);
}
static nir_ssa_def *
-expand_to_vec4(nir_builder *b, nir_ssa_def *value)
+get_image_coord(struct vtn_builder *b, uint32_t value)
{
- if (value->num_components == 4)
- return value;
-
- unsigned swiz[4];
- for (unsigned i = 0; i < 4; i++)
- swiz[i] = i < value->num_components ? i : 0;
- return nir_swizzle(b, value, swiz, 4);
+ nir_ssa_def *coord = vtn_get_nir_ssa(b, value);
+ /* The image_load_store intrinsics assume a 4-dim coordinate */
+ return expand_to_vec4(&b->nb, coord);
}
static void