Am Sonntag, den 26.03.2017, 16:13 +0200 schrieb Christian Gmeiner: > In the long run the compiler needs to know the specifc variant > 'key' in order to compile appropriate assembly. With this commit > the variant knows its shader and we are able pass the preallocated > variant into etna_compile_shader(..). This saves us from passing > extra ptrs everywhere. > > Signed-off-by: Christian Gmeiner <christian.gmei...@gmail.com>
Reviewed-by: Lucas Stach <l.st...@pengutronix.de> > --- > src/gallium/drivers/etnaviv/etnaviv_compiler.c | 53 > +++++++++++----------- > src/gallium/drivers/etnaviv/etnaviv_compiler.h | 7 ++- > .../drivers/etnaviv/etnaviv_compiler_cmdline.c | 22 +++++++-- > src/gallium/drivers/etnaviv/etnaviv_shader.c | 18 ++++++-- > 4 files changed, 62 insertions(+), 38 deletions(-) > > diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c > b/src/gallium/drivers/etnaviv/etnaviv_compiler.c > index be3838d..7552a8f 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c > +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c > @@ -54,6 +54,7 @@ > #include "etnaviv_context.h" > #include "etnaviv_debug.h" > #include "etnaviv_disasm.h" > +#include "etnaviv_shader.h" > #include "etnaviv_uniforms.h" > #include "etnaviv_util.h" > > @@ -2253,15 +2254,18 @@ copy_uniform_state_to_shader(struct etna_compile *c, > struct etna_shader_variant > etna_set_shader_uniforms_dirty_flags(sobj); > } > > -struct etna_shader_variant * > -etna_compile_shader(const struct etna_specs *specs, > - const struct tgsi_token *tokens) > +bool > +etna_compile_shader(struct etna_shader_variant *v) > { > /* Create scratch space that may be too large to fit on stack > */ > bool ret; > struct etna_compile *c; > - struct etna_shader_variant *shader; > + > + if (unlikely(!v)) > + return false; > + > + const struct etna_specs *specs = v->shader->specs; > > struct tgsi_lowering_config lconfig = { > .lower_SCS = specs->has_sin_cos_sqrt, > @@ -2278,11 +2282,9 @@ etna_compile_shader(const struct etna_specs *specs, > > c = CALLOC_STRUCT(etna_compile); > if (!c) > - return NULL; > + return false; > > - shader = CALLOC_STRUCT(etna_shader_variant); > - if (!shader) > - goto out; > + const struct tgsi_token *tokens = v->shader->tokens; > > c->specs = specs; > c->tokens = tgsi_transform_lowering(&lconfig, tokens, &c->info); > @@ -2412,30 +2414,27 @@ etna_compile_shader(const struct etna_specs *specs, > etna_compile_fill_in_labels(c); > > ret = etna_compile_check_limits(c); > - if (!ret) { > - FREE(shader); > - shader = NULL; > + if (!ret) > goto out; > - } > > /* fill in output structure */ > - shader->processor = c->info.processor; > - shader->code_size = c->inst_ptr * 4; > - shader->code = mem_dup(c->code, c->inst_ptr * 16); > - shader->num_loops = c->num_loops; > - shader->num_temps = c->next_free_native; > - shader->vs_pos_out_reg = -1; > - shader->vs_pointsize_out_reg = -1; > - shader->ps_color_out_reg = -1; > - shader->ps_depth_out_reg = -1; > - copy_uniform_state_to_shader(c, shader); > + v->processor = c->info.processor; > + v->code_size = c->inst_ptr * 4; > + v->code = mem_dup(c->code, c->inst_ptr * 16); > + v->num_loops = c->num_loops; > + v->num_temps = c->next_free_native; > + v->vs_pos_out_reg = -1; > + v->vs_pointsize_out_reg = -1; > + v->ps_color_out_reg = -1; > + v->ps_depth_out_reg = -1; > + copy_uniform_state_to_shader(c, v); > > if (c->info.processor == PIPE_SHADER_VERTEX) { > - fill_in_vs_inputs(shader, c); > - fill_in_vs_outputs(shader, c); > + fill_in_vs_inputs(v, c); > + fill_in_vs_outputs(v, c); > } else if (c->info.processor == PIPE_SHADER_FRAGMENT) { > - fill_in_ps_inputs(shader, c); > - fill_in_ps_outputs(shader, c); > + fill_in_ps_inputs(v, c); > + fill_in_ps_outputs(v, c); > } > > out: > @@ -2445,7 +2444,7 @@ out: > FREE(c->labels); > FREE(c); > > - return shader; > + return ret; > } > > extern const char *tgsi_swizzle_names[]; > diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h > b/src/gallium/drivers/etnaviv/etnaviv_compiler.h > index 8de0126..8582e30 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h > +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h > @@ -95,6 +95,9 @@ struct etna_shader_variant { > > /* shader variants form a linked list */ > struct etna_shader_variant *next; > + > + /* replicated here to avoid passing extra ptrs everywhere */ > + struct etna_shader *shader; > }; > > struct etna_varying { > @@ -110,8 +113,8 @@ struct etna_shader_link_info { > struct etna_varying varyings[ETNA_NUM_INPUTS]; > }; > > -struct etna_shader_variant * > -etna_compile_shader(const struct etna_specs *specs, const struct tgsi_token > *tokens); > +bool > +etna_compile_shader(struct etna_shader_variant *shader); > > void > etna_dump_shader(const struct etna_shader_variant *shader); > diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c > b/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c > index 48f74b8..035ee86 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c > +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c > @@ -38,6 +38,9 @@ > #include "etnaviv_compiler.h" > #include "etnaviv_debug.h" > #include "etnaviv_internal.h" > +#include "etnaviv_shader.h" > + > +#include "util/u_memory.h" > > static const struct etna_specs specs_gc2000 = { > .vs_need_z_div = 0, > @@ -98,10 +101,16 @@ main(int argc, char **argv) > const char *filename; > struct tgsi_token toks[65536]; > struct tgsi_parse_context parse; > - struct etna_shader_variant *shader_obj; > + struct etna_shader s = {}; > void *ptr; > size_t size; > > + struct etna_shader_variant *v = CALLOC_STRUCT(etna_shader_variant); > + if (!v) { > + fprintf(stderr, "malloc failed!\n"); > + return 1; > + } > + > etna_mesa_debug = ETNA_DBG_MSGS; > > while (n < argc) { > @@ -134,13 +143,16 @@ main(int argc, char **argv) > > tgsi_parse_init(&parse, toks); > > - shader_obj = etna_compile_shader(&specs_gc2000, toks); > + s.specs = &specs_gc2000; > + s.tokens = toks; > + > + v->shader = &s; > > - if (shader_obj == NULL) { > + if (!etna_compile_shader(v)) { > fprintf(stderr, "compiler failed!\n"); > return 1; > } > > - etna_dump_shader(shader_obj); > - etna_destroy_shader(shader_obj); > + etna_dump_shader(v); > + etna_destroy_shader(v); > } > diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.c > b/src/gallium/drivers/etnaviv/etnaviv_shader.c > index f89b23f..8132bc8 100644 > --- a/src/gallium/drivers/etnaviv/etnaviv_shader.c > +++ b/src/gallium/drivers/etnaviv/etnaviv_shader.c > @@ -270,17 +270,27 @@ etna_shader_update_vertex(struct etna_context *ctx) > static struct etna_shader_variant * > create_variant(struct etna_shader *shader) > { > - struct etna_shader_variant *v; > + struct etna_shader_variant *v = CALLOC_STRUCT(etna_shader_variant); > + int ret; > > - v = etna_compile_shader(shader->specs, shader->tokens); > - if (!v) { > - debug_error("compile failed!"); > + if (!v) > return NULL; > + > + v->shader = shader; > + > + ret = etna_compile_shader(v); > + if (!ret) { > + debug_error("compile failed!"); > + goto fail; > } > > v->id = ++shader->variant_count; > > return v; > + > +fail: > + FREE(v); > + return NULL; > } > > static void * _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev