summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/Renderer.cpp
diff options
context:
space:
mode:
authorConnor McLaughlin <stenzek@gmail.com>2019-10-31 23:42:38 +1000
committerGitHub <noreply@github.com>2019-10-31 23:42:38 +1000
commitc6841a027a1c34a35b94e436e909cfdbfbbdbfc7 (patch)
treef09efa7bee413d3f2e03c0391c73ebfed93923de /Source/Core/VideoBackends/Vulkan/Renderer.cpp
parentd3ee0a4535cb34b2d7c27219d43a82cb1094e7f6 (diff)
parent16f103ab42c6faca0cb2c4ce6e93546d22feb1a4 (diff)
Merge pull request #8372 from stenzek/vulkan-exclusive-fullscreen
Vulkan: Exclusive fullscreen support via VK_EXT_full_screen_exclusive
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/Renderer.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/Renderer.cpp47
1 files changed, 43 insertions, 4 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/Renderer.cpp b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
index 648b019971..0628a5482b 100644
--- a/Source/Core/VideoBackends/Vulkan/Renderer.cpp
+++ b/Source/Core/VideoBackends/Vulkan/Renderer.cpp
@@ -280,13 +280,39 @@ void Renderer::BindBackbuffer(const ClearColor& clear_color)
CheckForSurfaceChange();
CheckForSurfaceResize();
- VkResult res = g_command_buffer_mgr->CheckLastPresentFail() ? VK_ERROR_OUT_OF_DATE_KHR :
- m_swap_chain->AcquireNextImage();
- if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR)
+ // Check for exclusive fullscreen request.
+ if (m_swap_chain->GetCurrentFullscreenState() != m_swap_chain->GetNextFullscreenState() &&
+ !m_swap_chain->SetFullscreenState(m_swap_chain->GetNextFullscreenState()))
+ {
+ // if it fails, don't keep trying
+ m_swap_chain->SetNextFullscreenState(m_swap_chain->GetCurrentFullscreenState());
+ }
+
+ VkResult res = g_command_buffer_mgr->CheckLastPresentFail() ?
+ g_command_buffer_mgr->GetLastPresentResult() :
+ m_swap_chain->AcquireNextImage();
+ if (res != VK_SUCCESS)
{
// Execute cmdbuffer before resizing, as the last frame could still be presenting.
ExecuteCommandBuffer(false, true);
- m_swap_chain->ResizeSwapChain();
+
+ // Was this a lost exclusive fullscreen?
+ if (res == VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT)
+ {
+ // The present keeps returning exclusive mode lost unless we re-create the swap chain.
+ INFO_LOG(VIDEO, "Lost exclusive fullscreen.");
+ m_swap_chain->RecreateSwapChain();
+ }
+ else if (res == VK_SUBOPTIMAL_KHR || res == VK_ERROR_OUT_OF_DATE_KHR)
+ {
+ m_swap_chain->ResizeSwapChain();
+ }
+ else
+ {
+ ERROR_LOG(VIDEO, "Unknown present error 0x%08X, please report.", res);
+ m_swap_chain->RecreateSwapChain();
+ }
+
res = m_swap_chain->AcquireNextImage();
}
if (res != VK_SUCCESS)
@@ -323,6 +349,19 @@ void Renderer::PresentBackbuffer()
StateTracker::GetInstance()->InvalidateCachedState();
}
+void Renderer::SetFullscreen(bool enable_fullscreen)
+{
+ if (!m_swap_chain->IsFullscreenSupported())
+ return;
+
+ m_swap_chain->SetNextFullscreenState(enable_fullscreen);
+}
+
+bool Renderer::IsFullscreen() const
+{
+ return m_swap_chain && m_swap_chain->GetCurrentFullscreenState();
+}
+
void Renderer::ExecuteCommandBuffer(bool submit_off_thread, bool wait_for_completion)
{
StateTracker::GetInstance()->EndRenderPass();