nvc0: patch up TEX cases with 5 or 6 sources on nve4
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 6 Apr 2013 15:40:02 +0000 (17:40 +0200)
committerChristoph Bumiller <christoph.bumiller@speed.at>
Fri, 12 Apr 2013 09:41:35 +0000 (11:41 +0200)
Hackishly fixes alignment requirement of 2nd tuple for now.

src/gallium/drivers/nvc0/codegen/nv50_ir_lowering_nvc0.cpp

index 5f0f2e72231f102e332885298b782d0c35b10134..c459d60759b33398d84aec7efbb5ffa00ec460bc 100644 (file)
@@ -728,13 +728,31 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
    if (i->tex.useOffsets) {
       uint32_t value = 0;
       int n, c;
-      int s = i->srcCount(0xff);
+      int s = i->srcCount(0xff, true);
+      if (i->srcExists(s)) // move potential predicate out of the way
+         i->moveSources(s, 1);
       for (n = 0; n < i->tex.useOffsets; ++n)
          for (c = 0; c < 3; ++c)
             value |= (i->tex.offset[n][c] & 0xf) << (n * 12 + c * 4);
       i->setSrc(s, bld.loadImm(NULL, value));
    }
 
+   if (prog->getTarget()->getChipset() >= NVISA_GK104_CHIPSET) {
+      //
+      // If TEX requires more than 4 sources, the 2nd register tuple must be
+      // aligned to 4, even if it consists of just a single 4-byte register.
+      //
+      // XXX HACK: We insert 0 sources to avoid the 5 or 6 regs case.
+      //
+      int s = i->srcCount(0xff, true);
+      if (s > 4 && s < 7) {
+         if (i->srcExists(s)) // move potential predicate out of the way
+            i->moveSources(s, 7 - s);
+         while (s < 7)
+            i->setSrc(s++, bld.loadImm(NULL, 0));
+      }
+   }
+
    return true;
 }