summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTimothy Arceri <[email protected]>2018-03-21 11:27:19 +1100
committerTimothy Arceri <[email protected]>2018-03-28 09:59:37 +1100
commitfc51fdbcdec60f96b9bf593d74beb42e465cc277 (patch)
tree47556b29a890e934cda8c3f7034596f7508bf437 /src
parent47eee04556c75075145fbdd0ec50844dcf080d17 (diff)
st/glsl_to_nir: fix driver location for dual-slot packed doubles
Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/state_tracker/st_glsl_to_nir.cpp22
1 files 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 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;