[Mesa-dev] [PATCH] glsl: Remove VS output varyings which are optimized out of the FS

Jordan Justen jljusten at gmail.com
Tue Feb 12 21:47:51 PST 2013


Paul, Ken,

In case you were interested, I confirmed that this fixes (or more
accurately it masks) the Steam Big Picture issue that Ken fixed in
09fbc298. (I checked the effects of this patch with 09fbc298 removed.)

You two had suspected this change might mask that particular issue.

-Jordan

On Tue, Feb 12, 2013 at 6:59 PM, Jordan Justen
<jordan.l.justen at intel.com> wrote:
> Previously when an input varying was optimized out of the
> FS we would still retain it as an output of the VS.
>
> We now build a hash of live FS input varyings rather
> than looking in the FS symbol table. (The FS symbol table
> will still contain the optimized out varyings.)
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Paul Berry <stereotype441 at gmail.com>
> ---
>  src/glsl/link_varyings.cpp |   19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/src/glsl/link_varyings.cpp b/src/glsl/link_varyings.cpp
> index b1317c8..616933d 100644
> --- a/src/glsl/link_varyings.cpp
> +++ b/src/glsl/link_varyings.cpp
> @@ -964,6 +964,8 @@ assign_varying_locations(struct gl_context *ctx,
>     varying_matches matches(ctx->Const.DisableVaryingPacking);
>     hash_table *tfeedback_candidates
>        = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare);
> +   hash_table *consumer_inputs
> +      = hash_table_ctor(0, hash_table_string_hash, hash_table_string_compare);
>
>     /* Operate in a total of three passes.
>      *
> @@ -976,6 +978,18 @@ assign_varying_locations(struct gl_context *ctx,
>      *    not being inputs.  This lets the optimizer eliminate them.
>      */
>
> +   if (consumer) {
> +      foreach_list(node, consumer->ir) {
> +         ir_variable *const input_var =
> +            ((ir_instruction *) node)->as_variable();
> +
> +         if ((input_var != NULL) && (input_var->mode == ir_var_shader_in)) {
> +            hash_table_insert(consumer_inputs, input_var,
> +                              ralloc_strdup(mem_ctx, input_var->name));
> +         }
> +      }
> +   }
> +
>     foreach_list(node, producer->ir) {
>        ir_variable *const output_var = ((ir_instruction *) node)->as_variable();
>
> @@ -986,7 +1000,7 @@ assign_varying_locations(struct gl_context *ctx,
>        g.process(output_var);
>
>        ir_variable *input_var =
> -        consumer ? consumer->symbols->get_variable(output_var->name) : NULL;
> +         (ir_variable *) hash_table_find(consumer_inputs, output_var->name);
>
>        if (input_var && input_var->mode != ir_var_shader_in)
>           input_var = NULL;
> @@ -1005,6 +1019,7 @@ assign_varying_locations(struct gl_context *ctx,
>
>        if (matched_candidate == NULL) {
>           hash_table_dtor(tfeedback_candidates);
> +         hash_table_dtor(consumer_inputs);
>           return false;
>        }
>
> @@ -1021,11 +1036,13 @@ assign_varying_locations(struct gl_context *ctx,
>
>        if (!tfeedback_decls[i].assign_location(ctx, prog)) {
>           hash_table_dtor(tfeedback_candidates);
> +         hash_table_dtor(consumer_inputs);
>           return false;
>        }
>     }
>
>     hash_table_dtor(tfeedback_candidates);
> +   hash_table_dtor(consumer_inputs);
>
>     if (ctx->Const.DisableVaryingPacking) {
>        /* Transform feedback code assumes varyings are packed, so if the driver
> --
> 1.7.10.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