diff options
author | Ilia Mirkin <[email protected]> | 2014-07-06 03:06:55 -0400 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2014-07-09 21:10:24 -0400 |
commit | 9807a8ddaf3d0b6d8bf8b3e7c0b01cc4c7db4f30 (patch) | |
tree | 08b99828187e0107d5ab8d2d85cea3c7b044093d /src | |
parent | 0bdc3e1afda111c5741a699da3ff891fedfe89de (diff) |
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 <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp index e6bf1a0740c..c102bc5214c 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -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); } |