v2: make use of existing si_tgsi_emit_epilogue()
---
 src/gallium/drivers/radeonsi/si_shader.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 3293dd44c6..a64f0d69a6 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1106,27 +1106,25 @@ static LLVMValueRef lds_load(struct 
lp_build_tgsi_context *bld_base,
        return bitcast(bld_base, type, value);
 }
 
 /**
  * Store to LDS.
  *
  * \param swizzle      offset (typically 0..3)
  * \param dw_addr      address in dwords
  * \param value                value to store
  */
-static void lds_store(struct lp_build_tgsi_context *bld_base,
+static void lds_store(struct si_shader_context *ctx,
                      unsigned dw_offset_imm, LLVMValueRef dw_addr,
                      LLVMValueRef value)
 {
-       struct si_shader_context *ctx = si_shader_context(bld_base);
-
-       dw_addr = lp_build_add(&bld_base->uint_bld, dw_addr,
+       dw_addr = lp_build_add(&ctx->bld_base.uint_bld, dw_addr,
                            LLVMConstInt(ctx->i32, dw_offset_imm, 0));
 
        ac_lds_store(&ctx->ac, dw_addr, value);
 }
 
 static LLVMValueRef desc_from_addr_base64k(struct si_shader_context *ctx,
                                                  unsigned param)
 {
        LLVMBuilderRef builder = ctx->ac.builder;
 
@@ -1258,21 +1256,21 @@ static void store_output_tcs(struct 
lp_build_tgsi_context *bld_base,
        uint32_t writemask = reg->Register.WriteMask;
        while (writemask) {
                chan_index = u_bit_scan(&writemask);
                LLVMValueRef value = dst[chan_index];
 
                if (inst->Instruction.Saturate)
                        value = ac_build_clamp(&ctx->ac, value);
 
                /* Skip LDS stores if there is no LDS read of this output. */
                if (!skip_lds_store)
-                       lds_store(bld_base, chan_index, dw_addr, value);
+                       lds_store(ctx, chan_index, dw_addr, value);
 
                value = ac_to_integer(&ctx->ac, value);
                values[chan_index] = value;
 
                if (reg->Register.WriteMask != 0xF && !is_tess_factor) {
                        ac_build_buffer_store_dword(&ctx->ac, buffer, value, 1,
                                                    buf_addr, base,
                                                    4 * chan_index, 1, 0, true, 
false);
                }
 
@@ -3126,36 +3124,37 @@ static void si_set_es_return_value_for_gs(struct 
si_shader_context *ctx)
                                           8 + 
GFX9_SGPR_GS_SAMPLERS_AND_IMAGES);
 
        unsigned vgpr = 8 + GFX9_GS_NUM_USER_SGPR;
        for (unsigned i = 0; i < 5; i++) {
                unsigned param = ctx->param_gs_vtx01_offset + i;
                ret = si_insert_input_ret_float(ctx, ret, param, vgpr++);
        }
        ctx->return_value = ret;
 }
 
-static void si_llvm_emit_ls_epilogue(struct lp_build_tgsi_context *bld_base)
+static void si_llvm_emit_ls_epilogue(struct ac_shader_abi *abi,
+                                    unsigned max_outputs,
+                                    LLVMValueRef *addrs)
 {
-       struct si_shader_context *ctx = si_shader_context(bld_base);
+       struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        struct si_shader *shader = ctx->shader;
        struct tgsi_shader_info *info = &shader->selector->info;
        unsigned i, chan;
        LLVMValueRef vertex_id = LLVMGetParam(ctx->main_fn,
                                              ctx->param_rel_auto_id);
        LLVMValueRef vertex_dw_stride = get_tcs_in_vertex_dw_stride(ctx);
        LLVMValueRef base_dw_addr = LLVMBuildMul(ctx->ac.builder, vertex_id,
                                                 vertex_dw_stride, "");
 
        /* Write outputs to LDS. The next shader (TCS aka HS) will read
         * its inputs from it. */
        for (i = 0; i < info->num_outputs; i++) {
-               LLVMValueRef *out_ptr = ctx->outputs[i];
                unsigned name = info->output_semantic_name[i];
                unsigned index = info->output_semantic_index[i];
 
                /* The ARB_shader_viewport_layer_array spec contains the
                 * following issue:
                 *
                 *    2) What happens if gl_ViewportIndex or gl_Layer is
                 *    written in the vertex shader and a geometry shader is
                 *    present?
                 *
@@ -3169,22 +3168,22 @@ static void si_llvm_emit_ls_epilogue(struct 
lp_build_tgsi_context *bld_base)
                 */
                if (name == TGSI_SEMANTIC_LAYER ||
                    name == TGSI_SEMANTIC_VIEWPORT_INDEX)
                        continue;
 
                int param = si_shader_io_get_unique_index(name, index);
                LLVMValueRef dw_addr = LLVMBuildAdd(ctx->ac.builder, 
base_dw_addr,
                                        LLVMConstInt(ctx->i32, param * 4, 0), 
"");
 
                for (chan = 0; chan < 4; chan++) {
-                       lds_store(bld_base, chan, dw_addr,
-                                 LLVMBuildLoad(ctx->ac.builder, out_ptr[chan], 
""));
+                       lds_store(ctx, chan, dw_addr,
+                                 LLVMBuildLoad(ctx->ac.builder, addrs[4 * i + 
chan], ""));
                }
        }
 
        if (ctx->screen->b.chip_class >= GFX9)
                si_set_ls_return_value_for_tcs(ctx);
 }
 
 static void si_llvm_emit_es_epilogue(struct lp_build_tgsi_context *bld_base)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
@@ -3217,21 +3216,21 @@ static void si_llvm_emit_es_epilogue(struct 
lp_build_tgsi_context *bld_base)
 
                param = 
si_shader_io_get_unique_index(info->output_semantic_name[i],
                                                      
info->output_semantic_index[i]);
 
                for (chan = 0; chan < 4; chan++) {
                        LLVMValueRef out_val = LLVMBuildLoad(ctx->ac.builder, 
out_ptr[chan], "");
                        out_val = ac_to_integer(&ctx->ac, out_val);
 
                        /* GFX9 has the ESGS ring in LDS. */
                        if (ctx->screen->b.chip_class >= GFX9) {
-                               lds_store(bld_base, param * 4 + chan, lds_base, 
out_val);
+                               lds_store(ctx, param * 4 + chan, lds_base, 
out_val);
                                continue;
                        }
 
                        ac_build_buffer_store_dword(&ctx->ac,
                                                    ctx->esgs_ring,
                                                    out_val, 1, NULL, soffset,
                                                    (4 * param + chan) * 4,
                                                    1, 1, true, true);
                }
        }
@@ -4426,21 +4425,20 @@ static void create_function(struct si_shader_context 
*ctx)
                        break;
                }
 
                declare_per_stage_desc_pointers(ctx, &fninfo, true);
                declare_vs_specific_input_sgprs(ctx, &fninfo);
 
                if (shader->key.as_es) {
                        assert(!shader->selector->nir);
                        ctx->param_es2gs_offset = add_arg(&fninfo, ARG_SGPR, 
ctx->i32);
                } else if (shader->key.as_ls) {
-                       assert(!shader->selector->nir);
                        /* no extra parameters */
                } else {
                        if (shader->is_gs_copy_shader) {
                                fninfo.num_params = ctx->param_rw_buffers + 1;
                                fninfo.num_sgpr_params = fninfo.num_params;
                        }
 
                        /* The locations of the other parameters are assigned 
dynamically. */
                        declare_streamout_params(ctx, &shader->selector->so,
                                                 &fninfo);
@@ -5731,23 +5729,24 @@ static bool si_compile_tgsi_main(struct 
si_shader_context *ctx,
                                 bool is_monolithic)
 {
        struct si_shader *shader = ctx->shader;
        struct si_shader_selector *sel = shader->selector;
        struct lp_build_tgsi_context *bld_base = &ctx->bld_base;
 
        // TODO clean all this up!
        switch (ctx->type) {
        case PIPE_SHADER_VERTEX:
                ctx->load_input = declare_input_vs;
-               if (shader->key.as_ls)
-                       bld_base->emit_epilogue = si_llvm_emit_ls_epilogue;
-               else if (shader->key.as_es)
+               if (shader->key.as_ls) {
+                       ctx->abi.emit_outputs = si_llvm_emit_ls_epilogue;
+                       bld_base->emit_epilogue = si_tgsi_emit_epilogue;
+               } else if (shader->key.as_es)
                        bld_base->emit_epilogue = si_llvm_emit_es_epilogue;
                else {
                        ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
                        bld_base->emit_epilogue = si_tgsi_emit_epilogue;
                }
                break;
        case PIPE_SHADER_TESS_CTRL:
                bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_tcs;
                bld_base->emit_fetch_funcs[TGSI_FILE_OUTPUT] = fetch_output_tcs;
                bld_base->emit_store = store_output_tcs;
-- 
2.14.3

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

Reply via email to