fixed a bug that crash after window resize. because WorkObject::cur_render_target don't reset after window resize.

This commit is contained in:
hyzboy 2025-02-05 23:36:53 +08:00
parent e5a46f3ee8
commit 9f0625ed4e
4 changed files with 36 additions and 6 deletions

View File

@ -1,13 +1,16 @@
#pragma once #pragma once
#include"WorkObject.h"
#include<hgl/WorkObject.h>
namespace hgl namespace hgl
{ {
/** /**
* WorkObject<br> * WorkObject<br>
*/ */
class WorkManager class WorkManager:public io::WindowEvent
{ {
protected:
graph::RenderFramework *render_framework; graph::RenderFramework *render_framework;
uint fps=60; uint fps=60;
@ -41,6 +44,15 @@ namespace hgl
virtual void Render(WorkObject *wo); 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); void Run(WorkObject *wo);
};//class WorkManager };//class WorkManager
@ -53,10 +65,17 @@ namespace hgl
SwapchainWorkManager(graph::RenderFramework *rf):WorkManager(rf) SwapchainWorkManager(graph::RenderFramework *rf):WorkManager(rf)
{ {
swpachain_module=rf->GetSwapchainModule(); swpachain_module=rf->GetSwapchainModule();
rf->GetWindow()->Join(this);
}
~SwapchainWorkManager()
{
render_framework->GetWindow()->Unjoin(this);
} }
~SwapchainWorkManager()=default;
void Render(WorkObject *wo) override; void Render(WorkObject *wo) override;
void OnResize(uint w,uint h) override;
}; };
template<typename WO> int RunFramework(const OSString &title,uint width=1280,uint height=720) template<typename WO> int RunFramework(const OSString &title,uint width=1280,uint height=720)

View File

@ -57,6 +57,8 @@ namespace hgl
virtual void OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt); virtual void OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt);
virtual void OnResize(const VkExtent2D &){}
virtual void Render(double delta_time,graph::RenderCmdBuffer *cmd)=0; virtual void Render(double delta_time,graph::RenderCmdBuffer *cmd)=0;
virtual void Render(double delta_time); virtual void Render(double delta_time);

View File

@ -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) void SwapchainWorkManager::Render(WorkObject *wo)
{ {
graph::IRenderTarget *rt=swpachain_module->AcquireNextImage(); graph::IRenderTarget *rt=swpachain_module->AcquireNextImage();

View File

@ -19,8 +19,7 @@ namespace hgl
void WorkObject::OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt) void WorkObject::OnRenderTargetSwitch(graph::RenderFramework *rf,graph::IRenderTarget *rt)
{ {
if(!rf)return; if(!rf||!rt)return;
if(render_framework==rf)return;
render_framework=rf; render_framework=rf;
cur_render_target=rt; cur_render_target=rt;