[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