diff options
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 6 | ||||
-rw-r--r-- | src/glsl/glsl_symbol_table.cpp | 14 | ||||
-rw-r--r-- | src/glsl/glsl_symbol_table.h | 1 |
3 files changed, 18 insertions, 3 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index ea5e3b773e3..31dd51aa921 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -4132,6 +4132,12 @@ ast_uniform_block::hir(exec_list *instructions, struct gl_uniform_block *ubo = get_next_uniform_block(state); ubo->Name = ralloc_strdup(state->uniform_blocks, this->block_name); + if (!state->symbols->add_uniform_block(ubo)) { + YYLTYPE loc = this->get_location(); + _mesa_glsl_error(&loc, state, "Uniform block name `%s' already taken in " + "the current scope.\n", ubo->Name); + } + unsigned int num_variables = 0; foreach_list_typed(ast_declarator_list, decl_list, link, &declarations) { foreach_list_const(node, &decl_list->declarations) { 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); diff --git a/src/glsl/glsl_symbol_table.h b/src/glsl/glsl_symbol_table.h index 9f5602787f0..f95fb8a0115 100644 --- a/src/glsl/glsl_symbol_table.h +++ b/src/glsl/glsl_symbol_table.h @@ -99,6 +99,7 @@ public: bool add_variable(ir_variable *v); bool add_type(const char *name, const glsl_type *t); bool add_function(ir_function *f); + bool add_uniform_block(struct gl_uniform_block *u); /*@}*/ /** |