From: Nicolai Hähnle <nicolai.haeh...@amd.com>

Make it a bit clearer that the index spaces are logically seperate by
having them defined in different functions.
---
 src/gallium/drivers/radeonsi/si_shader.c        | 56 +++++++++++++++++--------
 src/gallium/drivers/radeonsi/si_shader.h        |  1 +
 src/gallium/drivers/radeonsi/si_state_shaders.c |  6 +--
 3 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 77dd6b1..a48a552 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -98,20 +98,42 @@ static bool is_merged_shader(struct si_shader *shader)
        if (shader->selector->screen->b.chip_class <= VI)
                return false;
 
        return shader->key.as_ls ||
               shader->key.as_es ||
               shader->selector->type == PIPE_SHADER_TESS_CTRL ||
               shader->selector->type == PIPE_SHADER_GEOMETRY;
 }
 
 /**
+ * Returns a unique index for a per-patch semantic name and index. The index
+ * must be less than 32, so that a 32-bit bitmask of used inputs or outputs
+ * can be calculated.
+ */
+unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name, unsigned 
index)
+{
+       switch (semantic_name) {
+       case TGSI_SEMANTIC_TESSOUTER:
+               return 0;
+       case TGSI_SEMANTIC_TESSINNER:
+               return 1;
+       case TGSI_SEMANTIC_PATCH:
+               assert(index < 30);
+               return 2 + index;
+
+       default:
+               assert(!"invalid semantic name");
+               return 0;
+       }
+}
+
+/**
  * Returns a unique index for a semantic name and index. The index must be
  * less than 64, so that a 64-bit bitmask of used inputs or outputs can be
  * calculated.
  */
 unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index)
 {
        switch (semantic_name) {
        case TGSI_SEMANTIC_POSITION:
                return 0;
        case TGSI_SEMANTIC_PSIZE:
@@ -119,28 +141,20 @@ unsigned si_shader_io_get_unique_index(unsigned 
semantic_name, unsigned index)
        case TGSI_SEMANTIC_CLIPDIST:
                assert(index <= 1);
                return 2 + index;
        case TGSI_SEMANTIC_GENERIC:
                if (index <= 63-4)
                        return 4 + index;
 
                assert(!"invalid generic index");
                return 0;
 
-       /* patch indices are completely separate and thus start from 0 */
-       case TGSI_SEMANTIC_TESSOUTER:
-               return 0;
-       case TGSI_SEMANTIC_TESSINNER:
-               return 1;
-       case TGSI_SEMANTIC_PATCH:
-               return 2 + index;
-
        default:
                assert(!"invalid semantic name");
                return 0;
        }
 }
 
 unsigned si_shader_io_get_unique_index2(unsigned name, unsigned index)
 {
        switch (name) {
        case TGSI_SEMANTIC_FOG:
@@ -670,24 +684,29 @@ static LLVMValueRef get_dw_address(struct 
si_shader_context *ctx,
                else
                        first = reg.Register.Index;
 
                ind_index = get_indirect_index(ctx, &reg.Indirect,
                                           reg.Register.Index - first);
 
                base_addr = LLVMBuildAdd(gallivm->builder, base_addr,
                                    LLVMBuildMul(gallivm->builder, ind_index,
                                                 LLVMConstInt(ctx->i32, 4, 0), 
""), "");
 
-               param = si_shader_io_get_unique_index(name[first], 
index[first]);
+               param = reg.Register.Dimension ?
+                       si_shader_io_get_unique_index(name[first], 
index[first]) :
+                       si_shader_io_get_unique_index_patch(name[first], 
index[first]);
        } else {
-               param = si_shader_io_get_unique_index(name[reg.Register.Index],
-                                                     
index[reg.Register.Index]);
+               param = reg.Register.Dimension ?
+                       si_shader_io_get_unique_index(name[reg.Register.Index],
+                                                     
index[reg.Register.Index]) :
+                       
si_shader_io_get_unique_index_patch(name[reg.Register.Index],
+                                                           
index[reg.Register.Index]);
        }
 
        /* Add the base address of the element. */
        return LLVMBuildAdd(gallivm->builder, base_addr,
                            LLVMConstInt(ctx->i32, param * 4, 0), "");
 }
 
 /* The offchip buffer layout for TCS->TES is
  *
  * - attribute 0 of patch 0 vertex 0
@@ -795,22 +814,23 @@ static LLVMValueRef get_tcs_tes_buffer_address_from_reg(
                        param_base = reg.Register.Index;
 
                param_index = get_indirect_index(ctx, &reg.Indirect,
                                                 reg.Register.Index - 
param_base);
 
        } else {
                param_base = reg.Register.Index;
                param_index = ctx->i32_0;
        }
 
-       param_index_base = si_shader_io_get_unique_index(name[param_base],
-                                                        index[param_base]);
+       param_index_base = reg.Register.Dimension ?
+               si_shader_io_get_unique_index(name[param_base], 
index[param_base]) :
+               si_shader_io_get_unique_index_patch(name[param_base], 
index[param_base]);
 
        param_index = LLVMBuildAdd(gallivm->builder, param_index,
                                   LLVMConstInt(ctx->i32, param_index_base, 0),
                                   "");
 
        return get_tcs_tes_buffer_address(ctx, get_rel_patch_id(ctx),
                                          vertex_index, param_index);
 }
 
 static LLVMValueRef buffer_load(struct lp_build_tgsi_context *bld_base,
@@ -1548,21 +1568,21 @@ static void declare_system_value(struct 
si_shader_context *ctx,
                else if (ctx->type == PIPE_SHADER_TESS_EVAL)
                        value = unpack_param(ctx, 
ctx->param_tcs_offchip_layout, 6, 6);
                else
                        assert(!"invalid shader stage for 
TGSI_SEMANTIC_VERTICESIN");
                break;
 
        case TGSI_SEMANTIC_TESSINNER:
        case TGSI_SEMANTIC_TESSOUTER:
        {
                LLVMValueRef buffer, base, addr;
-               int param = si_shader_io_get_unique_index(decl->Semantic.Name, 
0);
+               int param = 
si_shader_io_get_unique_index_patch(decl->Semantic.Name, 0);
 
                buffer = desc_from_addr_base64k(ctx, 
ctx->param_tcs_offchip_addr_base64k);
 
                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));
 
                value = buffer_load(&ctx->bld_base, TGSI_TYPE_FLOAT,
                                    ~0, buffer, base, addr, true);
 
@@ -2537,22 +2557,22 @@ static void si_write_tess_factors(struct 
lp_build_tgsi_context *bld_base,
                inner_comps = 2;
                break;
        default:
                assert(0);
                return;
        }
 
        /* Load tess_inner and tess_outer from LDS.
         * Any invocation can write them, so we can't get them from a temporary.
         */
-       tess_inner_index = 
si_shader_io_get_unique_index(TGSI_SEMANTIC_TESSINNER, 0);
-       tess_outer_index = 
si_shader_io_get_unique_index(TGSI_SEMANTIC_TESSOUTER, 0);
+       tess_inner_index = 
si_shader_io_get_unique_index_patch(TGSI_SEMANTIC_TESSINNER, 0);
+       tess_outer_index = 
si_shader_io_get_unique_index_patch(TGSI_SEMANTIC_TESSOUTER, 0);
 
        lds_base = tcs_out_current_patch_data_offset;
        lds_inner = LLVMBuildAdd(gallivm->builder, lds_base,
                                 LLVMConstInt(ctx->i32,
                                              tess_inner_index * 4, 0), "");
        lds_outer = LLVMBuildAdd(gallivm->builder, lds_base,
                                 LLVMConstInt(ctx->i32,
                                              tess_outer_index * 4, 0), "");
 
        for (i = 0; i < 4; i++) {
@@ -2621,33 +2641,33 @@ static void si_write_tess_factors(struct 
lp_build_tgsi_context *bld_base,
 
        /* Store the tess factors into the offchip buffer if TES reads them. */
        if (shader->key.part.tcs.epilog.tes_reads_tess_factors) {
                LLVMValueRef buf, base, inner_vec, outer_vec, tf_outer_offset;
                LLVMValueRef tf_inner_offset;
                unsigned param_outer, param_inner;
 
                buf = desc_from_addr_base64k(ctx, 
ctx->param_tcs_offchip_addr_base64k);
                base = LLVMGetParam(ctx->main_fn, 
ctx->param_tcs_offchip_offset);
 
-               param_outer = si_shader_io_get_unique_index(
+               param_outer = si_shader_io_get_unique_index_patch(
                                      TGSI_SEMANTIC_TESSOUTER, 0);
                tf_outer_offset = get_tcs_tes_buffer_address(ctx, rel_patch_id, 
NULL,
                                        LLVMConstInt(ctx->i32, param_outer, 0));
 
                outer_vec = lp_build_gather_values(gallivm, outer,
                                                   
util_next_power_of_two(outer_comps));
 
                ac_build_buffer_store_dword(&ctx->ac, buf, outer_vec,
                                            outer_comps, tf_outer_offset,
                                            base, 0, 1, 0, true, false);
                if (inner_comps) {
-                       param_inner = si_shader_io_get_unique_index(
+                       param_inner = si_shader_io_get_unique_index_patch(
                                              TGSI_SEMANTIC_TESSINNER, 0);
                        tf_inner_offset = get_tcs_tes_buffer_address(ctx, 
rel_patch_id, NULL,
                                        LLVMConstInt(ctx->i32, param_inner, 0));
 
                        inner_vec = inner_comps == 1 ? inner[0] :
                                    lp_build_gather_values(gallivm, inner, 
inner_comps);
                        ac_build_buffer_store_dword(&ctx->ac, buf, inner_vec,
                                                    inner_comps, 
tf_inner_offset,
                                                    base, 0, 1, 0, true, false);
                }
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 0988d91..cb8a902 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -598,20 +598,21 @@ int si_shader_create(struct si_screen *sscreen, 
LLVMTargetMachineRef tm,
                     struct pipe_debug_callback *debug);
 int si_compile_llvm(struct si_screen *sscreen,
                    struct ac_shader_binary *binary,
                    struct si_shader_config *conf,
                    LLVMTargetMachineRef tm,
                    LLVMModuleRef mod,
                    struct pipe_debug_callback *debug,
                    unsigned processor,
                    const char *name);
 void si_shader_destroy(struct si_shader *shader);
+unsigned si_shader_io_get_unique_index_patch(unsigned semantic_name, unsigned 
index);
 unsigned si_shader_io_get_unique_index(unsigned semantic_name, unsigned index);
 unsigned si_shader_io_get_unique_index2(unsigned name, unsigned index);
 int si_shader_binary_upload(struct si_screen *sscreen, struct si_shader 
*shader);
 void si_shader_dump(struct si_screen *sscreen, struct si_shader *shader,
                    struct pipe_debug_callback *debug, unsigned processor,
                    FILE *f, bool check_debug_option);
 void si_multiwave_lds_size_workaround(struct si_screen *sscreen,
                                      unsigned *lds_size);
 void si_shader_apply_scratch_relocs(struct si_context *sctx,
                        struct si_shader *shader,
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index e479422..68f4d21 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1975,35 +1975,35 @@ static void *si_create_shader_selector(struct 
pipe_context *ctx,
                        sel->max_gs_stream = MAX2(sel->max_gs_stream,
                                                  sel->so.output[i].stream);
 
                sel->gs_input_verts_per_prim =
                        
u_vertices_per_prim(sel->info.properties[TGSI_PROPERTY_GS_INPUT_PRIM]);
                break;
 
        case PIPE_SHADER_TESS_CTRL:
                /* Always reserve space for these. */
                sel->patch_outputs_written |=
-                       (1llu << 
si_shader_io_get_unique_index(TGSI_SEMANTIC_TESSINNER, 0)) |
-                       (1llu << 
si_shader_io_get_unique_index(TGSI_SEMANTIC_TESSOUTER, 0));
+                       (1llu << 
si_shader_io_get_unique_index_patch(TGSI_SEMANTIC_TESSINNER, 0)) |
+                       (1llu << 
si_shader_io_get_unique_index_patch(TGSI_SEMANTIC_TESSOUTER, 0));
                /* fall through */
        case PIPE_SHADER_VERTEX:
        case PIPE_SHADER_TESS_EVAL:
                for (i = 0; i < sel->info.num_outputs; i++) {
                        unsigned name = sel->info.output_semantic_name[i];
                        unsigned index = sel->info.output_semantic_index[i];
 
                        switch (name) {
                        case TGSI_SEMANTIC_TESSINNER:
                        case TGSI_SEMANTIC_TESSOUTER:
                        case TGSI_SEMANTIC_PATCH:
                                sel->patch_outputs_written |=
-                                       1llu << 
si_shader_io_get_unique_index(name, index);
+                                       1llu << 
si_shader_io_get_unique_index_patch(name, index);
                                break;
 
                        case TGSI_SEMANTIC_GENERIC:
                                /* don't process indices the function can't 
handle */
                                if (index >= 60)
                                        break;
                                /* fall through */
                        case TGSI_SEMANTIC_POSITION:
                        case TGSI_SEMANTIC_PSIZE:
                        case TGSI_SEMANTIC_CLIPDIST:
-- 
2.9.3

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

Reply via email to