ac/nir,radeonsi: add ac_shader_abi::load_ubo
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sat, 20 May 2017 15:19:50 +0000 (17:19 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:36 +0000 (14:55 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_shader_abi.h
src/gallium/drivers/radeonsi/si_shader.c

index b3c18d391b17d8b42de1ea564f494852863bb7bd..e6befff861c6d9b2203995a09bd1a6deb3997d83 100644 (file)
@@ -2454,6 +2454,9 @@ static LLVMValueRef visit_load_ubo_buffer(struct ac_nir_context *ctx,
        LLVMValueRef offset = get_src(ctx, instr->src[1]);
        int num_components = instr->num_components;
 
+       if (ctx->abi->load_ubo)
+               rsrc = ctx->abi->load_ubo(ctx->abi, rsrc);
+
        if (instr->dest.ssa.bit_size == 64)
                num_components *= 2;
 
index 81fbc22bb4dbdd2f9394a20095e9473aaac14f28..b0161d9f22045bf47551c6629b442f891caa0b3e 100644 (file)
@@ -46,6 +46,8 @@ struct ac_shader_abi {
        void (*emit_outputs)(struct ac_shader_abi *abi,
                             unsigned max_outputs,
                             LLVMValueRef *addrs);
+
+       LLVMValueRef (*load_ubo)(struct ac_shader_abi *abi, LLVMValueRef index);
 };
 
 #endif /* AC_SHADER_ABI_H */
index 900b3c3a7f1f45e37e3c5580badcbc127470a6bf..0d25773cc3d835f0db7becd80f784be76eee35df 100644 (file)
@@ -1776,6 +1776,18 @@ static LLVMValueRef load_const_buffer_desc(struct si_shader_context *ctx, int i)
                        LLVMConstInt(ctx->i32, si_get_constbuf_slot(i), 0));
 }
 
+static LLVMValueRef load_ubo(struct ac_shader_abi *abi, LLVMValueRef index)
+{
+       struct si_shader_context *ctx = si_shader_context_from_abi(abi);
+       LLVMValueRef ptr = LLVMGetParam(ctx->main_fn, ctx->param_const_and_shader_buffers);
+
+       index = si_llvm_bound_index(ctx, index, ctx->num_const_buffers);
+       index = LLVMBuildAdd(ctx->gallivm.builder, index,
+                            LLVMConstInt(ctx->i32, SI_NUM_SHADER_BUFFERS, 0), "");
+
+       return ac_build_indexed_load_const(&ctx->ac, ptr, index);
+}
+
 static LLVMValueRef fetch_constant(
        struct lp_build_tgsi_context *bld_base,
        const struct tgsi_full_src_register *reg,
@@ -5609,6 +5621,8 @@ static bool si_compile_tgsi_main(struct si_shader_context *ctx,
                return false;
        }
 
+       ctx->abi.load_ubo = load_ubo;
+
        create_function(ctx);
        preload_ring_buffers(ctx);