From 6df919eb70f3f087571d019b578f9c5c2fabd06b Mon Sep 17 00:00:00 2001 From: SirLynix Date: Sun, 26 Feb 2023 13:45:18 +0100 Subject: [PATCH] Renderer/WindowSwapchain: Don't create swapchain on minimized window This is mainly to prepare for Android "windows" where the window is considered minimized when app is in the background (and thus has no ANativeWindow to render to) --- include/Nazara/Platform/Window.hpp | 4 ++-- include/Nazara/Platform/Window.inl | 12 ++++++++++++ src/Nazara/Renderer/WindowSwapchain.cpp | 13 +++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/Nazara/Platform/Window.hpp b/include/Nazara/Platform/Window.hpp index 79dc64c0e..db954ceb5 100644 --- a/include/Nazara/Platform/Window.hpp +++ b/include/Nazara/Platform/Window.hpp @@ -56,8 +56,8 @@ namespace Nz inline CursorController& GetCursorController(); inline WindowEventHandler& GetEventHandler(); WindowHandle GetHandle() const; - Vector2i GetPosition() const; - Vector2ui GetSize() const; + const Vector2i& GetPosition() const; + const Vector2ui& GetSize() const; WindowStyleFlags GetStyle() const; std::string GetTitle() const; diff --git a/include/Nazara/Platform/Window.inl b/include/Nazara/Platform/Window.inl index 97f8091ef..4cab6b9a8 100644 --- a/include/Nazara/Platform/Window.inl +++ b/include/Nazara/Platform/Window.inl @@ -51,6 +51,18 @@ namespace Nz return m_eventHandler; } + inline const Vector2i& Window::GetPosition() const + { + NazaraAssert(m_impl, "Window not created"); + return m_position; + } + + inline const Vector2ui& Window::GetSize() const + { + NazaraAssert(m_impl, "Window not created"); + return m_size; + } + inline bool Window::IsOpen(bool checkClosed) { if (!m_impl) diff --git a/src/Nazara/Renderer/WindowSwapchain.cpp b/src/Nazara/Renderer/WindowSwapchain.cpp index b2b0c4a61..f243c3e2e 100644 --- a/src/Nazara/Renderer/WindowSwapchain.cpp +++ b/src/Nazara/Renderer/WindowSwapchain.cpp @@ -19,8 +19,10 @@ namespace Nz if (m_window->IsValid()) { - m_swapchain = m_renderDevice->InstantiateSwapchain(window.GetHandle(), window.GetSize(), m_parameters); m_isMinimized = window.IsMinimized(); + + if (!m_isMinimized) + m_swapchain = m_renderDevice->InstantiateSwapchain(window.GetHandle(), window.GetSize(), m_parameters); } else m_isMinimized = true; //< consider it minimized so AcquireFrame returns no frame @@ -45,7 +47,7 @@ namespace Nz const Vector2ui& WindowSwapchain::GetSize() const { - return m_swapchain->GetSize(); + return (m_swapchain) ? m_swapchain->GetSize() : m_window->GetSize(); } void WindowSwapchain::ConnectSignals() @@ -53,9 +55,9 @@ namespace Nz WindowEventHandler& windowEvents = m_window->GetEventHandler(); m_onCreated.Connect(windowEvents.OnCreated, [this](const WindowEventHandler* /*eventHandler*/) { - // Recreate swapchain - m_swapchain = m_renderDevice->InstantiateSwapchain(m_window->GetHandle(), m_window->GetSize(), m_parameters); m_isMinimized = m_window->IsMinimized(); + if (!m_isMinimized) + m_swapchain = m_renderDevice->InstantiateSwapchain(m_window->GetHandle(), m_window->GetSize(), m_parameters); }); m_onDestruction.Connect(windowEvents.OnDestruction, [this](const WindowEventHandler* /*eventHandler*/) @@ -87,6 +89,9 @@ namespace Nz m_onRestored.Connect(windowEvents.OnRestored, [this](const WindowEventHandler* /*eventHandler*/) { + if (!m_swapchain) + m_swapchain = m_renderDevice->InstantiateSwapchain(m_window->GetHandle(), m_window->GetSize(), m_parameters); + m_isMinimized = false; }); }