I missed that Zhiyi was out so I've just reordered this, calling __wine_get_vulkan_driver from winex11 d3dkmt instead.
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; }
From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/driver.c | 10 ++-- dlls/win32u/vulkan.c | 13 ++--- dlls/winemac.drv/gdi.c | 2 +- dlls/winemac.drv/macdrv.h | 2 +- dlls/winemac.drv/vulkan.c | 70 ++++++++++-------------- dlls/winewayland.drv/vulkan.c | 69 ++++++++++-------------- dlls/winewayland.drv/waylanddrv.h | 2 +- dlls/winewayland.drv/waylanddrv_main.c | 2 +- dlls/winex11.drv/init.c | 10 +--- dlls/winex11.drv/vulkan.c | 73 +++++++++++--------------- 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, 112 insertions(+), 155 deletions(-)
diff --git a/dlls/win32u/driver.c b/dlls/win32u/driver.c index bd513ee20b7..e2749e51833 100644 --- a/dlls/win32u/driver.c +++ b/dlls/win32u/driver.c @@ -915,7 +915,7 @@ 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 void *nulldrv_VulkanInit( UINT version, struct vulkan_funcs *vulkan_funcs ) { return NULL; } @@ -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 void *loaderdrv_VulkanInit( UINT version, struct vulkan_funcs *vulkan_funcs ) { - return load_driver()->pwine_get_vulkan_driver( version ); + return load_driver()->pVulkanInit( version, 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 bd989a4979f..28d8654177c 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -32,13 +32,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
-static const struct vulkan_funcs *driver_funcs; +static void *vulkan_handle; +static struct vulkan_funcs driver_funcs; static struct vulkan_funcs vulkan_funcs;
-static void load_vulkan(void) +static void vulkan_init(void) { - if ((driver_funcs = user_driver->pwine_get_vulkan_driver( WINE_VULKAN_DRIVER_VERSION ))) - vulkan_funcs = *driver_funcs; + if ((vulkan_handle = user_driver->pVulkanInit( WINE_VULKAN_DRIVER_VERSION, &driver_funcs ))) + vulkan_funcs = driver_funcs; }
/*********************************************************************** @@ -54,6 +55,6 @@ const struct vulkan_funcs *__wine_get_vulkan_driver( UINT version ) return NULL; }
- pthread_once( &init_once, load_vulkan ); - return driver_funcs ? &vulkan_funcs : NULL; + pthread_once( &init_once, vulkan_init ); + return vulkan_handle ? &vulkan_funcs : NULL; } 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..bee9a1f394f 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 void *macdrv_VulkanInit(UINT version, 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 472b2885b10..5c39f4c37cf 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -98,36 +98,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR handle)
static void *vulkan_handle;
-static void wine_vk_init(void) -{ - if (!(vulkan_handle = dlopen(SONAME_LIBMOLTENVK, RTLD_NOW))) - { - ERR("Failed to load %s\n", SONAME_LIBMOLTENVK); - 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,50 @@ static const struct vulkan_funcs vulkan_funcs = macdrv_wine_get_host_surface, };
-static const struct vulkan_funcs *get_vulkan_driver(UINT version) +void *macdrv_VulkanInit(UINT version, 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; }
- pthread_once(&init_once, wine_vk_init); - if (vulkan_handle) - return &vulkan_funcs; + if (!(vulkan_handle = dlopen(SONAME_LIBMOLTENVK, RTLD_NOW))) + { + ERR("Failed to load %s\n", SONAME_LIBMOLTENVK); + return NULL; + }
+#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 + + *driver_funcs = vulkan_funcs; + return vulkan_handle; + +fail: + dlclose(vulkan_handle); + vulkan_handle = NULL; return NULL; }
#else /* No vulkan */
-static const struct vulkan_funcs *get_vulkan_driver(UINT version) +void *macdrv_VulkanInit(UINT version, struct vulkan_funcs *driver_funcs) { ERR("Wine was built without Vulkan support.\n"); return NULL; }
#endif /* SONAME_LIBMOLTENVK */ - -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..17e15c4cd81 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -542,38 +542,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,28 +560,49 @@ 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) +void *WAYLAND_VulkanInit(UINT version, 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; }
- pthread_once(&init_once, wine_vk_init); - if (vulkan_handle) - return &vulkan_funcs; + if (!(vulkan_handle = dlopen(SONAME_LIBVULKAN, RTLD_NOW))) + { + ERR("Failed to load %s.\n", SONAME_LIBVULKAN); + return NULL; + } + +#define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) goto fail + 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 + + *driver_funcs = vulkan_funcs; + return vulkan_handle;
+fail: + dlclose(vulkan_handle); + vulkan_handle = NULL; return NULL; }
#else /* No vulkan */
-const struct vulkan_funcs *WAYLAND_wine_get_vulkan_driver(UINT version) +void *WAYLAND_VulkanInit(UINT version, struct vulkan_funcs *driver_funcs) { ERR("Wine was built without Vulkan support.\n"); return NULL; diff --git a/dlls/winewayland.drv/waylanddrv.h b/dlls/winewayland.drv/waylanddrv.h index 7cf813a1ca3..8ca0845a91c 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); +void *WAYLAND_VulkanInit(UINT version, struct vulkan_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..50d456ae81d 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -96,41 +96,6 @@ static inline struct wine_vk_surface *surface_from_handle(VkSurfaceKHR 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,26 +491,50 @@ static const struct vulkan_funcs vulkan_funcs = X11DRV_wine_get_host_surface, };
-const struct vulkan_funcs *get_vulkan_driver(UINT version) +void *X11DRV_VulkanInit(UINT version, 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; }
- pthread_once(&init_once, wine_vk_init); - if (vulkan_handle) - return &vulkan_funcs; + init_recursive_mutex(&vulkan_mutex);
+ if (!(vulkan_handle = dlopen(SONAME_LIBVULKAN, RTLD_NOW))) + { + ERR("Failed to load %s.\n", SONAME_LIBVULKAN); + return NULL; + } + +#define LOAD_FUNCPTR(f) if (!(p##f = dlsym(vulkan_handle, #f))) goto fail + 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 + + vulkan_hwnd_context = XUniqueContext(); + *driver_funcs = vulkan_funcs; + return vulkan_handle; + +fail: + dlclose(vulkan_handle); + vulkan_handle = NULL; return NULL; }
#else /* No vulkan */
-const struct vulkan_funcs *get_vulkan_driver(UINT version) +void *X11DRV_VulkanInit(UINT version struct vulkan_funcs *driver_funcs) { ERR("Wine was built without Vulkan support.\n"); return NULL; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index a525f0dd499..e6697b8fcdd 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 void *X11DRV_VulkanInit(UINT,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..b7bb60f4477 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..28b73864324 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); + void * (*pVulkanInit)(UINT,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 | 36 +++++++++++++++++++++++++++++++++++ dlls/winemac.drv/vulkan.c | 32 ++----------------------------- dlls/winewayland.drv/vulkan.c | 30 ----------------------------- dlls/winex11.drv/vulkan.c | 32 ++----------------------------- 4 files changed, 40 insertions(+), 90 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 28d8654177c..cc06dc97fa2 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -24,9 +24,13 @@
#include "config.h"
+#include <dlfcn.h> #include <pthread.h>
#include "win32u_private.h" + +#define VK_NO_PROTOTYPES +#define WINE_VK_HOST #include "wine/vulkan.h" #include "wine/vulkan_driver.h"
@@ -36,10 +40,42 @@ static void *vulkan_handle; static struct vulkan_funcs driver_funcs; 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) { if ((vulkan_handle = user_driver->pVulkanInit( WINE_VULKAN_DRIVER_VERSION, &driver_funcs ))) + { +#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 = driver_funcs; + 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 5c39f4c37cf..29f1c80d806 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.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 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, @@ -491,8 +465,6 @@ void *macdrv_VulkanInit(UINT version, struct vulkan_funcs *driver_funcs) 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 17e15c4cd81..9d20896c145 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -58,8 +58,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 *); @@ -485,30 +483,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) { @@ -551,8 +525,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, @@ -584,8 +556,6 @@ void *WAYLAND_VulkanInit(UINT version, struct vulkan_funcs *driver_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 50d456ae81d..8663a983fe7 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -81,8 +81,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, @@ -515,8 +489,6 @@ void *X11DRV_VulkanInit(UINT version, struct vulkan_funcs *driver_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 | 31 +++++++++++++++++----- include/wine/vulkan_driver.h | 51 ------------------------------------ 2 files changed, 25 insertions(+), 57 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index cc06dc97fa2..1cca37c1909 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -45,21 +45,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 driver_funcs.p_vkCreateSwapchainKHR; + if (!strcmp( name, "vkDestroySwapchainKHR" )) return driver_funcs.p_vkDestroySwapchainKHR; + if (!strcmp( name, "vkGetDeviceProcAddr" )) return win32u_vkGetDeviceProcAddr; + if (!strcmp( name, "vkGetSwapchainImagesKHR" )) return driver_funcs.p_vkGetSwapchainImagesKHR; + if (!strcmp( name, "vkQueuePresentKHR" )) return driver_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 driver_funcs.p_vkCreateInstance; + if (!strcmp( name, "vkEnumerateInstanceExtensionProperties" )) return driver_funcs.p_vkEnumerateInstanceExtensionProperties; + + if (!instance) return p_vkGetInstanceProcAddr( instance, name ); + + if (!strcmp( name, "vkCreateWin32SurfaceKHR" )) return driver_funcs.p_vkCreateWin32SurfaceKHR; + if (!strcmp( name, "vkDestroyInstance" )) return driver_funcs.p_vkDestroyInstance; + if (!strcmp( name, "vkDestroySurfaceKHR" )) return driver_funcs.p_vkDestroySurfaceKHR; + if (!strcmp( name, "vkGetInstanceProcAddr" )) return win32u_vkGetInstanceProcAddr; + if (!strcmp( name, "vkGetPhysicalDeviceWin32PresentationSupportKHR" )) return driver_funcs.p_vkGetPhysicalDeviceWin32PresentationSupportKHR; + + /* vkGetInstanceProcAddr also loads any children of instance, so device functions as well. */ + if (!strcmp( name, "vkCreateSwapchainKHR" )) return driver_funcs.p_vkCreateSwapchainKHR; + if (!strcmp( name, "vkDestroySwapchainKHR" )) return driver_funcs.p_vkDestroySwapchainKHR; + if (!strcmp( name, "vkGetDeviceProcAddr" )) return win32u_vkGetDeviceProcAddr; + if (!strcmp( name, "vkGetSwapchainImagesKHR" )) return driver_funcs.p_vkGetSwapchainImagesKHR; + if (!strcmp( name, "vkQueuePresentKHR" )) return driver_funcs.p_vkQueuePresentKHR; + return p_vkGetInstanceProcAddr( instance, name ); }
@@ -75,6 +93,7 @@ static void vulkan_init(void) vulkan_funcs = driver_funcs; vulkan_funcs.p_vkGetDeviceProcAddr = win32u_vkGetDeviceProcAddr; vulkan_funcs.p_vkGetInstanceProcAddr = win32u_vkGetInstanceProcAddr; + vulkan_funcs.p_wine_get_host_surface = driver_funcs.p_wine_get_host_surface; } }
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 */