diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c
index 6866dbcb076ddbf527b14410cd63e652f146cae2..73e0b276bbe8a2662b6d27ba62405b3cf6a237ce 100644
--- a/dlls/win32u/vulkan.c
+++ b/dlls/win32u/vulkan.c
@@ -43,9 +43,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(vulkan);
 static void *vulkan_handle;
 static struct vulkan_funcs vulkan_funcs;
 
+static VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *, HWND *);
 static void *(*p_vkGetDeviceProcAddr)(VkDevice, const char *);
 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;
+
+    TRACE( "queue %p, present_info %p\n", queue, present_info );
+
+    return p_vkQueuePresentKHR( queue, &host_present_info, surfaces );
+}
+
 static void *win32u_vkGetDeviceProcAddr( VkDevice device, const char *name )
 {
     TRACE( "device %p, name %s\n", device, debugstr_a(name) );
@@ -112,6 +122,9 @@ static void vulkan_init(void)
 
     vulkan_funcs.p_vkGetDeviceProcAddr = win32u_vkGetDeviceProcAddr;
     vulkan_funcs.p_vkGetInstanceProcAddr = win32u_vkGetInstanceProcAddr;
+
+    p_vkQueuePresentKHR = vulkan_funcs.p_vkQueuePresentKHR;
+    vulkan_funcs.p_vkQueuePresentKHR = win32u_vkQueuePresentKHR;
 }
 
 /***********************************************************************
diff --git a/dlls/winemac.drv/vulkan.c b/dlls/winemac.drv/vulkan.c
index f32269c72370cfa473cc786b0d2a37b4a602b11f..fd25b862ac983e9ada14b0fba1ed2169036ccbe2 100644
--- a/dlls/winemac.drv/vulkan.c
+++ b/dlls/winemac.drv/vulkan.c
@@ -235,7 +235,7 @@ static VkBool32 macdrv_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysical
     return VK_TRUE;
 }
 
-static VkResult macdrv_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info)
+static VkResult macdrv_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info, HWND *surfaces)
 {
     TRACE("%p, %p\n", queue, present_info);
     return pvkQueuePresentKHR(queue, present_info);
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
index 972de3cedaf357747a089e789d043cc187730095..ab757e19a61ed99fd15f858f7c8e1f93db980f2b 100644
--- a/dlls/winevulkan/vulkan.c
+++ b/dlls/winevulkan/vulkan.c
@@ -1740,25 +1740,31 @@ void wine_vkDestroySwapchainKHR(VkDevice device_handle, VkSwapchainKHR swapchain
 VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *present_info)
 {
     VkSwapchainKHR swapchains_buffer[16], *swapchains = swapchains_buffer;
+    HWND surfaces_buffer[ARRAY_SIZE(swapchains_buffer)], *surfaces = surfaces_buffer;
     struct wine_queue *queue = wine_queue_from_handle(queue_handle);
     VkPresentInfoKHR present_info_host = *present_info;
-    struct wine_device *device = queue->device;
     VkResult res;
     UINT i;
 
     if (present_info->swapchainCount > ARRAY_SIZE(swapchains_buffer) &&
-        !(swapchains = malloc(present_info->swapchainCount * sizeof(*swapchains))))
+        (!(swapchains = malloc(present_info->swapchainCount * sizeof(*swapchains))) ||
+         !(surfaces = malloc(present_info->swapchainCount * sizeof(*surfaces)))))
+    {
+        free(swapchains);
         return VK_ERROR_OUT_OF_HOST_MEMORY;
+    }
 
     for (i = 0; i < present_info->swapchainCount; i++)
     {
         struct wine_swapchain *swapchain = wine_swapchain_from_handle(present_info->pSwapchains[i]);
+        struct wine_surface *surface = swapchain->surface;
         swapchains[i] = swapchain->host_swapchain;
+        surfaces[i] = surface->hwnd;
     }
 
     present_info_host.pSwapchains = swapchains;
 
-    res = device->funcs.p_vkQueuePresentKHR(queue->host_queue, &present_info_host);
+    res = vk_funcs->p_vkQueuePresentKHR(queue->host_queue, &present_info_host, surfaces);
 
     for (i = 0; i < present_info->swapchainCount; i++)
     {
@@ -1786,6 +1792,7 @@ VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *pr
     }
 
     if (swapchains != swapchains_buffer) free(swapchains);
+    if (surfaces != surfaces_buffer) free(surfaces);
 
     if (TRACE_ON(fps))
     {
diff --git a/dlls/winewayland.drv/vulkan.c b/dlls/winewayland.drv/vulkan.c
index 8fd13fa7761748d864301d0cb0c81b30ec57775d..9246e70439c11168cfdb1312edd6cf3abd922967 100644
--- a/dlls/winewayland.drv/vulkan.c
+++ b/dlls/winewayland.drv/vulkan.c
@@ -365,7 +365,7 @@ static VkBool32 wayland_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysica
                                                              process_wayland.wl_display);
 }
 
-static VkResult wayland_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info)
+static VkResult wayland_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info, HWND *surfaces)
 {
     VkResult res;
 
diff --git a/dlls/winex11.drv/vulkan.c b/dlls/winex11.drv/vulkan.c
index 36edcffa997e2e4a2809c9b822b38af8aacb4fb9..4aa7610399534f09f298f86de3f57f9753861a2b 100644
--- a/dlls/winex11.drv/vulkan.c
+++ b/dlls/winex11.drv/vulkan.c
@@ -252,7 +252,7 @@ static VkBool32 X11DRV_vkGetPhysicalDeviceWin32PresentationSupportKHR(VkPhysical
             default_visual.visual->visualid);
 }
 
-static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info)
+static VkResult X11DRV_vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *present_info, HWND *surfaces)
 {
     TRACE("%p, %p\n", queue, present_info);
     return pvkQueuePresentKHR(queue, present_info);
diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h
index e707a56269c68973fc578cc3a99328ff74e69373..cd08f525f403537dd1b2bff714bf95c63fa18f17 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 23
+#define WINE_VULKAN_DRIVER_VERSION 24
 
 struct vulkan_funcs
 {
@@ -36,7 +36,7 @@ struct vulkan_funcs
     void * (*p_vkGetDeviceProcAddr)(VkDevice, const char *);
     void * (*p_vkGetInstanceProcAddr)(VkInstance, const char *);
     VkBool32 (*p_vkGetPhysicalDeviceWin32PresentationSupportKHR)(VkPhysicalDevice, uint32_t);
-    VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *);
+    VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *, HWND *surfaces);
 
     /* winevulkan specific functions */
     const char *(*p_get_host_surface_extension)(void);