spirv: Use STACK_ARRAY instead of NIR_VLA

The number of fields comes from the shader, so it could be a value large
enough that using alloca would be problematic.

Fixes: 2a023f30a6 ("nir/spirv: Add basic support for types")
Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Reviewed-by: Ryan Neph <ryanneph@google.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39866>
This commit is contained in:
Ian Romanick 2026-01-23 09:58:26 -08:00 committed by Marge Bot
parent db532eaf00
commit 3da828d2dd

View file

@ -27,7 +27,6 @@
#include "glsl_types.h"
#include "vtn_private.h"
#include "nir/nir_vla.h"
#include "nir/nir_control_flow.h"
#include "nir/nir_constant_expressions.h"
#include "nir/nir_deref.h"
@ -42,6 +41,7 @@
#include "util/mesa-blake3.h"
#include "util/bfloat.h"
#include "util/float8.h"
#include "util/stack_array.h"
#include <stdio.h>
@ -1408,7 +1408,7 @@ vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type,
case vtn_base_type_struct: {
bool need_new_struct = false;
const uint32_t num_fields = type->length;
NIR_VLA(struct glsl_struct_field, fields, num_fields);
STACK_ARRAY(struct glsl_struct_field, fields, num_fields);
for (unsigned i = 0; i < num_fields; i++) {
fields[i] = *glsl_get_struct_field_data(type->type, i);
const struct glsl_type *field_nir_type =
@ -1418,20 +1418,25 @@ vtn_type_get_nir_type(struct vtn_builder *b, struct vtn_type *type,
need_new_struct = true;
}
}
const struct glsl_type *result;
if (need_new_struct) {
if (glsl_type_is_interface(type->type)) {
return glsl_interface_type(fields, num_fields,
/* packing */ 0, false,
glsl_get_type_name(type->type));
result = glsl_interface_type(fields, num_fields,
/* packing */ 0, false,
glsl_get_type_name(type->type));
} else {
return glsl_struct_type(fields, num_fields,
glsl_get_type_name(type->type),
glsl_struct_type_is_packed(type->type));
result = glsl_struct_type(fields, num_fields,
glsl_get_type_name(type->type),
glsl_struct_type_is_packed(type->type));
}
} else {
/* No changes, just pass it on */
return type->type;
result = type->type;
}
STACK_ARRAY_FINISH(fields);
return result;
}
case vtn_base_type_image:
@ -2077,7 +2082,7 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
val->type->offsets = vtn_alloc_array(b, unsigned, num_fields);
val->type->packed = false;
NIR_VLA(struct glsl_struct_field, fields, count);
STACK_ARRAY(struct glsl_struct_field, fields, count);
for (unsigned i = 0; i < num_fields; i++) {
val->type->members[i] = vtn_get_type(b, w[i + 2]);
const char *name = NULL;
@ -2133,6 +2138,8 @@ vtn_handle_type(struct vtn_builder *b, SpvOp opcode,
name ? name : "struct",
val->type->packed);
}
STACK_ARRAY_FINISH(fields);
break;
}