vc4: Fix simulator when more than one vc4_screen is opened.
authorEric Anholt <eric@anholt.net>
Tue, 4 Oct 2016 23:29:26 +0000 (16:29 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 7 Oct 2016 01:09:24 +0000 (18:09 -0700)
We would assertion fail in setting up the simulator the second time
around.  This at least postpones the assertion failure until we've closed
all of the first set of screens and started opening a new set.

src/gallium/drivers/vc4/vc4_context.h
src/gallium/drivers/vc4/vc4_screen.c
src/gallium/drivers/vc4/vc4_simulator.c

index 0d6b8d0e21803a50ef7dbba441bf35dddb8b048d..313630a7e2f43b2f348c1fe53ccdd403aa28b1f7 100644 (file)
@@ -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);
index 64bff5dc227d921444bd3cd34dafa8990231aebb..045f3fb2a34a83248074f650b37b5fdd398c77c7 100644 (file)
@@ -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);
 }
index b802391aa6e5d89e48902c9d27626baa34cf32f8..0291a4e1458809e11f9d1f68922e1f4ebe6995f5 100644 (file)
@@ -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 */