From: Timothy Arceri Date: Wed, 21 Mar 2018 00:27:19 +0000 (+1100) Subject: st/glsl_to_nir: fix driver location for dual-slot packed doubles X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fc51fdbcdec60f96b9bf593d74beb42e465cc277;p=mesa.git st/glsl_to_nir: fix driver location for dual-slot packed doubles Reviewed-by: Marek Olšák --- diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 9bb99f30610..acc8942bfeb 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;