[Mesa-dev] [PATCH v2 12/14] radeonsi: Use barrier instructions for TCS barriers.
Marek Olšák
maraeo at gmail.com
Mon May 16 17:48:31 UTC 2016
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
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