Window minimization handle

- Getter for Renderer isRunning
- Disabling drawing with isDrawing
- Disabling drawing on zero size
- Recreate swapchain on GLFW resize event
This commit is contained in:
legatt 2025-10-01 14:52:37 +03:00
parent 1d65039e2f
commit 16bd65c35a
3 changed files with 30 additions and 5 deletions

View File

@ -131,19 +131,23 @@ struct SurfaceInfo
class Renderer class Renderer
{ {
public: public:
std::atomic<bool> isRunning;
std::atomic<int> screenWidth, screenHeight;
Renderer(GLFWwindow *window, const AssetMaterial& baseMaterial); Renderer(GLFWwindow *window, const AssetMaterial& baseMaterial);
~Renderer(); ~Renderer();
void Start(); void Start();
void Shutdown(); void Shutdown();
bool GetThreadStatus();
bool GetDrawStatus();
void RegisterObjects(RenderObject* objects, size_t size); void RegisterObjects(RenderObject* objects, size_t size);
void ResizeWindow(int width, int height); void ResizeWindow(int width, int height);
private: private:
std::atomic<bool> isRunning;
std::atomic<bool> isDrawing;
std::atomic<int> screenWidth, screenHeight;
std::stop_token *stoken; std::stop_token *stoken;
std::jthread renderThread; std::jthread renderThread;
boost::lockfree::spsc_queue<RenderCommand, boost::lockfree::capacity<512>> commands; boost::lockfree::spsc_queue<RenderCommand, boost::lockfree::capacity<512>> commands;

View File

@ -16,6 +16,7 @@ bool operator < (const RenderObject& lhs, const RenderObject& rhs)
Renderer::Renderer(GLFWwindow *window, const AssetMaterial &baseMaterial) : Renderer::Renderer(GLFWwindow *window, const AssetMaterial &baseMaterial) :
isRunning(false), isRunning(false),
isDrawing(false),
baseMaterial(baseMaterial) baseMaterial(baseMaterial)
{ {
this->window = window; this->window = window;
@ -417,6 +418,13 @@ void Renderer::SetupSwapchain()
void Renderer::RecreateSwapchain() void Renderer::RecreateSwapchain()
{ {
if (screenWidth.load() == 0 || screenHeight.load() == 0)
{
isDrawing.store(false);
return;
}
else isDrawing.store(true);
vkDeviceWaitIdle(device); vkDeviceWaitIdle(device);
ReleaseSwapchain(); ReleaseSwapchain();
@ -558,6 +566,8 @@ void Renderer::SetupBuffers()
void Renderer::Draw() void Renderer::Draw()
{ {
if (!isDrawing.load()) return;
VkResult vkResult; VkResult vkResult;
uint32_t imageIndex = 0; uint32_t imageIndex = 0;
@ -731,6 +741,7 @@ void Renderer::Start()
} }
isRunning.store(true); isRunning.store(true);
isDrawing.store(true);
renderThread = std::jthread([this](std::stop_token stop) { renderThread = std::jthread([this](std::stop_token stop) {
this->stoken = &stop; this->stoken = &stop;
Threading(); Threading();
@ -801,6 +812,9 @@ void Renderer::ProcessCommand(const RenderCommand &command)
case RenderCommand::RESIZE_WINDOW: case RenderCommand::RESIZE_WINDOW:
{ {
LOG(INFO, "RESIZE_WINDOW command"); LOG(INFO, "RESIZE_WINDOW command");
RecreateSwapchain();
break; break;
} }
@ -865,4 +879,7 @@ void Renderer::Release()
LOG(INFO, "Renderer is released"); LOG(INFO, "Renderer is released");
isRunning.store(false); isRunning.store(false);
} }
bool Renderer::GetThreadStatus() { return isRunning.load(); }
bool Renderer::GetDrawStatus() { return isDrawing.load(); }

View File

@ -41,6 +41,10 @@ int main(int argc, char **argv)
//Setup Engine //Setup Engine
Engine::assetManager = &assetManager; Engine::assetManager = &assetManager;
Engine::renderer = &renderer; Engine::renderer = &renderer;
glfwSetFramebufferSizeCallback(window, [](GLFWwindow *window, int width, int height) {
Engine::renderer->ResizeWindow(width, height);
});
// Test render obj // Test render obj
RenderObject triangle { RenderObject triangle {
@ -59,7 +63,7 @@ int main(int argc, char **argv)
// Free memory // Free memory
LOG(INFO, "Exit..."); LOG(INFO, "Exit...");
renderer.Shutdown(); while(renderer.isRunning.load()); renderer.Shutdown(); while(renderer.GetThreadStatus());
assetManager.Shutdown(); while(assetManager.isRunning.load()); assetManager.Shutdown(); while(assetManager.isRunning.load());
glfwDestroyWindow(window); glfwDestroyWindow(window);
glfwTerminate(); glfwTerminate();