[Mesa-dev] [RFC PATCH 08/13] spirv/nir: interface_type should only be set for blocks, not any structs

Alejandro Piñeiro apinheiro at igalia.com
Sat Dec 8 11:48:16 UTC 2018


Current code assumes that if the type is an struct it would behave as
a block. That is not always the case (like xfb_offset/xfb_buffer
assignment on arrays of structs vs arrays of blocks), so we need to
differentiate.
---
 src/compiler/spirv/vtn_variables.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c
index be3545aad47..6d7d5dfc691 100644
--- a/src/compiler/spirv/vtn_variables.c
+++ b/src/compiler/spirv/vtn_variables.c
@@ -1677,9 +1677,12 @@ add_missing_member_locations(struct vtn_variable *var,
        *
        * “If the structure type is a Block but without a Location, then each
        *  of its members must have a Location decoration.”
+       *
        */
-      assert(var->base_location != -1 ||
-             var->var->members[i].location != -1);
+      if (var->type->block) {
+         assert(var->base_location != -1 ||
+                var->var->members[i].location != -1);
+      }
 
       /* From the Vulkan spec:
        *
@@ -1692,8 +1695,12 @@ add_missing_member_locations(struct vtn_variable *var,
       else
          var->var->members[i].location = location;
 
+      /* Below we use type instead of interface_type, because interface_type
+       * is only available when it is a Block. This code also supports
+       * input/outputs that are just structs
+       */
       const struct glsl_type *member_type =
-         glsl_get_struct_field(var->var->interface_type, i);
+         glsl_get_struct_field(glsl_without_array(var->type->type), i);
 
       location +=
          glsl_count_attribute_slots(member_type, is_vertex_input);
@@ -1862,9 +1869,11 @@ vtn_create_variable(struct vtn_builder *b, struct vtn_value *val,
          interface_type = var->type->array_element;
       }
 
-      if (glsl_type_is_struct(interface_type->type)) {
+      if (interface_type->block) {
          var->var->interface_type = interface_type->type;
+      }
 
+      if (glsl_type_is_struct(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.19.1



More information about the mesa-dev mailing list