[Mesa-dev] [PATCH 11/11] ac: use new LLVM 8 intrinsics in ac_build_buffer_store_dword()

Timothy Arceri tarceri at itsqueeze.com
Wed Mar 13 00:26:22 UTC 2019


This one causes 2000+ piglit tests to fail on radeonsi. For example:

./bin/shader_runner 
generated_tests/spec/arb_gpu_shader_fp64/execution/conversion/geom-conversion-explicit-bool-double.shader_test 
-auto -fbo

On 13/3/19 3:19 am, Samuel Pitoiset wrote:
> New buffer intrinsics have a separate soffset parameter.
> 
> Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> ---
>   src/amd/common/ac_llvm_build.c | 66 ++++++++++++++--------------------
>   1 file changed, 26 insertions(+), 40 deletions(-)
> 
> diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c
> index ce6639d49bf..8ed5199da55 100644
> --- a/src/amd/common/ac_llvm_build.c
> +++ b/src/amd/common/ac_llvm_build.c
> @@ -1227,59 +1227,45 @@ ac_build_buffer_store_dword(struct ac_llvm_context *ctx,
>   	if (!swizzle_enable_hint) {
>   		LLVMValueRef offset = soffset;
>   
> -		static const char *types[] = {"f32", "v2f32", "v4f32"};
> -
>   		if (inst_offset)
>   			offset = LLVMBuildAdd(ctx->builder, offset,
>   					      LLVMConstInt(ctx->i32, inst_offset, 0), "");
> -		if (voffset)
> -			offset = LLVMBuildAdd(ctx->builder, offset, voffset, "");
> -
> -		LLVMValueRef args[] = {
> -			ac_to_float(ctx, vdata),
> -			LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, ""),
> -			ctx->i32_0,
> -			offset,
> -			LLVMConstInt(ctx->i1, glc, 0),
> -			LLVMConstInt(ctx->i1, slc, 0),
> -		};
> -
> -		char name[256];
> -		snprintf(name, sizeof(name), "llvm.amdgcn.buffer.store.%s",
> -			 types[CLAMP(num_channels, 1, 3) - 1]);
>   
> -		ac_build_intrinsic(ctx, name, ctx->voidt,
> -				   args, ARRAY_SIZE(args),
> -				   ac_get_store_intr_attribs(writeonly_memory));
> +		if (HAVE_LLVM >= 0x800) {
> +			ac_build_llvm8_buffer_store_common(ctx, rsrc,
> +							   ac_to_float(ctx, vdata),
> +							   ctx->i32_0,
> +							   voffset, offset,
> +							   num_channels,
> +							   glc, slc,
> +							   writeonly_memory,
> +							   false, true);
> +		} else {
> +			if (voffset)
> +				offset = LLVMBuildAdd(ctx->builder, offset, voffset, "");
> +
> +			ac_build_buffer_store_common(ctx, rsrc,
> +						     ac_to_float(ctx, vdata),
> +						     ctx->i32_0, offset,
> +						     num_channels, glc, slc,
> +						     writeonly_memory, false);
> +		}
>   		return;
>   	}
>   
> -	static const unsigned dfmt[] = {
> +	static const unsigned dfmts[] = {
>   		V_008F0C_BUF_DATA_FORMAT_32,
>   		V_008F0C_BUF_DATA_FORMAT_32_32,
>   		V_008F0C_BUF_DATA_FORMAT_32_32_32,
>   		V_008F0C_BUF_DATA_FORMAT_32_32_32_32
>   	};
> -	static const char *types[] = {"i32", "v2i32", "v4i32"};
> -	LLVMValueRef args[] = {
> -		vdata,
> -		LLVMBuildBitCast(ctx->builder, rsrc, ctx->v4i32, ""),
> -		ctx->i32_0,
> -		voffset ? voffset : ctx->i32_0,
> -		soffset,
> -		LLVMConstInt(ctx->i32, inst_offset, 0),
> -		LLVMConstInt(ctx->i32, dfmt[num_channels - 1], 0),
> -		LLVMConstInt(ctx->i32, V_008F0C_BUF_NUM_FORMAT_UINT, 0),
> -		LLVMConstInt(ctx->i1, glc, 0),
> -		LLVMConstInt(ctx->i1, slc, 0),
> -	};
> -	char name[256];
> -	snprintf(name, sizeof(name), "llvm.amdgcn.tbuffer.store.%s",
> -		 types[CLAMP(num_channels, 1, 3) - 1]);
> +	unsigned dfmt = dfmts[num_channels - 1];
> +	unsigned nfmt = V_008F0C_BUF_NUM_FORMAT_UINT;
> +	LLVMValueRef immoffset = LLVMConstInt(ctx->i32, inst_offset, 0);
>   
> -	ac_build_intrinsic(ctx, name, ctx->voidt,
> -			   args, ARRAY_SIZE(args),
> -			   ac_get_store_intr_attribs(writeonly_memory));
> +	ac_build_tbuffer_store(ctx, rsrc, vdata, ctx->i32_0, voffset, soffset,
> +			       immoffset, num_channels, dfmt, nfmt, glc, slc,
> +			       writeonly_memory);
>   }
>   
>   static LLVMValueRef
> 


More information about the mesa-dev mailing list