[PATCH 06/11] etnaviv: pass a preallocated variant to compiler
Lucas Stach
l.stach at pengutronix.de
Mon Mar 27 08:52:32 UTC 2017
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.gmeiner at gmail.com>
Reviewed-by: Lucas Stach <l.stach at 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 *
More information about the etnaviv
mailing list