OSDN Git Service

nvc0/ir: try to use the optimal texture op mode
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 27 Apr 2012 21:27:34 +0000 (23:27 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sun, 29 Apr 2012 16:02:37 +0000 (18:02 +0200)
Don't really know what they are yet but for groups of textures, the
last one should use mode "p" and the others "t".

src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp

index c91c56c..026a6a0 100644 (file)
@@ -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