[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