[Mesa-dev] [PATCH] radeonsi/ac: move frag interp emission code to shared llvm code.

Nicolai Hähnle nhaehnle at gmail.com
Wed Feb 1 12:02:16 UTC 2017


On 01.02.2017 05:48, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> This code should be used in radv, so move it to a shared location
> in advance of doing that.
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>

Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

> ---
>  src/amd/common/ac_llvm_util.c            |  71 ++++++++++++++++++++++
>  src/amd/common/ac_llvm_util.h            |  14 +++++
>  src/gallium/drivers/radeonsi/si_shader.c | 100 ++++---------------------------
>  3 files changed, 98 insertions(+), 87 deletions(-)
>
> diff --git a/src/amd/common/ac_llvm_util.c b/src/amd/common/ac_llvm_util.c
> index f3cab92..8c87a13 100644
> --- a/src/amd/common/ac_llvm_util.c
> +++ b/src/amd/common/ac_llvm_util.c
> @@ -512,3 +512,74 @@ ac_dump_module(LLVMModuleRef module)
>  	fprintf(stderr, "%s", str);
>  	LLVMDisposeMessage(str);
>  }
> +
> +LLVMValueRef
> +ac_build_fs_interp(struct ac_llvm_context *ctx,
> +		   LLVMValueRef llvm_chan,
> +		   LLVMValueRef attr_number,
> +		   LLVMValueRef params,
> +		   LLVMValueRef i,
> +		   LLVMValueRef j)
> +{
> +	LLVMValueRef args[5];
> +	LLVMValueRef p1;
> +	
> +	if (HAVE_LLVM < 0x0400) {
> +		LLVMValueRef ij[2];
> +		ij[0] = LLVMBuildBitCast(ctx->builder, i, ctx->i32, "");
> +		ij[1] = LLVMBuildBitCast(ctx->builder, j, ctx->i32, "");
> +
> +		args[0] = llvm_chan;
> +		args[1] = attr_number;
> +		args[2] = params;
> +		args[3] = ac_build_gather_values(ctx, ij, 2);
> +		return ac_emit_llvm_intrinsic(ctx, "llvm.SI.fs.interp",
> +					      ctx->f32, args, 4,
> +					      AC_FUNC_ATTR_READNONE);
> +	}
> +
> +	args[0] = i;
> +	args[1] = llvm_chan;
> +	args[2] = attr_number;
> +	args[3] = params;
> +
> +	p1 = ac_emit_llvm_intrinsic(ctx, "llvm.amdgcn.interp.p1",
> +				    ctx->f32, args, 4, AC_FUNC_ATTR_READNONE);
> +
> +	args[0] = p1;
> +	args[1] = j;
> +	args[2] = llvm_chan;
> +	args[3] = attr_number;
> +	args[4] = params;
> +
> +	return ac_emit_llvm_intrinsic(ctx, "llvm.amdgcn.interp.p2",
> +				      ctx->f32, args, 5, AC_FUNC_ATTR_READNONE);
> +}
> +
> +LLVMValueRef
> +ac_build_fs_interp_mov(struct ac_llvm_context *ctx,
> +		       LLVMValueRef parameter,
> +		       LLVMValueRef llvm_chan,
> +		       LLVMValueRef attr_number,
> +		       LLVMValueRef params)
> +{
> +	LLVMValueRef args[4];
> +	if (HAVE_LLVM < 0x0400) {
> +		args[0] = llvm_chan;
> +		args[1] = attr_number;
> +		args[2] = params;
> +
> +		return ac_emit_llvm_intrinsic(ctx,
> +					      "llvm.SI.fs.constant",
> +					      ctx->f32, args, 3,
> +					      AC_FUNC_ATTR_READNONE);
> +	}
> +
> +	args[0] = parameter;
> +	args[1] = llvm_chan;
> +	args[2] = attr_number;
> +	args[3] = params;
> +
> +	return ac_emit_llvm_intrinsic(ctx, "llvm.amdgcn.interp.mov",
> +				      ctx->f32, args, 4, AC_FUNC_ATTR_READNONE);
> +}
> diff --git a/src/amd/common/ac_llvm_util.h b/src/amd/common/ac_llvm_util.h
> index c07f67a..2a33765 100644
> --- a/src/amd/common/ac_llvm_util.h
> +++ b/src/amd/common/ac_llvm_util.h
> @@ -98,6 +98,20 @@ ac_prepare_cube_coords(struct ac_llvm_context *ctx,
>  void
>  ac_dump_module(LLVMModuleRef module);
>
> +LLVMValueRef
> +ac_build_fs_interp(struct ac_llvm_context *ctx,
> +		   LLVMValueRef llvm_chan,
> +		   LLVMValueRef attr_number,
> +		   LLVMValueRef params,
> +		   LLVMValueRef i,
> +		   LLVMValueRef j);
> +
> +LLVMValueRef
> +ac_build_fs_interp_mov(struct ac_llvm_context *ctx,
> +		       LLVMValueRef parameter,
> +		       LLVMValueRef llvm_chan,
> +		       LLVMValueRef attr_number,
> +		       LLVMValueRef params);
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
> index 5c5f2e6..9ae12d6 100644
> --- a/src/gallium/drivers/radeonsi/si_shader.c
> +++ b/src/gallium/drivers/radeonsi/si_shader.c
> @@ -1281,80 +1281,6 @@ static int lookup_interp_param_index(unsigned interpolate, unsigned location)
>  	}
>  }
>
> -static LLVMValueRef build_fs_interp(
> -	struct lp_build_tgsi_context *bld_base,
> -	LLVMValueRef llvm_chan,
> -	LLVMValueRef attr_number,
> -	LLVMValueRef params,
> -	LLVMValueRef i,
> -	LLVMValueRef j) {
> -
> -	struct si_shader_context *ctx = si_shader_context(bld_base);
> -	struct gallivm_state *gallivm = bld_base->base.gallivm;
> -	LLVMValueRef args[5];
> -	LLVMValueRef p1;
> -	if (HAVE_LLVM < 0x0400) {
> -		LLVMValueRef ij[2];
> -		ij[0] = LLVMBuildBitCast(gallivm->builder, i, ctx->i32, "");
> -		ij[1] = LLVMBuildBitCast(gallivm->builder, j, ctx->i32, "");
> -
> -		args[0] = llvm_chan;
> -		args[1] = attr_number;
> -		args[2] = params;
> -		args[3] = lp_build_gather_values(gallivm, ij, 2);
> -		return lp_build_intrinsic(gallivm->builder, "llvm.SI.fs.interp",
> -					  ctx->f32, args, 4,
> -					  LP_FUNC_ATTR_READNONE);
> -	}
> -
> -	args[0] = i;
> -	args[1] = llvm_chan;
> -	args[2] = attr_number;
> -	args[3] = params;
> -
> -	p1 = lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.interp.p1",
> -				ctx->f32, args, 4, LP_FUNC_ATTR_READNONE);
> -
> -	args[0] = p1;
> -	args[1] = j;
> -	args[2] = llvm_chan;
> -	args[3] = attr_number;
> -	args[4] = params;
> -
> -	return lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.interp.p2",
> -				  ctx->f32, args, 5, LP_FUNC_ATTR_READNONE);
> -}
> -
> -static LLVMValueRef build_fs_interp_mov(
> -	struct lp_build_tgsi_context *bld_base,
> -	LLVMValueRef parameter,
> -	LLVMValueRef llvm_chan,
> -	LLVMValueRef attr_number,
> -	LLVMValueRef params) {
> -
> -	struct si_shader_context *ctx = si_shader_context(bld_base);
> -	struct gallivm_state *gallivm = bld_base->base.gallivm;
> -	LLVMValueRef args[4];
> -	if (HAVE_LLVM < 0x0400) {
> -		args[0] = llvm_chan;
> -		args[1] = attr_number;
> -		args[2] = params;
> -
> -		return lp_build_intrinsic(gallivm->builder,
> -					  "llvm.SI.fs.constant",
> -					  ctx->f32, args, 3,
> -					  LP_FUNC_ATTR_READNONE);
> -	}
> -
> -	args[0] = parameter;
> -	args[1] = llvm_chan;
> -	args[2] = attr_number;
> -	args[3] = params;
> -
> -	return lp_build_intrinsic(gallivm->builder, "llvm.amdgcn.interp.mov",
> -				  ctx->f32, args, 4, LP_FUNC_ATTR_READNONE);
> -}
> -
>  /**
>   * Interpolate a fragment shader input.
>   *
> @@ -1438,17 +1364,17 @@ static void interp_fs_input(struct si_shader_context *ctx,
>  			LLVMValueRef front, back;
>
>  			if (interp) {
> -				front = build_fs_interp(bld_base, llvm_chan,
> +				front = ac_build_fs_interp(&ctx->ac, llvm_chan,
>  							attr_number, prim_mask,
>  							i, j);
> -				back = build_fs_interp(bld_base, llvm_chan,
> +				back = ac_build_fs_interp(&ctx->ac, llvm_chan,
>  							back_attr_number, prim_mask,
>  							i, j);
>  			} else {
> -				front = build_fs_interp_mov(bld_base,
> +				front = ac_build_fs_interp_mov(&ctx->ac,
>  					lp_build_const_int32(gallivm, 2), /* P0 */
>  					llvm_chan, attr_number, prim_mask);
> -				back = build_fs_interp_mov(bld_base,
> +				back = ac_build_fs_interp_mov(&ctx->ac,
>  					lp_build_const_int32(gallivm, 2), /* P0 */
>  					llvm_chan, back_attr_number, prim_mask);
>  			}
> @@ -1461,12 +1387,12 @@ static void interp_fs_input(struct si_shader_context *ctx,
>  		}
>  	} else if (semantic_name == TGSI_SEMANTIC_FOG) {
>  		if (interp) {
> -			result[0] = build_fs_interp(bld_base, uint->zero,
> -						attr_number, prim_mask, i, j);
> +			result[0] = ac_build_fs_interp(&ctx->ac, uint->zero,
> +						       attr_number, prim_mask, i, j);
>  		} else {
> -			result[0] = build_fs_interp_mov(bld_base, uint->zero,
> -				lp_build_const_int32(gallivm, 2), /* P0 */
> -				attr_number, prim_mask);
> +			result[0] = ac_build_fs_interp_mov(&ctx->ac, uint->zero,
> +							   lp_build_const_int32(gallivm, 2), /* P0 */
> +							   attr_number, prim_mask);
>  		}
>  		result[1] =
>  		result[2] = lp_build_const_float(gallivm, 0.0f);
> @@ -1476,10 +1402,10 @@ static void interp_fs_input(struct si_shader_context *ctx,
>  			LLVMValueRef llvm_chan = lp_build_const_int32(gallivm, chan);
>
>  			if (interp) {
> -				result[chan] = build_fs_interp(bld_base,
> +				result[chan] = ac_build_fs_interp(&ctx->ac,
>  					llvm_chan, attr_number, prim_mask, i, j);
>  			} else {
> -				result[chan] = build_fs_interp_mov(bld_base,
> +				result[chan] = ac_build_fs_interp_mov(&ctx->ac,
>  					lp_build_const_int32(gallivm, 2), /* P0 */
>  					llvm_chan, attr_number, prim_mask);
>  			}
> @@ -5291,11 +5217,11 @@ static void build_interp_intrinsic(const struct lp_build_tgsi_action *action,
>  				gallivm->builder, interp_param, uint->zero, "");
>  			LLVMValueRef j = LLVMBuildExtractElement(
>  				gallivm->builder, interp_param, uint->one, "");
> -			emit_data->output[chan] = build_fs_interp(bld_base,
> +			emit_data->output[chan] = ac_build_fs_interp(&ctx->ac,
>  				llvm_chan, attr_number, params,
>  				i, j);
>  		} else {
> -			emit_data->output[chan] = build_fs_interp_mov(bld_base,
> +			emit_data->output[chan] = ac_build_fs_interp_mov(&ctx->ac,
>  				lp_build_const_int32(gallivm, 2), /* P0 */
>  				llvm_chan, attr_number, params);
>  		}
>


More information about the mesa-dev mailing list