[Mesa-dev] [PATCH] ac/nir/radeonsi: add ARB_shader_ballot support

Nicolai Hähnle nhaehnle at gmail.com
Mon Jan 22 12:43:11 UTC 2018


On 22.01.2018 02:54, Timothy Arceri wrote:
> ---
>   src/amd/common/ac_nir_to_llvm.c              | 38 ++++++++++++++++++++++++++++
>   src/gallium/drivers/radeonsi/si_shader_nir.c |  9 +++++++
>   2 files changed, 47 insertions(+)
> 
> diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
> index eabdc83f16..2c9b85bf82 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -4260,6 +4260,44 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
>   	LLVMValueRef result = NULL;
>   
>   	switch (instr->intrinsic) {
> +	case nir_intrinsic_ballot:
> +		result = ac_build_ballot(&ctx->ac, get_src(ctx, instr->src[0]));
> +		break;
> +	case nir_intrinsic_read_invocation:
> +	case nir_intrinsic_read_first_invocation: {
> +		const char *intr_names[2] = {"llvm.amdgcn.readlane", "llvm.amdgcn.readfirstlane"};
> +		LLVMValueRef args[2];
> +
> +		/* Value */
> +		args[0] = get_src(ctx, instr->src[0]);
> +
> +		unsigned num_args;
> +		const char *intr_name;
> +		if (instr->intrinsic == nir_intrinsic_read_invocation) {
> +			num_args = 2;
> +			intr_name = intr_names[0];

Please just inline the intrinsic names here.

With that fixed:

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


> +
> +			/* Invocation */
> +			args[1] = get_src(ctx, instr->src[1]);
> +		} else {
> +			num_args = 1;
> +			intr_name = intr_names[1];
> +		}
> +
> +		/* We currently have no other way to prevent LLVM from lifting the icmp
> +		 * calls to a dominating basic block.
> +		 */
> +		ac_build_optimization_barrier(&ctx->ac, &args[0]);
> +
> +		result = ac_build_intrinsic(&ctx->ac, intr_name,
> +					    ctx->ac.i32, args, num_args,
> +					    AC_FUNC_ATTR_READNONE |
> +					    AC_FUNC_ATTR_CONVERGENT);
> +		break;
> +	}
> +	case nir_intrinsic_load_subgroup_invocation:
> +		result = ac_get_thread_id(&ctx->ac);
> +		break;
>   	case nir_intrinsic_load_work_group_id: {
>   		LLVMValueRef values[3];
>   
> diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
> index 2f19bae813..5b941da949 100644
> --- a/src/gallium/drivers/radeonsi/si_shader_nir.c
> +++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
> @@ -566,6 +566,15 @@ si_lower_nir(struct si_shader_selector* sel)
>   	};
>   	NIR_PASS_V(sel->nir, nir_lower_tex, &lower_tex_options);
>   
> +	const nir_lower_subgroups_options subgroups_options = {
> +		.subgroup_size = 64,
> +		.ballot_bit_size = 32,
> +		.lower_to_scalar = true,
> +		.lower_subgroup_masks = true,
> +		.lower_vote_trivial = false,
> +	};
> +	NIR_PASS_V(sel->nir, nir_lower_subgroups, &subgroups_options);
> +
>   	bool progress;
>   	do {
>   		progress = false;
> 


-- 
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.


More information about the mesa-dev mailing list