From: Eric Anholt Date: Wed, 10 Mar 2010 23:44:32 +0000 (-0800) Subject: i965: When doing a swizzled kill pixel, don't do redundant channel compares. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=52cea5090ceb56105464d60b989c2c36ec9c4b16;p=mesa.git i965: When doing a swizzled kill pixel, don't do redundant channel compares. This was obvious when looking at the compiled output of ETQW's shaders. --- diff --git a/src/mesa/drivers/dri/i965/brw_wm_emit.c b/src/mesa/drivers/dri/i965/brw_wm_emit.c index b1695760174..3a4057bb6b8 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_emit.c +++ b/src/mesa/drivers/dri/i965/brw_wm_emit.c @@ -1110,11 +1110,19 @@ static void emit_kil( struct brw_wm_compile *c, { struct brw_compile *p = &c->func; struct brw_reg r0uw = retype(brw_vec1_grf(0, 0), BRW_REGISTER_TYPE_UW); - GLuint i; - - /* XXX - usually won't need 4 compares! - */ + GLuint i, j; + for (i = 0; i < 4; i++) { + /* Check if we've already done the comparison for this reg + * -- common when someone does KIL TEMP.wwww. + */ + for (j = 0; j < i; j++) { + if (memcmp(&arg0[j], &arg0[i], sizeof(arg0[0])) == 0) + break; + } + if (j != i) + continue; + brw_push_insn_state(p); brw_CMP(p, brw_null_reg(), BRW_CONDITIONAL_GE, arg0[i], brw_imm_f(0)); brw_set_predicate_control_flag_value(p, 0xff);