[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