From: Rémi Bernon rbernon@codeweavers.com
And call win32u redirected functions through vk_funcs. --- dlls/win32u/vulkan.c | 51 ++++++++++---------------------- dlls/winevulkan/make_vulkan | 8 +++-- dlls/winevulkan/vulkan.c | 6 ++-- dlls/winevulkan/vulkan_private.h | 2 ++ dlls/winevulkan/vulkan_thunks.c | 4 +-- 5 files changed, 27 insertions(+), 44 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 451a27ac833..4b46a520c63 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; @@ -139,32 +144,9 @@ static VkResult win32u_vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR return res; }
-static PFN_vkVoidFunction win32u_vkGetDeviceProcAddr( VkDevice device, const char *name ) -{ - 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; - - return p_vkGetDeviceProcAddr( device, name ); -} - -static PFN_vkVoidFunction win32u_vkGetInstanceProcAddr( VkInstance instance, const char *name ) +static const char *win32u_get_host_surface_extension(void) { - TRACE( "instance %p, name %s\n", instance, debugstr_a(name) ); - - if (!instance) return p_vkGetInstanceProcAddr( instance, 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; - - /* 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; - - return p_vkGetInstanceProcAddr( instance, name ); + return driver_funcs->p_get_host_surface_extension(); }
static VkSurfaceKHR win32u_wine_get_host_surface( VkSurfaceKHR handle ) @@ -184,8 +166,8 @@ static struct vulkan_funcs vulkan_funcs = .p_vkCreateWin32SurfaceKHR = win32u_vkCreateWin32SurfaceKHR, .p_vkDestroySurfaceKHR = win32u_vkDestroySurfaceKHR, .p_vkQueuePresentKHR = win32u_vkQueuePresentKHR, - .p_vkGetDeviceProcAddr = win32u_vkGetDeviceProcAddr, - .p_vkGetInstanceProcAddr = win32u_vkGetInstanceProcAddr, + .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = win32u_vkGetPhysicalDeviceWin32PresentationSupportKHR, + .p_get_host_surface_extension = win32u_get_host_surface_extension, .p_wine_get_host_surface = win32u_wine_get_host_surface, .p_vulkan_surface_update = win32u_vulkan_surface_update, }; @@ -244,13 +226,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) @@ -308,6 +285,8 @@ static const struct vulkan_driver_funcs lazydrv_funcs = .p_vulkan_surface_detach = lazydrv_vulkan_surface_detach, .p_vulkan_surface_update = lazydrv_vulkan_surface_update, .p_vulkan_surface_presented = lazydrv_vulkan_surface_presented, + .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = lazydrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, + .p_get_host_surface_extension = lazydrv_get_host_surface_extension, };
static void vulkan_init_once(void) @@ -334,8 +313,8 @@ static void vulkan_init_once(void) #undef LOAD_FUNCPTR
driver_funcs = &lazydrv_funcs; - vulkan_funcs.p_vkGetPhysicalDeviceWin32PresentationSupportKHR = lazydrv_vkGetPhysicalDeviceWin32PresentationSupportKHR; - vulkan_funcs.p_get_host_surface_extension = lazydrv_get_host_surface_extension; + vulkan_funcs.p_vkGetInstanceProcAddr = p_vkGetInstanceProcAddr; + vulkan_funcs.p_vkGetDeviceProcAddr = p_vkGetDeviceProcAddr; }
void vulkan_detach_surfaces( struct list *surfaces ) diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 4ecc454b7ef..d6d54e76dd1 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -904,10 +904,12 @@ class VkFunction(object): else: params += ", {0}{1}".format(params_prefix, self.extra_param)
- if self.name not in MANUAL_UNIX_THUNKS: - func_prefix = "{0}->p_".format(self.params[0].dispatch_table(params_prefix, conv)) - else: + if self.name in MANUAL_UNIX_THUNKS: func_prefix = "wine_" + elif self.name in USER_DRIVER_FUNCS: + func_prefix = "vk_funcs->p_" + else: + func_prefix = "{0}->p_".format(self.params[0].dispatch_table(params_prefix, conv))
# Call the host Vulkan function. if self.type == "void": diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index c5ce0735901..628bc477ff8 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -128,7 +128,7 @@ static uint32_t wine_vk_count_struct_(void *s, VkStructureType t) return result; }
-static const struct vulkan_funcs *vk_funcs; +const struct vulkan_funcs *vk_funcs;
static int vulkan_object_compare(const void *key, const struct rb_entry *entry) { @@ -1702,7 +1702,7 @@ VkResult wine_vkCreateWin32SurfaceKHR(VkInstance client_instance, const VkWin32S create_info_host.hwnd = surface->hwnd = dummy; }
- res = instance->p_vkCreateWin32SurfaceKHR(instance->host.instance, &create_info_host, + res = vk_funcs->p_vkCreateWin32SurfaceKHR(instance->host.instance, &create_info_host, NULL /* allocator */, &surface->driver_surface); if (res != VK_SUCCESS) { @@ -1732,7 +1732,7 @@ void wine_vkDestroySurfaceKHR(VkInstance client_instance, VkSurfaceKHR client_su if (!surface) return;
- instance->p_vkDestroySurfaceKHR(instance->host.instance, surface->driver_surface, NULL); + vk_funcs->p_vkDestroySurfaceKHR(instance->host.instance, surface->driver_surface, NULL); vulkan_instance_remove_object(instance, &surface->obj.obj); window_surfaces_remove(surface);
diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index e6b983f5112..23a29bb460f 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -30,6 +30,8 @@
#include "wine/rbtree.h"
+extern const struct vulkan_funcs *vk_funcs; + struct wine_cmd_buffer { VULKAN_OBJECT_HEADER( VkCommandBuffer, command_buffer ); diff --git a/dlls/winevulkan/vulkan_thunks.c b/dlls/winevulkan/vulkan_thunks.c index fd01558550f..d515ad7e0e0 100644 --- a/dlls/winevulkan/vulkan_thunks.c +++ b/dlls/winevulkan/vulkan_thunks.c @@ -51112,7 +51112,7 @@ static NTSTATUS thunk64_vkGetPhysicalDeviceWin32PresentationSupportKHR(void *arg
TRACE("%p, %u\n", params->physicalDevice, params->queueFamilyIndex);
- params->result = vulkan_physical_device_from_handle(params->physicalDevice)->instance->p_vkGetPhysicalDeviceWin32PresentationSupportKHR(vulkan_physical_device_from_handle(params->physicalDevice)->host.physical_device, params->queueFamilyIndex); + params->result = vk_funcs->p_vkGetPhysicalDeviceWin32PresentationSupportKHR(vulkan_physical_device_from_handle(params->physicalDevice)->host.physical_device, params->queueFamilyIndex); return STATUS_SUCCESS; } #endif /* _WIN64 */ @@ -51128,7 +51128,7 @@ static NTSTATUS thunk32_vkGetPhysicalDeviceWin32PresentationSupportKHR(void *arg
TRACE("%#x, %u\n", params->physicalDevice, params->queueFamilyIndex);
- params->result = vulkan_physical_device_from_handle((VkPhysicalDevice)UlongToPtr(params->physicalDevice))->instance->p_vkGetPhysicalDeviceWin32PresentationSupportKHR(vulkan_physical_device_from_handle((VkPhysicalDevice)UlongToPtr(params->physicalDevice))->host.physical_device, params->queueFamilyIndex); + params->result = vk_funcs->p_vkGetPhysicalDeviceWin32PresentationSupportKHR(vulkan_physical_device_from_handle((VkPhysicalDevice)UlongToPtr(params->physicalDevice))->host.physical_device, params->queueFamilyIndex); return STATUS_SUCCESS; }