From: Rob Clark <robcl...@freedesktop.org> Signed-off-by: Rob Clark <robcl...@freedesktop.org> --- For adreno a4xx, we need to lower all TXP, for a3xx, we need to just lower for certain texture types.
src/gallium/auxiliary/tgsi/tgsi_lowering.c | 35 ++++++++++++++++++++---------- src/gallium/auxiliary/tgsi/tgsi_lowering.h | 3 +++ 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/gallium/auxiliary/tgsi/tgsi_lowering.c b/src/gallium/auxiliary/tgsi/tgsi_lowering.c index b6b18db..079a0ebe 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: @@ -1090,7 +1093,7 @@ transform_samp(struct tgsi_transform_context *tctx, /* 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 +1129,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 +1467,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 +1535,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 55e1507..52c204f 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: -- 1.9.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev