mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-01 19:38:31 +00:00
winevulkan: Pass surface info for each vkQueuePresent swapchain to win32u.
This commit is contained in:
parent
00198c4084
commit
d2892d352d
|
@ -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;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue