summaryrefslogtreecommitdiffstats
path: root/src/glsl/lower_named_interface_blocks.cpp
diff options
context:
space:
mode:
authorIago Toral Quiroga <itoral@igalia.com>2014-04-04 15:11:15 +0200
committerKenneth Graunke <kenneth@whitecape.org>2014-04-15 22:18:43 -0700
commit6d0e30c6a332de9ea7ab00e1fd303df2fb337c64 (patch)
treeae83bca029160740f6ddfb28258c8e5d61078d43 /src/glsl/lower_named_interface_blocks.cpp
parent6ac5a5e383830d711793e425ddd285e17ffcd235 (diff)
downloadexternal_mesa3d-6d0e30c6a332de9ea7ab00e1fd303df2fb337c64.zip
external_mesa3d-6d0e30c6a332de9ea7ab00e1fd303df2fb337c64.tar.gz
external_mesa3d-6d0e30c6a332de9ea7ab00e1fd303df2fb337c64.tar.bz2
glsl: Properly handle blocks that define the same field name.
Currently we can have name space collisions between blocks that define the same fields. For example: in block { vec4 Color; } In[]; out block { vec4 Color; } Out; These two blocks will assign the same interface name (block.Color) to the Color field in flatten_named_interface_blocks_declarations.cpp, leading to havoc. This was breaking badly the gl-320-primitive-shading test from ogl-samples. The patch uses the block instance name to avoid collisions, producing names like block.In.Color and block.Out.Color to avoid the name clash. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=76394 Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Diffstat (limited to 'src/glsl/lower_named_interface_blocks.cpp')
-rw-r--r--src/glsl/lower_named_interface_blocks.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/src/glsl/lower_named_interface_blocks.cpp b/src/glsl/lower_named_interface_blocks.cpp
index 09d867e..04e0d36 100644
--- a/src/glsl/lower_named_interface_blocks.cpp
+++ b/src/glsl/lower_named_interface_blocks.cpp
@@ -125,8 +125,8 @@ flatten_named_interface_blocks_declarations::run(exec_list *instructions)
for (unsigned i = 0; i < iface_t->length; i++) {
const char * field_name = iface_t->fields.structure[i].name;
char *iface_field_name =
- ralloc_asprintf(mem_ctx, "%s.%s",
- iface_t->name, field_name);
+ ralloc_asprintf(mem_ctx, "%s.%s.%s",
+ iface_t->name, var->name, field_name);
ir_variable *found_var =
(ir_variable *) hash_table_find(interface_namespace,
@@ -217,8 +217,8 @@ flatten_named_interface_blocks_declarations::handle_rvalue(ir_rvalue **rvalue)
if (var->get_interface_type() != NULL) {
char *iface_field_name =
- ralloc_asprintf(mem_ctx, "%s.%s", var->get_interface_type()->name,
- ir->field);
+ ralloc_asprintf(mem_ctx, "%s.%s.%s", var->get_interface_type()->name,
+ var->name, ir->field);
/* Find the variable in the set of flattened interface blocks */
ir_variable *found_var =
(ir_variable *) hash_table_find(interface_namespace,