diff options
author | Christoph Bumiller <[email protected]> | 2012-04-27 23:27:34 +0200 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2012-04-29 18:02:37 +0200 |
commit | d6ab3106cf7475cdaddf788a3e650bdd5833f73c (patch) | |
tree | f21a19f0f5323aaa92d419c25468a9b1b75d8f69 /src | |
parent | afcd7b5d1614a8a758ccb4353a9c31a601c9b9b4 (diff) |
nvc0/ir: try to use the optimal texture op mode
Don't really know what they are yet but for groups of textures, the
last one should use mode "p" and the others "t".
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp index c91c56c9c10..026a6a0ee99 100644 --- a/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp +++ b/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp @@ -965,13 +965,25 @@ void CodeEmitterNVC0::emitTEXCSAA(const TexInstruction *i) srcId(i->src(0), 20); } +static inline bool +isNextIndependentTex(const TexInstruction *i) +{ + if (!i->next || !isTextureOp(i->next->op)) + return false; + if (i->getDef(0)->interfers(i->next->getSrc(0))) + return false; + return !i->next->srcExists(1) || !i->getDef(0)->interfers(i->next->getSrc(1)); +} + void CodeEmitterNVC0::emitTEX(const TexInstruction *i) { code[0] = 0x00000006; - if (1) - code[0] |= 0x80; // normal/t/p mode = t, XXX: what is this ? + if (isNextIndependentTex(i)) + code[0] |= 0x080; // t mode + else + code[0] |= 0x100; // p mode if (i->tex.liveOnly) code[0] |= 1 << 9; @@ -1021,7 +1033,7 @@ CodeEmitterNVC0::emitTEX(const TexInstruction *i) if (i->tex.target.isShadow()) code[1] |= 1 << 24; - const int src1 = MAX2(i->predSrc + 1, 1); // if predSrc == 1, no 2nd src + const int src1 = (i->predSrc == 1) ? 2 : 1; // if predSrc == 1, !srcExists(2) if (i->srcExists(src1) && i->src(src1).getFile() == FILE_IMMEDIATE) { // lzero |