From 16bd65c35a503a1eaa7b44940af1c9d068dfc234 Mon Sep 17 00:00:00 2001 From: legatt Date: Wed, 1 Oct 2025 14:52:37 +0300 Subject: [PATCH] Window minimization handle - Getter for Renderer isRunning - Disabling drawing with isDrawing - Disabling drawing on zero size - Recreate swapchain on GLFW resize event --- frontend/include/Renderer.hpp | 10 +++++++--- frontend/src/Renderer.cpp | 19 ++++++++++++++++++- frontend/src/main.cpp | 6 +++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/frontend/include/Renderer.hpp b/frontend/include/Renderer.hpp index 8b963c6..138437f 100644 --- a/frontend/include/Renderer.hpp +++ b/frontend/include/Renderer.hpp @@ -131,19 +131,23 @@ struct SurfaceInfo class Renderer { public: - std::atomic isRunning; - std::atomic screenWidth, screenHeight; - Renderer(GLFWwindow *window, const AssetMaterial& baseMaterial); ~Renderer(); void Start(); void Shutdown(); + + bool GetThreadStatus(); + bool GetDrawStatus(); void RegisterObjects(RenderObject* objects, size_t size); void ResizeWindow(int width, int height); private: + std::atomic isRunning; + std::atomic isDrawing; + std::atomic screenWidth, screenHeight; + std::stop_token *stoken; std::jthread renderThread; boost::lockfree::spsc_queue> commands; diff --git a/frontend/src/Renderer.cpp b/frontend/src/Renderer.cpp index 6cab727..25f5105 100644 --- a/frontend/src/Renderer.cpp +++ b/frontend/src/Renderer.cpp @@ -16,6 +16,7 @@ bool operator < (const RenderObject& lhs, const RenderObject& rhs) Renderer::Renderer(GLFWwindow *window, const AssetMaterial &baseMaterial) : isRunning(false), + isDrawing(false), baseMaterial(baseMaterial) { this->window = window; @@ -417,6 +418,13 @@ void Renderer::SetupSwapchain() void Renderer::RecreateSwapchain() { + if (screenWidth.load() == 0 || screenHeight.load() == 0) + { + isDrawing.store(false); + return; + } + else isDrawing.store(true); + vkDeviceWaitIdle(device); ReleaseSwapchain(); @@ -558,6 +566,8 @@ void Renderer::SetupBuffers() void Renderer::Draw() { + if (!isDrawing.load()) return; + VkResult vkResult; uint32_t imageIndex = 0; @@ -731,6 +741,7 @@ void Renderer::Start() } isRunning.store(true); + isDrawing.store(true); renderThread = std::jthread([this](std::stop_token stop) { this->stoken = &stop; Threading(); @@ -801,6 +812,9 @@ void Renderer::ProcessCommand(const RenderCommand &command) case RenderCommand::RESIZE_WINDOW: { LOG(INFO, "RESIZE_WINDOW command"); + + RecreateSwapchain(); + break; } @@ -865,4 +879,7 @@ void Renderer::Release() LOG(INFO, "Renderer is released"); isRunning.store(false); -} \ No newline at end of file +} + +bool Renderer::GetThreadStatus() { return isRunning.load(); } +bool Renderer::GetDrawStatus() { return isDrawing.load(); } \ No newline at end of file diff --git a/frontend/src/main.cpp b/frontend/src/main.cpp index c001fd4..458bec7 100644 --- a/frontend/src/main.cpp +++ b/frontend/src/main.cpp @@ -41,6 +41,10 @@ int main(int argc, char **argv) //Setup Engine Engine::assetManager = &assetManager; Engine::renderer = &renderer; + + glfwSetFramebufferSizeCallback(window, [](GLFWwindow *window, int width, int height) { + Engine::renderer->ResizeWindow(width, height); + }); // Test render obj RenderObject triangle { @@ -59,7 +63,7 @@ int main(int argc, char **argv) // Free memory LOG(INFO, "Exit..."); - renderer.Shutdown(); while(renderer.isRunning.load()); + renderer.Shutdown(); while(renderer.GetThreadStatus()); assetManager.Shutdown(); while(assetManager.isRunning.load()); glfwDestroyWindow(window); glfwTerminate();