I missed that Zhiyi was out so I've just reordered this, calling __wine_get_vulkan_driver from winex11 d3dkmt instead.
-- v3: win32u: Move vkGet(Device|Instance)ProcAddr helpers inline. winevulkan: Stop generating the wine/vulkan_driver.h header. win32u: Move vkGet(Instance|Device)ProcAddr out the drivers. win32u: Move vulkan loading and init guard out of the drivers. winemac: Use SONAME_LIBVULKAN as an alias for MoltenVK.
From: Rémi Bernon rbernon@codeweavers.com
--- configure.ac | 2 +- dlls/winemac.drv/vulkan.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/configure.ac b/configure.ac index fa81d912106..6605cde4953 100644 --- a/configure.ac +++ b/configure.ac @@ -1847,7 +1847,7 @@ then WINE_CHECK_SONAME(vulkan, vkGetInstanceProcAddr) if test "x$ac_cv_lib_soname_vulkan" = "x" then - WINE_CHECK_SONAME(MoltenVK, vkGetInstanceProcAddr) + WINE_CHECK_SONAME(MoltenVK, vkGetInstanceProcAddr, [AC_DEFINE_UNQUOTED(SONAME_LIBVULKAN,[$ac_cv_lib_soname_MoltenVK])]) fi fi WINE_NOTICE_WITH(vulkan,[test "x$ac_cv_lib_soname_vulkan" = "x" -a "x$ac_cv_lib_soname_MoltenVK" = "x"], diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 472b2885b10..6c4ab646021 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -42,7 +42,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
-#ifdef SONAME_LIBMOLTENVK +#ifdef SONAME_LIBVULKAN
WINE_DECLARE_DEBUG_CHANNEL(fps);
@@ -100,9 +100,9 @@ static void *vulkan_handle;
static void wine_vk_init(void) { - if (!(vulkan_handle = dlopen(SONAME_LIBMOLTENVK, RTLD_NOW))) + if (!(vulkan_handle = dlopen(SONAME_LIBVULKAN, RTLD_NOW))) { - ERR("Failed to load %s\n", SONAME_LIBMOLTENVK); + ERR("Failed to load %s\n", SONAME_LIBVULKAN); return; }
@@ -523,7 +523,7 @@ static const struct vulkan_funcs *get_vulkan_driver(UINT version) return NULL; }
-#endif /* SONAME_LIBMOLTENVK */ +#endif /* SONAME_LIBVULKAN */
const struct vulkan_funcs *macdrv_wine_get_vulkan_driver(UINT version) {
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/driver.c | 12 ++-- dlls/win32u/vulkan.c | 58 +++++++++++++++++++- dlls/winemac.drv/gdi.c | 2 +- dlls/winemac.drv/macdrv.h | 2 +- dlls/winemac.drv/vulkan.c | 71 ++++++++---------------- dlls/winewayland.drv/vulkan.c | 71 +++++++++--------------- dlls/winewayland.drv/waylanddrv.h | 2 +- dlls/winewayland.drv/waylanddrv_main.c | 2 +- dlls/winex11.drv/init.c | 10 +--- dlls/winex11.drv/vulkan.c | 76 +++++++++----------------- dlls/winex11.drv/x11drv.h | 2 +- dlls/winex11.drv/x11drv_main.c | 6 +- dlls/winex11.drv/xrandr.c | 2 +- include/wine/gdi_driver.h | 4 +- 14 files changed, 150 insertions(+), 170 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index bd513ee20b7..7485c0950b3 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -915,9 +915,9 @@ static BOOL nulldrv_SystemParametersInfo( UINT action, UINT int_param, void *ptr return FALSE; }
-static const struct vulkan_funcs *nulldrv_wine_get_vulkan_driver( UINT version ) +static UINT nulldrv_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs *vulkan_funcs ) { - return NULL; + return STATUS_NOT_IMPLEMENTED; }
static struct opengl_funcs *nulldrv_wine_get_wgl_driver( UINT version ) @@ -1231,9 +1231,9 @@ static BOOL loaderdrv_UpdateLayeredWindow( HWND hwnd, const UPDATELAYEREDWINDOWI return load_driver()->pUpdateLayeredWindow( hwnd, info, window_rect ); }
-static const struct vulkan_funcs * loaderdrv_wine_get_vulkan_driver( UINT version ) +static UINT loaderdrv_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs *vulkan_funcs ) { - return load_driver()->pwine_get_vulkan_driver( version ); + return load_driver()->pVulkanInit( version, vulkan_handle, vulkan_funcs ); }
static const struct user_driver_funcs lazy_load_driver = @@ -1302,7 +1302,7 @@ static const struct user_driver_funcs lazy_load_driver = /* system parameters */ nulldrv_SystemParametersInfo, /* vulkan support */ - loaderdrv_wine_get_vulkan_driver, + loaderdrv_VulkanInit, /* opengl support */ nulldrv_wine_get_wgl_driver, /* thread management */ @@ -1386,7 +1386,7 @@ void __wine_set_user_driver( const struct user_driver_funcs *funcs, UINT version SET_USER_FUNC(WindowPosChanging); SET_USER_FUNC(WindowPosChanged); SET_USER_FUNC(SystemParametersInfo); - SET_USER_FUNC(wine_get_vulkan_driver); + SET_USER_FUNC(VulkanInit); SET_USER_FUNC(wine_get_wgl_driver); SET_USER_FUNC(ThreadDetach); #undef SET_USER_FUNC diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index c66be5bc7ed..30bbd76b65a 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -22,14 +22,70 @@ #pragma makedep unix #endif
+#include "config.h" + +#include <dlfcn.h> +#include <pthread.h> + +#include "ntstatus.h" +#define WIN32_NO_STATUS #include "win32u_private.h" #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
+WINE_DEFAULT_DEBUG_CHANNEL(vulkan); + +#ifdef SONAME_LIBVULKAN + +static void *vulkan_handle; +static struct vulkan_funcs vulkan_funcs; + +static void vulkan_init(void) +{ + UINT status; + + if (!(vulkan_handle = dlopen( SONAME_LIBVULKAN, RTLD_NOW ))) + { + ERR( "Failed to load %s\n", SONAME_LIBVULKAN ); + return; + } + + if ((status = user_driver->pVulkanInit( WINE_VULKAN_DRIVER_VERSION, vulkan_handle, &vulkan_funcs )) && + status != STATUS_NOT_IMPLEMENTED) + { + ERR( "Failed to initialize the driver vulkan functions, status %#x\n", status ); + dlclose( vulkan_handle ); + vulkan_handle = NULL; + return; + } +} + /*********************************************************************** * __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 win32u has %u\n", version, WINE_VULKAN_DRIVER_VERSION ); + return NULL; + } + + pthread_once( &init_once, vulkan_init ); + return vulkan_handle ? &vulkan_funcs : NULL; +} + +#else /* SONAME_LIBVULKAN */ + +/*********************************************************************** + * __wine_get_vulkan_driver (win32u.so) + */ +const struct vulkan_funcs *__wine_get_vulkan_driver( UINT version ) +{ + ERR("Wine was built without Vulkan support.\n"); + return NULL; } + +#endif /* SONAME_LIBVULKAN */ diff --git a/dlls/winemac.drv/gdi.c b/dlls/winemac.drv/gdi.c index 137945c4b74..a06314ed62c 100644 --- a/dlls/winemac.drv/gdi.c +++ b/dlls/winemac.drv/gdi.c @@ -308,7 +308,7 @@ static const struct user_driver_funcs macdrv_funcs = .pWindowMessage = macdrv_WindowMessage, .pWindowPosChanged = macdrv_WindowPosChanged, .pWindowPosChanging = macdrv_WindowPosChanging, - .pwine_get_vulkan_driver = macdrv_wine_get_vulkan_driver, + .pVulkanInit = macdrv_VulkanInit, .pwine_get_wgl_driver = macdrv_wine_get_wgl_driver, };
diff --git a/dlls/winemac.drv/macdrv.h b/dlls/winemac.drv/macdrv.h index 7e43314dce1..f5793006c35 100644 --- a/dlls/winemac.drv/macdrv.h +++ b/dlls/winemac.drv/macdrv.h @@ -257,7 +257,7 @@ extern BOOL macdrv_SystemParametersInfo(UINT action, UINT int_param, void *ptr_p extern void macdrv_lost_pasteboard_ownership(HWND hwnd);
extern struct opengl_funcs *macdrv_wine_get_wgl_driver(UINT version); -extern const struct vulkan_funcs *macdrv_wine_get_vulkan_driver(UINT version); +extern UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *vulkan_funcs); extern void sync_gl_view(struct macdrv_win_data* data, const RECT* old_whole_rect, const RECT* old_client_rect);
extern CGImageRef create_cgimage_from_icon_bitmaps(HDC hdc, HANDLE icon, HBITMAP hbmColor, diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 6c4ab646021..4474a74fbcc 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -31,6 +31,8 @@ #include <stdio.h> #include <dlfcn.h>
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "macdrv.h" #include "wine/debug.h"
@@ -96,38 +98,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle) return (struct wine_vk_surface *)(uintptr_t)handle; }
-static void *vulkan_handle; - -static void wine_vk_init(void) -{ - if (!(vulkan_handle = dlopen(SONAME_LIBVULKAN, RTLD_NOW))) - { - ERR("Failed to load %s\n", SONAME_LIBVULKAN); - return; - } - -#define LOAD_FUNCPTR(f) if ((p##f = dlsym(vulkan_handle, #f)) == NULL) goto fail; - LOAD_FUNCPTR(vkCreateInstance) - LOAD_FUNCPTR(vkCreateSwapchainKHR) - LOAD_FUNCPTR(vkCreateMacOSSurfaceMVK) - LOAD_FUNCPTR(vkCreateMetalSurfaceEXT) - LOAD_FUNCPTR(vkDestroyInstance) - LOAD_FUNCPTR(vkDestroySurfaceKHR) - LOAD_FUNCPTR(vkDestroySwapchainKHR) - LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) - LOAD_FUNCPTR(vkGetDeviceProcAddr) - LOAD_FUNCPTR(vkGetInstanceProcAddr) - LOAD_FUNCPTR(vkGetSwapchainImagesKHR) - LOAD_FUNCPTR(vkQueuePresentKHR) -#undef LOAD_FUNCPTR - - return; - -fail: - dlclose(vulkan_handle); - vulkan_handle = NULL; -} - /* Helper function for converting between win32 and MoltenVK compatible VkInstanceCreateInfo. * Caller is responsible for allocation and cleanup of 'dst'. */ @@ -498,34 +468,39 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_wine_get_host_surface, };
-static const struct vulkan_funcs *get_vulkan_driver(UINT version) +UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs) { - 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; + ERR("version mismatch, win32u wants %u but driver has %u\n", version, WINE_VULKAN_DRIVER_VERSION); + return STATUS_INVALID_PARAMETER; }
- pthread_once(&init_once, wine_vk_init); - if (vulkan_handle) - return &vulkan_funcs; +#define LOAD_FUNCPTR(f) if ((p##f = dlsym(vulkan_handle, #f)) == NULL) return STATUS_PROCEDURE_NOT_FOUND; + LOAD_FUNCPTR(vkCreateInstance) + LOAD_FUNCPTR(vkCreateSwapchainKHR) + LOAD_FUNCPTR(vkCreateMacOSSurfaceMVK) + LOAD_FUNCPTR(vkCreateMetalSurfaceEXT) + LOAD_FUNCPTR(vkDestroyInstance) + LOAD_FUNCPTR(vkDestroySurfaceKHR) + LOAD_FUNCPTR(vkDestroySwapchainKHR) + LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) + LOAD_FUNCPTR(vkGetDeviceProcAddr) + LOAD_FUNCPTR(vkGetInstanceProcAddr) + LOAD_FUNCPTR(vkGetSwapchainImagesKHR) + LOAD_FUNCPTR(vkQueuePresentKHR) +#undef LOAD_FUNCPTR
- return NULL; + *driver_funcs = vulkan_funcs; + return STATUS_SUCCESS; }
#else /* No vulkan */
-static const struct vulkan_funcs *get_vulkan_driver(UINT version) +UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs) { ERR("Wine was built without Vulkan support.\n"); - return NULL; + return STATUS_NOT_IMPLEMENTED; }
#endif /* SONAME_LIBVULKAN */ - -const struct vulkan_funcs *macdrv_wine_get_vulkan_driver(UINT version) -{ - return get_vulkan_driver( version ); -} diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 88c7a62422a..fca74aaf940 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -27,6 +27,8 @@ #include <dlfcn.h> #include <stdlib.h>
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "waylanddrv.h" #include "wine/debug.h"
@@ -64,7 +66,6 @@ static VkBool32 (*pvkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalD static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
-static void *vulkan_handle; static const struct vulkan_funcs vulkan_funcs;
static pthread_mutex_t wine_vk_swapchain_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -542,38 +543,6 @@ static VkSurfaceKHR wayland_wine_get_host_surface(VkSurfaceKHR surface) return wine_vk_surface_from_handle(surface)->host_surface; }
-static void wine_vk_init(void) -{ - if (!(vulkan_handle = dlopen(SONAME_LIBVULKAN, RTLD_NOW))) - { - ERR("Failed to load %s.\n", SONAME_LIBVULKAN); - return; - } - -#define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) goto fail -#define LOAD_OPTIONAL_FUNCPTR(f) p##f = dlsym(vulkan_handle, #f) - LOAD_FUNCPTR(vkCreateInstance); - LOAD_FUNCPTR(vkCreateSwapchainKHR); - LOAD_FUNCPTR(vkCreateWaylandSurfaceKHR); - LOAD_FUNCPTR(vkDestroyInstance); - LOAD_FUNCPTR(vkDestroySurfaceKHR); - LOAD_FUNCPTR(vkDestroySwapchainKHR); - LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); - LOAD_FUNCPTR(vkGetDeviceProcAddr); - LOAD_FUNCPTR(vkGetInstanceProcAddr); - LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); - LOAD_FUNCPTR(vkGetSwapchainImagesKHR); - LOAD_FUNCPTR(vkQueuePresentKHR); -#undef LOAD_FUNCPTR -#undef LOAD_OPTIONAL_FUNCPTR - - return; - -fail: - dlclose(vulkan_handle); - vulkan_handle = NULL; -} - static const struct vulkan_funcs vulkan_funcs = { .p_vkCreateInstance = wayland_vkCreateInstance, @@ -592,31 +561,41 @@ static const struct vulkan_funcs vulkan_funcs = };
/********************************************************************** - * WAYLAND_wine_get_vulkan_driver + * WAYLAND_VulkanInit */ -const struct vulkan_funcs *WAYLAND_wine_get_vulkan_driver(UINT version) +UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs) { - 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; + ERR("version mismatch, win32u wants %u but driver has %u\n", version, WINE_VULKAN_DRIVER_VERSION); + return STATUS_INVALID_PARAMETER; }
- pthread_once(&init_once, wine_vk_init); - if (vulkan_handle) - return &vulkan_funcs; +#define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) return STATUS_PROCEDURE_NOT_FOUND; + LOAD_FUNCPTR(vkCreateInstance); + LOAD_FUNCPTR(vkCreateSwapchainKHR); + LOAD_FUNCPTR(vkCreateWaylandSurfaceKHR); + LOAD_FUNCPTR(vkDestroyInstance); + LOAD_FUNCPTR(vkDestroySurfaceKHR); + LOAD_FUNCPTR(vkDestroySwapchainKHR); + LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); + LOAD_FUNCPTR(vkGetDeviceProcAddr); + LOAD_FUNCPTR(vkGetInstanceProcAddr); + LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); + LOAD_FUNCPTR(vkGetSwapchainImagesKHR); + LOAD_FUNCPTR(vkQueuePresentKHR); +#undef LOAD_FUNCPTR
- return NULL; + *driver_funcs = vulkan_funcs; + return STATUS_SUCCESS; }
#else /* No vulkan */
-const struct vulkan_funcs *WAYLAND_wine_get_vulkan_driver(UINT version) +UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs) { - ERR("Wine was built without Vulkan support.\n"); - return NULL; + ERR( "Wine was built without Vulkan support.\n" ); + return STATUS_NOT_IMPLEMENTED; }
#endif /* SONAME_LIBVULKAN */ diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 7cf813a1ca3..d6359e57db3 100644 --- a/dlls/winewayland.drv/waylanddrv.h +++ b/dlls/winewayland.drv/waylanddrv.h @@ -338,7 +338,7 @@ void WAYLAND_WindowPosChanged(HWND hwnd, HWND insert_after, UINT swp_flags, BOOL WAYLAND_WindowPosChanging(HWND hwnd, HWND insert_after, UINT swp_flags, const RECT *window_rect, const RECT *client_rect, RECT *visible_rect, struct window_surface **surface); -const struct vulkan_funcs *WAYLAND_wine_get_vulkan_driver(UINT version); +UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs); struct opengl_funcs *WAYLAND_wine_get_wgl_driver(UINT version);
#endif /* __WINE_WAYLANDDRV_H */ diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index ca73cd4c97d..7d02497295a 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -42,7 +42,7 @@ static const struct user_driver_funcs waylanddrv_funcs = .pWindowMessage = WAYLAND_WindowMessage, .pWindowPosChanged = WAYLAND_WindowPosChanged, .pWindowPosChanging = WAYLAND_WindowPosChanging, - .pwine_get_vulkan_driver = WAYLAND_wine_get_vulkan_driver, + .pVulkanInit = WAYLAND_VulkanInit, .pwine_get_wgl_driver = WAYLAND_wine_get_wgl_driver, };
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index 1a5cd1cfb25..b21afdf0511 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -333,14 +333,6 @@ static struct opengl_funcs *X11DRV_wine_get_wgl_driver( UINT version ) return get_glx_driver( version ); }
-/********************************************************************** - * X11DRV_wine_get_vulkan_driver - */ -static const struct vulkan_funcs *X11DRV_wine_get_vulkan_driver( UINT version ) -{ - return get_vulkan_driver( version ); -} -
static const struct user_driver_funcs x11drv_funcs = { @@ -436,7 +428,7 @@ static const struct user_driver_funcs x11drv_funcs = .pWindowPosChanging = X11DRV_WindowPosChanging, .pWindowPosChanged = X11DRV_WindowPosChanged, .pSystemParametersInfo = X11DRV_SystemParametersInfo, - .pwine_get_vulkan_driver = X11DRV_wine_get_vulkan_driver, + .pVulkanInit = X11DRV_VulkanInit, .pwine_get_wgl_driver = X11DRV_wine_get_wgl_driver, .pThreadDetach = X11DRV_ThreadDetach, }; diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 0de6c72862c..8b36f729865 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -30,6 +30,8 @@ #include <stdio.h> #include <dlfcn.h>
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "windef.h" #include "winbase.h"
@@ -94,43 +96,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle) return (struct wine_vk_surface *)(uintptr_t)handle; }
-static void *vulkan_handle; - -static void wine_vk_init(void) -{ - init_recursive_mutex(&vulkan_mutex); - - if (!(vulkan_handle = dlopen(SONAME_LIBVULKAN, RTLD_NOW))) - { - ERR("Failed to load %s.\n", SONAME_LIBVULKAN); - return; - } - -#define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) goto fail -#define LOAD_OPTIONAL_FUNCPTR(f) p##f = dlsym(vulkan_handle, #f) - LOAD_FUNCPTR(vkCreateInstance); - LOAD_FUNCPTR(vkCreateSwapchainKHR); - LOAD_FUNCPTR(vkCreateXlibSurfaceKHR); - LOAD_FUNCPTR(vkDestroyInstance); - LOAD_FUNCPTR(vkDestroySurfaceKHR); - LOAD_FUNCPTR(vkDestroySwapchainKHR); - LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); - LOAD_FUNCPTR(vkGetDeviceProcAddr); - LOAD_FUNCPTR(vkGetInstanceProcAddr); - LOAD_FUNCPTR(vkGetPhysicalDeviceXlibPresentationSupportKHR); - LOAD_FUNCPTR(vkGetSwapchainImagesKHR); - LOAD_FUNCPTR(vkQueuePresentKHR); -#undef LOAD_FUNCPTR -#undef LOAD_OPTIONAL_FUNCPTR - - vulkan_hwnd_context = XUniqueContext(); - return; - -fail: - dlclose(vulkan_handle); - vulkan_handle = NULL; -} - /* Helper function for converting between win32 and X11 compatible VkInstanceCreateInfo. * Caller is responsible for allocation and cleanup of 'dst'. */ @@ -526,29 +491,42 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_wine_get_host_surface, };
-const struct vulkan_funcs *get_vulkan_driver(UINT version) +UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs ) { - 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; + ERR( "version mismatch, win32u wants %u but driver has %u\n", version, WINE_VULKAN_DRIVER_VERSION ); + return STATUS_INVALID_PARAMETER; }
- pthread_once(&init_once, wine_vk_init); - if (vulkan_handle) - return &vulkan_funcs; + init_recursive_mutex( &vulkan_mutex ); + +#define LOAD_FUNCPTR( f ) if (!(p##f = dlsym( vulkan_handle, #f ))) return STATUS_PROCEDURE_NOT_FOUND; + LOAD_FUNCPTR( vkCreateInstance ); + LOAD_FUNCPTR( vkCreateSwapchainKHR ); + LOAD_FUNCPTR( vkCreateXlibSurfaceKHR ); + LOAD_FUNCPTR( vkDestroyInstance ); + LOAD_FUNCPTR( vkDestroySurfaceKHR ); + LOAD_FUNCPTR( vkDestroySwapchainKHR ); + LOAD_FUNCPTR( vkEnumerateInstanceExtensionProperties ); + LOAD_FUNCPTR( vkGetDeviceProcAddr ); + LOAD_FUNCPTR( vkGetInstanceProcAddr ); + LOAD_FUNCPTR( vkGetPhysicalDeviceXlibPresentationSupportKHR ); + LOAD_FUNCPTR( vkGetSwapchainImagesKHR ); + LOAD_FUNCPTR( vkQueuePresentKHR ); +#undef LOAD_FUNCPTR
- return NULL; + vulkan_hwnd_context = XUniqueContext(); + *driver_funcs = vulkan_funcs; + return STATUS_SUCCESS; }
#else /* No vulkan */
-const struct vulkan_funcs *get_vulkan_driver(UINT version) +UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs ) { - ERR("Wine was built without Vulkan support.\n"); - return NULL; + ERR( "Wine was built without Vulkan support.\n" ); + return STATUS_NOT_IMPLEMENTED; }
void wine_vk_surface_destroy(HWND hwnd) diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index a525f0dd499..26a3e8b2e64 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -292,7 +292,7 @@ extern BOOL shape_layered_windows; extern const struct gdi_dc_funcs *X11DRV_XRender_Init(void);
extern struct opengl_funcs *get_glx_driver(UINT); -extern const struct vulkan_funcs *get_vulkan_driver(UINT); +extern UINT X11DRV_VulkanInit( UINT, void *, struct vulkan_funcs * );
extern struct format_entry *import_xdnd_selection( Display *display, Window win, Atom selection, Atom *targets, UINT count, diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index bbb0386bd69..5d4ed065fb5 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -819,7 +819,7 @@ BOOL X11DRV_SystemParametersInfo( UINT action, UINT int_param, void *ptr_param,
NTSTATUS X11DRV_D3DKMTCloseAdapter( const D3DKMT_CLOSEADAPTER *desc ) { - const struct vulkan_funcs *vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); + const struct vulkan_funcs *vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ); struct x11_d3dkmt_adapter *adapter;
if (!vulkan_funcs) @@ -1003,7 +1003,7 @@ NTSTATUS X11DRV_D3DKMTOpenAdapterFromLuid( D3DKMT_OPENADAPTERFROMLUID *desc ) }
/* Find the Vulkan device with corresponding UUID */ - if (!(vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION))) + if (!(vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) { WARN("Vulkan is unavailable.\n"); return STATUS_UNSUCCESSFUL; @@ -1091,7 +1091,7 @@ done:
NTSTATUS X11DRV_D3DKMTQueryVideoMemoryInfo( D3DKMT_QUERYVIDEOMEMORYINFO *desc ) { - const struct vulkan_funcs *vulkan_funcs = get_vulkan_driver(WINE_VULKAN_DRIVER_VERSION); + const struct vulkan_funcs *vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ); PFN_vkGetPhysicalDeviceMemoryProperties2KHR pvkGetPhysicalDeviceMemoryProperties2KHR; VkPhysicalDeviceMemoryBudgetPropertiesEXT budget; VkPhysicalDeviceMemoryProperties2 properties2; diff --git a/dlls/winex11.drv/xrandr.c b/dlls/winex11.drv/xrandr.c index d77eb1a0163..b829c677ff1 100644 --- a/dlls/winex11.drv/xrandr.c +++ b/dlls/winex11.drv/xrandr.c @@ -639,7 +639,7 @@ static BOOL get_gpu_properties_from_vulkan( struct gdi_gpu *gpu, const XRRProvid "VK_KHR_display", VK_KHR_SURFACE_EXTENSION_NAME, }; - const struct vulkan_funcs *vulkan_funcs = get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ); + const struct vulkan_funcs *vulkan_funcs = __wine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ); VkResult (*pvkGetRandROutputDisplayEXT)( VkPhysicalDevice, Display *, RROutput, VkDisplayKHR * ); PFN_vkGetPhysicalDeviceProperties2KHR pvkGetPhysicalDeviceProperties2KHR; PFN_vkEnumeratePhysicalDevices pvkEnumeratePhysicalDevices; diff --git a/include/wine/gdi_driver.h b/include/wine/gdi_driver.h index ffe84787d51..69392126a8a 100644 --- a/include/wine/gdi_driver.h +++ b/include/wine/gdi_driver.h @@ -175,7 +175,7 @@ struct gdi_dc_funcs };
/* increment this when you change the DC function table */ -#define WINE_GDI_DRIVER_VERSION 84 +#define WINE_GDI_DRIVER_VERSION 85
#define GDI_PRIORITY_NULL_DRV 0 /* null driver */ #define GDI_PRIORITY_FONT_DRV 100 /* any font driver */ @@ -348,7 +348,7 @@ struct user_driver_funcs /* system parameters */ BOOL (*pSystemParametersInfo)(UINT,UINT,void*,UINT); /* vulkan support */ - const struct vulkan_funcs * (*pwine_get_vulkan_driver)(UINT); + UINT (*pVulkanInit)(UINT,void *,struct vulkan_funcs *); /* opengl support */ struct opengl_funcs * (*pwine_get_wgl_driver)(UINT); /* thread management */
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 42 +++++++++++++++++++++++++++++++++++ dlls/winemac.drv/vulkan.c | 32 ++------------------------ dlls/winewayland.drv/vulkan.c | 30 ------------------------- dlls/winex11.drv/vulkan.c | 32 ++------------------------ 4 files changed, 46 insertions(+), 90 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 30bbd76b65a..77f5ee2da8d 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -30,6 +30,9 @@ #include "ntstatus.h" #define WIN32_NO_STATUS #include "win32u_private.h" + +#define VK_NO_PROTOTYPES +#define WINE_VK_HOST #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
@@ -40,6 +43,29 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); static void *vulkan_handle; static struct vulkan_funcs vulkan_funcs;
+static void *(*p_vkGetDeviceProcAddr)(VkDevice, const char *); +static void *(*p_vkGetInstanceProcAddr)(VkInstance, const char *); + +static void *win32u_vkGetDeviceProcAddr( VkDevice device, const char *name ) +{ + void *proc_addr; + + TRACE( "device %p, name %s\n", device, debugstr_a(name) ); + + if ((proc_addr = get_vulkan_driver_device_proc_addr( &vulkan_funcs, name ))) return proc_addr; + return p_vkGetDeviceProcAddr( device, name ); +} + +static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name ) +{ + void *proc_addr; + + TRACE( "instance %p, name %s\n", instance, debugstr_a(name) ); + + if ((proc_addr = get_vulkan_driver_instance_proc_addr( &vulkan_funcs, instance, name ))) return proc_addr; + return p_vkGetInstanceProcAddr( instance, name ); +} + static void vulkan_init(void) { UINT status; @@ -58,6 +84,22 @@ static void vulkan_init(void) vulkan_handle = NULL; return; } + +#define LOAD_FUNCPTR( f ) \ + if (!(p_##f = dlsym( vulkan_handle, #f ))) \ + { \ + ERR( "Failed to find " #f "\n" ); \ + dlclose( vulkan_handle ); \ + vulkan_handle = NULL; \ + return; \ + } + + LOAD_FUNCPTR( vkGetDeviceProcAddr ); + LOAD_FUNCPTR( vkGetInstanceProcAddr ); +#undef LOAD_FUNCPTR + + vulkan_funcs.p_vkGetDeviceProcAddr = win32u_vkGetDeviceProcAddr; + vulkan_funcs.p_vkGetInstanceProcAddr = win32u_vkGetInstanceProcAddr; }
/*********************************************************************** diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 4474a74fbcc..52928ec3d44 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -85,8 +85,6 @@ static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); -static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); -static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkResult (*pvkGetPhysicalDeviceSurfaceCapabilities2KHR)(VkPhysicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *, VkSurfaceCapabilities2KHR *); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); @@ -373,30 +371,6 @@ static VkResult macdrv_vkEnumerateInstanceExtensionProperties(const char *layer_ return res; }
-static void *macdrv_vkGetDeviceProcAddr(VkDevice device, const char *name) -{ - void *proc_addr; - - TRACE("%p, %s\n", device, debugstr_a(name)); - - if ((proc_addr = get_vulkan_driver_device_proc_addr(&vulkan_funcs, name))) - return proc_addr; - - return pvkGetDeviceProcAddr(device, name); -} - -static void *macdrv_vkGetInstanceProcAddr(VkInstance instance, const char *name) -{ - void *proc_addr; - - TRACE("%p, %s\n", instance, debugstr_a(name)); - - if ((proc_addr = get_vulkan_driver_instance_proc_addr(&vulkan_funcs, instance, name))) - return proc_addr; - - return pvkGetInstanceProcAddr(instance, name); -} - static VkBool32 macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice phys_dev, uint32_t index) { @@ -459,8 +433,8 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_vkDestroySurfaceKHR, macdrv_vkDestroySwapchainKHR, macdrv_vkEnumerateInstanceExtensionProperties, - macdrv_vkGetDeviceProcAddr, - macdrv_vkGetInstanceProcAddr, + NULL, + NULL, macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, macdrv_vkGetSwapchainImagesKHR, macdrv_vkQueuePresentKHR, @@ -485,8 +459,6 @@ UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *d LOAD_FUNCPTR(vkDestroySurfaceKHR) LOAD_FUNCPTR(vkDestroySwapchainKHR) LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties) - LOAD_FUNCPTR(vkGetDeviceProcAddr) - LOAD_FUNCPTR(vkGetInstanceProcAddr) LOAD_FUNCPTR(vkGetSwapchainImagesKHR) LOAD_FUNCPTR(vkQueuePresentKHR) #undef LOAD_FUNCPTR diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index fca74aaf940..ec5e9fe6ae8 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -60,8 +60,6 @@ static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); -static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); -static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkBool32 (*pvkGetPhysicalDeviceWaylandPresentationSupportKHR)(VkPhysicalDevice, uint32_t, struct wl_display *); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); @@ -486,30 +484,6 @@ static VkResult wayland_vkEnumerateInstanceExtensionProperties(const char *layer return res; }
-static void *wayland_vkGetDeviceProcAddr(VkDevice device, const char *name) -{ - void *proc_addr; - - TRACE("%p, %s\n", device, debugstr_a(name)); - - if ((proc_addr = get_vulkan_driver_device_proc_addr(&vulkan_funcs, name))) - return proc_addr; - - return pvkGetDeviceProcAddr(device, name); -} - -static void *wayland_vkGetInstanceProcAddr(VkInstance instance, const char *name) -{ - void *proc_addr; - - TRACE("%p, %s\n", instance, debugstr_a(name)); - - if ((proc_addr = get_vulkan_driver_instance_proc_addr(&vulkan_funcs, instance, name))) - return proc_addr; - - return pvkGetInstanceProcAddr(instance, name); -} - static VkBool32 wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice phys_dev, uint32_t index) { @@ -552,8 +526,6 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkDestroySurfaceKHR = wayland_vkDestroySurfaceKHR, .p_vkDestroySwapchainKHR = wayland_vkDestroySwapchainKHR, .p_vkEnumerateInstanceExtensionProperties = wayland_vkEnumerateInstanceExtensionProperties, - .p_vkGetDeviceProcAddr = wayland_vkGetDeviceProcAddr, - .p_vkGetInstanceProcAddr = wayland_vkGetInstanceProcAddr, .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, .p_vkGetSwapchainImagesKHR = wayland_vkGetSwapchainImagesKHR, .p_vkQueuePresentKHR = wayland_vkQueuePresentKHR, @@ -579,8 +551,6 @@ UINT WAYLAND_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs * LOAD_FUNCPTR(vkDestroySurfaceKHR); LOAD_FUNCPTR(vkDestroySwapchainKHR); LOAD_FUNCPTR(vkEnumerateInstanceExtensionProperties); - LOAD_FUNCPTR(vkGetDeviceProcAddr); - LOAD_FUNCPTR(vkGetInstanceProcAddr); LOAD_FUNCPTR(vkGetPhysicalDeviceWaylandPresentationSupportKHR); LOAD_FUNCPTR(vkGetSwapchainImagesKHR); LOAD_FUNCPTR(vkQueuePresentKHR); diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 8b36f729865..39a76c0a0e9 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -83,8 +83,6 @@ static void (*pvkDestroyInstance)(VkInstance, const VkAllocationCallbacks *); static void (*pvkDestroySurfaceKHR)(VkInstance, VkSurfaceKHR, const VkAllocationCallbacks *); static void (*pvkDestroySwapchainKHR)(VkDevice, VkSwapchainKHR, const VkAllocationCallbacks *); static VkResult (*pvkEnumerateInstanceExtensionProperties)(const char *, uint32_t *, VkExtensionProperties *); -static void * (*pvkGetDeviceProcAddr)(VkDevice, const char *); -static void * (*pvkGetInstanceProcAddr)(VkInstance, const char *); static VkBool32 (*pvkGetPhysicalDeviceXlibPresentationSupportKHR)(VkPhysicalDevice, uint32_t, Display *, VisualID); static VkResult (*pvkGetSwapchainImagesKHR)(VkDevice, VkSwapchainKHR, uint32_t *, VkImage *); static VkResult (*pvkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *); @@ -392,30 +390,6 @@ static VkResult X11DRV_vkEnumerateInstanceExtensionProperties(const char *layer_ return res; }
-static void *X11DRV_vkGetDeviceProcAddr(VkDevice device, const char *name) -{ - void *proc_addr; - - TRACE("%p, %s\n", device, debugstr_a(name)); - - if ((proc_addr = get_vulkan_driver_device_proc_addr( &vulkan_funcs, name ))) - return proc_addr; - - return pvkGetDeviceProcAddr(device, name); -} - -static void *X11DRV_vkGetInstanceProcAddr(VkInstance instance, const char *name) -{ - void *proc_addr; - - TRACE("%p, %s\n", instance, debugstr_a(name)); - - if ((proc_addr = get_vulkan_driver_instance_proc_addr( &vulkan_funcs, instance, name ))) - return proc_addr; - - return pvkGetInstanceProcAddr(instance, name); -} - static VkBool32 X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysicalDevice phys_dev, uint32_t index) { @@ -482,8 +456,8 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_vkDestroySurfaceKHR, X11DRV_vkDestroySwapchainKHR, X11DRV_vkEnumerateInstanceExtensionProperties, - X11DRV_vkGetDeviceProcAddr, - X11DRV_vkGetInstanceProcAddr, + NULL, + NULL, X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR, X11DRV_vkGetSwapchainImagesKHR, X11DRV_vkQueuePresentKHR, @@ -509,8 +483,6 @@ UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs * LOAD_FUNCPTR( vkDestroySurfaceKHR ); LOAD_FUNCPTR( vkDestroySwapchainKHR ); LOAD_FUNCPTR( vkEnumerateInstanceExtensionProperties ); - LOAD_FUNCPTR( vkGetDeviceProcAddr ); - LOAD_FUNCPTR( vkGetInstanceProcAddr ); LOAD_FUNCPTR( vkGetPhysicalDeviceXlibPresentationSupportKHR ); LOAD_FUNCPTR( vkGetSwapchainImagesKHR ); LOAD_FUNCPTR( vkQueuePresentKHR );
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winevulkan/make_vulkan | 63 ------------------------------------ include/wine/vulkan_driver.h | 20 ++++++++---- 2 files changed, 14 insertions(+), 69 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 6b4debf20ff..809591b3c97 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -3142,66 +3142,6 @@ class VkGenerator(object):
f.write("#endif /* __WINE_VULKAN_H */\n")
- def generate_vulkan_driver_h(self, f): - self._generate_copyright(f) - f.write("#ifndef __WINE_VULKAN_DRIVER_H\n") - f.write("#define __WINE_VULKAN_DRIVER_H\n\n") - - f.write("/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */\n") - f.write("#define WINE_VULKAN_DRIVER_VERSION {0}\n\n".format(DRIVER_VERSION)) - - f.write("struct vulkan_funcs\n{\n") - f.write(" /* Vulkan global functions. These are the only calls at this point a graphics driver\n") - f.write(" * needs to provide. Other function calls will be provided indirectly by dispatch\n") - f.write(" * tables part of dispatchable Vulkan objects such as VkInstance or vkDevice.\n") - f.write(" */\n") - - for vk_func in self.registry.funcs.values(): - if not vk_func.is_driver_func(): - continue - - pfn = vk_func.pfn() - # Avoid PFN_vkVoidFunction in driver interface as Vulkan likes to put calling convention - # stuff in there. For simplicity substitute with "void *". - pfn = pfn.replace("PFN_vkVoidFunction", "void *") - f.write(" {0};\n".format(pfn)) - - f.write("\n") - f.write(" /* winevulkan specific functions */\n") - f.write(" VkSurfaceKHR (*p_wine_get_host_surface)(VkSurfaceKHR);\n") - f.write("};\n\n") - - f.write("static inline void *get_vulkan_driver_device_proc_addr(\n") - f.write(" const struct vulkan_funcs *vulkan_funcs, const char *name)\n{\n") - f.write(" if (!name || name[0] != 'v' || name[1] != 'k') return NULL;\n\n") - f.write(" name += 2;\n\n") - for vk_func in self.registry.funcs.values(): - if vk_func.is_driver_func() and vk_func.is_device_func(): - f.write(' if (!strcmp(name, "{0}"))\n'.format(vk_func.name[2:])) - f.write(' return vulkan_funcs->p_{0};\n'.format(vk_func.name)) - f.write("\n") - f.write(" return NULL;\n}\n\n") - - f.write("static inline void *get_vulkan_driver_instance_proc_addr(\n") - f.write(" const struct vulkan_funcs *vulkan_funcs, VkInstance instance, const char *name)\n{\n") - f.write(" if (!name || name[0] != 'v' || name[1] != 'k') return NULL;\n\n") - f.write(" name += 2;\n\n") - for vk_func in self.registry.funcs.values(): - if vk_func.is_driver_func() and vk_func.is_global_func() and vk_func.name != "vkGetInstanceProcAddr": - f.write(' if (!strcmp(name, "{0}"))\n'.format(vk_func.name[2:])) - f.write(' return vulkan_funcs->p_{0};\n'.format(vk_func.name)) - f.write("\n") - f.write(" if (!instance) return NULL;\n\n") - for vk_func in self.registry.funcs.values(): - if vk_func.is_driver_func() and (vk_func.is_instance_func() or vk_func.is_phys_dev_func()): - f.write(' if (!strcmp(name, "{0}"))\n'.format(vk_func.name[2:])) - f.write(' return vulkan_funcs->p_{0};\n'.format(vk_func.name)) - f.write("\n") - f.write(" name -= 2;\n\n") - f.write(" return get_vulkan_driver_device_proc_addr(vulkan_funcs, name);\n}\n\n") - - f.write("#endif /* __WINE_VULKAN_DRIVER_H */\n") - def generate_vulkan_spec(self, f): self._generate_copyright(f, spec_file=True) f.write("@ stdcall -private vk_icdGetInstanceProcAddr(ptr str)\n") @@ -3894,9 +3834,6 @@ def main(): with open(WINE_VULKAN_H, "w") as f: generator.generate_vulkan_h(f)
- with open(WINE_VULKAN_DRIVER_H, "w") as f: - generator.generate_vulkan_driver_h(f) - with open(WINE_VULKAN_THUNKS_H, "w") as f: generator.generate_thunks_h(f, "wine_")
diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 949dbc769b5..2cf6d99cfd8 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -1,12 +1,20 @@ -/* Automatically generated from Vulkan vk.xml; DO NOT EDIT! +/* + * Copyright 2017-2018 Roderick Colenbrander + * Copyright 2022 Jacek Caban for CodeWeavers * - * This file is generated from Vulkan vk.xml file covered - * by the following copyright and permission notice: + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * - * Copyright 2015-2024 The Khronos Group Inc. - * - * SPDX-License-Identifier: Apache-2.0 OR MIT + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
#ifndef __WINE_VULKAN_DRIVER_H
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 30 ++++++++++++++++----- include/wine/vulkan_driver.h | 51 ------------------------------------ 2 files changed, 24 insertions(+), 57 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 77f5ee2da8d..853e0a973a3 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -48,21 +48,39 @@ static void *(*p_vkGetInstanceProcAddr)(VkInstance, const char *);
static void *win32u_vkGetDeviceProcAddr( VkDevice device, const char *name ) { - void *proc_addr; - TRACE( "device %p, name %s\n", device, debugstr_a(name) );
- if ((proc_addr = get_vulkan_driver_device_proc_addr( &vulkan_funcs, name ))) return proc_addr; + if (!strcmp( name, "vkCreateSwapchainKHR" )) return vulkan_funcs.p_vkCreateSwapchainKHR; + if (!strcmp( name, "vkDestroySwapchainKHR" )) return vulkan_funcs.p_vkDestroySwapchainKHR; + if (!strcmp( name, "vkGetDeviceProcAddr" )) return win32u_vkGetDeviceProcAddr; + if (!strcmp( name, "vkGetSwapchainImagesKHR" )) return vulkan_funcs.p_vkGetSwapchainImagesKHR; + if (!strcmp( name, "vkQueuePresentKHR" )) return vulkan_funcs.p_vkQueuePresentKHR; + return p_vkGetDeviceProcAddr( device, name ); }
static void *win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name ) { - void *proc_addr; - TRACE( "instance %p, name %s\n", instance, debugstr_a(name) );
- if ((proc_addr = get_vulkan_driver_instance_proc_addr( &vulkan_funcs, instance, name ))) return proc_addr; + if (!strcmp( name, "vkCreateInstance" )) return vulkan_funcs.p_vkCreateInstance; + if (!strcmp( name, "vkEnumerateInstanceExtensionProperties" )) return vulkan_funcs.p_vkEnumerateInstanceExtensionProperties; + + if (!instance) return p_vkGetInstanceProcAddr( instance, name ); + + if (!strcmp( name, "vkCreateWin32SurfaceKHR" )) return vulkan_funcs.p_vkCreateWin32SurfaceKHR; + if (!strcmp( name, "vkDestroyInstance" )) return vulkan_funcs.p_vkDestroyInstance; + if (!strcmp( name, "vkDestroySurfaceKHR" )) return vulkan_funcs.p_vkDestroySurfaceKHR; + if (!strcmp( name, "vkGetInstanceProcAddr" )) return win32u_vkGetInstanceProcAddr; + if (!strcmp( name, "vkGetPhysicalDeviceWin32PresentationSupportKHR" )) return vulkan_funcs.p_vkGetPhysicalDeviceWin32PresentationSupportKHR; + + /* vkGetInstanceProcAddr also loads any children of instance, so device functions as well. */ + if (!strcmp( name, "vkCreateSwapchainKHR" )) return vulkan_funcs.p_vkCreateSwapchainKHR; + if (!strcmp( name, "vkDestroySwapchainKHR" )) return vulkan_funcs.p_vkDestroySwapchainKHR; + if (!strcmp( name, "vkGetDeviceProcAddr" )) return win32u_vkGetDeviceProcAddr; + if (!strcmp( name, "vkGetSwapchainImagesKHR" )) return vulkan_funcs.p_vkGetSwapchainImagesKHR; + if (!strcmp( name, "vkQueuePresentKHR" )) return vulkan_funcs.p_vkQueuePresentKHR; + return p_vkGetInstanceProcAddr( instance, name ); }
diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 2cf6d99cfd8..6c72548e02f 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -46,55 +46,4 @@ struct vulkan_funcs VkSurfaceKHR (*p_wine_get_host_surface)(VkSurfaceKHR); };
-static inline void *get_vulkan_driver_device_proc_addr( - const struct vulkan_funcs *vulkan_funcs, const char *name) -{ - if (!name || name[0] != 'v' || name[1] != 'k') return NULL; - - name += 2; - - if (!strcmp(name, "CreateSwapchainKHR")) - return vulkan_funcs->p_vkCreateSwapchainKHR; - if (!strcmp(name, "DestroySwapchainKHR")) - return vulkan_funcs->p_vkDestroySwapchainKHR; - if (!strcmp(name, "GetDeviceProcAddr")) - return vulkan_funcs->p_vkGetDeviceProcAddr; - if (!strcmp(name, "GetSwapchainImagesKHR")) - return vulkan_funcs->p_vkGetSwapchainImagesKHR; - if (!strcmp(name, "QueuePresentKHR")) - return vulkan_funcs->p_vkQueuePresentKHR; - - return NULL; -} - -static inline void *get_vulkan_driver_instance_proc_addr( - const struct vulkan_funcs *vulkan_funcs, VkInstance instance, const char *name) -{ - if (!name || name[0] != 'v' || name[1] != 'k') return NULL; - - name += 2; - - if (!strcmp(name, "CreateInstance")) - return vulkan_funcs->p_vkCreateInstance; - if (!strcmp(name, "EnumerateInstanceExtensionProperties")) - return vulkan_funcs->p_vkEnumerateInstanceExtensionProperties; - - if (!instance) return NULL; - - if (!strcmp(name, "CreateWin32SurfaceKHR")) - return vulkan_funcs->p_vkCreateWin32SurfaceKHR; - if (!strcmp(name, "DestroyInstance")) - return vulkan_funcs->p_vkDestroyInstance; - if (!strcmp(name, "DestroySurfaceKHR")) - return vulkan_funcs->p_vkDestroySurfaceKHR; - if (!strcmp(name, "GetInstanceProcAddr")) - return vulkan_funcs->p_vkGetInstanceProcAddr; - if (!strcmp(name, "GetPhysicalDeviceWin32PresentationSupportKHR")) - return vulkan_funcs->p_vkGetPhysicalDeviceWin32PresentationSupportKHR; - - name -= 2; - - return get_vulkan_driver_device_proc_addr(vulkan_funcs, name); -} - #endif /* __WINE_VULKAN_DRIVER_H */
On Thu Mar 21 16:55:32 2024 +0000, Rémi Bernon wrote:
changed this line in [version 3 of the diff](/wine/wine/-/merge_requests/5365/diffs?diff_id=106465&start_sha=adb4cc0162fcaa2045ad124d5381b5c33c7f0471#7132f4ef5057ee4a63a7f14b0202e645caa26b06_499_493)
Moved the vulkan dlopen to win32u.
This merge request was approved by Jacek Caban.