[Mesa-dev] [PATCH v2 12/14] radeonsi: Use barrier instructions for TCS barriers.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Mon May 16 23:39:30 UTC 2016


On Mon, May 16, 2016 at 7:48 PM, Marek Olšák <maraeo at gmail.com> wrote:
> NAK. The barrier is never needed with tessellation, because every
> patch always fits into a single wave and there is no patch splitting
> between waves.
>
> Marek

OK.

I don't see any optimization barrier before loading the tess factors
though, is the part that added the barrier (now optimization barrier)
before loading the tess factors also  NAKed?

- Bas


>
> On Fri, May 13, 2016 at 3:37 AM, Bas Nieuwenhuizen
> <bas at basnieuwenhuizen.nl> wrote:
>> With potentially more than 1 wave working on a patch we
>> need the barrier.
>>
>> Also adds a barrier before loading the tessellation factors to
>> write them to the TF ring.
>>
>> Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
>> Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>
>> ---
>>  src/gallium/drivers/radeonsi/si_shader.c | 48 ++++++++++----------------------
>>  1 file changed, 15 insertions(+), 33 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
>> index 087b5bb..235983a 100644
>> --- a/src/gallium/drivers/radeonsi/si_shader.c
>> +++ b/src/gallium/drivers/radeonsi/si_shader.c
>> @@ -2514,6 +2514,19 @@ static void si_copy_tcs_inputs(struct lp_build_tgsi_context *bld_base)
>>         }
>>  }
>>
>> +static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
>> +                                struct lp_build_tgsi_context *bld_base,
>> +                                struct lp_build_emit_data *emit_data)
>> +{
>> +       struct si_shader_context *ctx = si_shader_context(bld_base);
>> +       struct gallivm_state *gallivm = bld_base->base.gallivm;
>> +
>> +       lp_build_intrinsic(gallivm->builder,
>> +                          HAVE_LLVM >= 0x0309 ? "llvm.amdgcn.s.barrier"
>> +                                              : "llvm.AMDGPU.barrier.local",
>> +                          ctx->voidt, NULL, 0, LLVMNoUnwindAttribute);
>> +}
>> +
>>  static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
>>                                   LLVMValueRef rel_patch_id,
>>                                   LLVMValueRef invocation_id,
>> @@ -2528,6 +2541,8 @@ static void si_write_tess_factors(struct lp_build_tgsi_context *bld_base,
>>         unsigned stride, outer_comps, inner_comps, i;
>>         struct lp_build_if_state if_ctx;
>>
>> +       si_llvm_emit_barrier(NULL, bld_base, NULL);
>> +
>>         /* Do this only for invocation 0, because the tess levels are per-patch,
>>          * not per-vertex.
>>          *
>> @@ -3213,18 +3228,6 @@ static void build_tex_intrinsic(const struct lp_build_tgsi_action *action,
>>                                 struct lp_build_tgsi_context *bld_base,
>>                                 struct lp_build_emit_data *emit_data);
>>
>> -/* Prevent optimizations (at least of memory accesses) across the current
>> - * point in the program by emitting empty inline assembly that is marked as
>> - * having side effects.
>> - */
>> -static void emit_optimization_barrier(struct si_shader_context *ctx)
>> -{
>> -       LLVMBuilderRef builder = ctx->radeon_bld.gallivm.builder;
>> -       LLVMTypeRef ftype = LLVMFunctionType(ctx->voidt, NULL, 0, false);
>> -       LLVMValueRef inlineasm = LLVMConstInlineAsm(ftype, "", "", true, false);
>> -       LLVMBuildCall(builder, inlineasm, NULL, 0, "");
>> -}
>> -
>>  static void emit_waitcnt(struct si_shader_context *ctx)
>>  {
>>         struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
>> @@ -5154,27 +5157,6 @@ static void si_llvm_emit_primitive(
>>                            ctx->voidt, args, 2, LLVMNoUnwindAttribute);
>>  }
>>
>> -static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
>> -                                struct lp_build_tgsi_context *bld_base,
>> -                                struct lp_build_emit_data *emit_data)
>> -{
>> -       struct si_shader_context *ctx = si_shader_context(bld_base);
>> -       struct gallivm_state *gallivm = bld_base->base.gallivm;
>> -
>> -       /* The real barrier instruction isn’t needed, because an entire patch
>> -        * always fits into a single wave.
>> -        */
>> -       if (ctx->type == PIPE_SHADER_TESS_CTRL) {
>> -               emit_optimization_barrier(ctx);
>> -               return;
>> -       }
>> -
>> -       lp_build_intrinsic(gallivm->builder,
>> -                          HAVE_LLVM >= 0x0309 ? "llvm.amdgcn.s.barrier"
>> -                                              : "llvm.AMDGPU.barrier.local",
>> -                          ctx->voidt, NULL, 0, LLVMNoUnwindAttribute);
>> -}
>> -
>>  static const struct lp_build_tgsi_action tex_action = {
>>         .fetch_args = tex_fetch_args,
>>         .emit = build_tex_intrinsic,
>> --
>> 2.8.2
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list