summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStuart Abercrombie <[email protected]>2011-12-02 11:29:38 -0800
committerEric Anholt <[email protected]>2011-12-02 15:28:44 -0800
commitaa010157a3f4fa1be7b85d476538bd5496e91004 (patch)
tree848ac21acdedca42488b3a56c224c9428aa8e850
parent079bb3fff7104782f2c921200e9a299c38a53ab6 (diff)
i965: Fix emit of a MOV with bad destination channel on gen6 math in FPs.
Previously a zero writemask would result in dst_chan == -1, meaning an unnecessary MOV with the destination register dictated by undefined memory contents would be emitted before returning. This caused intermittent GPU hangs, e.g. with glean/texCombine. Reviewed-by: Eric Anholt <[email protected]>
-rw-r--r--src/mesa/drivers/dri/i965/brw_wm_emit.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c
index b5a4a4f34da..5905ba9cd40 100644
--- a/src/mesa/drivers/dri/i965/brw_wm_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c
@@ -888,6 +888,11 @@ void emit_math1(struct brw_wm_compile *c,
BRW_MATH_SATURATE_NONE);
struct brw_reg src;
+ if (!(mask & WRITEMASK_XYZW))
+ return; /* Do not emit dead code */
+
+ assert(is_power_of_two(mask & WRITEMASK_XYZW));
+
if (intel->gen >= 6 && ((arg0[0].hstride == BRW_HORIZONTAL_STRIDE_0 ||
arg0[0].file != BRW_GENERAL_REGISTER_FILE) ||
arg0[0].negate || arg0[0].abs)) {
@@ -903,11 +908,6 @@ void emit_math1(struct brw_wm_compile *c,
src = arg0[0];
}
- if (!(mask & WRITEMASK_XYZW))
- return; /* Do not emit dead code */
-
- assert(is_power_of_two(mask & WRITEMASK_XYZW));
-
/* Send two messages to perform all 16 operations:
*/
brw_push_insn_state(p);