i965: Don't try to emit interpolation for unused varying slots.
authorEric Anholt <eric@anholt.net>
Tue, 28 Sep 2010 21:53:36 +0000 (14:53 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 28 Sep 2010 21:53:36 +0000 (14:53 -0700)
Fixes:
glsl-fs-varying-array
glsl-texcoord-array
glsl-texcoord-array-2
glsl-vs-varying-array

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

index fbd2464357d2fe8763d654f42e5b8f8b3320bf14..feb0cc156cb4657e6e779d303d1f667eeff4a722 100644 (file)
@@ -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,