diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_lowering.c | 46 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_lowering.h | 3 |
2 files changed, 34 insertions, 15 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_lowering.c b/src/gallium/auxiliary/tgsi/tgsi_lowering.c index b6b18dbdc89..dee6c419d11 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_lowering.c +++ b/src/gallium/auxiliary/tgsi/tgsi_lowering.c @@ -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); } diff --git a/src/gallium/auxiliary/tgsi/tgsi_lowering.h b/src/gallium/auxiliary/tgsi/tgsi_lowering.h index 55e15070dd4..52c204fc55e 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_lowering.h +++ b/src/gallium/auxiliary/tgsi/tgsi_lowering.h @@ -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: |