From 9f0625ed4ee3689903c9794766a594c0b2f2db9d Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 5 Feb 2025 23:36:53 +0800 Subject: [PATCH] fixed a bug that crash after window resize. because WorkObject::cur_render_target don't reset after window resize. --- inc/hgl/WorkManager.h | 27 +++++++++++++++++++++++---- inc/hgl/WorkObject.h | 2 ++ src/Work/WorkManager.cpp | 10 ++++++++++ src/Work/WorkObject.cpp | 3 +-- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/inc/hgl/WorkManager.h b/inc/hgl/WorkManager.h index f4ab6e7c..5c20e73a 100644 --- a/inc/hgl/WorkManager.h +++ b/inc/hgl/WorkManager.h @@ -1,13 +1,16 @@ #pragma once -#include"WorkObject.h" + +#include namespace hgl { /** * 工作管理器,管理一个序列的WorkObject
*/ - class WorkManager + class WorkManager:public io::WindowEvent { + protected: + graph::RenderFramework *render_framework; uint fps=60; @@ -41,6 +44,15 @@ namespace hgl virtual void Render(WorkObject *wo); + virtual void OnResize(uint w,uint h) override + { + if(!cur_work_object)return; + + VkExtent2D ext={w,h}; + + cur_work_object->OnResize(ext); + } + void Run(WorkObject *wo); };//class WorkManager @@ -53,17 +65,24 @@ namespace hgl SwapchainWorkManager(graph::RenderFramework *rf):WorkManager(rf) { swpachain_module=rf->GetSwapchainModule(); + + rf->GetWindow()->Join(this); + } + ~SwapchainWorkManager() + { + render_framework->GetWindow()->Unjoin(this); } - ~SwapchainWorkManager()=default; void Render(WorkObject *wo) override; + + void OnResize(uint w,uint h) override; }; template int RunFramework(const OSString &title,uint width=1280,uint height=720) { graph::RenderFramework rf(title); - if(!rf.Init(width,height)) + if(!rf.Init(width,height)) return(-1); SwapchainWorkManager wm(&rf); diff --git a/inc/hgl/WorkObject.h b/inc/hgl/WorkObject.h index a6faf10e..742b66be 100644 --- a/inc/hgl/WorkObject.h +++ b/inc/hgl/WorkObject.h @@ -56,6 +56,8 @@ namespace hgl virtual ~WorkObject()=default; virtual void OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt); + + virtual void OnResize(const VkExtent2D &){} virtual void Render(double delta_time,graph::RenderCmdBuffer *cmd)=0; diff --git a/src/Work/WorkManager.cpp b/src/Work/WorkManager.cpp index 213cba80..6d787378 100644 --- a/src/Work/WorkManager.cpp +++ b/src/Work/WorkManager.cpp @@ -26,6 +26,16 @@ namespace hgl } } + void SwapchainWorkManager::OnResize(uint w,uint h) + { + if(!cur_work_object)return; + + VkExtent2D ext={w,h}; + + cur_work_object->OnRenderTargetSwitch(render_framework,render_framework->GetSwapchainRenderTarget()); + cur_work_object->OnResize(ext); + } + void SwapchainWorkManager::Render(WorkObject *wo) { graph::IRenderTarget *rt=swpachain_module->AcquireNextImage(); diff --git a/src/Work/WorkObject.cpp b/src/Work/WorkObject.cpp index 0db0e68b..fd2f28f2 100644 --- a/src/Work/WorkObject.cpp +++ b/src/Work/WorkObject.cpp @@ -19,8 +19,7 @@ namespace hgl void WorkObject::OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt) { - if(!rf)return; - if(render_framework==rf)return; + if(!rf||!rt)return; render_framework=rf; cur_render_target=rt;