i965/fs: Port texture projection avoidance optimization from the old backend.
authorEric Anholt <eric@anholt.net>
Fri, 22 Jul 2011 22:56:46 +0000 (15:56 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 29 Jul 2011 19:17:03 +0000 (12:17 -0700)
This is part of fixing a ~1% performance regression in OpenArena when
changing the fixed function fragment shader to using the new backend.
Right now this just avoids the LINTERP of the projector, not the math
using it.

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

index 15475fbae2f9cc90ca4ba9eb62aa7c82b06bd490..9c3180fbc1c10743cc7d039d7366799e625870c9 100644 (file)
@@ -463,9 +463,21 @@ fs_visitor::emit_general_interpolation(ir_variable *ir)
         } else {
            /* Perspective interpolation case. */
            for (unsigned int k = 0; k < type->vector_elements; k++) {
-              struct brw_reg interp = interp_reg(location, k);
-              emit(FS_OPCODE_LINTERP, attr,
-                   this->delta_x, this->delta_y, fs_reg(interp));
+              /* FINISHME: At some point we probably want to push
+               * this farther by giving similar treatment to the
+               * other potentially constant components of the
+               * attribute, as well as making brw_vs_constval.c
+               * handle varyings other than gl_TexCoord.
+               */
+              if (location >= FRAG_ATTRIB_TEX0 &&
+                  location <= FRAG_ATTRIB_TEX7 &&
+                  k == 3 && !(c->key.proj_attrib_mask & (1 << location))) {
+                 emit(BRW_OPCODE_MOV, attr, fs_reg(1.0f));
+              } else {
+                 struct brw_reg interp = interp_reg(location, k);
+                 emit(FS_OPCODE_LINTERP, attr,
+                      this->delta_x, this->delta_y, fs_reg(interp));
+              }
               attr.reg_offset++;
            }