[Mesa-dev] [PATCH 2/3] st/glsl_to_nir: fix driver location for packed doubles
Timothy Arceri
tarceri at itsqueeze.com
Thu Mar 22 02:39:56 UTC 2018
The subject line should have read:
"st/glsl_to_nir: fix driver location for dual-slot packed doubles"
This should also partially fix packed arrays although more is needed to
make sure those work since an array can be packed across multiple other
arrays so we need to make sure everything is assigned a driver location
in the correct order.
On 21/03/18 14:50, Timothy Arceri wrote:
> ---
> src/mesa/state_tracker/st_glsl_to_nir.cpp | 22 ++++++++++++++++------
> 1 file changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> index afb6120d9d..b01be622f7 100644
> --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp
> +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp
> @@ -141,16 +141,23 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
> type = glsl_get_array_element(type);
> }
>
> + unsigned var_size = type_size(type);
> +
> /* Builtins don't allow component packing so we only need to worry about
> * user defined varyings sharing the same location.
> */
> bool processed = false;
> if (var->data.location >= base) {
> unsigned glsl_location = var->data.location - base;
> - if (processed_locs[var->data.index] & ((uint64_t)1 << glsl_location))
> - processed = true;
> - else
> - processed_locs[var->data.index] |= ((uint64_t)1 << glsl_location);
> +
> + for (unsigned i = 0; i < var_size; i++) {
> + if (processed_locs[var->data.index] &
> + ((uint64_t)1 << (glsl_location + i)))
> + processed = true;
> + else
> + processed_locs[var->data.index] |=
> + ((uint64_t)1 << (glsl_location + i));
> + }
> }
>
> /* Because component packing allows varyings to share the same location
> @@ -162,9 +169,12 @@ st_nir_assign_var_locations(struct exec_list *var_list, unsigned *size,
> continue;
> }
>
> - assigned_locations[var->data.location] = location;
> + for (unsigned i = 0; i < var_size; i++) {
> + assigned_locations[var->data.location + i] = location + i;
> + }
> +
> var->data.driver_location = location;
> - location += type_size(type);
> + location += var_size;
> }
>
> *size += location;
>
More information about the mesa-dev
mailing list