<div dir="ltr">Ugh... This patch, though obviously correct if taken on its own, doesn't wok.  The double_inputs_read field is more subtle and bonkers than I thought.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Dec 2, 2017 at 9:32 AM, Jason Ekstrand <span dir="ltr"><<a href="mailto:jason@jlekstrand.net" target="_blank">jason@jlekstrand.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">It's a little sketchy to put the logic in set_io_mask but due to a<br>
detail of the GLSL spec, it's safe to check for 64-bit without knowing<br>
the full access chain.  This fixes a bug where try_mask_partial_io<br>
succeeded at marking a portion of the input as used but then we came<br>
along and marked the whole thing in double_inputs_read.  By putting it<br>
in set_io_mask, we get the correct flagging even for partial reads.<br>
<br>
Bugzilla: <a href="https://bugs.freedesktop.org/show_bug.cgi?id=103241" rel="noreferrer" target="_blank">https://bugs.freedesktop.org/<wbr>show_bug.cgi?id=103241</a><br>
Cc: <a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.<wbr>org</a><br>
Cc: Timothy Arceri <<a href="mailto:tarceri@itsqueeze.com">tarceri@itsqueeze.com</a>><br>
Cc: Alejandro Piñeiro <<a href="mailto:apinheiro@igalia.com">apinheiro@igalia.com</a>><br>
---<br>
 src/compiler/nir/nir_gather_<wbr>info.c | 28 +++++++++++++++++-----------<br>
 1 file changed, 17 insertions(+), 11 deletions(-)<br>
<br>
diff --git a/src/compiler/nir/nir_gather_<wbr>info.c b/src/compiler/nir/nir_gather_<wbr>info.c<br>
index 9469396..bab37f3 100644<br>
--- a/src/compiler/nir/nir_gather_<wbr>info.c<br>
+++ b/src/compiler/nir/nir_gather_<wbr>info.c<br>
@@ -54,6 +54,23 @@ set_io_mask(nir_shader *shader, nir_variable *var, int offset, int len,<br>
          else<br>
             shader->info.inputs_read |= bitfield;<br>
<br>
+         /* From the GLSL 4.60 spec, section 4.3.4 "Input Variables":<br>
+          *<br>
+          *    It is a compile-time error to declare a vertex shader input<br>
+          *    containing any of the  following:<br>
+          *<br>
+          *     - A Boolean type (bool, bvec2, bvec3, bvec4)<br>
+          *     - An opaque type<br>
+          *     - A structure<br>
+          *<br>
+          * Therefore, when looking for 64-bit attributes, we need only<br>
+          * consider arrays of vectors.<br>
+          */<br>
+         if (shader->info.stage == MESA_SHADER_VERTEX &&<br>
+             glsl_type_is_dual_slot(glsl_<wbr>without_array(var->type))) {<br>
+            shader->info.double_inputs_<wbr>read |= bitfield;<br>
+         }<br>
+<br>
          if (shader->info.stage == MESA_SHADER_FRAGMENT) {<br>
             shader->info.fs.uses_sample_<wbr>qualifier |= var->data.sample;<br>
          }<br>
@@ -226,17 +243,6 @@ gather_intrinsic_info(nir_<wbr>intrinsic_instr *instr, nir_shader *shader)<br>
<br>
          if (!try_mask_partial_io(shader, instr->variables[0], is_output_read))<br>
             mark_whole_variable(shader, var, is_output_read);<br>
-<br>
-         /* We need to track which input_reads bits correspond to a<br>
-          * dvec3/dvec4 input attribute */<br>
-         if (shader->info.stage == MESA_SHADER_VERTEX &&<br>
-             var->data.mode == nir_var_shader_in &&<br>
-             glsl_type_is_dual_slot(glsl_<wbr>without_array(var->type))) {<br>
-            for (uint i = 0; i < glsl_count_attribute_slots(<wbr>var->type, false); i++) {<br>
-               int idx = var->data.location + i;<br>
-               shader->info.double_inputs_<wbr>read |= BITFIELD64_BIT(idx);<br>
-            }<br>
-         }<br>
       }<br>
       break;<br>
    }<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0.400.gff86faf<br>
<br>
</font></span></blockquote></div><br></div>