[Mesa-dev] [PATCH 04/19] glsl: Construct gl_PerVertex interfaces for GS and VS outputs.

Paul Berry stereotype441 at gmail.com
Wed Oct 2 17:45:17 PDT 2013


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.
---
 src/glsl/builtin_variables.cpp | 26 +++++++++++++++++++-------
 1 file changed, 19 insertions(+), 7 deletions(-)

diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp
index 0ab7dda..f97fb8e 100644
--- a/src/glsl/builtin_variables.cpp
+++ b/src/glsl/builtin_variables.cpp
@@ -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;
 };
 
 
@@ -803,10 +804,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);
@@ -852,11 +853,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);
+      }
    }
 }
 
-- 
1.8.4



More information about the mesa-dev mailing list