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
{
public:
std::atomic<bool> isRunning;
std::atomic<int> 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<bool> isRunning;
std::atomic<bool> isDrawing;
std::atomic<int> screenWidth, screenHeight;
std::stop_token *stoken;
std::jthread renderThread;
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) :
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);
}
}
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
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();