[Mesa-dev] [PATCH 04/19] glsl: Construct gl_PerVertex interfaces for GS and VS outputs.
Jordan Justen
jljusten at gmail.com
Tue Oct 8 14:55:47 PDT 2013
1-4 Reviewed-by: Jordan Justen <jordan.l.justen at intel.com>
On Wed, Oct 2, 2013 at 5:45 PM, Paul Berry <stereotype441 at gmail.com> wrote:
> 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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list