i965: vs optimization fix: Check val.{negate,abs} in accumulator_contains()
authorPaul Berry <stereotype441@gmail.com>
Fri, 22 Jul 2011 21:05:52 +0000 (14:05 -0700)
committerPaul Berry <stereotype441@gmail.com>
Mon, 25 Jul 2011 18:40:53 +0000 (11:40 -0700)
When emitting a MAC instruction in a vertex shader, brw_vs_emit()
calls accumulator_contains() to determine whether the accumulator
already contains the appropriate addend; if it does, then we can avoid
emitting an unnecessary MOV instruction.

However, accumulator_contains() wasn't checking the val.negate or
val.abs flags.  As a result, if the desired value was the negation, or
the absolute value, of what was already in the accumulator, we would
generate an incorrect shader.

Fixes piglit test vs-refract-vec4-vec4-float.

Tested on Gen5 and Gen6.

Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_vs_emit.c

index d8cb0f7cb6971345ef7390ceeb6e19f92155e990..674a994bace565d741c25f1b86f6ce2f5d3f6226 100644 (file)
@@ -1821,6 +1821,9 @@ accumulator_contains(struct brw_vs_compile *c, struct brw_reg val)
    if (val.address_mode != BRW_ADDRESS_DIRECT)
       return GL_FALSE;
 
+   if (val.negate || val.abs)
+      return GL_FALSE;
+
    switch (prev_insn->header.opcode) {
    case BRW_OPCODE_MOV:
    case BRW_OPCODE_MAC: