From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_pipe.c   |  1 +
 src/gallium/drivers/radeonsi/si_pipe.h   |  3 ++
 src/gallium/drivers/radeonsi/si_shader.c | 53 ++++++++++++++++++++++++--------
 src/gallium/drivers/radeonsi/si_shader.h |  2 +-
 4 files changed, 45 insertions(+), 14 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.c 
b/src/gallium/drivers/radeonsi/si_pipe.c
index fa60732..448fe88 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -600,6 +600,7 @@ struct pipe_screen *radeonsi_screen_create(struct 
radeon_winsys *ws)
 
        sscreen->b.has_cp_dma = true;
        sscreen->b.has_streamout = true;
+       sscreen->use_monolithic_shaders = true;
 
        if (debug_get_bool_option("RADEON_DUMP_SHADERS", FALSE))
                sscreen->b.debug_flags |= DBG_FS | DBG_VS | DBG_GS | DBG_PS | 
DBG_CS;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index b5790d6..2a2455c 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -84,6 +84,9 @@ struct si_compute;
 struct si_screen {
        struct r600_common_screen       b;
        unsigned                        gs_table_depth;
+
+       /* Whether shaders are monolithic (1-part) or separate (3-part). */
+       bool                            use_monolithic_shaders;
 };
 
 struct si_blend_color {
diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index b058019..b74ed1e 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -70,6 +70,12 @@ struct si_shader_context
 
        unsigned type; /* TGSI_PROCESSOR_* specifies the type of shader. */
        bool is_gs_copy_shader;
+
+       /* Whether to generate the optimized shader variant compiled as a whole
+        * (without a prolog and epilog)
+        */
+       bool is_monolithic;
+
        int param_streamout_config;
        int param_streamout_write_index;
        int param_streamout_offset[4];
@@ -3657,8 +3663,10 @@ static void create_function(struct si_shader_context 
*ctx)
        struct lp_build_tgsi_context *bld_base = &ctx->radeon_bld.soa.bld_base;
        struct gallivm_state *gallivm = bld_base->base.gallivm;
        struct si_shader *shader = ctx->shader;
-       LLVMTypeRef params[SI_NUM_PARAMS], v2i32, v3i32;
+       LLVMTypeRef params[SI_NUM_PARAMS + SI_NUM_VERTEX_BUFFERS], v2i32, v3i32;
+       LLVMTypeRef returns[16+32*4];
        unsigned i, last_array_pointer, last_sgpr, num_params;
+       unsigned num_returns = 0;
 
        v2i32 = LLVMVectorType(ctx->i32, 2);
        v3i32 = LLVMVectorType(ctx->i32, 3);
@@ -3785,7 +3793,7 @@ static void create_function(struct si_shader_context *ctx)
 
        assert(num_params <= Elements(params));
 
-       si_create_function(ctx, NULL, 0, params,
+       si_create_function(ctx, returns, num_returns, params,
                           num_params, last_array_pointer, last_sgpr);
 
        shader->num_input_sgprs = 0;
@@ -4492,9 +4500,11 @@ static void si_init_shader_ctx(struct si_shader_context 
*ctx,
        bld_base->op_actions[TGSI_OPCODE_MIN].intr_name = "llvm.minnum.f32";
 }
 
-int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
-                    struct si_shader *shader,
-                    struct pipe_debug_callback *debug)
+static int si_compile_tgsi_shader(struct si_screen *sscreen,
+                                 LLVMTargetMachineRef tm,
+                                 struct si_shader *shader,
+                                 bool is_monolithic,
+                                 struct pipe_debug_callback *debug)
 {
        struct si_shader_selector *sel = shader->selector;
        struct tgsi_token *tokens = sel->tokens;
@@ -4524,6 +4534,7 @@ int si_shader_create(struct si_screen *sscreen, 
LLVMTargetMachineRef tm,
 
        si_init_shader_ctx(&ctx, sscreen, shader, tm,
                           poly_stipple ? &stipple_shader_info : &sel->info);
+       ctx.is_monolithic = is_monolithic;
 
        shader->uses_instanceid = sel->info.uses_instanceid;
 
@@ -4604,14 +4615,6 @@ int si_shader_create(struct si_screen *sscreen, 
LLVMTargetMachineRef tm,
                goto out;
        }
 
-       si_shader_dump(sscreen, shader, debug, ctx.type);
-
-       r = si_shader_binary_upload(sscreen, shader);
-       if (r) {
-               fprintf(stderr, "LLVM failed to upload shader\n");
-               goto out;
-       }
-
        radeon_llvm_dispose(&ctx.radeon_bld);
 
        /* Calculate the number of fragment input VGPRs. */
@@ -4675,6 +4678,30 @@ out:
        return r;
 }
 
+int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
+                    struct si_shader *shader,
+                    struct pipe_debug_callback *debug)
+{
+       int r;
+
+       /* Compile TGSI. */
+       r = si_compile_tgsi_shader(sscreen, tm, shader,
+                                  sscreen->use_monolithic_shaders, debug);
+       if (r)
+               return r;
+
+       si_shader_dump(sscreen, shader, debug, 
shader->selector->info.processor);
+
+       /* Upload. */
+       r = si_shader_binary_upload(sscreen, shader);
+       if (r) {
+               fprintf(stderr, "LLVM failed to upload shader\n");
+               return r;
+       }
+
+       return 0;
+}
+
 void si_shader_destroy(struct si_shader *shader)
 {
        if (shader->gs_copy_shader) {
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 4c3c14a..66b3156 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -363,7 +363,7 @@ static inline bool si_vs_exports_prim_id(struct si_shader 
*shader)
                return false;
 }
 
-/* radeonsi_shader.c */
+/* si_shader.c */
 int si_shader_create(struct si_screen *sscreen, LLVMTargetMachineRef tm,
                     struct si_shader *shader,
                     struct pipe_debug_callback *debug);
-- 
2.5.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to