Module: wine Branch: master Commit: 50584bcc02d1764ba9a8d8f4296f72bd91d050ef URL: https://gitlab.winehq.org/wine/wine/-/commit/50584bcc02d1764ba9a8d8f4296f72b...
Author: Rémi Bernon rbernon@codeweavers.com Date: Sat Feb 24 12:42:59 2024 +0100
winevulkan: Pass win32u surface wrappers for each vkQueuePresent swapchain.
---
dlls/win32u/vulkan.c | 11 +++++++---- dlls/winevulkan/vulkan.c | 4 ++-- include/wine/vulkan_driver.h | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/dlls/win32u/vulkan.c b/dlls/win32u/vulkan.c index 8d63e8bbd14..ecc6a532c83 100644 --- a/dlls/win32u/vulkan.c +++ b/dlls/win32u/vulkan.c @@ -52,6 +52,7 @@ struct surface { VkSurfaceKHR host_surface; VkSurfaceKHR driver_surface; + HWND hwnd; };
static inline struct surface *surface_from_handle( VkSurfaceKHR handle ) @@ -80,6 +81,7 @@ static VkResult win32u_vkCreateWin32SurfaceKHR( VkInstance instance, const VkWin return res; }
+ surface->hwnd = info->hwnd; surface->host_surface = driver_funcs->p_wine_get_host_surface( surface->driver_surface ); *handle = surface_to_handle( surface ); return VK_SUCCESS; @@ -96,20 +98,21 @@ static void win32u_vkDestroySurfaceKHR( VkInstance instance, VkSurfaceKHR handle free( surface ); }
-static VkResult win32u_vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR *present_info, HWND *surfaces ) +static VkResult win32u_vkQueuePresentKHR( VkQueue queue, const VkPresentInfoKHR *present_info, VkSurfaceKHR *surfaces ) { - VkPresentInfoKHR host_present_info = *present_info; VkResult res; UINT i;
TRACE( "queue %p, present_info %p\n", queue, present_info );
- res = p_vkQueuePresentKHR( queue, &host_present_info ); + res = p_vkQueuePresentKHR( queue, present_info );
for (i = 0; i < present_info->swapchainCount; i++) { VkResult swapchain_res = present_info->pResults ? present_info->pResults[i] : res; - driver_funcs->p_vulkan_surface_presented( surfaces[i], swapchain_res ); + struct surface *surface = surface_from_handle( surfaces[i] ); + + driver_funcs->p_vulkan_surface_presented( surface->hwnd, swapchain_res ); }
return res; diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index 43ce65fc221..e7d00813a42 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -1740,7 +1740,7 @@ 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; + VkSurfaceKHR 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; VkResult res; @@ -1759,7 +1759,7 @@ VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *pr 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; + surfaces[i] = surface->driver_surface; }
present_info_host.pSwapchains = swapchains; diff --git a/include/wine/vulkan_driver.h b/include/wine/vulkan_driver.h index 8b24cd4978d..96f60cb067a 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 28 +#define WINE_VULKAN_DRIVER_VERSION 29
struct vulkan_funcs { @@ -34,7 +34,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 *, HWND *surfaces); + VkResult (*p_vkQueuePresentKHR)(VkQueue, const VkPresentInfoKHR *, VkSurfaceKHR *surfaces);
/* winevulkan specific functions */ const char *(*p_get_host_surface_extension)(void);