etnaviv: do register setup only once
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Fri, 3 Jul 2020 10:42:56 +0000 (12:42 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 24 Jul 2020 20:01:04 +0000 (20:01 +0000)
Register set setup should be done once at backend
initializaion, as ra_set_finalize is O(r^2*c^2).

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-by: Lucas Stach <l.stach@pengutronix.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5996>

src/gallium/drivers/etnaviv/etnaviv_compiler.c
src/gallium/drivers/etnaviv/etnaviv_compiler.h
src/gallium/drivers/etnaviv/etnaviv_compiler_nir.h
src/gallium/drivers/etnaviv/etnaviv_compiler_nir_ra.c
src/gallium/drivers/etnaviv/etnaviv_shader.c
src/gallium/drivers/etnaviv/etnaviv_shader.h

index aa6b2c6d29ba4947353a6dec4b0a2986b42996dc..0cb07c03cd783e9ea5a96080075726c4bb11e0b2 100644 (file)
@@ -25,6 +25,8 @@
  */
 
 #include "etnaviv_compiler.h"
+#include "etnaviv_compiler_nir.h"
+#include "etnaviv_debug.h"
 #include "util/ralloc.h"
 
 struct etna_compiler *
@@ -32,6 +34,15 @@ etna_compiler_create(void)
 {
    struct etna_compiler *compiler = rzalloc(NULL, struct etna_compiler);
 
+   if (!DBG_ENABLED(ETNA_DBG_NIR))
+      return compiler;
+
+   compiler->regs = etna_ra_setup(compiler);
+   if (!compiler->regs) {
+      ralloc_free((void *)compiler);
+      compiler = NULL;
+   }
+
    return compiler;
 }
 
index af979766ef30facabe03e92b3752ace00a91df9b..e03b748b48bbfa9d1bf7880a5fa90ac8f5fe0cca 100644 (file)
@@ -50,6 +50,7 @@
  */
 struct etna_compiler {
    uint32_t shader_count;
+   struct ra_regs *regs;
 };
 
 /* compiler output per input/output */
index 7a2bbdf70a14480ed886199ef874605632807926..2ad004d85e0339b3522489a93dd6f62d85e2e4dd 100644 (file)
@@ -51,7 +51,6 @@ struct etna_compile {
 
    /* ra state */
    struct ra_graph *g;
-   struct ra_regs *regs;
    unsigned *live_map;
    unsigned num_nodes;
 
@@ -319,6 +318,9 @@ static inline int reg_get_base(struct etna_compile *c, int virt_reg)
    return virt_reg / NUM_REG_TYPES;
 }
 
+struct ra_regs *
+etna_ra_setup(void *mem_ctx);
+
 void
 etna_ra_assign(struct etna_compile *c, nir_shader *shader);
 
index b322f0352796aca5a43364b85e86a6435002f546..fef982c9bf04595d4c63b009a7281610215dff86 100644 (file)
@@ -81,10 +81,10 @@ static inline int reg_get_class(int virt_reg)
    return 0;
 }
 
-void
-etna_ra_assign(struct etna_compile *c, nir_shader *shader)
+struct ra_regs *
+etna_ra_setup(void *mem_ctx)
 {
-   struct ra_regs *regs = ra_alloc_reg_set(NULL, ETNA_MAX_TEMPS *
+   struct ra_regs *regs = ra_alloc_reg_set(mem_ctx, ETNA_MAX_TEMPS *
                   NUM_REG_TYPES, false);
 
    /* classes always be created from index 0, so equal to the class enum
@@ -108,6 +108,15 @@ etna_ra_assign(struct etna_compile *c, nir_shader *shader)
    }
    ra_set_finalize(regs, q_values);
 
+   return regs;
+}
+
+void
+etna_ra_assign(struct etna_compile *c, nir_shader *shader)
+{
+   struct etna_compiler *compiler = c->variant->shader->compiler;
+   struct ra_regs *regs = compiler->regs;
+
    nir_function_impl *impl = nir_shader_get_entrypoint(shader);
 
    /* liveness and interference */
@@ -226,7 +235,6 @@ etna_ra_assign(struct etna_compile *c, nir_shader *shader)
    assert(ok);
 
    c->g = g;
-   c->regs = regs;
    c->live_map = live_map;
    c->num_nodes = num_nodes;
 }
@@ -241,7 +249,6 @@ etna_ra_finish(struct etna_compile *c)
    }
 
    ralloc_free(c->g);
-   ralloc_free(c->regs);
    ralloc_free(c->live_map);
 
    return j;
index 44ab8eda36300d329d82e918d9fea2bbfcb33b92..b44354483ae245de8356ccb2e2ec324ac6693efd 100644 (file)
@@ -404,6 +404,7 @@ etna_create_shader_state(struct pipe_context *pctx,
 
    shader->id = p_atomic_inc_return(&compiler->shader_count);
    shader->specs = &screen->specs;
+   shader->compiler = screen->compiler;
 
    if (DBG_ENABLED(ETNA_DBG_NIR))
       shader->nir = (pss->type == PIPE_SHADER_IR_NIR) ? pss->ir.nir :
index 528603a55a99652a1de3620e12b4e681ee18a962..c1ea785a135c4a14cba83454f547430d8dc9aa46 100644 (file)
@@ -66,6 +66,7 @@ struct etna_shader {
    struct tgsi_token *tokens;
    struct nir_shader *nir;
    const struct etna_specs *specs;
+   struct etna_compiler *compiler;
 
    struct etna_shader_variant *variants;
 };