nvc0/ir: fix txq on indirect samplers
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 18 Jul 2015 20:43:17 +0000 (16:43 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 18 Jul 2015 21:34:48 +0000 (17:34 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: mesa-stable@lists.freedesktop.org
src/gallium/drivers/nouveau/codegen/nv50_ir_from_tgsi.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp

index 018a1ec6d1d85d4a0083e7510e3144e54900ba65..e5164ca0d181b1c27ea25f2ef2039b063d83b99c 100644 (file)
@@ -1728,7 +1728,7 @@ Converter::handleTXQ(Value *dst0[4], enum TexQuery query)
    }
    tex->setSrc((c = 0), fetchSrc(0, 0)); // mip level
 
-   setTexRS(tex, c, 1, -1);
+   setTexRS(tex, ++c, 1, -1);
 
    bb->insertTail(tex);
 }
index 7a5d1ce0299d2bc3c0d06f91bb66b212e8f1bfb8..da364f2ad0465cd6c3b0327e9efd74cde3edde21 100644 (file)
@@ -956,7 +956,61 @@ NVC0LoweringPass::handleTXD(TexInstruction *txd)
 bool
 NVC0LoweringPass::handleTXQ(TexInstruction *txq)
 {
-   // TODO: indirect resource/sampler index
+   if (txq->tex.rIndirectSrc < 0 && txq->tex.sIndirectSrc < 0)
+      return true;
+
+   Value *ticRel = txq->getIndirectR();
+   Value *tscRel = txq->getIndirectS();
+   const int chipset = prog->getTarget()->getChipset();
+
+   txq->setIndirectS(NULL);
+   txq->tex.sIndirectSrc = -1;
+
+   if (chipset < NVISA_GK104_CHIPSET) {
+      LValue *src = new_LValue(func, FILE_GPR); // 0xttxsaaaa
+
+      if (ticRel) {
+         txq->setSrc(txq->tex.rIndirectSrc, NULL);
+         if (txq->tex.r)
+            ticRel = bld.mkOp2v(OP_ADD, TYPE_U32, bld.getScratch(),
+                                ticRel, bld.mkImm(txq->tex.r));
+      }
+      if (tscRel) {
+         txq->setSrc(txq->tex.sIndirectSrc, NULL);
+         if (txq->tex.s)
+            tscRel = bld.mkOp2v(OP_ADD, TYPE_U32, bld.getScratch(),
+                                tscRel, bld.mkImm(txq->tex.s));
+      }
+
+      bld.loadImm(src, 0);
+
+      if (ticRel)
+         bld.mkOp3(OP_INSBF, TYPE_U32, src, ticRel, bld.mkImm(0x0917), src);
+      if (tscRel)
+         bld.mkOp3(OP_INSBF, TYPE_U32, src, tscRel, bld.mkImm(0x0710), src);
+
+      txq->moveSources(0, 1);
+      txq->setSrc(0, src);
+   } else {
+      // XXX this ignores tsc, and assumes a 1:1 mapping
+      assert(txq->tex.rIndirectSrc >= 0);
+      Value *hnd = loadTexHandle(
+            bld.mkOp2v(OP_SHL, TYPE_U32, bld.getSSA(),
+                       txq->getIndirectR(), bld.mkImm(2)),
+            txq->tex.r);
+      txq->tex.r = 0xff;
+      txq->tex.s = 0x1f;
+
+      if (chipset < NVISA_GM107_CHIPSET) {
+         txq->setIndirectR(NULL);
+         txq->moveSources(0, 1);
+         txq->setSrc(0, hnd);
+         txq->tex.rIndirectSrc = 0;
+      } else {
+         txq->setIndirectR(hnd);
+      }
+   }
+
    return true;
 }