From 10fbcfef148ca02bc97c02c385924ca8cbb9458b Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sun, 19 Jan 2025 19:42:38 +0800 Subject: [PATCH] RenderFramework::RunFrame/Run --- CMCore | 2 +- inc/hgl/graph/RenderFramework.h | 41 ++++++++---- inc/hgl/graph/module/SwapchainModule.h | 10 +-- src/SceneGraph/RenderFramework.cpp | 76 ++++++++++++++++++++++- src/SceneGraph/module/SwapchainModule.cpp | 12 ++-- 5 files changed, 115 insertions(+), 26 deletions(-) diff --git a/CMCore b/CMCore index 5aad7d81..1bcd213b 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 5aad7d81419d02141b3b3f53661e2c8e3e763163 +Subproject commit 1bcd213b63ed080863fd4a51eaec5fe6205e7589 diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index 6fd68ba4..0ecc2130 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include @@ -13,14 +13,22 @@ class TextureManager; class RenderTargetManager; class SwapchainModule; +class RenderModule; + class RenderFramework:public io::WindowEvent { - OSString app_name; + OSString app_name; - Window * win =nullptr; - VulkanInstance * inst =nullptr; + Window * win =nullptr; + VulkanInstance * inst =nullptr; - GPUDevice * device =nullptr; + GPUDevice * device =nullptr; + +private: + + double last_time =0; + double cur_time =0; + int64 frame_count =0; protected: @@ -36,10 +44,11 @@ protected: public: - Window * GetWindow (){return win;} - GPUDevice * GetDevice (){return device;} + Window * GetWindow (){return win;} + GPUDevice * GetDevice (){return device;} + GPUDeviceAttribute * GetDeviceAttribute (){return device->GetDeviceAttribute();} - RenderPass * GetRenderPass (){return device_render_pass;} + RenderPass * GetRenderPass (){return device_render_pass;} public: @@ -64,10 +73,20 @@ public: public: // event - void OnResize(uint w,uint h); - void OnActive(bool); - void OnClose(); + virtual void OnResize(uint w,uint h); + virtual void OnActive(bool); + virtual void OnClose(); +protected: + + virtual void BeginFrame(); + virtual void EndFrame(); + + virtual bool RunFrame(RenderModule *); + +public: + + virtual bool Run(RenderModule *); };//class RenderFramework VK_NAMESPACE_END diff --git a/inc/hgl/graph/module/SwapchainModule.h b/inc/hgl/graph/module/SwapchainModule.h index 5626f16f..e4e6d677 100644 --- a/inc/hgl/graph/module/SwapchainModule.h +++ b/inc/hgl/graph/module/SwapchainModule.h @@ -1,12 +1,12 @@ #pragma once -#include +#include VK_NAMESPACE_BEGIN class RenderTargetManager; -RENDER_MODULE_CLASS(SwapchainModule) +GRAPH_MODULE_CLASS(SwapchainModule) { Swapchain *swapchain=nullptr; @@ -43,13 +43,9 @@ public: public: - RenderPass * GetRenderPass () {return swapchain_rp;} - - RTSwapchain * GetRenderTarget () {return swapchain_rt;} - const VkExtent2D & GetSwapchainSize()const {return swapchain_rt->GetExtent();} - RenderCmdBuffer *GetRenderCmdBuffer(); + RenderCmdBuffer *Use(); };//class SwapchainModule:public RenderModule diff --git a/src/SceneGraph/RenderFramework.cpp b/src/SceneGraph/RenderFramework.cpp index 6b7d070f..3386b7ff 100644 --- a/src/SceneGraph/RenderFramework.cpp +++ b/src/SceneGraph/RenderFramework.cpp @@ -5,7 +5,10 @@ #include #include #include +#include +#include #include +#include VK_NAMESPACE_BEGIN @@ -87,8 +90,6 @@ bool RenderFramework::Init(uint w,uint h) win->Join(this); - OnResize(w,h); - module_manager=new GraphModuleManager(device); render_pass_manager=module_manager->GetOrCreate(); @@ -108,7 +109,7 @@ bool RenderFramework::Init(uint w,uint h) module_manager->Registry(swapchain_module); { - auto *attr=GetDevice()->GetDeviceAttribute(); + auto *attr=GetDeviceAttribute(); SwapchainRenderbufferInfo rbi(attr->surface_format.format,attr->physical_device->GetDepthFormat()); @@ -123,12 +124,48 @@ bool RenderFramework::Init(uint w,uint h) #endif//_DEBUG } + OnResize(w,h); + + return(true); +} + +bool RenderFramework::Run(RenderModule *rm) +{ + if(!rm) + return(false); + + if(!win) + return(false); + + if(!swapchain_module) + return(false); + + while(win->Update()) + { + if(win->IsVisible()) + { + ++frame_count; + last_time=cur_time; + + cur_time=GetDoubleTime(); + + if(!RunFrame(rm)) + return(false); + } + + device->WaitIdle(); + } + return(true); } void RenderFramework::OnResize(uint w,uint h) { io::WindowEvent::OnResize(w,h); + + VkExtent2D ext(w,h); + + swapchain_module->OnResize(ext); //其实swapchain_module并不需要这个 } void RenderFramework::OnActive(bool) @@ -138,4 +175,37 @@ void RenderFramework::OnActive(bool) void RenderFramework::OnClose() { } + +void RenderFramework::BeginFrame() +{ +} + +void RenderFramework::EndFrame() +{ +} + +bool RenderFramework::RunFrame(RenderModule *rm) +{ + bool result=true; + + BeginFrame(); + + swapchain_module->BeginFrame(); + { + RenderCmdBuffer *rcb=swapchain_module->Use(); + + if(rcb) + { + result=rm->OnFrameRender(cur_time,rcb); + + rcb->End(); + } + } + swapchain_module->EndFrame(); + + EndFrame(); + + return result; +} + VK_NAMESPACE_END diff --git a/src/SceneGraph/module/SwapchainModule.cpp b/src/SceneGraph/module/SwapchainModule.cpp index 946bb88a..428e1eaf 100644 --- a/src/SceneGraph/module/SwapchainModule.cpp +++ b/src/SceneGraph/module/SwapchainModule.cpp @@ -223,7 +223,7 @@ SwapchainModule::~SwapchainModule() SAFE_CLEAR(swapchain); } -SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm):GraphModuleInherit(dev,"SwapchainModule") +SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm):GraphModuleInherit(dev,"SwapchainModule") { tex_manager=tm; rt_manager=rtm; @@ -281,14 +281,18 @@ void SwapchainModule::EndFrame() swapchain_rt->WaitFence(); } -RenderCmdBuffer *SwapchainModule::GetRenderCmdBuffer() +RenderCmdBuffer *SwapchainModule::Use() { - int index=swapchain_rt->GetCurrentFrameIndices(); + uint32_t index=swapchain_rt->GetCurrentFrameIndices(); if(index>=swapchain->color_count) return(nullptr); - return cmd_buf[index]; + RenderCmdBuffer *rcb=cmd_buf[index]; + + rcb->BindFramebuffer(swapchain_rp,swapchain_rt->GetFramebuffer()); + + return rcb; } VK_NAMESPACE_END