[Mesa-dev] [PATCH 1/3] r600g: rewrite tgsi-to-llvm load-input to handle fragcoord

Tom Stellard tom at stellard.net
Mon Oct 22 06:22:18 PDT 2012


On Fri, Oct 19, 2012 at 11:19:32PM +0200, Vincent Lejeune wrote:
> ---
>  src/gallium/drivers/r600/r600_llvm.c   | 124 ++++++++++++++++++++++-----------
>  src/gallium/drivers/r600/r600_shader.c |   2 +-
>  2 files changed, 84 insertions(+), 42 deletions(-)
>

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

> diff --git a/src/gallium/drivers/r600/r600_llvm.c b/src/gallium/drivers/r600/r600_llvm.c
> index c6e60af..321966e 100644
> --- a/src/gallium/drivers/r600/r600_llvm.c
> +++ b/src/gallium/drivers/r600/r600_llvm.c
> @@ -66,6 +66,53 @@ static LLVMValueRef llvm_fetch_system_value(
>  	return bitcast(bld_base, type, cval);
>  }
>  
> +static LLVMValueRef
> +llvm_load_input_helper(
> +	struct radeon_llvm_context * ctx,
> +	const char *intrinsic, unsigned idx)
> +{
> +	LLVMValueRef reg = lp_build_const_int32(
> +		ctx->soa.bld_base.base.gallivm,
> +		idx);
> +	return build_intrinsic(
> +		ctx->soa.bld_base.base.gallivm->builder,
> +		intrinsic,
> +		ctx->soa.bld_base.base.elem_type, &reg, 1,
> +		LLVMReadNoneAttribute);
> +}
> +
> +static LLVMValueRef
> +llvm_face_select_helper(
> +	struct radeon_llvm_context * ctx,
> +	const char *intrinsic, unsigned face_register,
> +	unsigned frontcolor_register, unsigned backcolor_regiser)
> +{
> +
> +	LLVMValueRef backcolor = llvm_load_input_helper(
> +		ctx,
> +		"llvm.R600.load.input",
> +		backcolor_regiser);
> +	LLVMValueRef front_color = llvm_load_input_helper(
> +		ctx,
> +		"llvm.R600.load.input",
> +		frontcolor_register);
> +	LLVMValueRef face = llvm_load_input_helper(
> +		ctx,
> +		"llvm.R600.load.input",
> +		face_register);
> +	LLVMValueRef is_face_positive = LLVMBuildFCmp(
> +		ctx->soa.bld_base.base.gallivm->builder,
> +		LLVMRealUGT, face,
> +		lp_build_const_float(ctx->soa.bld_base.base.gallivm, 0.0f),
> +		"");
> +	return LLVMBuildSelect(
> +		ctx->soa.bld_base.base.gallivm->builder,
> +		is_face_positive,
> +		front_color,
> +		backcolor,
> +		"");
> +}
> +
>  static void llvm_load_input(
>  	struct radeon_llvm_context * ctx,
>  	unsigned input_index,
> @@ -77,50 +124,45 @@ static void llvm_load_input(
>  		unsigned soa_index = radeon_llvm_reg_index_soa(input_index,
>  								chan);
>  
> -		/* The * 4 is assuming that we are in soa mode. */
> -		LLVMValueRef reg = lp_build_const_int32(
> -				ctx->soa.bld_base.base.gallivm,
> -				soa_index + (ctx->reserved_reg_count * 4));
> -		ctx->inputs[soa_index] = build_intrinsic(
> -				ctx->soa.bld_base.base.gallivm->builder,
> +		switch (decl->Semantic.Name) {
> +		case TGSI_SEMANTIC_FACE:
> +			ctx->inputs[soa_index] = llvm_load_input_helper(ctx,
>  				"llvm.R600.load.input",
> -				ctx->soa.bld_base.base.elem_type, &reg, 1,
> -				LLVMReadNoneAttribute);
> -				
> -		if (decl->Semantic.Name == TGSI_SEMANTIC_COLOR && ctx->two_side) {
> -			unsigned back_reg = ctx->r600_inputs[input_index]
> -				.potential_back_facing_reg;
> -			unsigned back_soa_index = radeon_llvm_reg_index_soa(
> -				ctx->r600_inputs[back_reg].gpr
> -				, chan);
> -			LLVMValueRef backcolor_reg = lp_build_const_int32(
> -				ctx->soa.bld_base.base.gallivm,
> -				back_soa_index);
> -			LLVMValueRef backcolor = build_intrinsic(
> -				ctx->soa.bld_base.base.gallivm->builder,
> +				4 * ctx->face_input);
> +			break;
> +		case TGSI_SEMANTIC_POSITION:
> +			if (ctx->type != TGSI_PROCESSOR_FRAGMENT || chan != 3) {
> +				ctx->inputs[soa_index] = llvm_load_input_helper(ctx,
> +					"llvm.R600.load.input",
> +					soa_index + (ctx->reserved_reg_count * 4));
> +			} else {
> +				LLVMValueRef w_coord = llvm_load_input_helper(ctx,
>  				"llvm.R600.load.input",
> -				ctx->soa.bld_base.base.elem_type, &backcolor_reg, 1,
> -				LLVMReadNoneAttribute);
> -			LLVMValueRef face_reg = lp_build_const_int32(
> -				ctx->soa.bld_base.base.gallivm,
> -				ctx->face_input * 4);
> -			LLVMValueRef face = build_intrinsic(
> -				ctx->soa.bld_base.base.gallivm->builder,
> +				soa_index + (ctx->reserved_reg_count * 4));
> +				ctx->inputs[soa_index] = LLVMBuildFDiv(ctx->gallivm.builder,
> +				lp_build_const_float(&(ctx->gallivm), 1.0f), w_coord, "");
> +			}
> +			break;
> +		case TGSI_SEMANTIC_COLOR:
> +			if (ctx->two_side) {
> +				unsigned back_reg = ctx->r600_inputs[input_index]
> +					.potential_back_facing_reg;
> +				unsigned back_soa_index = radeon_llvm_reg_index_soa(
> +					ctx->r600_inputs[back_reg].gpr,
> +					chan);
> +				ctx->inputs[soa_index] = llvm_face_select_helper(ctx,
> +				"llvm.R600.load.input",
> +					4 * ctx->face_input,
> +					soa_index + 4 * ctx->reserved_reg_count,
> +					back_soa_index);
> +				break;
> +			}
> +		default:
> +			/* The * 4 is assuming that we are in soa mode. */
> +			ctx->inputs[soa_index] = llvm_load_input_helper(ctx,
>  				"llvm.R600.load.input",
> -				ctx->soa.bld_base.base.elem_type,
> -				&face_reg, 1,
> -				LLVMReadNoneAttribute);
> -			LLVMValueRef is_face_positive = LLVMBuildFCmp(
> -				ctx->soa.bld_base.base.gallivm->builder,
> -				LLVMRealUGT, face, 
> -				lp_build_const_float(ctx->soa.bld_base.base.gallivm, 0.0f),
> -				"");
> -			ctx->inputs[soa_index] = LLVMBuildSelect(
> -				ctx->soa.bld_base.base.gallivm->builder,
> -				is_face_positive,
> -				ctx->inputs[soa_index],
> -				backcolor,
> -				"");
> +				soa_index + (ctx->reserved_reg_count * 4));
> +			break;
>  		}
>  	}
>  }
> diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
> index 053a988..2e3d805 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -1373,7 +1373,7 @@ static int r600_shader_from_tgsi(struct r600_screen *rscreen,
>  	if (shader->fs_write_all && rscreen->chip_class >= EVERGREEN)
>  		shader->nr_ps_max_color_exports = 8;
>  
> -	if (ctx.fragcoord_input >= 0) {
> +	if (ctx.fragcoord_input >= 0 && !use_llvm) {
>  		if (ctx.bc->chip_class == CAYMAN) {
>  			for (j = 0 ; j < 4; j++) {
>  				struct r600_bytecode_alu alu;
> -- 
> 1.7.11.7
> 
> _______________________________________________
> 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