summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2013-09-28 10:04:41 -0700
committerPaul Berry <stereotype441@gmail.com>2013-10-10 14:27:38 -0700
commit84b9fa83a07552ff0c0f7b2ea6386377334289ef (patch)
tree55220b3987bb98e4dccc605aaef2c250db945e14
parentfc2330b0be3d8461abc0a1a12a40df2c0bf831b8 (diff)
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>
-rw-r--r--src/glsl/ast_to_hir.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp
index 3c788de6f5..d64d5480bf 100644
--- a/src/glsl/ast_to_hir.cpp
+++ b/src/glsl/ast_to_hir.cpp
@@ -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);