From: Rémi Bernon <rbernon@codeweavers.com> --- dlls/win32u/vulkan.c | 24 ++++++++---------------- dlls/winemac.drv/vulkan.c | 29 +++++++---------------------- dlls/winewayland.drv/vulkan.c | 25 ++++++------------------- dlls/winex11.drv/vulkan.c | 23 +++++++---------------- include/wine/vulkan_driver.h | 4 ++-- 5 files changed, 30 insertions(+), 75 deletions(-) diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index c95038ed6a4..00f85243a3f 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -1533,8 +1533,11 @@ static VkResult win32u_vkCreateWin32SurfaceKHR( VkInstance client_instance, cons surface->hwnd = dummy; } - if ((res = driver_funcs->p_vulkan_surface_create( surface->hwnd, instance, &host_surface, &surface->client ))) + if (!(surface->client = user_driver->pCreateClientSurface( surface->hwnd, 0 ))) res = VK_ERROR_OUT_OF_HOST_MEMORY; + else res = driver_funcs->p_vulkan_surface_create( surface->client, instance, &host_surface ); + if (res) { + if (surface->client) client_surface_release( surface->client ); if (dummy) NtUserDestroyWindow( dummy ); free( surface ); return res; @@ -2924,20 +2927,10 @@ static struct vulkan_funcs vulkan_funcs = .p_vkUnmapMemory2KHR = win32u_vkUnmapMemory2KHR, }; -static VkResult nulldrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, - struct client_surface **client ) +static VkResult nulldrv_vulkan_surface_create( struct client_surface *client, const struct vulkan_instance *instance, VkSurfaceKHR *surface ) { VkHeadlessSurfaceCreateInfoEXT create_info = {.sType = VK_STRUCTURE_TYPE_HEADLESS_SURFACE_CREATE_INFO_EXT}; - VkResult res; - - if (!(*client = user_driver->pCreateClientSurface( hwnd, 0 ))) return VK_ERROR_OUT_OF_HOST_MEMORY; - if ((res = instance->p_vkCreateHeadlessSurfaceEXT( instance->host.instance, &create_info, NULL, surface ))) - { - client_surface_release(*client); - *client = NULL; - } - - return res; + return instance->p_vkCreateHeadlessSurfaceEXT( instance->host.instance, &create_info, NULL, surface ); } static VkBool32 nulldrv_get_physical_device_presentation_support( struct vulkan_physical_device *physical_device, uint32_t queue ) @@ -2989,11 +2982,10 @@ static void vulkan_driver_load(void) pthread_once( &init_once, vulkan_driver_init ); } -static VkResult lazydrv_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *surface, - struct client_surface **client ) +static VkResult lazydrv_vulkan_surface_create( struct client_surface *client, const struct vulkan_instance *instance, VkSurfaceKHR *surface ) { vulkan_driver_load(); - return driver_funcs->p_vulkan_surface_create( hwnd, instance, surface, client ); + return driver_funcs->p_vulkan_surface_create( client, instance, surface ); } static VkBool32 lazydrv_get_physical_device_presentation_support( struct vulkan_physical_device *physical_device, uint32_t queue ) diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 41c148627fb..532f792ed46 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -40,19 +40,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); static const struct vulkan_driver_funcs macdrv_vulkan_driver_funcs; -static VkResult macdrv_vulkan_surface_create(HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *handle, - struct client_surface **client) +static VkResult macdrv_vulkan_surface_create(struct client_surface *client, const struct vulkan_instance *instance, VkSurfaceKHR *handle) { VkResult res; - struct macdrv_client_surface *surface; - struct client_surface *ptr; + struct macdrv_client_surface *surface = impl_from_client_surface(client); - TRACE("%p %p %p %p\n", hwnd, instance, handle, client); + TRACE("%s %p %p\n", debugstr_client_surface(client), instance, handle); - if (!(ptr = macdrv_CreateClientSurface(hwnd, 0))) return VK_ERROR_OUT_OF_HOST_MEMORY; - surface = impl_from_client_surface( ptr ); - - if (!macdrv_client_surface_acquire_metal_swapchain(surface)) goto err; + if (!macdrv_client_surface_acquire_metal_swapchain(surface)) return VK_ERROR_INCOMPATIBLE_DRIVER; if (instance->p_vkCreateMetalSurfaceEXT) { @@ -62,7 +57,7 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, const struct vulkan_inst create_info_host.flags = 0; /* reserved */ create_info_host.pLayer = macdrv_swapchain_get_layer(surface->metal_swapchain); - res = instance->p_vkCreateMetalSurfaceEXT(instance->host.instance, &create_info_host, NULL /* allocator */, handle); + if ((res = instance->p_vkCreateMetalSurfaceEXT(instance->host.instance, &create_info_host, NULL /* allocator */, handle))) return res; } else { @@ -72,21 +67,11 @@ static VkResult macdrv_vulkan_surface_create(HWND hwnd, const struct vulkan_inst create_info_host.flags = 0; /* reserved */ create_info_host.pView = macdrv_swapchain_get_layer(surface->metal_swapchain); - res = instance->p_vkCreateMacOSSurfaceMVK(instance->host.instance, &create_info_host, NULL /* allocator */, handle); - } - if (res != VK_SUCCESS) - { - ERR("Failed to create MoltenVK surface, res=%d\n", res); - goto err; + if ((res = instance->p_vkCreateMacOSSurfaceMVK(instance->host.instance, &create_info_host, NULL /* allocator */, handle))) return res; } - *client = &surface->client; - TRACE("Created surface=0x%s, client=%p\n", wine_dbgstr_longlong(*handle), *client); + TRACE("Created surface=0x%s\n", wine_dbgstr_longlong(*handle)); return VK_SUCCESS; - -err: - client_surface_release(&surface->client); - return VK_ERROR_INCOMPATIBLE_DRIVER; } static VkBool32 macdrv_get_physical_device_presentation_support(struct vulkan_physical_device *physical_device, diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 65ebbc40b1f..b2c435cb7a4 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -38,37 +38,24 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs; -static VkResult wayland_vulkan_surface_create(HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *handle, - struct client_surface **client) +static VkResult wayland_vulkan_surface_create(struct client_surface *client, const struct vulkan_instance *instance, VkSurfaceKHR *handle) { VkResult res; VkWaylandSurfaceCreateInfoKHR create_info_host; - struct wayland_client_surface *surface; - struct client_surface *ptr; + struct wayland_client_surface *surface = impl_from_client_surface(client); + HWND hwnd = client->hwnd; - TRACE("%p %p %p %p\n", hwnd, instance, handle, client); - - if (!(ptr = WAYLAND_CreateClientSurface(hwnd, 0))) return VK_ERROR_OUT_OF_HOST_MEMORY; - surface = impl_from_client_surface( ptr ); + TRACE("%s %p %p\n", debugstr_client_surface(client), instance, handle); create_info_host.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR; create_info_host.pNext = NULL; create_info_host.flags = 0; /* reserved */ create_info_host.display = process_wayland.wl_display; create_info_host.surface = surface->wl_surface; - - res = instance->p_vkCreateWaylandSurfaceKHR(instance->host.instance, &create_info_host, NULL /* allocator */, handle); - if (res != VK_SUCCESS) - { - ERR("Failed to create vulkan wayland surface, res=%d\n", res); - client_surface_release(&surface->client); - return res; - } - + if ((res = instance->p_vkCreateWaylandSurfaceKHR(instance->host.instance, &create_info_host, NULL /* allocator */, handle))) return res; set_client_surface(hwnd, surface); - *client = &surface->client; - TRACE("Created surface=0x%s, client=%p\n", wine_dbgstr_longlong(*handle), *client); + TRACE("Created surface=0x%s\n", wine_dbgstr_longlong(*handle)); return VK_SUCCESS; } diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index fd58d4662d7..1c1b9cf3ba1 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -46,31 +46,22 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan); static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs; -static VkResult X11DRV_vulkan_surface_create( HWND hwnd, const struct vulkan_instance *instance, VkSurfaceKHR *handle, - struct client_surface **client ) +static VkResult X11DRV_vulkan_surface_create( struct client_surface *client, const struct vulkan_instance *instance, VkSurfaceKHR *handle ) { + struct x11drv_client_surface *surface = impl_from_client_surface( client ); VkXlibSurfaceCreateInfoKHR info = { .sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, .dpy = gdi_display, + .window = surface->window, }; - struct x11drv_client_surface *surface; - struct client_surface *ptr; + VkResult res; - TRACE( "%p %p %p %p\n", hwnd, instance, handle, client ); + TRACE( "%s %p %p\n", debugstr_client_surface( client ), instance, handle ); - if (!(ptr = X11DRV_CreateClientSurface( hwnd, 0 ))) return VK_ERROR_OUT_OF_HOST_MEMORY; - surface = impl_from_client_surface( ptr ); + if ((res = instance->p_vkCreateXlibSurfaceKHR( instance->host.instance, &info, NULL /* allocator */, handle ))) return res; + TRACE( "Created surface 0x%s\n", wine_dbgstr_longlong( *handle ) ); - info.window = surface->window; - if (instance->p_vkCreateXlibSurfaceKHR( instance->host.instance, &info, NULL /* allocator */, handle )) - { - ERR("Failed to create Xlib surface\n"); - client_surface_release( *client ); - return VK_ERROR_OUT_OF_HOST_MEMORY; - } - - TRACE( "Created surface 0x%s, client %s\n", wine_dbgstr_longlong( *handle ), debugstr_client_surface( *client ) ); return VK_SUCCESS; } diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 9c18f6d20db..d2209a3ef54 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -89,7 +89,7 @@ struct VkDevice_T #include "wine/list.h" /* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 47 +#define WINE_VULKAN_DRIVER_VERSION 48 struct vulkan_object { @@ -358,7 +358,7 @@ struct vulkan_funcs struct client_surface; struct vulkan_driver_funcs { - VkResult (*p_vulkan_surface_create)(HWND, const struct vulkan_instance *, VkSurfaceKHR *, struct client_surface **); + VkResult (*p_vulkan_surface_create)(struct client_surface *, const struct vulkan_instance *, VkSurfaceKHR *); VkBool32 (*p_get_physical_device_presentation_support)(struct vulkan_physical_device *, uint32_t); void (*p_map_instance_extensions)( struct vulkan_instance_extensions *extensions ); void (*p_map_device_extensions)( struct vulkan_device_extensions *extensions ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11093