On 24.04.2017 10:45, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com>

A merged LS-HS shader needs both fix_fetch and inputs_to_copy
for compilation.

Patches 5-8:

Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>


---
 src/gallium/drivers/radeonsi/si_shader.c        | 10 +++++-----
 src/gallium/drivers/radeonsi/si_shader.h        | 12 ++++--------
 src/gallium/drivers/radeonsi/si_state_shaders.c |  4 ++--
 3 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 840742c..0afa888 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -357,21 +357,21 @@ static void declare_input_vs(
        t_list_ptr = LLVMGetParam(ctx->main_fn, SI_PARAM_VERTEX_BUFFERS);

        t_offset = LLVMConstInt(ctx->i32, input_index, 0);

        t_list = ac_build_indexed_load_const(&ctx->ac, t_list_ptr, t_offset);

        vertex_index = LLVMGetParam(ctx->main_fn,
                                    ctx->param_vertex_index0 +
                                    input_index);

-       fix_fetch = ctx->shader->key.mono.vs.fix_fetch[input_index];
+       fix_fetch = ctx->shader->key.mono.vs_fix_fetch[input_index];

        /* Do multiple loads for special formats. */
        switch (fix_fetch) {
        case SI_FIX_FETCH_RGB_64_FLOAT:
                num_fetches = 3; /* 3 2-dword loads */
                fetch_stride = 8;
                break;
        case SI_FIX_FETCH_RGBA_64_FLOAT:
                num_fetches = 2; /* 2 4-dword loads */
                fetch_stride = 16;
@@ -2420,21 +2420,21 @@ static void si_copy_tcs_inputs(struct 
lp_build_tgsi_context *bld_base)
                        LLVMConstInt(ctx->i32, SI_HS_RING_TESS_OFFCHIP, 0));

        buffer_offset = LLVMGetParam(ctx->main_fn, ctx->param_oc_lds);

        lds_vertex_stride = unpack_param(ctx, SI_PARAM_TCS_IN_LAYOUT, 24, 8);
        lds_vertex_offset = LLVMBuildMul(gallivm->builder, invocation_id,
                                         lds_vertex_stride, "");
        lds_base = get_tcs_in_current_patch_offset(ctx);
        lds_base = LLVMBuildAdd(gallivm->builder, lds_base, lds_vertex_offset, 
"");

-       inputs = ctx->shader->key.mono.tcs.inputs_to_copy;
+       inputs = ctx->shader->key.mono.ff_tcs_inputs_to_copy;
        while (inputs) {
                unsigned i = u_bit_scan64(&inputs);

                LLVMValueRef lds_ptr = LLVMBuildAdd(gallivm->builder, lds_base,
                                            LLVMConstInt(ctx->i32, 4 * i, 0),
                                             "");

                LLVMValueRef buffer_addr = get_tcs_tes_buffer_address(ctx,
                                              get_rel_patch_id(ctx),
                                              invocation_id,
@@ -6654,29 +6654,29 @@ static void si_dump_shader_key(unsigned shader, struct 
si_shader_key *key,
        case PIPE_SHADER_VERTEX:
                fprintf(f, "  part.vs.prolog.instance_divisors = {");
                for (i = 0; i < 
ARRAY_SIZE(key->part.vs.prolog.instance_divisors); i++)
                        fprintf(f, !i ? "%u" : ", %u",
                                key->part.vs.prolog.instance_divisors[i]);
                fprintf(f, "}\n");
                fprintf(f, "  part.vs.epilog.export_prim_id = %u\n", 
key->part.vs.epilog.export_prim_id);
                fprintf(f, "  as_es = %u\n", key->as_es);
                fprintf(f, "  as_ls = %u\n", key->as_ls);

-               fprintf(f, "  mono.vs.fix_fetch = {");
+               fprintf(f, "  mono.vs_fix_fetch = {");
                for (i = 0; i < SI_MAX_ATTRIBS; i++)
-                       fprintf(f, !i ? "%u" : ", %u", 
key->mono.vs.fix_fetch[i]);
+                       fprintf(f, !i ? "%u" : ", %u", 
key->mono.vs_fix_fetch[i]);
                fprintf(f, "}\n");
                break;

        case PIPE_SHADER_TESS_CTRL:
                fprintf(f, "  part.tcs.epilog.prim_mode = %u\n", 
key->part.tcs.epilog.prim_mode);
-               fprintf(f, "  mono.tcs.inputs_to_copy = 0x%"PRIx64"\n", 
key->mono.tcs.inputs_to_copy);
+               fprintf(f, "  mono.ff_tcs_inputs_to_copy = 0x%"PRIx64"\n", 
key->mono.ff_tcs_inputs_to_copy);
                break;

        case PIPE_SHADER_TESS_EVAL:
                fprintf(f, "  part.tes.epilog.export_prim_id = %u\n", 
key->part.tes.epilog.export_prim_id);
                fprintf(f, "  as_es = %u\n", key->as_es);
                break;

        case PIPE_SHADER_GEOMETRY:
                fprintf(f, "  part.gs.prolog.tri_strip_adj_fix = %u\n", 
key->part.gs.prolog.tri_strip_adj_fix);
                break;
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index cfa691b..05c0e62 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -444,28 +444,24 @@ struct si_shader_key {
                } ps;
        } part;

        /* These two are initially set according to the NEXT_SHADER property,
         * or guessed if the property doesn't seem correct.
         */
        unsigned as_es:1; /* export shader, which precedes GS */
        unsigned as_ls:1; /* local shader, which precedes TCS */

        /* Flags for monolithic compilation only. */
-       union {
-               struct {
-                       /* One byte for every input: SI_FIX_FETCH_* enums. */
-                       uint8_t         fix_fetch[SI_MAX_ATTRIBS];
-               } vs;
-               struct {
-                       uint64_t        inputs_to_copy; /* for fixed-func TCS */
-               } tcs;
+       struct {
+               /* One byte for every input: SI_FIX_FETCH_* enums. */
+               uint8_t         vs_fix_fetch[SI_MAX_ATTRIBS];
+               uint64_t        ff_tcs_inputs_to_copy; /* for fixed-func TCS */
        } mono;

        /* Optimization flags for asynchronous compilation only. */
        union {
                struct {
                        uint64_t        kill_outputs; /* "get_unique_index" 
bits */
                        uint32_t        kill_outputs2; /* "get_unique_index2" 
bits */
                        unsigned        clip_disable:1;
                } hw_vs; /* HW VS (it can be VS, TES, GS) */
        } opt;
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 3a604eb..8afc731 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1028,42 +1028,42 @@ static inline void si_shader_selector_key(struct 
pipe_context *ctx,

        switch (sel->type) {
        case PIPE_SHADER_VERTEX:
                if (sctx->vertex_elements) {
                        unsigned count = MIN2(sel->info.num_inputs,
                                              sctx->vertex_elements->count);
                        for (i = 0; i < count; ++i)
                                key->part.vs.prolog.instance_divisors[i] =
                                        
sctx->vertex_elements->elements[i].instance_divisor;

-                       memcpy(key->mono.vs.fix_fetch,
+                       memcpy(key->mono.vs_fix_fetch,
                               sctx->vertex_elements->fix_fetch, count);
                }
                if (sctx->tes_shader.cso)
                        key->as_ls = 1;
                else if (sctx->gs_shader.cso)
                        key->as_es = 1;
                else {
                        si_shader_selector_key_hw_vs(sctx, sel, key);

                        if (sctx->ps_shader.cso && 
sctx->ps_shader.cso->info.uses_primid)
                                key->part.vs.epilog.export_prim_id = 1;
                }
                break;
        case PIPE_SHADER_TESS_CTRL:
                key->part.tcs.epilog.prim_mode =
                        
sctx->tes_shader.cso->info.properties[TGSI_PROPERTY_TES_PRIM_MODE];
                key->part.tcs.epilog.tes_reads_tess_factors =
                        sctx->tes_shader.cso->info.reads_tess_factors;

                if (sel == sctx->fixed_func_tcs_shader.cso)
-                       key->mono.tcs.inputs_to_copy = 
sctx->vs_shader.cso->outputs_written;
+                       key->mono.ff_tcs_inputs_to_copy = 
sctx->vs_shader.cso->outputs_written;
                break;
        case PIPE_SHADER_TESS_EVAL:
                if (sctx->gs_shader.cso)
                        key->as_es = 1;
                else {
                        si_shader_selector_key_hw_vs(sctx, sel, key);

                        if (sctx->ps_shader.cso && 
sctx->ps_shader.cso->info.uses_primid)
                                key->part.tes.epilog.export_prim_id = 1;
                }



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to