From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 12 +++++++++++- dlls/winewayland.drv/vulkan.c | 33 ++++++++++++++++++++++----------- include/wine/vulkan_driver.h | 4 +++- 3 files changed, 36 insertions(+), 13 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 54c0fde841e..2ed70a95b2f 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -52,13 +52,23 @@ static VkResult win32u_vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR { const VkPresentSurfacesInfoWine *surfaces_info = present_info->pNext; VkPresentInfoKHR host_present_info = *present_info; + VkResult res; + UINT i;
TRACE( "queue %p, present_info %p\n", queue, present_info );
assert( surfaces_info && surfaces_info->sType == VK_STRUCTURE_TYPE_PRESENT_SURFACES_INFO_WINE ); host_present_info.pNext = surfaces_info->pNext;
- return p_vkQueuePresentKHR( queue, &host_present_info ); + res = p_vkQueuePresentKHR( queue, &host_present_info ); + + for (i = 0; vulkan_funcs.p_vulkan_surface_presented && i < present_info->swapchainCount; i++) + { + VkResult swapchain_res = present_info->pResults ? present_info->pResults[i] : res; + vulkan_funcs.p_vulkan_surface_presented( surfaces_info->pSurfaces[i], swapchain_res ); + } + + return res; }
static void *win32u_vkGetDeviceProcAddr( VkDevice device, const char *name ) diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 8fd13fa7761..ac1ecd58936 100644 --- a/dlls/winewayland.drv/vulkan.c +++ b/dlls/winewayland.drv/vulkan.c @@ -171,17 +171,6 @@ static VkResult check_queue_present(const VkPresentInfoKHR *present_info, int client_height = wayland_surface->window.client_rect.bottom - wayland_surface->window.client_rect.top;
- wayland_surface_ensure_contents(wayland_surface); - - /* Handle any processed configure request, to ensure the related - * surface state is applied by the compositor. */ - if (wayland_surface->processing.serial && - wayland_surface->processing.processed && - wayland_surface_reconfigure(wayland_surface)) - { - wl_surface_commit(wayland_surface->wl_surface); - } - pthread_mutex_unlock(&wayland_surface->mutex);
if (client_width == wine_vk_swapchain->extent.width && @@ -386,6 +375,27 @@ static VkSurfaceKHR wayland_wine_get_host_surface(VkSurfaceKHR surface) return wine_vk_surface_from_handle(surface)->host_surface; }
+static void wayland_vulkan_surface_presented(HWND hwnd, VkResult result) +{ + struct wayland_surface *wayland_surface; + + if ((wayland_surface = wayland_surface_lock_hwnd(hwnd))) + { + wayland_surface_ensure_contents(wayland_surface); + + /* Handle any processed configure request, to ensure the related + * surface state is applied by the compositor. */ + if (wayland_surface->processing.serial && + wayland_surface->processing.processed && + wayland_surface_reconfigure(wayland_surface)) + { + wl_surface_commit(wayland_surface->wl_surface); + } + + pthread_mutex_unlock(&wayland_surface->mutex); + } +} + static const struct vulkan_funcs vulkan_funcs = { .p_vkCreateSwapchainKHR = wayland_vkCreateSwapchainKHR, @@ -396,6 +406,7 @@ static const struct vulkan_funcs vulkan_funcs = .p_vkQueuePresentKHR = wayland_vkQueuePresentKHR, .p_get_host_surface_extension = wayland_get_host_surface_extension, .p_wine_get_host_surface = wayland_wine_get_host_surface, + .p_vulkan_surface_presented = wayland_vulkan_surface_presented, };
/********************************************************************** diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index d6002d88b80..e0475f007bd 100644 --- a/include/wine/vulkan_driver.h +++ b/include/wine/vulkan_driver.h @@ -21,7 +21,7 @@ #define __WINE_VULKAN_DRIVER_H
/* Wine internal vulkan driver version, needs to be bumped upon vulkan_funcs changes. */ -#define WINE_VULKAN_DRIVER_VERSION 24 +#define WINE_VULKAN_DRIVER_VERSION 25
#define VK_STRUCTURE_TYPE_PRESENT_SURFACES_INFO_WINE (UINT)VK_STRUCTURE_TYPE_MAX_ENUM + 1
@@ -51,6 +51,8 @@ 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_presented)(HWND, VkResult); };
#endif /* __WINE_VULKAN_DRIVER_H */