[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