radeonsi: preload shader buffers in shaders
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 15 Mar 2016 23:34:52 +0000 (18:34 -0500)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 12 Apr 2016 21:30:29 +0000 (16:30 -0500)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
src/gallium/drivers/radeonsi/si_shader.c

index 8f9a6212b435cf5acc69cfdcea63247eca045030..9d74c2a0198e6d2ff66e2e1afef46734690a38db 100644 (file)
@@ -98,6 +98,7 @@ struct si_shader_context
        LLVMValueRef const_buffers[SI_NUM_CONST_BUFFERS];
        LLVMValueRef lds;
        LLVMValueRef *constants[SI_NUM_CONST_BUFFERS];
+       LLVMValueRef shader_buffers[SI_NUM_SHADER_BUFFERS];
        LLVMValueRef sampler_views[SI_NUM_SAMPLERS];
        LLVMValueRef sampler_states[SI_NUM_SAMPLERS];
        LLVMValueRef fmasks[SI_NUM_USER_SAMPLERS];
@@ -4710,6 +4711,21 @@ static void preload_constants(struct si_shader_context *ctx)
        }
 }
 
+static void preload_shader_buffers(struct si_shader_context *ctx)
+{
+       struct gallivm_state *gallivm = &ctx->radeon_bld.gallivm;
+       LLVMValueRef ptr = LLVMGetParam(ctx->radeon_bld.main_fn, SI_PARAM_SHADER_BUFFERS);
+       int buf, maxbuf;
+
+       maxbuf = MIN2(ctx->shader->selector->info.file_max[TGSI_FILE_BUFFER],
+                     SI_NUM_SHADER_BUFFERS - 1);
+       for (buf = 0; buf <= maxbuf; ++buf) {
+               ctx->shader_buffers[buf] =
+                       build_indexed_load_const(
+                               ctx, ptr, lp_build_const_int32(gallivm, buf));
+       }
+}
+
 static void preload_samplers(struct si_shader_context *ctx)
 {
        struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
@@ -5575,6 +5591,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
        create_meta_data(&ctx);
        create_function(&ctx);
        preload_constants(&ctx);
+       preload_shader_buffers(&ctx);
        preload_samplers(&ctx);
        preload_images(&ctx);
        preload_streamout_buffers(&ctx);