etnaviv: do register setup only once
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>
This commit is contained in:
parent
7ee146aad4
commit
60915f87c7
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
*/
|
||||
struct etna_compiler {
|
||||
uint32_t shader_count;
|
||||
struct ra_regs *regs;
|
||||
};
|
||||
|
||||
/* compiler output per input/output */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 :
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue