[Mesa-dev] [PATCH v2] spirv/nir: don't set interface_type if it is not a struct
Alejandro PiƱeiro
apinheiro at igalia.com
Tue Nov 6 10:40:29 UTC 2018
vnt_variables uses interface_type on several use cases, but on nir
variable it is more limited. From nir.h:
/**
* For variables that are in an interface block or are an instance of an
* interface block, this is the \c GLSL_TYPE_INTERFACE type for that block.
*
* \sa ir_variable::location
*/
But interface blocks expects the type to be an struct, so those cases
should not be filled. For example, glsl checks if a variable is in an
uniform block if it is an uniform and has an interface type.
One example of why this is needed: gl_PatchVerticesIn is lowered to an
uniform. Without this change, it would include a interface_type. Then,
we would try to initialize the uniform block, and find that it doesn't
have any component.
v2: rearrange/clean code to only set interface_type for structs,
instead of a default assignment, and a NULL reassignement for
non-structs (Timothy)
Reviewed-by: Timothy Arceri <tarceri at itsqueeze.com>
---
src/compiler/spirv/vtn_variables.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index 0606ae0e243..541ba73e643 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -1789,6 +1789,12 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
var_is_patch_cb, &var->patch);
}
+ var->var = rzalloc(b->shader, nir_variable);
+ var->var->name = ralloc_strdup(var->var, val->name);
+ var->var->type = var->type->type;
+ var->var->data.mode = nir_mode;
+ var->var->data.patch = var->patch;
+
/* For inputs and outputs, we immediately split structures. This
* is for a couple of reasons. For one, builtins may all come in
* a struct and we really want those split out into separate
@@ -1808,14 +1814,9 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
interface_type = var->type->array_element;
}
- var->var = rzalloc(b->shader, nir_variable);
- var->var->name = ralloc_strdup(var->var, val->name);
- var->var->type = var->type->type;
- var->var->interface_type = interface_type->type;
- var->var->data.mode = nir_mode;
- var->var->data.patch = var->patch;
-
if (glsl_type_is_struct(interface_type->type)) {
+ var->var->interface_type = interface_type->type;
+
/* It's a struct. Set it up as per-member. */
var->var->num_members = glsl_get_length(interface_type->type);
var->var->members = rzalloc_array(var->var, struct nir_variable_data,
--
2.14.1
More information about the mesa-dev
mailing list