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:
parent
1d65039e2f
commit
16bd65c35a
@ -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;
|
||||
|
||||
@ -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(); }
|
||||
@ -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();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user