winevulkan: Pass surface info for each vkQueuePresent swapchain to win32u.

This commit is contained in:
Rémi Bernon 2024-04-10 14:17:07 +02:00 committed by Alexandre Julliard
parent 00198c4084
commit d2892d352d
6 changed files with 28 additions and 8 deletions

View file

@ -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;
}
/***********************************************************************

View file

@ -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);

View file

@ -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))
{

View file

@ -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;

View file

@ -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);

View file

@ -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);