glsl: Support redeclaration of GS gl_PerVertex input.
authorPaul Berry <stereotype441@gmail.com>
Sat, 28 Sep 2013 17:04:41 +0000 (10:04 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 10 Oct 2013 21:27:38 +0000 (14:27 -0700)
Fixes piglit test
spec/glsl-1.50/execution/redeclare-pervertex-subset-vs-to-gs.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/ast_to_hir.cpp

index 3c788de6f533f7d19312ff6a6f170e12c4bd34fb..d64d5480bfec10223bdb20c680e4db8744867616 100644 (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);