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

so that it's not done multiple times in branches
---
 src/gallium/drivers/radeonsi/si_shader.c          | 21 +++++++++------------
 src/gallium/drivers/radeonsi/si_shader_internal.h |  1 +
 2 files changed, 10 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 786b250..783d57f 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1315,51 +1315,47 @@ static LLVMValueRef fetch_output_tcs(
 
        return lds_load(bld_base, tgsi2llvmtype(bld_base, type), swizzle, 
dw_addr);
 }
 
 static LLVMValueRef fetch_input_tes(
        struct lp_build_tgsi_context *bld_base,
        const struct tgsi_full_src_register *reg,
        enum tgsi_opcode_type type, unsigned swizzle)
 {
        struct si_shader_context *ctx = si_shader_context(bld_base);
-       LLVMValueRef buffer, base, addr;
-
-       buffer = get_tess_ring_descriptor(ctx, TES_OFFCHIP_RING);
+       LLVMValueRef base, addr;
 
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
        addr = get_tcs_tes_buffer_address_from_reg(ctx, NULL, reg);
 
        return buffer_load(bld_base, tgsi2llvmtype(bld_base, type), swizzle,
-                          buffer, base, addr, true);
+                          ctx->tess_offchip_ring, base, addr, true);
 }
 
 LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi *abi,
                                   LLVMValueRef vertex_index,
                                   LLVMValueRef param_index,
                                   unsigned const_index,
                                   unsigned location,
                                   unsigned driver_location,
                                   unsigned component,
                                   unsigned num_components,
                                   bool is_patch,
                                   bool is_compact,
                                   bool load_input)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        struct tgsi_shader_info *info = &ctx->shader->selector->info;
-       LLVMValueRef buffer, base, addr;
+       LLVMValueRef base, addr;
 
        driver_location = driver_location / 4;
 
-       buffer = get_tess_ring_descriptor(ctx, TES_OFFCHIP_RING);
-
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
 
        if (param_index) {
                /* Add the constant index to the indirect index */
                param_index = LLVMBuildAdd(ctx->ac.builder, param_index,
                                           LLVMConstInt(ctx->i32, const_index, 
0), "");
        } else {
                param_index = LLVMConstInt(ctx->i32, const_index, 0);
        }
 
@@ -1369,21 +1365,22 @@ LLVMValueRef si_nir_load_input_tes(struct ac_shader_abi 
*abi,
                                                               
info->input_semantic_index,
                                                               is_patch);
 
        /* TODO: This will generate rather ordinary llvm code, although it
         * should be easy for the optimiser to fix up. In future we might want
         * to refactor buffer_load(), but for now this maximises code sharing
         * between the NIR and TGSI backends.
         */
        LLVMValueRef value[4];
        for (unsigned i = component; i < num_components + component; i++) {
-               value[i] = buffer_load(&ctx->bld_base, ctx->i32, i, buffer, 
base, addr, true);
+               value[i] = buffer_load(&ctx->bld_base, ctx->i32, i,
+                                      ctx->tess_offchip_ring, base, addr, 
true);
        }
 
        return ac_build_varying_gather_values(&ctx->ac, value, num_components, 
component);
 }
 
 static void store_output_tcs(struct lp_build_tgsi_context *bld_base,
                             const struct tgsi_full_instruction *inst,
                             const struct tgsi_opcode_info *info,
                             unsigned index,
                             LLVMValueRef dst[4])
@@ -1983,32 +1980,30 @@ static LLVMValueRef si_load_tess_coord(struct 
ac_shader_abi *abi)
            PIPE_PRIM_TRIANGLES)
                coord[2] = lp_build_sub(bld, ctx->ac.f32_1,
                                        lp_build_add(bld, coord[0], coord[1]));
 
        return lp_build_gather_values(&ctx->gallivm, coord, 4);
 }
 
 static LLVMValueRef load_tess_level(struct si_shader_context *ctx,
                                    unsigned semantic_name)
 {
-       LLVMValueRef buffer, base, addr;
+       LLVMValueRef base, addr;
 
        int param = si_shader_io_get_unique_index_patch(semantic_name, 0);
 
-       buffer = get_tess_ring_descriptor(ctx, TES_OFFCHIP_RING);
-
        base = LLVMGetParam(ctx->main_fn, ctx->param_tcs_offchip_offset);
        addr = get_tcs_tes_buffer_address(ctx, get_rel_patch_id(ctx), NULL,
                                          LLVMConstInt(ctx->i32, param, 0));
 
        return buffer_load(&ctx->bld_base, ctx->f32,
-                          ~0, buffer, base, addr, true);
+                          ~0, ctx->tess_offchip_ring, base, addr, true);
 
 }
 
 static LLVMValueRef si_load_tess_level(struct ac_shader_abi *abi,
                                       unsigned varying_id)
 {
        struct si_shader_context *ctx = si_shader_context_from_abi(abi);
        unsigned semantic_name;
 
        switch (varying_id) {
@@ -5071,20 +5066,22 @@ static void preload_ring_buffers(struct 
si_shader_context *ctx)
                                             
S_008F0C_NUM_FORMAT(V_008F0C_BUF_NUM_FORMAT_FLOAT) |
                                             
S_008F0C_DATA_FORMAT(V_008F0C_BUF_DATA_FORMAT_32) |
                                             S_008F0C_ELEMENT_SIZE(1) | /* 
element_size = 4 (bytes) */
                                             S_008F0C_INDEX_STRIDE(1) | /* 
index_stride = 16 (elements) */
                                             S_008F0C_ADD_TID_ENABLE(1),
                                             0),
                                LLVMConstInt(ctx->i32, 3, 0), "");
 
                        ctx->gsvs_ring[stream] = ring;
                }
+       } else if (ctx->type == PIPE_SHADER_TESS_EVAL) {
+               ctx->tess_offchip_ring = get_tess_ring_descriptor(ctx, 
TES_OFFCHIP_RING);
        }
 }
 
 static void si_llvm_emit_polygon_stipple(struct si_shader_context *ctx,
                                         LLVMValueRef param_rw_buffers,
                                         unsigned param_pos_fixed_pt)
 {
        LLVMBuilderRef builder = ctx->ac.builder;
        LLVMValueRef slot, desc, offset, row, bit, address[2];
 
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h 
b/src/gallium/drivers/radeonsi/si_shader_internal.h
index f9e0678..4dab921 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -184,20 +184,21 @@ struct si_shader_context {
        int param_gs_vtx23_offset; /* in dwords (GFX9) */
        int param_gs_vtx45_offset; /* in dwords (GFX9) */
        /* CS */
        int param_block_size;
 
        LLVMTargetMachineRef tm;
 
        /* Preloaded descriptors. */
        LLVMValueRef esgs_ring;
        LLVMValueRef gsvs_ring[4];
+       LLVMValueRef tess_offchip_ring;
 
        LLVMValueRef invoc0_tess_factors[6]; /* outer[4], inner[2] */
        LLVMValueRef gs_next_vertex[4];
        LLVMValueRef postponed_kill;
        LLVMValueRef return_value;
 
        LLVMTypeRef voidt;
        LLVMTypeRef i1;
        LLVMTypeRef i8;
        LLVMTypeRef i32;
-- 
2.7.4

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

Reply via email to