i965/fs: Fix projector==1.0 optimization pre-gen6.
authorEric Anholt <eric@anholt.net>
Fri, 6 Jan 2012 01:07:55 +0000 (17:07 -0800)
committerEric Anholt <eric@anholt.net>
Mon, 9 Jan 2012 18:59:38 +0000 (10:59 -0800)
The optimization was supposed to turn an attribute component that was
always 1.0 into a mov of 1.0.  But by leaving loop this patch removes
out of that test, we applied the projection correction to the 1.0 and
got some other value, breaking openarena once it was converted to
using the new compiler backend.

Originally this hunk was separate from the former loop to make the
generated instructions slightly better pipelined.  We now have
automatic instruction scheduling to handle that, and the generated
instruction sequence looked the same to me after this change (except
for the bugfix).

src/mesa/drivers/dri/i965/brw_fs.cpp

index b6aa60e84f3270fb95745c6031d8c501e62d5dbf..40327ace2cb8fbdb0749e87e1b1e372eb603ebd8 100644 (file)
@@ -491,17 +491,13 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
                   emit(FS_OPCODE_LINTERP, attr,
                        this->delta_x[barycoord_mode],
                        this->delta_y[barycoord_mode], fs_reg(interp));
+                 if (intel->gen < 6) {
+                    emit(BRW_OPCODE_MUL, attr, attr, this->pixel_w);
+                 }
               }
               attr.reg_offset++;
            }
 
-           if (intel->gen < 6) {
-              attr.reg_offset -= type->vector_elements;
-              for (unsigned int k = 0; k < type->vector_elements; k++) {
-                 emit(BRW_OPCODE_MUL, attr, attr, this->pixel_w);
-                 attr.reg_offset++;
-              }
-           }
         }
         location++;
       }