[Mesa-dev] [PATCH 3/4] r600g: frontcolor tracks its associated backcolor

Tom Stellard tom at stellard.net
Mon Sep 24 07:21:03 PDT 2012


On Mon, Sep 24, 2012 at 12:43:16AM +0200, Vincent Lejeune wrote:
> ---

I'm not too familiar with this code, but this patch looks good to me.
Just make sure there are no regressions with the TGSI compiler.

Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

>  src/gallium/drivers/r600/r600_shader.c | 59 ++++++++++++++++++++--------------
>  src/gallium/drivers/r600/r600_shader.h |  1 +
>  2 files changed, 35 insertions(+), 25 deletions(-)
> 
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 14c1763..310ab62 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -1123,36 +1123,14 @@ static int process_twoside_color_inputs(struct r600_shader_ctx *ctx)
>  {
>  	int i, r, count = ctx->shader->ninput;
>  
> -	/* additional inputs will be allocated right after the existing inputs,
> -	 * we won't need them after the color selection, so we don't need to
> -	 * reserve these gprs for the rest of the shader code and to adjust
> -	 * output offsets etc. */
> -	int gpr = ctx->file_offset[TGSI_FILE_INPUT] +
> -			ctx->info.file_max[TGSI_FILE_INPUT] + 1;
> -
> -	if (ctx->face_gpr == -1) {
> -		i = ctx->shader->ninput++;
> -		ctx->shader->input[i].name = TGSI_SEMANTIC_FACE;
> -		ctx->shader->input[i].spi_sid = 0;
> -		ctx->shader->input[i].gpr = gpr++;
> -		ctx->face_gpr = ctx->shader->input[i].gpr;
> -	}
> -
>  	for (i = 0; i < count; i++) {
>  		if (ctx->shader->input[i].name == TGSI_SEMANTIC_COLOR) {
> -			int ni = ctx->shader->ninput++;
> -			memcpy(&ctx->shader->input[ni],&ctx->shader->input[i], sizeof(struct r600_shader_io));
> -			ctx->shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
> -			ctx->shader->input[ni].spi_sid = r600_spi_sid(&ctx->shader->input[ni]);
> -			ctx->shader->input[ni].gpr = gpr++;
> -
> +			unsigned back_facing_reg = ctx->shader->input[i].potential_back_facing_reg;
>  			if (ctx->bc->chip_class >= EVERGREEN) {
> -				r = evergreen_interp_input(ctx, ni);
> -				if (r)
> +				if ((r = evergreen_interp_input(ctx, back_facing_reg)))
>  					return r;
>  			}
> -
> -			r = select_twoside_color(ctx, i, ni);
> +			r = select_twoside_color(ctx, i, back_facing_reg);
>  			if (r)
>  				return r;
>  		}
> @@ -1313,6 +1291,37 @@ static int r600_shader_from_tgsi(struct r600_context * rctx, struct r600_pipe_sh
>  			goto out_err;
>  		}
>  	}
> +	
> +	/* Process two side if needed */
> +	if (shader->two_side && ctx.colors_used) {
> +		int i, count = ctx.shader->ninput;
> +
> +		/* additional inputs will be allocated right after the existing inputs,
> +		 * we won't need them after the color selection, so we don't need to
> +		 * reserve these gprs for the rest of the shader code and to adjust
> +		 * output offsets etc. */
> +		int gpr = ctx.file_offset[TGSI_FILE_INPUT] +
> +				ctx.info.file_max[TGSI_FILE_INPUT] + 1;
> +
> +		if (ctx.face_gpr == -1) {
> +			i = ctx.shader->ninput++;
> +			ctx.shader->input[i].name = TGSI_SEMANTIC_FACE;
> +			ctx.shader->input[i].spi_sid = 0;
> +			ctx.shader->input[i].gpr = gpr++;
> +			ctx.face_gpr = ctx.shader->input[i].gpr;
> +		}
> +
> +		for (i = 0; i < count; i++) {
> +			if (ctx.shader->input[i].name == TGSI_SEMANTIC_COLOR) {
> +				int ni = ctx.shader->ninput++;
> +				memcpy(&ctx.shader->input[ni],&ctx.shader->input[i], sizeof(struct r600_shader_io));
> +				ctx.shader->input[ni].name = TGSI_SEMANTIC_BCOLOR;
> +				ctx.shader->input[ni].spi_sid = r600_spi_sid(&ctx.shader->input[ni]);
> +				ctx.shader->input[ni].gpr = gpr++;
> +				ctx.shader->input[i].potential_back_facing_reg = ni;
> +			}
> +		}
> +	}
>  
>  /* LLVM backend setup */
>  #ifdef R600_USE_LLVM
> diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h
> index eb0bbf6..e8a8cec 100644
> --- a/src/gallium/drivers/r600/r600_shader.h
> +++ b/src/gallium/drivers/r600/r600_shader.h
> @@ -34,6 +34,7 @@ struct r600_shader_io {
>  	unsigned		interpolate;
>  	boolean                 centroid;
>  	unsigned		lds_pos; /* for evergreen */
> +	unsigned		potential_back_facing_reg;
>  	unsigned		write_mask;
>  };
>  
> -- 
> 1.7.11.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list