[Mesa-dev] [PATCH] r600g: fix and optimize tgsi_cmp when using ABS and NEG modifier
Dave Airlie
airlied at gmail.com
Tue Mar 29 21:09:59 UTC 2016
On 28 March 2016 at 19:52, <siro at das-labor.org> wrote:
> From: Patrick Rudolph <siro at das-labor.org>
>
> Some apps set NEG and ABS on the source param to test for zero.
> Use ALU_OP3_CNDE insted of ALU_OP3_CNDGE and unset both modifiers.
>
> It also removes the need for a MOV instruction, as ABS isn't
> supported on op3.
>
> Tested on AMD CAYMAN and AMD RV770.
>
> Signed-off-by: Patrick Rudolph <siro at das-labor.org>
Seems sane to me, does this help in any app in particular?
Reviewed-by: Dave Airlie <airlied at redhat.com>
I just have to remember to push this tomorrow.
Dave.
> ---
> src/gallium/drivers/r600/r600_shader.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 77658f5..e5e2e3f 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -7707,6 +7707,15 @@ static int tgsi_cmp(struct r600_shader_ctx *ctx)
> int i, r, j;
> int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
> int temp_regs[3];
> + unsigned op;
> +
> + if (ctx->src[0].abs && ctx->src[0].neg) {
> + op = ALU_OP3_CNDE;
> + ctx->src[0].abs = 0;
> + ctx->src[0].neg = 0;
> + } else {
> + op = ALU_OP3_CNDGE;
> + }
>
> for (j = 0; j < inst->Instruction.NumSrcRegs; j++) {
> temp_regs[j] = 0;
> @@ -7719,7 +7728,7 @@ static int tgsi_cmp(struct r600_shader_ctx *ctx)
> continue;
>
> memset(&alu, 0, sizeof(struct r600_bytecode_alu));
> - alu.op = ALU_OP3_CNDGE;
> + alu.op = op;
> r = tgsi_make_src_for_op3(ctx, temp_regs[0], i, &alu.src[0], &ctx->src[0]);
> if (r)
> return r;
> --
> 2.5.0
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list