tgsi/lowering: add support to lower TXP (v2)
authorRob Clark <robclark@freedesktop.org>
Sat, 6 Dec 2014 18:36:02 +0000 (13:36 -0500)
committerRob Clark <robclark@freedesktop.org>
Tue, 9 Dec 2014 22:47:44 +0000 (17:47 -0500)
v2: actually do perspective divide for RECT/SHADOWRECT

Signed-off-by: Rob Clark <robclark@freedesktop.org>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/auxiliary/tgsi/tgsi_lowering.c
src/gallium/auxiliary/tgsi/tgsi_lowering.h

index b6b18dbdc89b570c54eaf56244e670e3041b46a0..dee6c419d1119c574e6e41e8da3949f9ecfee9e7 100644 (file)
@@ -1031,7 +1031,10 @@ transform_samp(struct tgsi_transform_context *tctx,
    struct tgsi_full_instruction new_inst;
    /* mask is clamped coords, pmask is all coords (for projection): */
    unsigned mask = 0, pmask = 0, smask;
+   unsigned tex = inst->Texture.Texture;
    unsigned opcode = inst->Instruction.Opcode;
+   bool lower_txp = (opcode == TGSI_OPCODE_TXP) &&
+                  (ctx->config->lower_TXP & (1 << tex));
 
    if (opcode == TGSI_OPCODE_TXB2) {
       samp = &inst->Src[2];
@@ -1043,14 +1046,14 @@ transform_samp(struct tgsi_transform_context *tctx,
    smask = 1 << samp->Register.Index;
 
    /* check if we actually need to lower this one: */
-   if (!(ctx->saturate & smask))
+   if (!(ctx->saturate & smask) && !lower_txp)
       return -1;
 
    /* figure out which coordinates need saturating:
     *   - RECT textures should not get saturated
     *   - array index coords should not get saturated
     */
-   switch (inst->Texture.Texture) {
+   switch (tex) {
    case TGSI_TEXTURE_3D:
    case TGSI_TEXTURE_CUBE:
    case TGSI_TEXTURE_CUBE_ARRAY:
@@ -1081,16 +1084,19 @@ transform_samp(struct tgsi_transform_context *tctx,
       pmask |= TGSI_WRITEMASK_X;
       break;
 
-      /* TODO: I think we should ignore these?
-         case TGSI_TEXTURE_RECT:
-         case TGSI_TEXTURE_SHADOWRECT:
-      */
+   case TGSI_TEXTURE_RECT:
+   case TGSI_TEXTURE_SHADOWRECT:
+      /* we don't saturate, but in case of lower_txp we
+       * still need to do the perspective divide:
+       */
+       pmask = TGSI_WRITEMASK_XY;
+       break;
    }
 
    /* sanity check.. driver could be asking to saturate a non-
     * existent coordinate component:
     */
-   if (!mask)
+   if (!mask && !lower_txp)
       return -1;
 
    /* MOV tmpA, src0 */
@@ -1126,8 +1132,10 @@ transform_samp(struct tgsi_transform_context *tctx,
    }
 
    /* MOV_SAT tmpA.<mask>, tmpA */
-   create_mov(tctx, &ctx->tmp[A].dst, &ctx->tmp[A].src, mask,
-              TGSI_SAT_ZERO_ONE);
+   if (mask) {
+      create_mov(tctx, &ctx->tmp[A].dst, &ctx->tmp[A].src, mask,
+                 TGSI_SAT_ZERO_ONE);
+   }
 
    /* modify the texture samp instruction to take fixed up coord: */
    new_inst = *inst;
@@ -1462,6 +1470,7 @@ tgsi_transform_lowering(const struct tgsi_lowering_config *config,
          OPCS(DPH) ||
          OPCS(DP2) ||
          OPCS(DP2A) ||
+         OPCS(TXP) ||
          ctx.two_side_colors ||
          ctx.saturate))
       return NULL;
@@ -1529,12 +1538,19 @@ tgsi_transform_lowering(const struct tgsi_lowering_config *config,
       newlen += DP2A_GROW * OPCS(DP2A);
       numtmp = MAX2(numtmp, DOTP_TMP);
    }
-   if (ctx.saturate) {
-      int n = info->opcode_count[TGSI_OPCODE_TEX] +
-         info->opcode_count[TGSI_OPCODE_TXP] +
-         info->opcode_count[TGSI_OPCODE_TXB] +
-         info->opcode_count[TGSI_OPCODE_TXB2] +
-         info->opcode_count[TGSI_OPCODE_TXL];
+   if (ctx.saturate || config->lower_TXP) {
+      int n = 0;
+
+      if (ctx.saturate) {
+         n = info->opcode_count[TGSI_OPCODE_TEX] +
+            info->opcode_count[TGSI_OPCODE_TXP] +
+            info->opcode_count[TGSI_OPCODE_TXB] +
+            info->opcode_count[TGSI_OPCODE_TXB2] +
+            info->opcode_count[TGSI_OPCODE_TXL];
+      } else if (config->lower_TXP) {
+          n = info->opcode_count[TGSI_OPCODE_TXP];
+      }
+
       newlen += SAMP_GROW * n;
       numtmp = MAX2(numtmp, SAMP_TMP);
    }
index 55e15070dd4e94ce1d8ceb6de2d058a4636e2168..52c204fc55ed9d4d7353c737f977ae0b5bd1aa75 100644 (file)
@@ -69,6 +69,9 @@ struct tgsi_lowering_config
    unsigned lower_DP2:1;
    unsigned lower_DP2A:1;
 
+   /* bitmask of (1 << TGSI_TEXTURE_type): */
+   unsigned lower_TXP;
+
    /* To emulate certain texture wrap modes, this can be used
     * to saturate the specified tex coord to [0.0, 1.0].  The
     * bits are according to sampler #, ie. if, for example: