From 3172289d8b1bec597dfce600dac2fe8a0f0819b9 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Tue, 20 Apr 2021 11:30:46 +1000 Subject: [PATCH] llvmpipe: wrap late screen init with a mutex. Next step can just move this into context init Reviewed-By: Mike Blumenkrantz Part-of: --- src/gallium/drivers/llvmpipe/lp_screen.c | 18 +++++++++++++++--- src/gallium/drivers/llvmpipe/lp_screen.h | 3 +++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c b/src/gallium/drivers/llvmpipe/lp_screen.c index 3fee18fd570..3c1d3ce5690 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.c +++ b/src/gallium/drivers/llvmpipe/lp_screen.c @@ -878,19 +878,30 @@ void lp_disk_cache_insert_shader(struct llvmpipe_screen *screen, static bool llvmpipe_screen_late_init(struct llvmpipe_screen *screen) { + bool ret = true; + mtx_lock(&screen->late_mutex); + + if (screen->late_init_done) + goto out; + screen->rast = lp_rast_create(screen->num_threads); if (!screen->rast) { - return false; + ret = false; + goto out; } screen->cs_tpool = lp_cs_tpool_create(screen->num_threads); if (!screen->cs_tpool) { lp_rast_destroy(screen->rast); - return false; + ret = false; + goto out; } lp_disk_cache_create(screen); - return true; + screen->late_init_done = true; +out: + mtx_unlock(&screen->late_mutex); + return ret; } /** @@ -959,6 +970,7 @@ llvmpipe_create_screen(struct sw_winsys *winsys) (void) mtx_init(&screen->cs_mutex, mtx_plain); (void) mtx_init(&screen->rast_mutex, mtx_plain); + (void) mtx_init(&screen->late_mutex, mtx_plain); if (!llvmpipe_screen_late_init(screen)) { lp_jit_screen_cleanup(screen); FREE(screen); diff --git a/src/gallium/drivers/llvmpipe/lp_screen.h b/src/gallium/drivers/llvmpipe/lp_screen.h index a790c199cd9..ca29e03a958 100644 --- a/src/gallium/drivers/llvmpipe/lp_screen.h +++ b/src/gallium/drivers/llvmpipe/lp_screen.h @@ -64,6 +64,9 @@ struct llvmpipe_screen bool use_tgsi; bool allow_cl; + mtx_t late_mutex; + bool late_init_done; + struct disk_cache *disk_shader_cache; unsigned num_disk_shader_cache_hits; unsigned num_disk_shader_cache_misses;