nvc0/ir: fix lowering of textureGrad

This commit is contained in:
Christoph Bumiller
2012-05-05 13:30:03 +02:00
parent 9dfac63ae0
commit 38a20281fc
3 changed files with 13 additions and 12 deletions
@@ -1819,8 +1819,8 @@ RegAlloc::InsertConstraintsPass::texConstraintNVE0(TexInstruction *tex)
int n = tex->srcCount(0xff, true);
if (n > 4) {
condenseSrcs(tex, 0, 3);
if (n > 5)
condenseSrcs(tex, 4, n - 1);
if (n > 5) // NOTE: first call modified positions already
condenseSrcs(tex, 4 - (4 - 1), n - 1 - (4 - 1));
} else
if (n > 1) {
condenseSrcs(tex, 0, n - 1);
@@ -1850,8 +1850,8 @@ RegAlloc::InsertConstraintsPass::texConstraintNVC0(TexInstruction *tex)
if (s > 1)
condenseSrcs(tex, 0, s - 1);
if (n > 1)
condenseSrcs(tex, s, s + (n - 1));
if (n > 1) // NOTE: first call modified positions already
condenseSrcs(tex, 1, n);
condenseDefs(tex);
}
@@ -1020,7 +1020,7 @@ CodeEmitterNVC0::emitTEX(const TexInstruction *i)
code[1] |= 0x02000000;
}
if (i->tex.derivAll)
if (i->op != OP_TXD && i->tex.derivAll)
code[1] |= 1 << 13;
defId(i->def(0), 14);
@@ -749,21 +749,22 @@ bool
NVC0LoweringPass::handleTXD(TexInstruction *txd)
{
int dim = txd->tex.target.getDim();
int arg = txd->tex.target.getDim() + txd->tex.target.isArray();
int arg = txd->tex.target.getArgCount();
handleTEX(txd);
while (txd->src(arg).exists())
while (txd->srcExists(arg))
++arg;
txd->tex.derivAll = true;
if (dim > 2 || txd->tex.target.isShadow())
if (dim > 2 ||
txd->tex.target.isCube() ||
arg > 4 ||
txd->tex.target.isShadow())
return handleManualTXD(txd);
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]);
txd->src(arg + c * 2 + 1).set(txd->dPdy[c]);
txd->setSrc(arg + c * 2 + 0, txd->dPdx[c]);
txd->setSrc(arg + c * 2 + 1, txd->dPdy[c]);
txd->dPdx[c].set(NULL);
txd->dPdy[c].set(NULL);
}