From 225b19880204024a805cc54b1001d09ef3b58054 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 12 Dec 2017 18:10:23 +0100 Subject: [PATCH] amd/common: add ac_build_waitcnt() Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/common/ac_llvm_build.c | 9 +++++++++ src/amd/common/ac_llvm_build.h | 2 ++ src/amd/common/ac_nir_to_llvm.c | 14 ++------------ src/gallium/drivers/radeonsi/si_shader.c | 13 ++----------- src/gallium/drivers/radeonsi/si_shader_internal.h | 2 -- src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c | 4 ++-- 6 files changed, 17 insertions(+), 27 deletions(-) diff --git a/src/amd/common/ac_llvm_build.c b/src/amd/common/ac_llvm_build.c index baa921d..b407678 100644 --- a/src/amd/common/ac_llvm_build.c +++ b/src/amd/common/ac_llvm_build.c @@ -1482,6 +1482,15 @@ LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, AC_FUNC_ATTR_LEGACY); } +void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned simm16) +{ + LLVMValueRef args[1] = { + LLVMConstInt(ctx->i32, simm16, false), + }; + ac_build_intrinsic(ctx, "llvm.amdgcn.s.waitcnt", + ctx->voidt, args, 1, 0); +} + void ac_get_image_intr_name(const char *base_name, LLVMTypeRef data_type, LLVMTypeRef coords_type, diff --git a/src/amd/common/ac_llvm_build.h b/src/amd/common/ac_llvm_build.h index 655dc1d..4a570c4 100644 --- a/src/amd/common/ac_llvm_build.h +++ b/src/amd/common/ac_llvm_build.h @@ -286,6 +286,8 @@ LLVMValueRef ac_build_bfe(struct ac_llvm_context *ctx, LLVMValueRef input, LLVMValueRef offset, LLVMValueRef width, bool is_signed); +void ac_build_waitcnt(struct ac_llvm_context *ctx, unsigned simm16); + void ac_get_image_intr_name(const char *base_name, LLVMTypeRef data_type, LLVMTypeRef coords_type, diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c index 25bdb34..69d7bea 100644 --- a/src/amd/common/ac_nir_to_llvm.c +++ b/src/amd/common/ac_nir_to_llvm.c @@ -3674,16 +3674,6 @@ static LLVMValueRef visit_image_size(struct ac_nir_context *ctx, #define LGKM_CNT 0x07f #define VM_CNT 0xf70 -static void emit_waitcnt(struct nir_to_llvm_context *ctx, - unsigned simm16) -{ - LLVMValueRef args[1] = { - LLVMConstInt(ctx->ac.i32, simm16, false), - }; - ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.s.waitcnt", - ctx->ac.voidt, args, 1, 0); -} - static void emit_membar(struct nir_to_llvm_context *ctx, const nir_intrinsic_instr *instr) { @@ -3706,7 +3696,7 @@ static void emit_membar(struct nir_to_llvm_context *ctx, break; } if (waitcnt != NOOP_WAITCNT) - emit_waitcnt(ctx, waitcnt); + ac_build_waitcnt(&ctx->ac, waitcnt); } static void emit_barrier(struct nir_to_llvm_context *ctx) @@ -3717,7 +3707,7 @@ static void emit_barrier(struct nir_to_llvm_context *ctx) */ if (ctx->options->chip_class == SI && ctx->stage == MESA_SHADER_TESS_CTRL) { - emit_waitcnt(ctx, LGKM_CNT & VM_CNT); + ac_build_waitcnt(&ctx->ac, LGKM_CNT & VM_CNT); return; } ac_build_intrinsic(&ctx->ac, "llvm.amdgcn.s.barrier", diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 5e49d65..02e24f0 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3681,15 +3681,6 @@ static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi, ctx->return_value = ret; } -void si_emit_waitcnt(struct si_shader_context *ctx, unsigned simm16) -{ - LLVMValueRef args[1] = { - LLVMConstInt(ctx->i32, simm16, 0) - }; - lp_build_intrinsic(ctx->ac.builder, "llvm.amdgcn.s.waitcnt", - ctx->voidt, args, 1, 0); -} - static void membar_emit( const struct lp_build_tgsi_action *action, struct lp_build_tgsi_context *bld_base, @@ -3712,7 +3703,7 @@ static void membar_emit( waitcnt &= LGKM_CNT; if (waitcnt != NOOP_WAITCNT) - si_emit_waitcnt(ctx, waitcnt); + ac_build_waitcnt(&ctx->ac, waitcnt); } static void clock_emit( @@ -4198,7 +4189,7 @@ static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action, */ if (ctx->screen->info.chip_class == SI && ctx->type == PIPE_SHADER_TESS_CTRL) { - si_emit_waitcnt(ctx, LGKM_CNT & VM_CNT); + ac_build_waitcnt(&ctx->ac, LGKM_CNT & VM_CNT); return; } diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index f50a022d..e05927c 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -294,8 +294,6 @@ void si_llvm_emit_store(struct lp_build_tgsi_context *bld_base, #define LGKM_CNT 0x07f #define VM_CNT 0xf70 -void si_emit_waitcnt(struct si_shader_context *ctx, unsigned simm16); - LLVMValueRef si_get_indirect_index(struct si_shader_context *ctx, const struct tgsi_ind_register *ind, unsigned addr_mul, int rel_index); diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c index 35ada5f..099f86b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c @@ -567,7 +567,7 @@ static void load_emit( } if (inst->Memory.Qualifier & TGSI_MEMORY_VOLATILE) - si_emit_waitcnt(ctx, VM_CNT); + ac_build_waitcnt(&ctx->ac, VM_CNT); can_speculate = !(inst->Memory.Qualifier & TGSI_MEMORY_VOLATILE) && is_oneway_access_only(inst, info, @@ -780,7 +780,7 @@ static void store_emit( } if (inst->Memory.Qualifier & TGSI_MEMORY_VOLATILE) - si_emit_waitcnt(ctx, VM_CNT); + ac_build_waitcnt(&ctx->ac, VM_CNT); writeonly_memory = is_oneway_access_only(inst, info, info->shader_buffers_load | -- 2.7.4