diff options
author | Paul Berry <[email protected]> | 2013-09-29 08:17:12 -0700 |
---|---|---|
committer | Paul Berry <[email protected]> | 2013-10-10 14:27:00 -0700 |
commit | 5a234d92af2467f6a224e2aee966257656e5af80 (patch) | |
tree | ec1f0c5deff23668b31608e87087eefccb9d5105 | |
parent | fb41f2c531b1243e6eebfe7b02ac04b0fe66c24e (diff) |
glsl: Construct gl_PerVertex interfaces for GS and VS outputs.
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 <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
-rw-r--r-- | src/glsl/builtin_variables.cpp | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index 60ad03b6b4c..ae0a03f0d47 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; }; @@ -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); + } } } |