mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-03 17:20:26 +01:00
spirv: handle undefined components for OpVectorShuffle
Fixes:
dEQP-VK.spirv_assembly.instruction.compute.opspecconstantop.vector_related
dEQP-VK.spirv_assembly.instruction.graphics.opspecconstantop.vector_related*
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "17.0 13.0" <mesa-stable@lists.freedesktop.org>
(cherry picked from commit bbe8705c57)
[Emil Velikov: resolve trivial conflicts]
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Conflicts:
src/compiler/spirv/spirv_to_nir.c
This commit is contained in:
parent
b18c791a64
commit
f4e2c60858
1 changed files with 22 additions and 8 deletions
|
|
@ -1055,16 +1055,30 @@ vtn_handle_constant(struct vtn_builder *b, SpvOp opcode,
|
|||
SpvOp opcode = get_specialization(b, val, w[3]);
|
||||
switch (opcode) {
|
||||
case SpvOpVectorShuffle: {
|
||||
struct vtn_value *v0 = vtn_value(b, w[4], vtn_value_type_constant);
|
||||
struct vtn_value *v1 = vtn_value(b, w[5], vtn_value_type_constant);
|
||||
unsigned len0 = glsl_get_vector_elements(v0->const_type);
|
||||
unsigned len1 = glsl_get_vector_elements(v1->const_type);
|
||||
struct vtn_value *v0 = &b->values[w[4]];
|
||||
struct vtn_value *v1 = &b->values[w[5]];
|
||||
|
||||
assert(v0->value_type == vtn_value_type_constant ||
|
||||
v0->value_type == vtn_value_type_undef);
|
||||
assert(v1->value_type == vtn_value_type_constant ||
|
||||
v1->value_type == vtn_value_type_undef);
|
||||
|
||||
unsigned len0 = v0->value_type == vtn_value_type_constant ?
|
||||
glsl_get_vector_elements(v0->const_type) :
|
||||
glsl_get_vector_elements(v0->type->type);
|
||||
unsigned len1 = v1->value_type == vtn_value_type_constant ?
|
||||
glsl_get_vector_elements(v1->const_type) :
|
||||
glsl_get_vector_elements(v1->type->type);
|
||||
|
||||
uint32_t u[8];
|
||||
for (unsigned i = 0; i < len0; i++)
|
||||
u[i] = v0->constant->value.u[i];
|
||||
for (unsigned i = 0; i < len1; i++)
|
||||
u[len0 + i] = v1->constant->value.u[i];
|
||||
if (v0->value_type == vtn_value_type_constant) {
|
||||
for (unsigned i = 0; i < len0; i++)
|
||||
u[i] = v0->constant->value.u[i];
|
||||
}
|
||||
if (v1->value_type == vtn_value_type_constant) {
|
||||
for (unsigned i = 0; i < len1; i++)
|
||||
u[len0 + i] = v1->constant->value.u[i];
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < count - 6; i++) {
|
||||
uint32_t comp = w[i + 6];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue