Fixes: 278ca7f68d727639b3389b78c363134fa2bd32a8 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57233
From: Rémi Bernon rbernon@codeweavers.com
Fixes: 278ca7f68d727639b3389b78c363134fa2bd32a8 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57233 --- dlls/win32u/vulkan.c | 19 +++++++++++++++++++ dlls/winemac.drv/vulkan.c | 5 +++++ dlls/winevulkan/vulkan.c | 3 +++ dlls/winewayland.drv/vulkan.c | 5 +++++ dlls/winex11.drv/vulkan.c | 11 +++++++++++ include/wine/vulkan_driver.h | 2 ++ 6 files changed, 45 insertions(+)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index dbcafb02570..d103cd94fdb 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -173,6 +173,12 @@ static VkSurfaceKHR win32u_wine_get_host_surface( VkSurfaceKHR handle ) return surface->host_surface; }
+static void win32u_vulkan_surface_update( VkSurfaceKHR handle ) +{ + struct surface *surface = surface_from_handle( handle ); + driver_funcs->p_vulkan_surface_update( surface->hwnd, surface->driver_private ); +} + static struct vulkan_funcs vulkan_funcs = { .p_vkCreateWin32SurfaceKHR = win32u_vkCreateWin32SurfaceKHR, @@ -181,6 +187,7 @@ static struct vulkan_funcs vulkan_funcs = .p_vkGetDeviceProcAddr = win32u_vkGetDeviceProcAddr, .p_vkGetInstanceProcAddr = win32u_vkGetInstanceProcAddr, .p_wine_get_host_surface = win32u_wine_get_host_surface, + .p_vulkan_surface_update = win32u_vulkan_surface_update, };
static VkResult nulldrv_vulkan_surface_create( HWND hwnd, VkInstance instance, VkSurfaceKHR *surface, void **private ) @@ -197,6 +204,10 @@ static void nulldrv_vulkan_surface_detach( HWND hwnd, void *private ) { }
+static void nulldrv_vulkan_surface_update( HWND hwnd, void *private ) +{ +} + static void nulldrv_vulkan_surface_presented( HWND hwnd, void *private, VkResult result ) { } @@ -216,6 +227,7 @@ static const struct vulkan_driver_funcs nulldrv_funcs = .p_vulkan_surface_create = nulldrv_vulkan_surface_create, .p_vulkan_surface_destroy = nulldrv_vulkan_surface_destroy, .p_vulkan_surface_detach = nulldrv_vulkan_surface_detach, + .p_vulkan_surface_update = nulldrv_vulkan_surface_update, .p_vulkan_surface_presented = nulldrv_vulkan_surface_presented, .p_vkGetPhysicalDeviceWin32PresentationSupportKHR = nulldrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, .p_get_host_surface_extension = nulldrv_get_host_surface_extension, @@ -265,6 +277,12 @@ static void lazydrv_vulkan_surface_detach( HWND hwnd, void *private ) return driver_funcs->p_vulkan_surface_detach( hwnd, private ); }
+static void lazydrv_vulkan_surface_update( HWND hwnd, void *private ) +{ + vulkan_driver_load(); + return driver_funcs->p_vulkan_surface_update( hwnd, private ); +} + static void lazydrv_vulkan_surface_presented( HWND hwnd, void *private, VkResult result ) { vulkan_driver_load(); @@ -288,6 +306,7 @@ static const struct vulkan_driver_funcs lazydrv_funcs = .p_vulkan_surface_create = lazydrv_vulkan_surface_create, .p_vulkan_surface_destroy = lazydrv_vulkan_surface_destroy, .p_vulkan_surface_detach = lazydrv_vulkan_surface_detach, + .p_vulkan_surface_update = lazydrv_vulkan_surface_update, .p_vulkan_surface_presented = lazydrv_vulkan_surface_presented, };
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index 3c6c5ee5b7f..08c4ac3bba8 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -182,6 +182,10 @@ static void macdrv_vulkan_surface_detach(HWND hwnd, void *private) { }
+static void macdrv_vulkan_surface_update(HWND hwnd, void *private) +{ +} + static void macdrv_vulkan_surface_presented(HWND hwnd, void *private, VkResult result) { } @@ -204,6 +208,7 @@ static const struct vulkan_driver_funcs macdrv_vulkan_driver_funcs = .p_vulkan_surface_create = macdrv_vulkan_surface_create, .p_vulkan_surface_destroy = macdrv_vulkan_surface_destroy, .p_vulkan_surface_detach = macdrv_vulkan_surface_detach, + .p_vulkan_surface_update = macdrv_vulkan_surface_update, .p_vulkan_surface_presented = macdrv_vulkan_surface_presented,
.p_vkGetPhysicalDeviceWin32PresentationSupportKHR = macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR, diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 4980d42204d..a76ba027356 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1786,6 +1786,9 @@ VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCrea if (surface) create_info_host.surface = surface->host_surface; if (old_swapchain) create_info_host.oldSwapchain = old_swapchain->host_swapchain;
+ /* update the host surface to commit any pending size change */ + vk_funcs->p_vulkan_surface_update( surface->driver_surface ); + /* Windows allows client rect to be empty, but host Vulkan often doesn't, adjust extents back to the host capabilities */ res = instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device->host_physical_device, surface->host_surface, &capabilities); diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 4398cad0558..937814d0c8a 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -118,6 +118,10 @@ static void wayland_vulkan_surface_detach(HWND hwnd, void *private) { }
+static void wayland_vulkan_surface_update(HWND hwnd, void *private) +{ +} + static void wayland_vulkan_surface_presented(HWND hwnd, void *private, VkResult result) { HWND toplevel = NtUserGetAncestor(hwnd, GA_ROOT); @@ -143,6 +147,7 @@ static const struct vulkan_driver_funcs wayland_vulkan_driver_funcs = .p_vulkan_surface_create = wayland_vulkan_surface_create, .p_vulkan_surface_destroy = wayland_vulkan_surface_destroy, .p_vulkan_surface_detach = wayland_vulkan_surface_detach, + .p_vulkan_surface_update = wayland_vulkan_surface_update, .p_vulkan_surface_presented = wayland_vulkan_surface_presented,
.p_vkGetPhysicalDeviceWin32PresentationSupportKHR = wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR, diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 8705b470740..32fb87c1368 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -203,6 +203,16 @@ static void vulkan_surface_update_offscreen( HWND hwnd, struct vulkan_surface *s } }
+static void X11DRV_vulkan_surface_update( HWND hwnd, void *private ) +{ + struct vulkan_surface *surface = private; + + TRACE( "%p %p\n", hwnd, private ); + + vulkan_surface_update_size( hwnd, surface ); + vulkan_surface_update_offscreen( hwnd, surface ); +} + static void X11DRV_vulkan_surface_presented( HWND hwnd, void *private, VkResult result ) { struct vulkan_surface *surface = private; @@ -261,6 +271,7 @@ static const struct vulkan_driver_funcs x11drv_vulkan_driver_funcs = .p_vulkan_surface_create = X11DRV_vulkan_surface_create, .p_vulkan_surface_destroy = X11DRV_vulkan_surface_destroy, .p_vulkan_surface_detach = X11DRV_vulkan_surface_detach, + .p_vulkan_surface_update = X11DRV_vulkan_surface_update, .p_vulkan_surface_presented = X11DRV_vulkan_surface_presented,
.p_vkGetPhysicalDeviceWin32PresentationSupportKHR = X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR, diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 3b1f20fda80..f264d2237cf 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -39,6 +39,7 @@ struct vulkan_funcs /* winevulkan specific functions */ const char *(*p_get_host_surface_extension)(void); VkSurfaceKHR (*p_wine_get_host_surface)(VkSurfaceKHR); + void (*p_vulkan_surface_update)(VkSurfaceKHR); };
/* interface between win32u and the user drivers */ @@ -47,6 +48,7 @@ struct vulkan_driver_funcs VkResult (*p_vulkan_surface_create)(HWND, VkInstance, VkSurfaceKHR *, void **); void (*p_vulkan_surface_destroy)(HWND, void *); void (*p_vulkan_surface_detach)(HWND, void *); + void (*p_vulkan_surface_update)(HWND, void *); void (*p_vulkan_surface_presented)(HWND, void *, VkResult);
VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t);