Module: Mesa Branch: master Commit: 3bef6dfe422ee61a1ca0a5f487856ca8d5bd83d8 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3bef6dfe422ee61a1ca0a5f487856ca8d5bd83d8
Author: Christian Gmeiner <[email protected]> Date: Fri Oct 30 19:19:31 2020 +0100 etnaviv: convert from tgsi semantic/index to varying-slot Prep work to unify some tgsi and nir compiler functions. No deqp and piglit regressions. Signed-off-by: Christian Gmeiner <[email protected]> Reviewed-by: Lucas Stach <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7397> --- src/gallium/drivers/etnaviv/etnaviv_compiler.h | 6 -- .../drivers/etnaviv/etnaviv_compiler_tgsi.c | 69 ++++++++-------------- 2 files changed, 24 insertions(+), 51 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h b/src/gallium/drivers/etnaviv/etnaviv_compiler.h index 734d5b1ee1b..3646baec52b 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h @@ -59,7 +59,6 @@ struct etna_compiler { /* compiler output per input/output */ struct etna_shader_inout { int reg; /* native register */ - struct tgsi_declaration_semantic semantic; /* tgsi semantic name and index */ int slot; /* nir: gl_varying_slot or gl_vert_attrib */ int num_components; }; @@ -73,11 +72,6 @@ struct etna_shader_io_file { struct etna_shader_variant { uint32_t id; /* for debug */ - /* index into outputs (for linking) - only for TGSI compiler */ - int output_count_per_semantic[TGSI_SEMANTIC_COUNT]; - struct etna_shader_inout * *output_per_semantic_list; /* list of pointers to outputs */ - struct etna_shader_inout **output_per_semantic[TGSI_SEMANTIC_COUNT]; - /* shader variants form a linked list */ struct etna_shader_variant *next; diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_tgsi.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_tgsi.c index f153f80490a..ee52f596350 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_tgsi.c +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_tgsi.c @@ -57,6 +57,7 @@ #include "etnaviv_uniforms.h" #include "etnaviv_util.h" +#include "nir/tgsi_to_nir.h" #include "pipe/p_shader_tokens.h" #include "tgsi/tgsi_info.h" #include "tgsi/tgsi_iterate.h" @@ -2108,6 +2109,11 @@ permute_ps_inputs(struct etna_compile *c) c->next_free_native = native_idx; } +static inline int sem2slot(const struct tgsi_declaration_semantic *semantic) +{ + return tgsi_varying_semantic_to_slot(semantic->Name, semantic->Index); +} + /* fill in ps inputs into shader object */ static void fill_in_ps_inputs(struct etna_shader_variant *sobj, struct etna_compile *c) @@ -2122,7 +2128,7 @@ fill_in_ps_inputs(struct etna_shader_variant *sobj, struct etna_compile *c) if (reg->native.id > 0) { assert(sf->num_reg < ETNA_NUM_INPUTS); sf->reg[sf->num_reg].reg = reg->native.id; - sf->reg[sf->num_reg].semantic = reg->semantic; + sf->reg[sf->num_reg].slot = sem2slot(®->semantic); /* convert usage mask to number of components (*=wildcard) * .r (0..1) -> 1 component * .*g (2..3) -> 2 component @@ -2176,7 +2182,7 @@ fill_in_vs_inputs(struct etna_shader_variant *sobj, struct etna_compile *c) /* XXX exclude inputs with special semantics such as gl_frontFacing */ sf->reg[sf->num_reg].reg = reg->native.id; - sf->reg[sf->num_reg].semantic = reg->semantic; + sf->reg[sf->num_reg].slot = sem2slot(®->semantic); sf->reg[sf->num_reg].num_components = util_last_bit(reg->usage_mask); sf->num_reg++; } @@ -2184,30 +2190,6 @@ fill_in_vs_inputs(struct etna_shader_variant *sobj, struct etna_compile *c) sobj->input_count_unk8 = (sf->num_reg + 19) / 16; /* XXX what is this */ } -/* build two-level output index [Semantic][Index] for fast linking */ -static void -build_output_index(struct etna_shader_variant *sobj) -{ - int total = 0; - int offset = 0; - - for (int name = 0; name < TGSI_SEMANTIC_COUNT; ++name) - total += sobj->output_count_per_semantic[name]; - - sobj->output_per_semantic_list = CALLOC(total, sizeof(struct etna_shader_inout *)); - - for (int name = 0; name < TGSI_SEMANTIC_COUNT; ++name) { - sobj->output_per_semantic[name] = &sobj->output_per_semantic_list[offset]; - offset += sobj->output_count_per_semantic[name]; - } - - for (int idx = 0; idx < sobj->outfile.num_reg; ++idx) { - sobj->output_per_semantic[sobj->outfile.reg[idx].semantic.Name] - [sobj->outfile.reg[idx].semantic.Index] = - &sobj->outfile.reg[idx]; - } -} - /* fill in outputs for vs into shader object */ static void fill_in_vs_outputs(struct etna_shader_variant *sobj, struct etna_compile *c) @@ -2228,18 +2210,12 @@ fill_in_vs_outputs(struct etna_shader_variant *sobj, struct etna_compile *c) break; default: sf->reg[sf->num_reg].reg = reg->native.id; - sf->reg[sf->num_reg].semantic = reg->semantic; + sf->reg[sf->num_reg].slot = sem2slot(®->semantic); sf->reg[sf->num_reg].num_components = 4; // XXX reg->num_components; sf->num_reg++; - sobj->output_count_per_semantic[reg->semantic.Name] = - MAX2(reg->semantic.Index + 1, - sobj->output_count_per_semantic[reg->semantic.Name]); } } - /* build two-level index for linking */ - build_output_index(sobj); - /* fill in "mystery meat" load balancing value. This value determines how * work is scheduled between VS and PS * in the unified shader architecture. More precisely, it is determined from @@ -2551,16 +2527,18 @@ etna_dump_shader(const struct etna_shader_variant *shader) } printf("inputs:\n"); for (int idx = 0; idx < shader->infile.num_reg; ++idx) { - printf(" [%i] name=%s index=%i comps=%i\n", shader->infile.reg[idx].reg, - tgsi_semantic_names[shader->infile.reg[idx].semantic.Name], - shader->infile.reg[idx].semantic.Index, + printf(" [%i] name=%s comps=%i\n", shader->infile.reg[idx].reg, + (shader->stage == MESA_SHADER_VERTEX) ? + gl_vert_attrib_name(shader->infile.reg[idx].slot) : + gl_varying_slot_name(shader->infile.reg[idx].slot), shader->infile.reg[idx].num_components); } printf("outputs:\n"); for (int idx = 0; idx < shader->outfile.num_reg; ++idx) { - printf(" [%i] name=%s index=%i comps=%i\n", shader->outfile.reg[idx].reg, - tgsi_semantic_names[shader->outfile.reg[idx].semantic.Name], - shader->outfile.reg[idx].semantic.Index, + printf(" [%i] name=%s comps=%i\n", shader->outfile.reg[idx].reg, + (shader->stage == MESA_SHADER_VERTEX) ? + gl_varying_slot_name(shader->outfile.reg[idx].slot) : + gl_frag_result_name(shader->outfile.reg[idx].slot), shader->outfile.reg[idx].num_components); } printf("special:\n"); @@ -2583,7 +2561,6 @@ etna_destroy_shader(struct etna_shader_variant *shader) FREE(shader->code); FREE(shader->uniforms.imm_data); FREE(shader->uniforms.imm_contents); - FREE(shader->output_per_semantic_list); FREE(shader); } @@ -2591,8 +2568,9 @@ static const struct etna_shader_inout * etna_shader_vs_lookup(const struct etna_shader_variant *sobj, const struct etna_shader_inout *in) { - if (in->semantic.Index < sobj->output_count_per_semantic[in->semantic.Name]) - return sobj->output_per_semantic[in->semantic.Name][in->semantic.Index]; + for (int i = 0; i < sobj->outfile.num_reg; i++) + if (sobj->outfile.reg[i].slot == in->slot) + return &sobj->outfile.reg[i]; return NULL; } @@ -2614,7 +2592,8 @@ etna_link_shader(struct etna_shader_link_info *info, const struct etna_shader_inout *fsio = &fs->infile.reg[idx]; const struct etna_shader_inout *vsio = etna_shader_vs_lookup(vs, fsio); struct etna_varying *varying; - bool interpolate_always = fsio->semantic.Name != TGSI_SEMANTIC_COLOR; + bool interpolate_always = ((fsio->slot != VARYING_SLOT_COL0) && + (fsio->slot != VARYING_SLOT_COL1)); assert(fsio->reg > 0 && fsio->reg <= ARRAY_SIZE(info->varyings)); @@ -2637,14 +2616,14 @@ etna_link_shader(struct etna_shader_link_info *info, /* point coord is an input to the PS without matching VS output, * so it gets a varying slot without being assigned a VS register. */ - if (fsio->semantic.Name == TGSI_SEMANTIC_PCOORD) { + if (fsio->slot == VARYING_SLOT_PNTC) { varying->use[0] = VARYING_COMPONENT_USE_POINTCOORD_X; varying->use[1] = VARYING_COMPONENT_USE_POINTCOORD_Y; info->pcoord_varying_comp_ofs = comp_ofs; } else { if (vsio == NULL) { /* not found -- link error */ - BUG("Semantic %d value %d not found in vertex shader outputs\n", fsio->semantic.Name, fsio->semantic.Index); + BUG("Semantic value not found in vertex shader outputs\n"); return true; } _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
