From: Stuart Abercrombie Date: Fri, 2 Dec 2011 19:29:38 +0000 (-0800) Subject: i965: Fix emit of a MOV with bad destination channel on gen6 math in FPs. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=aa010157a3f4fa1be7b85d476538bd5496e91004;p=mesa.git 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 --- 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);