diff options
Diffstat (limited to 'src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp')
-rw-r--r-- | src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp | 37 |
1 files changed, 29 insertions, 8 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 c7e9063fe65..dc1eb5e80a5 100644 --- a/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp +++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp @@ -739,21 +739,42 @@ NVC0LoweringPass::handleTEX(TexInstruction *i) // offset is last source (lod 1st, dc 2nd) if (i->tex.useOffsets) { - uint32_t value = 0; int n, c; int s = i->srcCount(0xff, true); if (i->srcExists(s)) // move potential predicate out of the way i->moveSources(s, 1); + if (i->tex.useOffsets == 4 && i->srcExists(s + 1)) + i->moveSources(s + 1, 1); if (i->op == OP_TXG) { - assert(i->tex.useOffsets == 1); - for (c = 0; c < 3; ++c) - value |= (i->tex.offset[0][c] & 0xff) << (c * 8); + // Either there is 1 offset, which goes into the 2 low bytes of the + // first source, or there are 4 offsets, which go into 2 sources (8 + // values, 1 byte each). + Value *offs[2] = {NULL, NULL}; + for (n = 0; n < i->tex.useOffsets; n++) { + for (c = 0; c < 2; ++c) { + if ((n % 2) == 0 && c == 0) + offs[n / 2] = i->offset[n][c].get(); + else + bld.mkOp3(OP_INSBF, TYPE_U32, + offs[n / 2], + i->offset[n][c].get(), + bld.mkImm(0x800 | ((n * 16 + c * 8) % 32)), + offs[n / 2]); + } + } + i->setSrc(s, offs[0]); + if (offs[1]) + i->setSrc(s + 1, offs[1]); } else { - for (n = 0; n < i->tex.useOffsets; ++n) - for (c = 0; c < 3; ++c) - value |= (i->tex.offset[n][c] & 0xf) << (n * 12 + c * 4); + unsigned imm = 0; + assert(i->tex.useOffsets == 1); + for (c = 0; c < 3; ++c) { + ImmediateValue val; + assert(i->offset[0][c].getImmediate(val)); + imm |= (val.reg.data.u32 & 0xf) << (c * 4); + } + i->setSrc(s, bld.loadImm(NULL, imm)); } - i->setSrc(s, bld.loadImm(NULL, value)); } if (chipset >= NVISA_GK104_CHIPSET) { |