glsl: do not allow interface block to have name already taken

Fixes currently failing Piglit case
   interface-blocks-name-reused-globally.vert

v2: combine var declaration with assignment (Ian)

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Tapani Pälli 2015-01-19 12:28:17 +02:00
parent 28b7c6b285
commit adc8cdfa35

View file

@ -5443,9 +5443,23 @@ ast_interface_block::hir(exec_list *instructions,
state->struct_specifier_depth--;
if (!redeclaring_per_vertex)
if (!redeclaring_per_vertex) {
validate_identifier(this->block_name, loc, state);
/* From section 4.3.9 ("Interface Blocks") of the GLSL 4.50 spec:
*
* "Block names have no other use within a shader beyond interface
* matching; it is a compile-time error to use a block name at global
* scope for anything other than as a block name."
*/
ir_variable *var = state->symbols->get_variable(this->block_name);
if (var && !var->type->is_interface()) {
_mesa_glsl_error(&loc, state, "Block name `%s' is "
"already used in the scope.",
this->block_name);
}
}
const glsl_type *earlier_per_vertex = NULL;
if (redeclaring_per_vertex) {
/* Find the previous declaration of gl_PerVertex. If we're redeclaring