summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2010-09-28 14:53:36 -0700
committerEric Anholt <[email protected]>2010-09-28 14:53:36 -0700
commit17f3b8097d01a63917afaaefccd6eea070271652 (patch)
treed1e98a335547fd722e71eca5d3798dd0ca93cb13
parent5272c6a7a23ba74c696608fc2cb07fbfaf9e822a (diff)
i965: Don't try to emit interpolation for unused varying slots.
Fixes: glsl-fs-varying-array glsl-texcoord-array glsl-texcoord-array-2 glsl-vs-varying-array
-rw-r--r--src/mesa/drivers/dri/i965/brw_fs.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index fbd2464357d..feb0cc156cb 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -677,6 +677,15 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
int location = ir->location;
for (unsigned int i = 0; i < array_elements; i++) {
for (unsigned int j = 0; j < type->matrix_columns; j++) {
+ if (!(fp->Base.InputsRead & BITFIELD64_BIT(location))) {
+ /* If there's no incoming setup data for this slot, don't
+ * emit interpolation for it (since it's not used, and
+ * we'd fall over later trying to find the setup data.
+ */
+ attr.reg_offset += type->vector_elements;
+ continue;
+ }
+
for (unsigned int c = 0; c < type->vector_elements; c++) {
struct brw_reg interp = interp_reg(location, c);
emit(fs_inst(FS_OPCODE_LINTERP,