Mesa (master): wgl: do not create screen from DllMain

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 2 10:09:58 UTC 2020


Module: Mesa
Branch: master
Commit: 7b7dbd4fc832eb67a4afd013f8cb623cedcf0d51
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=7b7dbd4fc832eb67a4afd013f8cb623cedcf0d51

Author: Erik Faye-Lund <erik.faye-lund at collabora.com>
Date:   Sun May 26 10:42:58 2019 +0200

wgl: do not create screen from DllMain

There's a lot of operations that aren't allowed from DllMain, so we
shouldn't create a driver-screen from there. So let's instead delay this
until it's needed from a normal function call.

See https://docs.microsoft.com/en-us/windows/win32/dlls/dllmain for
details about what is allowed and isn't from DllMain.

Reviewed-by: Neha Bhende <bhenden at vmware.com>
Tested-by: Marge Bot <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4307>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4307>

---

 src/gallium/state_trackers/wgl/stw_device.c      | 24 +++++++++++++++++++-----
 src/gallium/state_trackers/wgl/stw_device.h      |  8 ++++++--
 src/gallium/state_trackers/wgl/stw_pixelformat.c |  6 ++++++
 3 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/src/gallium/state_trackers/wgl/stw_device.c b/src/gallium/state_trackers/wgl/stw_device.c
index 86906ececc0..b4cf7b7d667 100644
--- a/src/gallium/state_trackers/wgl/stw_device.c
+++ b/src/gallium/state_trackers/wgl/stw_device.c
@@ -125,9 +125,7 @@ stw_init(const struct stw_winsys *stw_winsys)
 
    stw_dev->smapi->get_param = stw_get_param;
 
-   if (!init_screen(stw_winsys))
-      goto error1;
-
+   InitializeCriticalSection(&stw_dev->screen_mutex);
    InitializeCriticalSection(&stw_dev->ctx_mutex);
    InitializeCriticalSection(&stw_dev->fb_mutex);
 
@@ -136,8 +134,6 @@ stw_init(const struct stw_winsys *stw_winsys)
       goto error1;
    }
 
-   stw_pixelformat_init();
-
    /* env var override for WGL_EXT_swap_control, useful for testing/debugging */
    const char *s = os_get_option("WGL_SWAP_INTERVAL");
    if (s) {
@@ -158,6 +154,23 @@ error1:
    return FALSE;
 }
 
+boolean
+stw_init_screen()
+{
+   EnterCriticalSection(&stw_dev->screen_mutex);
+
+   if (!stw_dev->screen_initialized) {
+      stw_dev->screen_initialized = true;
+      if (!init_screen(stw_dev->stw_winsys)) {
+         LeaveCriticalSection(&stw_dev->screen_mutex);
+         return false;
+      }
+      stw_pixelformat_init();
+   }
+
+   LeaveCriticalSection(&stw_dev->screen_mutex);
+   return stw_dev->screen != NULL;
+}
 
 boolean
 stw_init_thread(void)
@@ -202,6 +215,7 @@ stw_cleanup(void)
 
    DeleteCriticalSection(&stw_dev->fb_mutex);
    DeleteCriticalSection(&stw_dev->ctx_mutex);
+   DeleteCriticalSection(&stw_dev->screen_mutex);
 
    if (stw_dev->smapi->destroy)
       stw_dev->smapi->destroy(stw_dev->smapi);
diff --git a/src/gallium/state_trackers/wgl/stw_device.h b/src/gallium/state_trackers/wgl/stw_device.h
index 3e1ffebe708..a2cd6c7487c 100644
--- a/src/gallium/state_trackers/wgl/stw_device.h
+++ b/src/gallium/state_trackers/wgl/stw_device.h
@@ -47,9 +47,11 @@ struct stw_framebuffer;
 struct stw_device
 {
    const struct stw_winsys *stw_winsys;
-   
+
+   CRITICAL_SECTION screen_mutex;
+   bool screen_initialized;
    struct pipe_screen *screen;
-   
+
    /* Cache some PIPE_CAP_* */
    unsigned max_2d_length;
 
@@ -88,6 +90,8 @@ struct stw_device
 
 extern struct stw_device *stw_dev;
 
+boolean
+stw_init_screen(void);
 
 static inline struct stw_context *
 stw_lookup_context_locked( DHGLRC dhglrc )
diff --git a/src/gallium/state_trackers/wgl/stw_pixelformat.c b/src/gallium/state_trackers/wgl/stw_pixelformat.c
index fe54e26845d..8696300f3e0 100644
--- a/src/gallium/state_trackers/wgl/stw_pixelformat.c
+++ b/src/gallium/state_trackers/wgl/stw_pixelformat.c
@@ -313,6 +313,9 @@ stw_pixelformat_init(void)
 uint
 stw_pixelformat_get_count(void)
 {
+   if (!stw_init_screen())
+      return 0;
+
    return stw_dev->pixelformat_count;
 }
 
@@ -320,6 +323,9 @@ stw_pixelformat_get_count(void)
 uint
 stw_pixelformat_get_extended_count(void)
 {
+   if (!stw_init_screen())
+      return 0;
+
    return stw_dev->pixelformat_extended_count;
 }
 



More information about the mesa-commit mailing list