nvc0: add support for texture gather
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 4 Apr 2014 05:11:23 +0000 (07:11 +0200)
committerIlia Mirkin <imirkin@alum.mit.edu>
Mon, 7 Apr 2014 05:06:19 +0000 (01:06 -0400)
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nvc0.cpp
src/gallium/drivers/nouveau/nvc0/nvc0_screen.c

index b716d5457be9f94c4d726741bcd786e2a9d071b3..a4b50ee2082d30d71426136b8202b9ec30ed9ace 100644 (file)
@@ -984,6 +984,9 @@ CodeEmitterGK110::emitTEX(const TexInstruction *i)
       case OP_TXF:
          code[1] = 0x78000000;
          break;
+      case OP_TXG:
+         code[1] = 0x7dc00000;
+         break;
       default:
          code[1] = 0x7d800000;
          break;
@@ -1005,6 +1008,11 @@ CodeEmitterGK110::emitTEX(const TexInstruction *i)
          code[1] = 0x70000000;
          code[1] |= i->tex.r << 13;
          break;
+      case OP_TXG:
+         code[0] = 0x00000001;
+         code[1] = 0x70000000;
+         code[1] |= i->tex.r << 15;
+         break;
       default:
          code[0] = 0x00000001;
          code[1] = 0x60000000;
@@ -1023,7 +1031,7 @@ CodeEmitterGK110::emitTEX(const TexInstruction *i)
    case OP_TXB: code[1] |= 0x2000; break;
    case OP_TXL: code[1] |= 0x3000; break;
    case OP_TXF: break;
-   case OP_TXG: break; // XXX
+   case OP_TXG: break;
    case OP_TXD: break;
    case OP_TXLQ: break;
    default:
@@ -1052,7 +1060,7 @@ CodeEmitterGK110::emitTEX(const TexInstruction *i)
    srcId(i->src(0), 10);
    srcId(i, src1, 23);
 
-   // if (i->op == OP_TXG) code[0] |= i->tex.gatherComp << 5;
+   if (i->op == OP_TXG) code[1] |= i->tex.gatherComp << 13;
 
    // texture target:
    code[1] |= (i->tex.target.isCube() ? 3 : (i->tex.target.getDim() - 1)) << 7;
@@ -1666,6 +1674,7 @@ CodeEmitterGK110::emitInstruction(Instruction *insn)
    case OP_TXL:
    case OP_TXD:
    case OP_TXF:
+   case OP_TXG:
    case OP_TXLQ:
       emitTEX(insn->asTex());
       break;
index 1f624a50bb385685560fff50c813a8fcce22f1b3..d486c8d39e2bd78268b25638c82f73aff3922237 100644 (file)
@@ -2303,6 +2303,7 @@ CodeEmitterNVC0::emitInstruction(Instruction *insn)
    case OP_TXL:
    case OP_TXD:
    case OP_TXF:
+   case OP_TXG:
    case OP_TXLQ:
       emitTEX(insn->asTex());
       break;
index 382b02da50dc5bdc2b1efcb275eea5c298727a19..44b5ecdcb13934cc447df7b57b62d5fad8af8a71 100644 (file)
@@ -744,9 +744,15 @@ NVC0LoweringPass::handleTEX(TexInstruction *i)
       int s = i->srcCount(0xff, true);
       if (i->srcExists(s)) // move potential predicate out of the way
          i->moveSources(s, 1);
-      for (n = 0; n < i->tex.useOffsets; ++n)
+      if (i->op == OP_TXG) {
+         assert(i->tex.useOffsets == 1);
          for (c = 0; c < 3; ++c)
-            value |= (i->tex.offset[n][c] & 0xf) << (n * 12 + c * 4);
+            value |= (i->tex.offset[0][c] & 0xff) << (c * 8);
+      } 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);
+      }
       i->setSrc(s, bld.loadImm(NULL, value));
    }
 
index fa3145eacde63e09ca684a181536e5415e5d5d8a..1ee6f727a4675a4c3f9910f3af140ddcfec08cc8 100644 (file)
@@ -174,7 +174,6 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_ENDIANNESS:
       return PIPE_ENDIAN_LITTLE;
    case PIPE_CAP_TGSI_VS_LAYER:
-   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
    case PIPE_CAP_TEXTURE_GATHER_SM5:
    case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
    case PIPE_CAP_FAKE_SW_MSAA:
@@ -183,6 +182,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
       return 1;
    case PIPE_CAP_TEXTURE_QUERY_LOD:
       return 1;
+   case PIPE_CAP_MAX_TEXTURE_GATHER_COMPONENTS:
+      return 4;
    default:
       NOUVEAU_ERR("unknown PIPE_CAP %d\n", param);
       return 0;