diff options
author | Kenneth Graunke <[email protected]> | 2012-11-28 00:18:02 -0800 |
---|---|---|
committer | Ian Romanick <[email protected]> | 2013-01-18 17:35:32 -0800 |
commit | 4f29169913f99252c54e1922f6d164e2ef530a58 (patch) | |
tree | e857b0a5384f67880afc06ffa8c3139e8452a272 /src/glsl/glsl_symbol_table.cpp | |
parent | bb47a4d081c383a2c42555c2bbde2f5d8ee2412c (diff) |
glsl: Track UBO block names in the symbol table.
The GLSL 1.40 spec says:
"Uniform block names and variable names declared within uniform
blocks are scoped at the program level."
Track the block name in the symbol table and emit errors when conflicts
exist.
Fixes es3conform's uniform_buffer_object_block_name_conflict test, and
fixes the piglit block-name-clashes-with-{variable,function,struct}.vert
tests.
NOTE: This is a candidate for the 9.0 branch.
v2: Fix bad constructor initialization. Noticed by Topi Pohjolainen.
Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src/glsl/glsl_symbol_table.cpp')
-rw-r--r-- | src/glsl/glsl_symbol_table.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/glsl/glsl_symbol_table.cpp b/src/glsl/glsl_symbol_table.cpp index f934ea86570..eb275b12e29 100644 --- a/src/glsl/glsl_symbol_table.cpp +++ b/src/glsl/glsl_symbol_table.cpp @@ -41,13 +41,15 @@ public: ralloc_free(entry); } - symbol_table_entry(ir_variable *v) : v(v), f(0), t(0) {} - symbol_table_entry(ir_function *f) : v(0), f(f), t(0) {} - symbol_table_entry(const glsl_type *t) : v(0), f(0), t(t) {} + symbol_table_entry(ir_variable *v) : v(v), f(0), t(0), u(0) {} + symbol_table_entry(ir_function *f) : v(0), f(f), t(0), u(0) {} + symbol_table_entry(const glsl_type *t) : v(0), f(0), t(t), u(0) {} + symbol_table_entry(struct gl_uniform_block *u) : v(0), f(0), t(0), u(u) {} ir_variable *v; ir_function *f; const glsl_type *t; + struct gl_uniform_block *u; }; glsl_symbol_table::glsl_symbol_table() @@ -132,6 +134,12 @@ bool glsl_symbol_table::add_function(ir_function *f) return _mesa_symbol_table_add_symbol(table, -1, f->name, entry) == 0; } +bool glsl_symbol_table::add_uniform_block(struct gl_uniform_block *u) +{ + symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(u); + return _mesa_symbol_table_add_symbol(table, -1, u->Name, entry) == 0; +} + void glsl_symbol_table::add_global_function(ir_function *f) { symbol_table_entry *entry = new(mem_ctx) symbol_table_entry(f); |