glsl: Construct gl_PerVertex interfaces for GS and VS outputs.
authorPaul Berry <stereotype441@gmail.com>
Sun, 29 Sep 2013 15:17:12 +0000 (08:17 -0700)
committerPaul Berry <stereotype441@gmail.com>
Thu, 10 Oct 2013 21:27:00 +0000 (14:27 -0700)
Although these interfaces can't be accessed directly by GLSL (since
they don't have an instance name), they will be necessary in order to
allow redeclarations of gl_PerVertex.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/glsl/builtin_variables.cpp

index 60ad03b6b4ca4784ff98c22efa51097e8d1fe41d..ae0a03f0d475395faee4a56e7c211c1d85d4ff65 100644 (file)
@@ -404,7 +404,8 @@ private:
    const glsl_type * const mat3_t;
    const glsl_type * const mat4_t;
 
-   per_vertex_accumulator per_vertex;
+   per_vertex_accumulator per_vertex_in;
+   per_vertex_accumulator per_vertex_out;
 };
 
 
@@ -804,10 +805,10 @@ builtin_variable_generator::add_varying(int slot, const glsl_type *type,
 {
    switch (state->target) {
    case geometry_shader:
-      this->per_vertex.add_field(slot, type, name);
+      this->per_vertex_in.add_field(slot, type, name);
       /* FALLTHROUGH */
    case vertex_shader:
-      add_output(slot, type, name);
+      this->per_vertex_out.add_field(slot, type, name);
       break;
    case fragment_shader:
       add_input(slot, type, name);
@@ -853,11 +854,22 @@ builtin_variable_generator::generate_varyings()
    }
 
    if (state->target == geometry_shader) {
-      const glsl_type *per_vertex_type =
-         this->per_vertex.construct_interface_instance();
-      ir_variable *var = add_variable("gl_in", array(per_vertex_type, 0),
+      const glsl_type *per_vertex_in_type =
+         this->per_vertex_in.construct_interface_instance();
+      ir_variable *var = add_variable("gl_in", array(per_vertex_in_type, 0),
                                       ir_var_shader_in, -1);
-      var->init_interface_type(per_vertex_type);
+      var->init_interface_type(per_vertex_in_type);
+   }
+   if (state->target == vertex_shader || state->target == geometry_shader) {
+      const glsl_type *per_vertex_out_type =
+         this->per_vertex_out.construct_interface_instance();
+      const glsl_struct_field *fields = per_vertex_out_type->fields.structure;
+      for (unsigned i = 0; i < per_vertex_out_type->length; i++) {
+         ir_variable *var =
+            add_variable(fields[i].name, fields[i].type, ir_var_shader_out,
+                         fields[i].location);
+         var->init_interface_type(per_vertex_out_type);
+      }
    }
 }