<div dir="ltr"><div><div>For the series:<br><br></div>Reviewed-by: Marek Olšák <<a href="mailto:marek.olsak@amd.com">marek.olsak@amd.com</a>><br><br></div>Marek<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 22, 2018 at 9:49 PM, Timothy Arceri <span dir="ltr"><<a href="mailto:tarceri@itsqueeze.com" target="_blank">tarceri@itsqueeze.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Fixes piglit test:<br>
tests/spec/arb_enhanced_<wbr>layouts/execution/component-<wbr>layout/vs-fs-array-interleave-<wbr>range.shader_test<br>
---<br>
 src/mesa/state_tracker/st_<wbr>glsl_to_nir.cpp | 24 +++++++++++++++++++++++-<br>
 1 file changed, 23 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/src/mesa/state_tracker/st_<wbr>glsl_to_nir.cpp b/src/mesa/state_tracker/st_<wbr>glsl_to_nir.cpp<br>
index e0467f205d3..4ded4ec60f5 100644<br>
--- a/src/mesa/state_tracker/st_<wbr>glsl_to_nir.cpp<br>
+++ b/src/mesa/state_tracker/st_<wbr>glsl_to_nir.cpp<br>
@@ -133,6 +133,7 @@ st_nir_assign_var_locations(<wbr>struct exec_list *var_list, unsigned *size,<br>
  Â  const int base = stage == MESA_SHADER_FRAGMENT ?<br>
  Â  Â  Â (int) FRAG_RESULT_DATA0 : (int) VARYING_SLOT_VAR0;<br>
<br>
+  Â int UNUSED last_loc = 0;<br>
  Â  nir_foreach_variable(var, var_list) {<br>
<br>
  Â  Â  Â const struct glsl_type *type = var->type;<br>
@@ -164,8 +165,29 @@ st_nir_assign_var_locations(<wbr>struct exec_list *var_list, unsigned *size,<br>
  Â  Â  Â  * we may have already have processed this location.<br>
  Â  Â  Â  */<br>
  Â  Â  Â if (processed) {<br>
-  Â  Â  Â  Â var->data.driver_location = assigned_locations[var->data.<wbr>location];<br>
+  Â  Â  Â  Â unsigned driver_location = assigned_locations[var->data.<wbr>location];<br>
+  Â  Â  Â  Â var->data.driver_location = driver_location;<br>
  Â  Â  Â  Â  *size += type_size(type);<br>
+<br>
+  Â  Â  Â  Â /* An array may be packed such that is crosses multiple other arrays<br>
+  Â  Â  Â  Â  * or variables, we need to make sure we have allocated the elements<br>
+  Â  Â  Â  Â  * consecutively if the previously proccessed var was shorter than<br>
+  Â  Â  Â  Â  * the current array we are processing.<br>
+  Â  Â  Â  Â  *<br>
+  Â  Â  Â  Â  * NOTE: The code below assumes the var list is ordered in ascending<br>
+  Â  Â  Â  Â  * location order.<br>
+  Â  Â  Â  Â  */<br>
+  Â  Â  Â  Â assert(last_loc <= var->data.location);<br>
+  Â  Â  Â  Â last_loc = var->data.location;<br>
+  Â  Â  Â  Â unsigned last_slot_location = driver_location + var_size;<br>
+  Â  Â  Â  Â if (last_slot_location > location) {<br>
+  Â  Â  Â  Â  Â  unsigned num_unallocated_slots = last_slot_location - location;<br>
+  Â  Â  Â  Â  Â  unsigned first_unallocated_slot = var_size - num_unallocated_slots;<br>
+  Â  Â  Â  Â  Â  for (unsigned i = first_unallocated_slot; i < num_unallocated_slots; i++) {<br>
+  Â  Â  Â  Â  Â  Â  Â assigned_locations[var->data.<wbr>location + i] = location;<br>
+  Â  Â  Â  Â  Â  Â  Â location++;<br>
+  Â  Â  Â  Â  Â  }<br>
+  Â  Â  Â  Â }<br>
  Â  Â  Â  Â  continue;<br>
  Â  Â  Â }<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
2.14.3<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div>