<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>