diff options
-rw-r--r-- | src/gallium/drivers/vc4/vc4_context.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_screen.c | 5 | ||||
-rw-r--r-- | src/gallium/drivers/vc4/vc4_simulator.c | 36 |
3 files changed, 39 insertions, 3 deletions
diff --git a/src/gallium/drivers/vc4/vc4_context.h b/src/gallium/drivers/vc4/vc4_context.h index 0d6b8d0e218..313630a7e2f 100644 --- a/src/gallium/drivers/vc4/vc4_context.h +++ b/src/gallium/drivers/vc4/vc4_context.h @@ -423,6 +423,7 @@ void vc4_program_init(struct pipe_context *pctx); void vc4_program_fini(struct pipe_context *pctx); void vc4_query_init(struct pipe_context *pctx); void vc4_simulator_init(struct vc4_screen *screen); +void vc4_simulator_destroy(struct vc4_screen *screen); int vc4_simulator_flush(struct vc4_context *vc4, struct drm_vc4_submit_cl *args, struct vc4_job *job); diff --git a/src/gallium/drivers/vc4/vc4_screen.c b/src/gallium/drivers/vc4/vc4_screen.c index 64bff5dc227..045f3fb2a34 100644 --- a/src/gallium/drivers/vc4/vc4_screen.c +++ b/src/gallium/drivers/vc4/vc4_screen.c @@ -99,6 +99,11 @@ vc4_screen_destroy(struct pipe_screen *pscreen) util_hash_table_destroy(screen->bo_handles); vc4_bufmgr_destroy(pscreen); slab_destroy_parent(&screen->transfer_pool); + +#if USE_VC4_SIMULATOR + vc4_simulator_destroy(screen); +#endif + close(screen->fd); ralloc_free(pscreen); } diff --git a/src/gallium/drivers/vc4/vc4_simulator.c b/src/gallium/drivers/vc4/vc4_simulator.c index b802391aa6e..0291a4e1458 100644 --- a/src/gallium/drivers/vc4/vc4_simulator.c +++ b/src/gallium/drivers/vc4/vc4_simulator.c @@ -32,6 +32,8 @@ #include "vc4_simulator_validate.h" #include "simpenrose/simpenrose.h" +static mtx_t exec_mutex = _MTX_INITIALIZER_NP; + /* A marker placed just after each BO, then checked after rendering to make * sure it's still there. */ @@ -318,12 +320,27 @@ vc4_simulator_flush(struct vc4_context *vc4, return 0; } +static void *sim_mem_base = NULL; +static int sim_mem_refcount = 0; +static ssize_t sim_mem_size = 256 * 1024 * 1024; + void vc4_simulator_init(struct vc4_screen *screen) { - screen->simulator_mem_size = 256 * 1024 * 1024; - screen->simulator_mem_base = ralloc_size(screen, - screen->simulator_mem_size); + mtx_lock(&exec_mutex); + if (sim_mem_refcount++) { + screen->simulator_mem_size = sim_mem_size; + screen->simulator_mem_base = sim_mem_base; + mtx_unlock(&exec_mutex); + return; + } + + sim_mem_base = calloc(sim_mem_size, 1); + if (!sim_mem_base) + abort(); + + screen->simulator_mem_size = sim_mem_size; + screen->simulator_mem_base = sim_mem_base; /* We supply our own memory so that we can have more aperture * available (256MB instead of simpenrose's default 64MB). @@ -339,6 +356,19 @@ vc4_simulator_init(struct vc4_screen *screen) * flush), so it had better be big. */ simpenrose_supply_overflow_mem(0, OVERFLOW_SIZE); + + mtx_unlock(&exec_mutex); +} + +void +vc4_simulator_destroy(struct vc4_screen *screen) +{ + mtx_lock(&exec_mutex); + if (!--sim_mem_refcount) { + free(sim_mem_base); + sim_mem_base = NULL; + } + mtx_unlock(&exec_mutex); } #endif /* USE_VC4_SIMULATOR */ |