[Mesa-dev] [PATCH 2/2] st/glsl_to_nir: correctly handle arrays packed across multiple vars

Marek Olšák maraeo at gmail.com
Tue Mar 27 22:46:32 UTC 2018


For the series:

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

Marek

On Thu, Mar 22, 2018 at 9:49 PM, Timothy Arceri <tarceri at itsqueeze.com>
wrote:

> Fixes piglit test:
> tests/spec/arb_enhanced_layouts/execution/component-
> layout/vs-fs-array-interleave-range.shader_test
> ---
>  src/mesa/state_tracker/st_glsl_to_nir.cpp | 24 +++++++++++++++++++++++-
>  1 file changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index e0467f205d3..4ded4ec60f5 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -133,6 +133,7 @@ st_nir_assign_var_locations(struct exec_list
> *var_list, unsigned *size,
>     const int base = stage == MESA_SHADER_FRAGMENT ?
>        (int) FRAG_RESULT_DATA0 : (int) VARYING_SLOT_VAR0;
>
> +   int UNUSED last_loc = 0;
>     nir_foreach_variable(var, var_list) {
>
>        const struct glsl_type *type = var->type;
> @@ -164,8 +165,29 @@ st_nir_assign_var_locations(struct exec_list
> *var_list, unsigned *size,
>         * we may have already have processed this location.
>         */
>        if (processed) {
> -         var->data.driver_location = assigned_locations[var->data.
> location];
> +         unsigned driver_location = assigned_locations[var->data.
> location];
> +         var->data.driver_location = driver_location;
>           *size += type_size(type);
> +
> +         /* An array may be packed such that is crosses multiple other
> arrays
> +          * or variables, we need to make sure we have allocated the
> elements
> +          * consecutively if the previously proccessed var was shorter
> than
> +          * the current array we are processing.
> +          *
> +          * NOTE: The code below assumes the var list is ordered in
> ascending
> +          * location order.
> +          */
> +         assert(last_loc <= var->data.location);
> +         last_loc = var->data.location;
> +         unsigned last_slot_location = driver_location + var_size;
> +         if (last_slot_location > location) {
> +            unsigned num_unallocated_slots = last_slot_location -
> location;
> +            unsigned first_unallocated_slot = var_size -
> num_unallocated_slots;
> +            for (unsigned i = first_unallocated_slot; i <
> num_unallocated_slots; i++) {
> +               assigned_locations[var->data.location + i] = location;
> +               location++;
> +            }
> +         }
>           continue;
>        }
>
> --
> 2.14.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180327/0529de1b/attachment.html>


More information about the mesa-dev mailing list