nv50/ir: fix textureGrad with offsets and in non-FPs
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 11 Oct 2011 15:58:14 +0000 (17:58 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 21 Oct 2011 21:00:39 +0000 (23:00 +0200)
src/gallium/drivers/nv50/codegen/nv50_ir.h
src/gallium/drivers/nv50/codegen/nv50_ir_ra.cpp
src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp
src/gallium/drivers/nvc0/codegen/nv50_ir_lowering_nvc0.cpp

index 88306087a981114560e8f83cd0d2cedfbaa07cf4..cf7bd3c0d05e5f22c0c9cd696c60b36eb587d004 100644 (file)
@@ -803,6 +803,7 @@ public:
 
       bool liveOnly; // only execute on live pixels of a quad (optimization)
       bool levelZero;
+      bool derivAll;
 
       int8_t useOffsets; // 0, 1, or 4 for textureGatherOffsets
       int8_t offset[4][3];
index ea5f4723f3cf6ed2cf768a4af030544ecaf5cd3a..ff6d9666a1903d619a72b43f26c7d3618d02fc30 100644 (file)
@@ -933,6 +933,8 @@ RegAlloc::InsertConstraintsPass::visit(BasicBlock *bb)
             if (!tex->tex.target.isArray() &&
                 (tex->tex.rIndirectSrc >= 0 || tex->tex.sIndirectSrc >= 0))
                ++s;
+           if (tex->op == OP_TXD && tex->tex.useOffsets)
+               ++s;
             n = tex->srcCount(0xff) - s;
             assert(n <= 4);
          }
index 13f5d2f7c72320fa504ad9b74682abe89e079671..ecff42106da30c920642040b5b7c91fb30bc722f 100644 (file)
@@ -968,6 +968,9 @@ CodeEmitterNVC0::emitTEX(const TexInstruction *i)
       code[1] |= 0x02000000;
    }
 
+   if (i->tex.derivAll)
+      code[1] |= 1 << 13;
+
    defId(i->def[0], 14);
    srcId(i->src[0], 20);
 
@@ -992,6 +995,8 @@ CodeEmitterNVC0::emitTEX(const TexInstruction *i)
       code[1] |= 1 << 24;
 
    int src1 = i->tex.target.getArgCount();
+   if (i->op == OP_TXD && i->tex.useOffsets)
+      ++src1;
 
    if (i->src[src1].getFile() == FILE_IMMEDIATE) { // lzero
       if (i->op == OP_TXL)
@@ -1052,6 +1057,9 @@ CodeEmitterNVC0::emitQUADOP(const Instruction *i, uint8_t qOp, uint8_t laneMask)
    srcId(i->src[0], 20);
    srcId(i->srcExists(1) ? i->src[1] : i->src[0], 26);
 
+   if (i->op == OP_QUADOP && progType != Program::TYPE_FRAGMENT)
+      code[0] |= 1 << 9; // dall
+
    emitPredicate(i);
 }
 
index 2ef5a87c47d132931f89d67cb33155e4dd5ea269..515379726444f80960736114e3e46bcd055b5cf3 100644 (file)
@@ -418,14 +418,14 @@ NVC0LoweringPass::handleTXD(TexInstruction *txd)
    int arg = txd->tex.target.getDim() + txd->tex.target.isArray();
 
    handleTEX(txd);
-   if (txd->src[arg].exists())
+   while (txd->src[arg].exists())
       ++arg;
 
+   txd->tex.derivAll = true;
    if (dim > 2 || txd->tex.target.isShadow())
       return handleManualTXD(txd);
 
-   // at most s/t/array, x, y, offset
-   assert(arg <= 4 && !txd->src[arg].exists());
+   assert(arg <= 4); // at most s/t/array, x, y, offset
 
    for (int c = 0; c < dim; ++c) {
       txd->src[arg + c * 2 + 0].set(txd->dPdx[c]);