glsl: Don't allow invalid identifier names in struct/interface fields.

Note: we need to make an exception for the gl_PerVertex interface
block, since built-in variables are allowed to be redeclared inside
it.  Future patches will make redeclaration of gl_PerVertex work
properly.

Fixes piglit tests:
- spec/glsl-1.50/compiler/interface-block-array-elem-uses-gl-prefix.vert
- spec/glsl-1.50/compiler/named-interface-block-elem-uses-gl-prefix.vert
- spec/glsl-1.50/compiler/unnamed-interface-block-elem-uses-gl-prefix.vert

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Paul Berry 2013-09-27 14:52:08 -07:00
parent f2dd3a04ce
commit 9b5b0320b6

View file

@ -4410,7 +4410,8 @@ ast_process_structure_or_interface_block(exec_list *instructions,
YYLTYPE &loc,
glsl_struct_field **fields_ret,
bool is_interface,
bool block_row_major)
bool block_row_major,
bool allow_reserved_names)
{
unsigned decl_count = 0;
@ -4452,6 +4453,9 @@ ast_process_structure_or_interface_block(exec_list *instructions,
foreach_list_typed (ast_declaration, decl, link,
&decl_list->declarations) {
if (!allow_reserved_names)
validate_identifier(decl->identifier, loc, state);
/* From the GL_ARB_uniform_buffer_object spec:
*
* "Sampler types are not allowed inside of uniform
@ -4568,7 +4572,8 @@ ast_struct_specifier::hir(exec_list *instructions,
loc,
&fields,
false,
false);
false,
false /* allow_reserved_names */);
const glsl_type *t =
glsl_type::get_record_instance(fields, decl_count, this->name);
@ -4625,7 +4630,8 @@ ast_interface_block::hir(exec_list *instructions,
loc,
&fields,
true,
block_row_major);
block_row_major,
redeclaring_per_vertex);
ir_variable_mode var_mode;
const char *iface_type_name;