From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 45 +++++++++++++++++++++++------------- include/wine/vulkan_driver.h | 19 +++++++++++++++ 2 files changed, 48 insertions(+), 16 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 2f852fc683b..9c1c2937905 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -119,6 +119,11 @@ static void win32u_vkDestroySurfaceKHR( VkInstance instance, VkSurfaceKHR handle free( surface ); }
+static VkBool32 win32u_vkGetPhysicalDeviceWin32PresentationSupportKHR( VkPhysicalDevice physical_device, uint32_t queue ) +{ + return driver_funcs->p_vkGetPhysicalDeviceWin32PresentationSupportKHR( physical_device, queue ); +} + static VkResult win32u_vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR *present_info, VkSurfaceKHR *surfaces ) { VkResult res; @@ -143,8 +148,17 @@ static PFN_vkVoidFunction win32u_vkGetDeviceProcAddr( struct vulkan_device *devi { TRACE( "device %p, name %s\n", device, debugstr_a(name) );
- if (!strcmp( name, "vkGetDeviceProcAddr" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkGetDeviceProcAddr; - if (!strcmp( name, "vkQueuePresentKHR" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkQueuePresentKHR; +#define USE_VK_FUNC(x) device->host_ ## x = (void *)p_vkGetDeviceProcAddr( device->host.device, #x ); + if (!device->host_initialized) + { + WIN32U_VK_DEVICE_FUNCS + device->host_initialized = TRUE; + } +#undef USE_VK_FUNC + +#define USE_VK_FUNC(x) if (!strcmp( name, #x )) return (PFN_vkVoidFunction)win32u_##x; + WIN32U_VK_DEVICE_FUNCS +#undef USE_VK_FUNC
return p_vkGetDeviceProcAddr( device->host.device, name ); } @@ -155,14 +169,17 @@ static PFN_vkVoidFunction win32u_vkGetInstanceProcAddr( struct vulkan_instance *
if (!instance) return p_vkGetInstanceProcAddr( NULL, name );
- if (!strcmp( name, "vkCreateWin32SurfaceKHR" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkCreateWin32SurfaceKHR; - if (!strcmp( name, "vkDestroySurfaceKHR" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkDestroySurfaceKHR; - if (!strcmp( name, "vkGetInstanceProcAddr" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkGetInstanceProcAddr; - if (!strcmp( name, "vkGetPhysicalDeviceWin32PresentationSupportKHR" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkGetPhysicalDeviceWin32PresentationSupportKHR; +#define USE_VK_FUNC(x) instance->host_ ## x = (void *)p_vkGetInstanceProcAddr( instance->host.instance, #x ); + if (!instance->host_initialized) + { + WIN32U_VK_INSTANCE_FUNCS + instance->host_initialized = TRUE; + } +#undef USE_VK_FUNC
- /* vkGetInstanceProcAddr also loads any children of instance, so device functions as well. */ - if (!strcmp( name, "vkGetDeviceProcAddr" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkGetDeviceProcAddr; - if (!strcmp( name, "vkQueuePresentKHR" )) return (PFN_vkVoidFunction)vulkan_funcs.p_vkQueuePresentKHR; +#define USE_VK_FUNC(x) if (!strcmp( name, #x )) return (PFN_vkVoidFunction)win32u_##x; + WIN32U_VK_INSTANCE_FUNCS +#undef USE_VK_FUNC
return p_vkGetInstanceProcAddr( instance->host.instance, name ); } @@ -186,6 +203,7 @@ static struct vulkan_funcs vulkan_funcs = .p_vkQueuePresentKHR = win32u_vkQueuePresentKHR, .p_vkGetDeviceProcAddr = win32u_vkGetDeviceProcAddr, .p_vkGetInstanceProcAddr = win32u_vkGetInstanceProcAddr, + .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = win32u_vkGetPhysicalDeviceWin32PresentationSupportKHR, .p_wine_get_host_surface = win32u_wine_get_host_surface, .p_vulkan_surface_update = win32u_vulkan_surface_update, }; @@ -244,13 +262,8 @@ static void vulkan_driver_init(void) return; }
- if (status == STATUS_NOT_IMPLEMENTED) - driver_funcs = &nulldrv_funcs; - else - { - vulkan_funcs.p_vkGetPhysicalDeviceWin32PresentationSupportKHR = driver_funcs->p_vkGetPhysicalDeviceWin32PresentationSupportKHR; - vulkan_funcs.p_get_host_surface_extension = driver_funcs->p_get_host_surface_extension; - } + if (status == STATUS_NOT_IMPLEMENTED) driver_funcs = &nulldrv_funcs; + else vulkan_funcs.p_get_host_surface_extension = driver_funcs->p_get_host_surface_extension; }
static void vulkan_driver_load(void) diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index a6a7fa4d3da..037ecfd264a 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -77,12 +77,27 @@ static inline void vulkan_object_init_ptr( struct vulkan_object *obj, void *host vulkan_object_init( obj, (UINT_PTR)host_handle, client ); }
+#define WIN32U_VK_DEVICE_FUNCS \ + USE_VK_FUNC(vkGetDeviceProcAddr) \ + USE_VK_FUNC(vkQueuePresentKHR) \ + +#define WIN32U_VK_INSTANCE_FUNCS \ + USE_VK_FUNC(vkCreateWin32SurfaceKHR) \ + USE_VK_FUNC(vkDestroySurfaceKHR) \ + USE_VK_FUNC(vkGetInstanceProcAddr) \ + USE_VK_FUNC(vkGetPhysicalDeviceWin32PresentationSupportKHR) \ + WIN32U_VK_DEVICE_FUNCS + struct vulkan_instance { VULKAN_OBJECT_HEADER( VkInstance, instance ); #define USE_VK_FUNC(x) PFN_ ## x p_ ## x; ALL_VK_INSTANCE_FUNCS #undef USE_VK_FUNC +#define USE_VK_FUNC(x) PFN_ ## x host_ ## x; + WIN32U_VK_INSTANCE_FUNCS + BOOL host_initialized; +#undef USE_VK_FUNC };
static inline struct vulkan_instance *vulkan_instance_from_handle( VkInstance handle ) @@ -110,6 +125,10 @@ struct vulkan_device #define USE_VK_FUNC(x) PFN_ ## x p_ ## x; ALL_VK_DEVICE_FUNCS #undef USE_VK_FUNC +#define USE_VK_FUNC(x) PFN_ ## x host_ ## x; + WIN32U_VK_DEVICE_FUNCS + BOOL host_initialized; +#undef USE_VK_FUNC };
static inline struct vulkan_device *vulkan_device_from_handle( VkDevice handle )