From: Rémi Bernon rbernon@codeweavers.com
--- dlls/win32u/vulkan.c | 12 +++++++++++- dlls/winemac.drv/vulkan.c | 5 +++++ dlls/winewayland.drv/vulkan.c | 33 ++++++++++++++++++++++----------- dlls/winex11.drv/vulkan.c | 5 +++++ include/wine/vulkan_driver.h | 4 +++- 5 files changed, 46 insertions(+), 13 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 73e0b276bbe..ffe8d804c54 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -50,10 +50,20 @@ static void *(*p_vkGetInstanceProcAddr)(VkInstance, const char *); static VkResult win32u_vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR *present_info, HWND *surfaces ) { VkPresentInfoKHR host_present_info = *present_info; + VkResult res; + UINT i;
TRACE( "queue %p, present_info %p\n", queue, present_info );
- return p_vkQueuePresentKHR( queue, &host_present_info, surfaces ); + res = p_vkQueuePresentKHR( queue, &host_present_info, surfaces ); + + for (i = 0; i < present_info->swapchainCount; i++) + { + VkResult swapchain_res = present_info->pResults ? present_info->pResults[i] : res; + vulkan_funcs.p_vulkan_surface_presented( surfaces[i], swapchain_res ); + } + + return res; }
static void *win32u_vkGetDeviceProcAddr( VkDevice device, const char *name ) diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c index fd25b862ac9..55451b2b093 100644 --- a/dlls/winemac.drv/vulkan.c +++ b/dlls/winemac.drv/vulkan.c @@ -255,6 +255,10 @@ static VkSurfaceKHR macdrv_wine_get_host_surface(VkSurfaceKHR surface) return mac_surface->host_surface; }
+static void macdrv_vulkan_surface_presented(HWND hwnd, VkResult result) +{ +} + static const struct vulkan_funcs vulkan_funcs = { macdrv_vkCreateSwapchainKHR, @@ -268,6 +272,7 @@ static const struct vulkan_funcs vulkan_funcs =
macdrv_get_host_surface_extension, macdrv_wine_get_host_surface, + macdrv_vulkan_surface_presented, };
UINT macdrv_VulkanInit(UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs) diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c index 9246e70439c..f93ece1c068 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/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c index 4aa76103995..35da6994075 100644 --- a/dlls/winex11.drv/vulkan.c +++ b/dlls/winex11.drv/vulkan.c @@ -272,6 +272,10 @@ static VkSurfaceKHR X11DRV_wine_get_host_surface( VkSurfaceKHR surface ) return x11_surface->host_surface; }
+static void X11DRV_vulkan_surface_presented(HWND hwnd, VkResult result) +{ +} + static const struct vulkan_funcs vulkan_funcs = { X11DRV_vkCreateSwapchainKHR, @@ -285,6 +289,7 @@ static const struct vulkan_funcs vulkan_funcs =
X11DRV_get_host_surface_extension, X11DRV_wine_get_host_surface, + X11DRV_vulkan_surface_presented, };
UINT X11DRV_VulkanInit( UINT version, void *vulkan_handle, struct vulkan_funcs *driver_funcs ) diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index cd08f525f40..aa6db2d5e19 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
struct vulkan_funcs { @@ -41,6 +41,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 */