mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-30 05:31:39 +00:00
winevulkan: Return VK_SUBOPTIMAL_KHR from vkQueuePresentKHR after resize.
This commit is contained in:
parent
551b535cdd
commit
010b497cf6
|
@ -762,11 +762,8 @@ static void test_win32_surface_swapchain_hwnd(VkDevice device, VkSwapchainKHR sw
|
||||||
|
|
||||||
vr = vkQueuePresentKHR(queue, &present_info);
|
vr = vkQueuePresentKHR(queue, &present_info);
|
||||||
if (expect_suboptimal)
|
if (expect_suboptimal)
|
||||||
{
|
|
||||||
todo_wine
|
|
||||||
ok(vr == VK_SUBOPTIMAL_KHR || broken(vr == VK_ERROR_OUT_OF_DATE_KHR) /* Nvidia */,
|
ok(vr == VK_SUBOPTIMAL_KHR || broken(vr == VK_ERROR_OUT_OF_DATE_KHR) /* Nvidia */,
|
||||||
"Got unexpected vr %d.\n", vr);
|
"Got unexpected vr %d.\n", vr);
|
||||||
}
|
|
||||||
else if (IsWindow(hwnd))
|
else if (IsWindow(hwnd))
|
||||||
ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr);
|
ok(vr == VK_SUCCESS, "Got unexpected vr %d.\n", vr);
|
||||||
else
|
else
|
||||||
|
|
|
@ -1624,6 +1624,12 @@ void wine_vkDestroySurfaceKHR(VkInstance handle, VkSurfaceKHR surface,
|
||||||
free(object);
|
free(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL extents_equals(const VkExtent2D *extents, const RECT *rect)
|
||||||
|
{
|
||||||
|
return extents->width == rect->right - rect->left &&
|
||||||
|
extents->height == rect->bottom - rect->top;
|
||||||
|
}
|
||||||
|
|
||||||
VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCreateInfoKHR *create_info,
|
VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCreateInfoKHR *create_info,
|
||||||
const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain_handle)
|
const VkAllocationCallbacks *allocator, VkSwapchainKHR *swapchain_handle)
|
||||||
{
|
{
|
||||||
|
@ -1661,6 +1667,9 @@ VkResult wine_vkCreateSwapchainKHR(VkDevice device_handle, const VkSwapchainCrea
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object->surface = surface;
|
||||||
|
object->extents = create_info->imageExtent;
|
||||||
|
|
||||||
*swapchain_handle = wine_swapchain_to_handle(object);
|
*swapchain_handle = wine_swapchain_to_handle(object);
|
||||||
add_handle_mapping(instance, *swapchain_handle, object->host_swapchain, &object->wrapper_entry);
|
add_handle_mapping(instance, *swapchain_handle, object->host_swapchain, &object->wrapper_entry);
|
||||||
return VK_SUCCESS;
|
return VK_SUCCESS;
|
||||||
|
@ -1704,6 +1713,31 @@ VkResult wine_vkQueuePresentKHR(VkQueue queue_handle, const VkPresentInfoKHR *pr
|
||||||
|
|
||||||
res = device->funcs.p_vkQueuePresentKHR(queue->host_queue, &present_info_host);
|
res = device->funcs.p_vkQueuePresentKHR(queue->host_queue, &present_info_host);
|
||||||
|
|
||||||
|
for (i = 0; i < present_info->swapchainCount; i++)
|
||||||
|
{
|
||||||
|
struct wine_swapchain *swapchain = wine_swapchain_from_handle(present_info->pSwapchains[i]);
|
||||||
|
VkResult swapchain_res = present_info->pResults ? present_info->pResults[i] : res;
|
||||||
|
struct wine_surface *surface = swapchain->surface;
|
||||||
|
RECT client_rect;
|
||||||
|
|
||||||
|
if (swapchain_res < VK_SUCCESS) continue;
|
||||||
|
if (!NtUserGetClientRect(surface->hwnd, &client_rect))
|
||||||
|
{
|
||||||
|
WARN("Swapchain window %p is invalid, returning VK_ERROR_OUT_OF_DATE_KHR\n", surface->hwnd);
|
||||||
|
if (present_info->pResults) present_info->pResults[i] = VK_ERROR_OUT_OF_DATE_KHR;
|
||||||
|
if (res >= VK_SUCCESS) res = VK_ERROR_OUT_OF_DATE_KHR;
|
||||||
|
}
|
||||||
|
else if (swapchain_res != VK_SUCCESS)
|
||||||
|
WARN("Present returned status %d for swapchain %p\n", swapchain_res, swapchain);
|
||||||
|
else if (!extents_equals(&swapchain->extents, &client_rect))
|
||||||
|
{
|
||||||
|
WARN("Swapchain size %dx%d does not match client rect %s, returning VK_SUBOPTIMAL_KHR\n",
|
||||||
|
swapchain->extents.width, swapchain->extents.height, wine_dbgstr_rect(&client_rect));
|
||||||
|
if (present_info->pResults) present_info->pResults[i] = VK_SUBOPTIMAL_KHR;
|
||||||
|
if (res == VK_SUCCESS) res = VK_SUBOPTIMAL_KHR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (swapchains != swapchains_buffer) free(swapchains);
|
if (swapchains != swapchains_buffer) free(swapchains);
|
||||||
|
|
||||||
if (TRACE_ON(fps))
|
if (TRACE_ON(fps))
|
||||||
|
|
|
@ -253,7 +253,9 @@ static inline VkSurfaceKHR wine_surface_to_handle(struct wine_surface *surface)
|
||||||
|
|
||||||
struct wine_swapchain
|
struct wine_swapchain
|
||||||
{
|
{
|
||||||
|
struct wine_surface *surface; /* parent */
|
||||||
VkSwapchainKHR host_swapchain;
|
VkSwapchainKHR host_swapchain;
|
||||||
|
VkExtent2D extents;
|
||||||
|
|
||||||
struct wrapper_entry wrapper_entry;
|
struct wrapper_entry wrapper_entry;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue