Skip to content

Commit 9f73b3b

Browse files
BananaWorks07loathingKernel
authored andcommitted
winevulkan: Skip present waits when the window is not visible.
1 parent 7d63fd2 commit 9f73b3b

3 files changed

Lines changed: 41 additions & 0 deletions

File tree

dlls/win32u/vulkan.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3019,6 +3019,41 @@ static VkResult win32u_vkAcquireNextImageKHR( VkDevice client_device, VkSwapchai
30193019
return res;
30203020
}
30213021

3022+
static BOOL should_skip_wait( HWND hwnd )
3023+
{
3024+
if (!NtUserIsWindowVisible( hwnd ))
3025+
{
3026+
WARN( "hwnd=%p not yet visible!\n", hwnd );
3027+
return TRUE;
3028+
}
3029+
3030+
return FALSE;
3031+
}
3032+
3033+
static VkResult win32u_vkWaitForPresentKHR( VkDevice client_device, VkSwapchainKHR client_swapchain,
3034+
uint64_t presentId, uint64_t timeout )
3035+
{
3036+
struct vulkan_device *device = vulkan_device_from_handle( client_device );
3037+
struct swapchain *swapchain = swapchain_from_handle( client_swapchain );
3038+
3039+
if (swapchain->surface && should_skip_wait( swapchain->surface->hwnd ))
3040+
return VK_SUCCESS;
3041+
3042+
return device->p_vkWaitForPresentKHR( device->host.device, swapchain->obj.host.swapchain, presentId, timeout );
3043+
}
3044+
3045+
static VkResult win32u_vkWaitForPresent2KHR( VkDevice client_device, VkSwapchainKHR client_swapchain,
3046+
const VkPresentWait2InfoKHR *info )
3047+
{
3048+
struct vulkan_device *device = vulkan_device_from_handle( client_device );
3049+
struct swapchain *swapchain = swapchain_from_handle( client_swapchain );
3050+
3051+
if (swapchain->surface && should_skip_wait( swapchain->surface->hwnd ))
3052+
return VK_SUCCESS;
3053+
3054+
return device->p_vkWaitForPresent2KHR( device->host.device, swapchain->obj.host.swapchain, info );
3055+
}
3056+
30223057
static VkResult win32u_vkGetSwapchainImagesKHR( VkDevice client_device, VkSwapchainKHR client_swapchain,
30233058
uint32_t *count, VkImage *images )
30243059
{
@@ -4382,6 +4417,8 @@ static struct vulkan_funcs vulkan_funcs =
43824417
.p_vkQueueSubmit2KHR = win32u_vkQueueSubmit2KHR,
43834418
.p_vkUnmapMemory = win32u_vkUnmapMemory,
43844419
.p_vkUnmapMemory2KHR = win32u_vkUnmapMemory2KHR,
4420+
.p_vkWaitForPresentKHR = win32u_vkWaitForPresentKHR,
4421+
.p_vkWaitForPresent2KHR = win32u_vkWaitForPresent2KHR,
43854422
};
43864423

43874424
static VkResult nulldrv_vulkan_surface_create( HWND hwnd, BOOL raw, const struct vulkan_instance *instance,

dlls/winevulkan/make_vulkan

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,8 @@ USER_DRIVER_FUNCS = {
240240
"vkQueueSubmit2KHR",
241241
"vkUnmapMemory",
242242
"vkUnmapMemory2KHR",
243+
"vkWaitForPresentKHR",
244+
"vkWaitForPresent2KHR",
243245
}
244246

245247
# functions for which the unix thunk is manually implemented

include/wine/vulkan_driver.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,8 @@ struct vulkan_funcs
361361
PFN_vkQueueSubmit2KHR p_vkQueueSubmit2KHR;
362362
PFN_vkUnmapMemory p_vkUnmapMemory;
363363
PFN_vkUnmapMemory2KHR p_vkUnmapMemory2KHR;
364+
PFN_vkWaitForPresentKHR p_vkWaitForPresentKHR;
365+
PFN_vkWaitForPresent2KHR p_vkWaitForPresent2KHR;
364366
};
365367

366368
/* interface between win32u and the user drivers */

0 commit comments

Comments
 (0)