[Mesa-dev] [PATCH] gtn: Trim out unused VS input variables.

Kenneth Graunke kenneth at whitecape.org
Sat Aug 20 03:29:01 UTC 2016


On Friday, August 19, 2016 6:38:57 PM PDT Eric Anholt wrote:
> If we're going to skip setting up vertex input data in them, we should
> probably not leave them as vertex inputs with a driver_location that
> happens to alias to something else.
> 
> Fixes a regression in glsl-mat-attribute on vc4 when enabling GTN.
> ---
>  src/mesa/state_tracker/st_glsl_to_nir.cpp | 27 ++++++++++++++++++++-------
>  1 file changed, 20 insertions(+), 7 deletions(-)
> 
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index 73a692a50256..fac866be798c 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -73,8 +73,7 @@ st_nir_fixup_varying_slots(struct st_context *st, struct exec_list *var_list)
>   * on varying-slot w/ the VS outputs)
>   */
>  static void
> -st_nir_assign_vs_in_locations(struct gl_program *prog,
> -                              struct exec_list *var_list, unsigned *size)
> +st_nir_assign_vs_in_locations(struct gl_program *prog, nir_shader *nir)
>  {
>     unsigned attr, num_inputs = 0;
>     unsigned input_to_index[VERT_ATTRIB_MAX] = {0};
> @@ -88,15 +87,29 @@ st_nir_assign_vs_in_locations(struct gl_program *prog,
>              /* add placeholder for second part of a double attribute */
>              num_inputs++;
>           }
> +      } else {
> +         input_to_index[attr] = ~0;
>        }
>     }
>  
> -   *size = 0;
> -   nir_foreach_variable(var, var_list) {
> +   nir->num_inputs = 0;
> +   nir_foreach_variable_safe(var, &nir->inputs) {
>        attr = var->data.location;
>        assert(attr < ARRAY_SIZE(input_to_index));
> -      var->data.driver_location = input_to_index[attr];
> -      (*size)++;
> +
> +      if (input_to_index[attr] != ~0u) {
> +         var->data.driver_location = input_to_index[attr];
> +         nir->num_inputs++;
> +      } else {
> +         /* Move unused input variables to the globals list (with no
> +          * initialization), to avoid confusing drivers looking through the
> +          * inputs array and expecting to find inputs with a driver_location
> +          * set.
> +          */
> +         exec_node_remove(&var->node);
> +         var->data.mode = nir_var_global;
> +         exec_list_push_tail(&nir->globals, &var->node);
> +      }
>     }
>  }
>  
> @@ -304,7 +317,7 @@ st_finalize_nir(struct st_context *st, struct gl_program *prog, nir_shader *nir)
>  
>     if (nir->stage == MESA_SHADER_VERTEX) {
>        /* Needs special handling so drvloc matches the vbo state: */
> -      st_nir_assign_vs_in_locations(prog, &nir->inputs, &nir->num_inputs);
> +      st_nir_assign_vs_in_locations(prog, nir);
>        sort_varyings(&nir->outputs);
>        nir_assign_var_locations(&nir->outputs,
>                                 &nir->num_outputs,
> 


Looks OK to me.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160819/a0c6b258/attachment.sig>


More information about the mesa-dev mailing list