Creating a screen needs to be serialized in order to support reusing
existing screen. With this, driver private mutexes in create_screen()
functions can be removed.

pipe_loader_create_screen is made an exported symbol to ensure the same
library function (and mutex) is used when multiple libraries are loaded.

Signed-off-by: Rob Herring <r...@kernel.org>
Cc: Emil Velikov <emil.l.veli...@gmail.com>
---
 src/gallium/auxiliary/pipe-loader/pipe_loader.c | 13 +++++++++++--
 src/gallium/targets/dri-vdpau.dyn               |  2 ++
 src/gallium/targets/dri/dri.sym                 |  2 ++
 src/gallium/targets/vdpau/vdpau.sym             |  2 ++
 4 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader.c 
b/src/gallium/auxiliary/pipe-loader/pipe_loader.c
index 61e5786a2528..4ea3dc81a64a 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader.c
@@ -31,6 +31,7 @@
 #include "util/u_memory.h"
 #include "util/u_string.h"
 #include "util/u_dl.h"
+#include "util/u_thread.h"
 #include "util/xmlconfig.h"
 #include "util/xmlpool.h"
 
@@ -43,6 +44,8 @@
 
 #define MODULE_PREFIX "pipe_"
 
+static mtx_t loader_mutex = _MTX_INITIALIZER_NP;
+
 static int (*backends[])(struct pipe_loader_device **, int) = {
 #ifdef HAVE_LIBDRM
    &pipe_loader_drm_probe,
@@ -70,11 +73,15 @@ pipe_loader_probe(struct pipe_loader_device **devs, int 
ndev)
 static void
 pipe_loader_release_dev(struct pipe_loader_device *dev)
 {
+   mtx_lock(&loader_mutex);
+
    dev->pscreen->destroy(dev->pscreen);
    dev->ops->release(&dev);
+
+   mtx_unlock(&loader_mutex);
 }
 
-void
+PUBLIC void
 pipe_loader_release(struct pipe_loader_device **devs, int ndev)
 {
    int i;
@@ -129,7 +136,7 @@ pipe_loader_get_driinfo_xml(const char *driver_name)
    return xml;
 }
 
-struct pipe_screen *
+PUBLIC struct pipe_screen *
 pipe_loader_create_screen(struct pipe_loader_device *dev)
 {
    struct pipe_screen *pscreen;
@@ -138,8 +145,10 @@ pipe_loader_create_screen(struct pipe_loader_device *dev)
    pipe_loader_load_options(dev);
    config.options = &dev->option_cache;
 
+   mtx_lock(&loader_mutex);
    pscreen = dev->ops->create_screen(dev, &config);
    dev->pscreen = pscreen;
+   mtx_unlock(&loader_mutex);
    return pscreen;
 }
 
diff --git a/src/gallium/targets/dri-vdpau.dyn 
b/src/gallium/targets/dri-vdpau.dyn
index a7919f7d3ba3..03e9e432b699 100644
--- a/src/gallium/targets/dri-vdpau.dyn
+++ b/src/gallium/targets/dri-vdpau.dyn
@@ -1,4 +1,6 @@
 {
+       pipe_loader_create_screen;
+       pipe_loader_release;
        nouveau_drm_screen_create;
        radeon_drm_winsys_create;
        amdgpu_winsys_create;
diff --git a/src/gallium/targets/dri/dri.sym b/src/gallium/targets/dri/dri.sym
index 1fdf18beee76..38b13544ddbf 100644
--- a/src/gallium/targets/dri/dri.sym
+++ b/src/gallium/targets/dri/dri.sym
@@ -2,6 +2,8 @@
        global:
                __driDriverExtensions;
                __driDriverGetExtensions*;
+               pipe_loader_create_screen;
+               pipe_loader_release;
                nouveau_drm_screen_create;
                radeon_drm_winsys_create;
                amdgpu_winsys_create;
diff --git a/src/gallium/targets/vdpau/vdpau.sym 
b/src/gallium/targets/vdpau/vdpau.sym
index 5e71c6285a64..65b6d1c4ebcc 100644
--- a/src/gallium/targets/vdpau/vdpau.sym
+++ b/src/gallium/targets/vdpau/vdpau.sym
@@ -1,6 +1,8 @@
 {
        global:
                vdp_imp_device_create_x11;
+               pipe_loader_create_screen;
+               pipe_loader_release;
                nouveau_drm_screen_create;
                radeon_drm_winsys_create;
                amdgpu_winsys_create;
-- 
2.11.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to