[Mesa-dev] [PATCH] r600: fix texture gradients instruction emission (v2)

Emil Velikov emil.l.velikov at gmail.com
Wed Nov 26 12:46:09 PST 2014


Hello Dave,

Cherry picking this commit for the 10.3 branch resulted in a number of
non-trivial conflicts. Can you or anyone else familiar with the code
backport this for 10.3 ?

Thanks
Emil

On 18/11/14 22:53, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
> 
> The piglit tests were failing, and it appeared to be SB
> optimising out things, but Glenn pointed out the gradients
> are meant to be clause local, so we should emit the texture
> instructions in the same clause. This moves things around
> to always copy to a temp and then emit the texture clauses
> for H/V.
> 
> v2: Glenn pointed out we could get another ALU fetch in
> the wrong place, so load the src gpr earlier as well.
> 
> Fixes at least:
> ./bin/tex-miplevel-selection textureGrad 2D
> 
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
>  src/gallium/drivers/r600/r600_shader.c | 59 ++++++++++++++++++----------------
>  1 file changed, 31 insertions(+), 28 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 76daf2c..41caac3 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -5110,11 +5110,37 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
>  	}
>  
>  	if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) {
> +		int temp_h, temp_v;
>  		/* TGSI moves the sampler to src reg 3 for TXD */
>  		sampler_src_reg = 3;
>  
>  		sampler_index_mode = inst->Src[sampler_src_reg].Indirect.Index == 2 ? 2 : 0; // CF_INDEX_1 : CF_INDEX_NONE
>  
> +		src_loaded = TRUE;
> +		for (i = 0; i < 3; i++) {
> +			int treg = r600_get_temp(ctx);
> +
> +			if (i == 0)
> +				src_gpr = treg;
> +			else if (i == 1)
> +				temp_h = treg;
> +			else
> +				temp_v = treg;
> +
> +			for (j = 0; j < 4; j++) {
> +				memset(&alu, 0, sizeof(struct r600_bytecode_alu));
> +				alu.op = ALU_OP1_MOV;
> +                                r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
> +                                alu.dst.sel = treg;
> +                                alu.dst.chan = j;
> +                                if (j == 3)
> +                                   alu.last = 1;
> +                                alu.dst.write = 1;
> +                                r = r600_bytecode_add_alu(ctx->bc, &alu);
> +                                if (r)
> +                                    return r;
> +			}
> +		}
>  		for (i = 1; i < 3; i++) {
>  			/* set gradients h/v */
>  			memset(&tex, 0, sizeof(struct r600_bytecode_tex));
> @@ -5125,35 +5151,12 @@ static int tgsi_tex(struct r600_shader_ctx *ctx)
>  			tex.resource_id = tex.sampler_id + R600_MAX_CONST_BUFFERS;
>  			tex.resource_index_mode = sampler_index_mode;
>  
> -			if (tgsi_tex_src_requires_loading(ctx, i)) {
> -				tex.src_gpr = r600_get_temp(ctx);
> -				tex.src_sel_x = 0;
> -				tex.src_sel_y = 1;
> -				tex.src_sel_z = 2;
> -				tex.src_sel_w = 3;
> +			tex.src_gpr = (i == 1) ? temp_h : temp_v;
> +			tex.src_sel_x = 0;
> +			tex.src_sel_y = 1;
> +			tex.src_sel_z = 2;
> +			tex.src_sel_w = 3;
>  
> -				for (j = 0; j < 4; j++) {
> -					memset(&alu, 0, sizeof(struct r600_bytecode_alu));
> -					alu.op = ALU_OP1_MOV;
> -                                        r600_bytecode_src(&alu.src[0], &ctx->src[i], j);
> -                                        alu.dst.sel = tex.src_gpr;
> -                                        alu.dst.chan = j;
> -                                        if (j == 3)
> -                                                alu.last = 1;
> -                                        alu.dst.write = 1;
> -                                        r = r600_bytecode_add_alu(ctx->bc, &alu);
> -                                        if (r)
> -                                                return r;
> -				}
> -
> -			} else {
> -				tex.src_gpr = tgsi_tex_get_src_gpr(ctx, i);
> -				tex.src_sel_x = ctx->src[i].swizzle[0];
> -				tex.src_sel_y = ctx->src[i].swizzle[1];
> -				tex.src_sel_z = ctx->src[i].swizzle[2];
> -				tex.src_sel_w = ctx->src[i].swizzle[3];
> -				tex.src_rel = ctx->src[i].rel;
> -			}
>  			tex.dst_gpr = ctx->temp_reg; /* just to avoid confusing the asm scheduler */
>  			tex.dst_sel_x = tex.dst_sel_y = tex.dst_sel_z = tex.dst_sel_w = 7;
>  			if (inst->Texture.Texture != TGSI_TEXTURE_RECT) {
> 



More information about the mesa-dev mailing list