summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/Renderer.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2017-09-16 16:15:20 +1000
committerStenzek <stenzek@gmail.com>2017-10-10 23:21:40 +1000
commit4301b8538df2d2728e624cfc2576758272dbb0c9 (patch)
treebb703ec42a5abc68a655536376fd9b97d96999e0 /Source/Core/VideoBackends/Vulkan/Renderer.cpp
parentcdf34a79f7457da8c1ec29096ed448b62ece478d (diff)
Vulkan: Only use oldSwapchain in response to VK_ERROR_OUT_OF_DATE_KHR
Seems to be required on the latest NV driver, otherwise the presented images are never shown.
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.cpp41
1 files changed, 14 insertions, 27 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
index 018df1dbf0..3a4907b88c 100644
--- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp
+++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
@@ -719,7 +719,7 @@ void Renderer::DrawScreen(const TargetRectangle& scaled_efb_rect, u32 xfb_addr,
u32 fb_stride, u32 fb_height)
{
VkResult res;
- if (!g_command_buffer_mgr->DidLastPresentFail())
+ if (!g_command_buffer_mgr->CheckLastPresentFail())
{
// Grab the next image from the swap chain in preparation for drawing the window.
res = m_swap_chain->AcquireNextImage(m_image_available_semaphore);
@@ -739,7 +739,7 @@ void Renderer::DrawScreen(const TargetRectangle& scaled_efb_rect, u32 xfb_addr,
// 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();
+ m_swap_chain->ResizeSwapChain();
BeginFrame();
g_command_buffer_mgr->PrepareToSubmitCommandBuffer();
res = m_swap_chain->AcquireNextImage(m_image_available_semaphore);
@@ -1076,14 +1076,17 @@ void Renderer::CheckForSurfaceChange()
if (!m_surface_needs_change.IsSet())
return;
- u32 old_width = m_swap_chain ? m_swap_chain->GetWidth() : 0;
- u32 old_height = m_swap_chain ? m_swap_chain->GetHeight() : 0;
+ // Wait for the GPU to catch up since we're going to destroy the swap chain.
+ g_command_buffer_mgr->WaitForGPUIdle();
+
+ // Clear the present failed flag, since we don't want to resize after recreating.
+ g_command_buffer_mgr->CheckLastPresentFail();
// Fast path, if the surface handle is the same, the window has just been resized.
if (m_swap_chain && m_new_surface_handle == m_swap_chain->GetNativeHandle())
{
INFO_LOG(VIDEO, "Detected window resize.");
- ResizeSwapChain();
+ m_swap_chain->RecreateSwapChain();
// Notify the main thread we are done.
m_surface_needs_change.Clear();
@@ -1092,9 +1095,6 @@ void Renderer::CheckForSurfaceChange()
}
else
{
- // Wait for the GPU to catch up since we're going to destroy the swap chain.
- g_command_buffer_mgr->WaitForGPUIdle();
-
// Did we previously have a swap chain?
if (m_swap_chain)
{
@@ -1133,12 +1133,8 @@ void Renderer::CheckForSurfaceChange()
m_surface_changed.Set();
}
- if (m_swap_chain)
- {
- // Handle case where the dimensions are now different
- if (old_width != m_swap_chain->GetWidth() || old_height != m_swap_chain->GetHeight())
- OnSwapChainResized();
- }
+ // Handle case where the dimensions are now different.
+ OnSwapChainResized();
}
void Renderer::CheckForConfigChanges()
@@ -1202,7 +1198,10 @@ void Renderer::CheckForConfigChanges()
// For quad-buffered stereo we need to change the layer count, so recreate the swap chain.
if (m_swap_chain &&
(g_ActiveConfig.iStereoMode == STEREO_QUADBUFFER) != m_swap_chain->IsStereoEnabled())
- ResizeSwapChain();
+ {
+ g_command_buffer_mgr->WaitForGPUIdle();
+ m_swap_chain->RecreateSwapChain();
+ }
// Wipe sampler cache if force texture filtering or anisotropy changes.
if (anisotropy_changed || force_texture_filtering_changed)
@@ -1248,18 +1247,6 @@ void Renderer::ResizeEFBTextures()
BPFunctions::SetScissor();
}
-void Renderer::ResizeSwapChain()
-{
- // The worker thread may still be submitting a present on this swap chain.
- g_command_buffer_mgr->WaitForGPUIdle();
-
- // It's now safe to resize the swap chain.
- if (!m_swap_chain->ResizeSwapChain())
- PanicAlert("Failed to resize swap chain.");
-
- OnSwapChainResized();
-}
-
void Renderer::ApplyState()
{
}