Hi Lucas,
2017-03-27 10:56 GMT+02:00 Lucas Stach <l.st...@pengutronix.de>: > Am Sonntag, den 26.03.2017, 16:13 +0200 schrieb Christian Gmeiner: >> This commit adds some basic infrastructure to handle shader >> variants. We are still creating exactly one shader variant >> for each shader. >> >> Signed-off-by: Christian Gmeiner <christian.gmei...@gmail.com> > > Nitpick inline, othwerwise: > > Reviewed-by: Lucas Stach <l.st...@pengutronix.de> > >> --- >> src/gallium/drivers/etnaviv/etnaviv_compiler.h | 3 ++ >> src/gallium/drivers/etnaviv/etnaviv_shader.c | 49 >> +++++++++++++++++++++++--- >> src/gallium/drivers/etnaviv/etnaviv_shader.h | 12 +++++++ >> 3 files changed, 60 insertions(+), 4 deletions(-) >> >> diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h >> b/src/gallium/drivers/etnaviv/etnaviv_compiler.h >> index 2a3b4f4..8de0126 100644 >> --- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h >> +++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h >> @@ -92,6 +92,9 @@ struct etna_shader_variant { >> >> /* unknown input property (XX_INPUT_COUNT, field UNK8) */ >> uint32_t input_count_unk8; >> + >> + /* shader variants form a linked list */ >> + struct etna_shader_variant *next; >> }; >> >> struct etna_varying { >> diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.c >> b/src/gallium/drivers/etnaviv/etnaviv_shader.c >> index 35084e5..d6bc9bc 100644 >> --- a/src/gallium/drivers/etnaviv/etnaviv_shader.c >> +++ b/src/gallium/drivers/etnaviv/etnaviv_shader.c >> @@ -31,6 +31,7 @@ >> #include "etnaviv_debug.h" >> #include "etnaviv_util.h" >> >> +#include "tgsi/tgsi_parse.h" >> #include "util/u_math.h" >> #include "util/u_memory.h" >> >> @@ -266,25 +267,65 @@ etna_shader_update_vertex(struct etna_context *ctx) >> ctx->vertex_elements); >> } >> >> +static struct etna_shader_variant * >> +create_variant(struct etna_shader *shader) >> +{ >> + struct etna_shader_variant *v; >> + >> + v = etna_compile_shader(shader->specs, shader->tokens); >> + if (!v) { >> + debug_error("compile failed!"); >> + return NULL; >> + } >> + >> + v->id = ++shader->variant_count; >> + >> + return v; >> +} >> + >> static void * >> etna_create_shader_state(struct pipe_context *pctx, >> const struct pipe_shader_state *pss) >> { >> struct etna_context *ctx = etna_context(pctx); >> - struct etna_shader_variant *shader = etna_compile_shader(&ctx->specs, >> pss->tokens); >> + struct etna_shader *shader = CALLOC_STRUCT(etna_shader); >> + >> + if (!shader) >> + return NULL; >> >> static uint32_t id; >> shader->id = id++; >> + shader->specs = &ctx->specs; >> + shader->tokens = tgsi_dup_tokens(pss->tokens); >> >> - dump_shader_info(shader, &ctx->debug); >> + /* compile new variant */ >> + struct etna_shader_variant *v; >> >> - return shader; >> + v = create_variant(shader); >> + if (v) { >> + v->next = shader->variants; >> + shader->variants = v; >> + dump_shader_info(v, &ctx->debug); >> + } >> + >> + return v; >> } >> >> static void >> etna_delete_shader_state(struct pipe_context *pctx, void *ss) >> { >> - etna_destroy_shader(ss); >> + struct etna_shader *shader = ss; >> + struct etna_shader_variant *v, *t; >> + >> + v = shader->variants; >> + while (v) { >> + t = v; >> + v = v->next; >> + etna_destroy_shader(t); >> + } >> + >> + FREE((void *)shader->tokens); > > Is this cast really needed? > It is not needed - I have corrected that locally. greets -- Christian Gmeiner, MSc https://www.youtube.com/user/AloryOFFICIAL https://soundcloud.com/christian-gmeiner _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev