<p dir="ltr">I gave you an back on 3; I'll let Eric actually review it.  The rest are</p>
<p dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>></p>
<div class="gmail_quote">On Mar 6, 2015 2:18 AM, "Kenneth Graunke" <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Piglit's spec/glsl-1.20/compiler/structure-and-array-operations/<br>
array-selection.vert test contains the following code:<br>
<br>
   gl_Position = (pick_from_a_or_b ? a : b)[i];<br>
<br>
where "a" and "b" are uniform vec4[2] variables.<br>
<br>
ast_to_hir creates a temporary vec4[2] variable, conditional_tmp, and<br>
generates an if-block to copy one or the other:<br>
<br>
   (declare (temporary) (array vec4 2) conditional_tmp)<br>
   (if (var_ref pick_from_a_or_b)<br>
     ((assign () (var_ref conditional_tmp) (var_ref a)))<br>
     ((assign () (var_ref conditional_tmp) (var_ref b))))<br>
<br>
However, we failed to update max_array_access for "a" and "b", so it<br>
remained 0 - here, the whole array is being accessed.  At link time,<br>
update_array_sizes() used this bogus information to change the types<br>
of "a" and "b" to vec4[1].  We then had assignments from a vec4[1] to<br>
a vec4[2], which is highly illegal.<br>
<br>
This tripped assertions in nir_split_var_copies with scalar VS.<br>
<br>
Signed-off-by: Kenneth Graunke <<a href="mailto:kenneth@whitecape.org">kenneth@whitecape.org</a>><br>
Cc: <a href="mailto:mesa-stable@lists.freedesktop.org">mesa-stable@lists.freedesktop.org</a><br>
---<br>
 src/glsl/ast_to_hir.cpp | 6 ++++++<br>
 1 file changed, 6 insertions(+)<br>
<br>
diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp<br>
index acb5c76..d387b2e 100644<br>
--- a/src/glsl/ast_to_hir.cpp<br>
+++ b/src/glsl/ast_to_hir.cpp<br>
@@ -1617,6 +1617,12 @@ ast_expression::do_hir(exec_list *instructions,<br>
           && cond_val != NULL) {<br>
          result = cond_val->value.b[0] ? op[1] : op[2];<br>
       } else {<br>
+         /* The copy to conditional_tmp reads the whole array. */<br>
+         if (type->is_array()) {<br>
+            mark_whole_array_access(op[1]);<br>
+            mark_whole_array_access(op[2]);<br>
+         }<br>
+<br>
          ir_variable *const tmp =<br>
             new(ctx) ir_variable(type, "conditional_tmp", ir_var_temporary);<br>
          instructions->push_tail(tmp);<br>
--<br>
2.2.1<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</blockquote></div>