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
|
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;
|
||||||
|
|||||||
@ -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(); }
|
||||||
@ -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();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user