glsl: Support redeclaration of GS gl_PerVertex input.

Fixes piglit test
spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Paul Berry
2013-09-28 10:04:41 -07:00
parent fc2330b0be
commit 84b9fa83a0
+21 -2
View File
@@ -4724,6 +4724,19 @@ ast_interface_block::hir(exec_list *instructions,
*/
return NULL;
}
/* Copy locations from the old gl_PerVertex interface block. */
for (unsigned i = 0; i < num_variables; i++) {
int j = earlier_per_vertex->field_index(fields[i].name);
if (j == -1) {
_mesa_glsl_error(&loc, state,
"redeclaration of gl_PerVertex must be a subset "
"of the built-in members of gl_PerVertex");
} else {
fields[i].location =
earlier_per_vertex->fields.structure[j].location;
}
}
}
const glsl_type *block_type =
@@ -4814,8 +4827,14 @@ ast_interface_block::hir(exec_list *instructions,
if (state->target == geometry_shader && var_mode == ir_var_shader_in)
handle_geometry_shader_input_decl(state, loc, var);
if (state->symbols->get_variable(this->instance_name)) {
_mesa_glsl_error(&loc, state, "`%s' redeclared", this->instance_name);
if (ir_variable *earlier =
state->symbols->get_variable(this->instance_name)) {
if (!redeclaring_per_vertex) {
_mesa_glsl_error(&loc, state, "`%s' redeclared",
this->instance_name);
}
earlier->type = var->type;
earlier->reinit_interface_type(block_type);
delete var;
} else {
state->symbols->add_variable(var);