[Mesa-dev] [PATCH 19/26] nir/linker: use only the array element type for array of ssbo/ubo

Alejandro PiƱeiro apinheiro at igalia.com
Sat Sep 15 16:18:42 UTC 2018


For this interfaces, the inner members are added only once as uniforms
or resources, in opposite to other cases, like a uniform array of
structs.
---
 src/compiler/glsl/gl_nir_link_uniforms.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c b/src/compiler/glsl/gl_nir_link_uniforms.c
index 00995fb3f76..c692cd0171f 100644
--- a/src/compiler/glsl/gl_nir_link_uniforms.c
+++ b/src/compiler/glsl/gl_nir_link_uniforms.c
@@ -498,11 +498,33 @@ gl_nir_link_uniforms(struct gl_context *ctx,
 
          state.current_var = var;
 
+         /*
+          * From OpenGL 4.6 spec, section 7.3.1.1, "Naming Active Resources":
+          *
+          *   "* For an active shader storage block member declared as an
+          *      array of an aggregate type, an entry will be generated only
+          *      for the first array element, regardless of its type. Such
+          *      block members are referred to as top-level arrays. If the
+          *      block member is an aggregate type, the enumeration rules are
+          *      then applied recursively.
+          *    * For an active interface block not declared as an array of
+          *      block instances, a single entry will be generated, using the
+          *      block name from the shader source."
+          *
+          * So for the UBO and SSBO case, we expand only the array element
+          * type.
+          */
+         const struct glsl_type *type = var->type;
+         if (nir_variable_is_in_block(var) &&
+             glsl_type_is_array(type)) {
+            type = glsl_get_array_element(type);
+         }
+
          struct type_tree_entry *type_tree =
-            build_type_tree_for_type(var->type);
+            build_type_tree_for_type(type);
          state.current_type = type_tree;
 
-         int res = nir_link_uniform(ctx, prog, sh->Program, shader_type, var->type,
+         int res = nir_link_uniform(ctx, prog, sh->Program, shader_type, type,
                                     location, &state);
 
          free_type_tree(type_tree);
-- 
2.14.1



More information about the mesa-dev mailing list