summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2012-01-05 17:07:55 -0800
committerEric Anholt <[email protected]>2012-01-09 10:59:38 -0800
commit30f86aec01e1e1df4265d10a4618e34e9b8fec95 (patch)
tree32624cf84882601987e2078589be594f16b4a9b0
parent83dc891b41c0224f5ba3624b3e3560129e644e28 (diff)
i965/fs: Fix projector==1.0 optimization pre-gen6.
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).
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index b6aa60e84f3..40327ace2cb 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -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++;
}