Vulkan: Fix deadlock in some resize scenarios
Only have experienced this on a few occasions when using the anv driver.
This commit is contained in:
parent
2ef884893a
commit
1cfb0a1185
|
@ -661,8 +661,15 @@ void Renderer::DrawScreen(const EFBRectangle& source_rect, u32 xfb_addr,
|
||||||
VkResult res = m_swap_chain->AcquireNextImage(m_image_available_semaphore);
|
VkResult res = m_swap_chain->AcquireNextImage(m_image_available_semaphore);
|
||||||
if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR)
|
if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR)
|
||||||
{
|
{
|
||||||
// Window has been resized. Update the swap chain and try again.
|
// There's an issue here. We can't resize the swap chain while the GPU is still busy with it,
|
||||||
|
// but calling WaitForGPUIdle would create a deadlock as PrepareToSubmitCommandBuffer has been
|
||||||
|
// called by SwapImpl. WaitForGPUIdle waits on the semaphore, which PrepareToSubmitCommandBuffer
|
||||||
|
// has already done, so it blocks indefinitely. To work around this, we submit the current
|
||||||
|
// command buffer, resize the swap chain (which calls WaitForGPUIdle), and then finally call
|
||||||
|
// PrepareToSubmitCommandBuffer to return to the state that the caller expects.
|
||||||
|
g_command_buffer_mgr->SubmitCommandBuffer(false);
|
||||||
ResizeSwapChain();
|
ResizeSwapChain();
|
||||||
|
g_command_buffer_mgr->PrepareToSubmitCommandBuffer();
|
||||||
res = m_swap_chain->AcquireNextImage(m_image_available_semaphore);
|
res = m_swap_chain->AcquireNextImage(m_image_available_semaphore);
|
||||||
}
|
}
|
||||||
if (res != VK_SUCCESS)
|
if (res != VK_SUCCESS)
|
||||||
|
|
Loading…
Reference in New Issue