nvc0/ir: unset s/r indirect sources before moving everything

With the current logic, it's very likely that s/r indirect sources are
right after the "regular" ones. Unset them before moving the texture
arguments over rather than after, as one of those arguments would
likely have assumed one of the s/r positions.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
This commit is contained in:
Ilia Mirkin 2014-07-06 03:06:55 -04:00
parent 0bdc3e1afd
commit 9807a8ddaf
1 changed files with 10 additions and 9 deletions

View File

@ -600,14 +600,19 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
if (i->tex.target.isArray() || i->tex.rIndirectSrc >= 0 || i->tex.sIndirectSrc >= 0) {
LValue *src = new_LValue(func, FILE_GPR); // 0xttxsaaaa
Value *ticRel = i->getIndirectR();
Value *tscRel = i->getIndirectS();
if (ticRel)
i->setSrc(i->tex.rIndirectSrc, NULL);
if (tscRel)
i->setSrc(i->tex.sIndirectSrc, NULL);
Value *arrayIndex = i->tex.target.isArray() ? i->getSrc(lyr) : NULL;
for (int s = dim; s >= 1; --s)
i->setSrc(s, i->getSrc(s - 1));
i->setSrc(0, arrayIndex);
Value *ticRel = i->getIndirectR();
Value *tscRel = i->getIndirectS();
if (arrayIndex) {
int sat = (i->op == OP_TXF) ? 1 : 0;
DataType sTy = (i->op == OP_TXF) ? TYPE_U32 : TYPE_F32;
@ -616,14 +621,10 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
bld.loadImm(src, 0);
}
if (ticRel) {
i->setSrc(i->tex.rIndirectSrc, NULL);
if (ticRel)
bld.mkOp3(OP_INSBF, TYPE_U32, src, ticRel, bld.mkImm(0x0917), src);
}
if (tscRel) {
i->setSrc(i->tex.sIndirectSrc, NULL);
if (tscRel)
bld.mkOp3(OP_INSBF, TYPE_U32, src, tscRel, bld.mkImm(0x0710), src);
}
i->setSrc(0, src);
}