From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index c66be5bc7ed..bd989a4979f 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -22,14 +22,38 @@ #pragma makedep unix #endif
+#include "config.h" + +#include <pthread.h> + #include "win32u_private.h" #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
+WINE_DEFAULT_DEBUG_CHANNEL(vulkan); + +static const struct vulkan_funcs *driver_funcs; +static struct vulkan_funcs vulkan_funcs; + +static void load_vulkan(void) +{ + if ((driver_funcs = user_driver->pwine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) + vulkan_funcs = *driver_funcs; +} + /*********************************************************************** * __wine_get_vulkan_driver (win32u.so) */ const struct vulkan_funcs *__wine_get_vulkan_driver( UINT version ) { - return user_driver->pwine_get_vulkan_driver( version ); + static pthread_once_t init_once = PTHREAD_ONCE_INIT; + + if (version != WINE_VULKAN_DRIVER_VERSION) + { + ERR( "version mismatch, vulkan wants %u but driver has %u\n", version, WINE_VULKAN_DRIVER_VERSION ); + return NULL; + } + + pthread_once( &init_once, load_vulkan ); + return driver_funcs ? &vulkan_funcs : NULL; }