<div dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 17, 2015 at 6:04 PM, Francisco Jerez <span dir="ltr"><<a href="mailto:currojerez@riseup.net" target="_blank">currojerez@riseup.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 perfectly fine to read the second half of a register written with<br>
force_writemask_all from a first half MOV instruction or vice versa, and<br>
lower_load_payload shouldn't mark the whole MOV as belonging to the second<br>
half in that case.  Replicate the same metadata to both halves of the<br>
destination when writemasking is disabled.<br>
---<br>
 src/mesa/drivers/dri/i965/brw_fs.cpp | 20 +++++++++++++-------<br>
 1 file changed, 13 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
index 4a61943..d585a67 100644<br>
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp<br>
@@ -3059,9 +3059,11 @@ fs_visitor::lower_load_payload()<br>
       }<br>
<br>
       if (inst->dst.file == MRF || inst->dst.file == GRF) {<br>
-         bool force_sechalf = inst->force_sechalf;<br>
+         bool force_sechalf = inst->force_sechalf &&<br>
+                              !inst->force_writemask_all;<br>
          bool toggle_sechalf = inst->dst.width == 16 &&<br>
-                               type_sz(inst->dst.type) == 4;<br>
+                               type_sz(inst->dst.type) == 4 &&<br>
+                               !inst->force_writemask_all;<br>
          for (int i = 0; i < inst->regs_written; ++i) {<br>
             metadata[dst_reg + i].written = true;<br>
             metadata[dst_reg + i].force_sechalf = force_sechalf;<br>
@@ -3104,11 +3106,15 @@ fs_visitor::lower_load_payload()<br>
                   mov->force_writemask_all = metadata[src_reg].force_writemask_all;<br>
                   metadata[dst_reg] = metadata[src_reg];<br>
                   if (dst.width * type_sz(dst.type) > 32) {<br>
-                     assert((!metadata[src_reg].written ||<br>
-                             !metadata[src_reg].force_sechalf) &&<br>
-                            (!metadata[src_reg + 1].written ||<br>
-                             metadata[src_reg + 1].force_sechalf));<br>
-                     metadata[dst_reg + 1] = metadata[src_reg + 1];<br>
+                     if (metadata[src_reg].force_writemask_all) {<br>
+                        metadata[dst_reg + 1] = metadata[src_reg];<br>
+                     } else {<br>
+                        assert((!metadata[src_reg].written ||<br>
+                                !metadata[src_reg].force_sechalf) &&<br>
+                               (!metadata[src_reg + 1].written ||<br>
+                                metadata[src_reg + 1].force_sechalf));<br>
+                        metadata[dst_reg + 1] = metadata[src_reg + 1];<br>
+                     }<br>
                   }<br>
                } else {<br>
                   metadata[dst_reg].force_writemask_all = false;<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.1.3<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>
</font></span></blockquote></div><br></div>