diff options
author | Marek Olšák <[email protected]> | 2017-05-19 15:47:23 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-05-29 01:52:16 +0200 |
commit | 48b91103cea7fec8ec2864c3a4f8fe1eec711073 (patch) | |
tree | 6f6a0b3d994570c5eee81f12b6cc614978426eb2 /src/gallium | |
parent | e019ea8f4b6f4e76a6d52e9ff8d6e11b19d97a94 (diff) |
radeonsi: use ac_build_buffer_load for shader buffer loads
and document why we can't use SMEM yet.
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c index e2be9e57c8b..c53bde1e6d4 100644 --- a/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c +++ b/src/gallium/drivers/radeonsi/si_shader_tgsi_mem.c @@ -414,32 +414,31 @@ static void load_emit_buffer(struct si_shader_context *ctx, bool can_speculate) { const struct tgsi_full_instruction *inst = emit_data->inst; - struct gallivm_state *gallivm = &ctx->gallivm; - LLVMBuilderRef builder = gallivm->builder; uint writemask = inst->Dst[0].Register.WriteMask; uint count = util_last_bit(writemask); - const char *intrinsic_name; - LLVMTypeRef dst_type; + LLVMValueRef *args = emit_data->args; - switch (count) { - case 1: - intrinsic_name = "llvm.amdgcn.buffer.load.f32"; - dst_type = ctx->f32; - break; - case 2: - intrinsic_name = "llvm.amdgcn.buffer.load.v2f32"; - dst_type = LLVMVectorType(ctx->f32, 2); - break; - default: // 3 & 4 - intrinsic_name = "llvm.amdgcn.buffer.load.v4f32"; - dst_type = ctx->v4f32; - count = 4; - } + /* Don't use SMEM for shader buffer loads, because LLVM doesn't + * select SMEM for SI.load.const with a non-constant offset, and + * constant offsets practically don't exist with shader buffers. + * + * Also, SI.load.const doesn't use inst_offset when it's lowered + * to VMEM, so we just end up with more VALU instructions in the end + * and no benefit. + * + * TODO: Remove this line once LLVM can select SMEM with a non-constant + * offset, and can derive inst_offset when VMEM is selected. + * After that, si_memory_barrier should invalidate sL1 for shader + * buffers. + */ - emit_data->output[emit_data->chan] = lp_build_intrinsic( - builder, intrinsic_name, dst_type, - emit_data->args, emit_data->arg_count, - get_load_intr_attribs(can_speculate)); + assert(LLVMConstIntGetZExtValue(args[1]) == 0); /* vindex */ + emit_data->output[emit_data->chan] = + ac_build_buffer_load(&ctx->ac, args[0], count, NULL, + args[2], NULL, 0, + LLVMConstIntGetZExtValue(args[3]), + LLVMConstIntGetZExtValue(args[4]), + can_speculate, false); } static LLVMValueRef get_memory_ptr(struct si_shader_context *ctx, |