From 768ebde8799589c25380a935924be7396dbfab84 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sun, 26 Jan 2025 12:13:51 +0800 Subject: [PATCH] optimized SwapchainModule::BeginFrame/EndFrame --- example/Basic/rf_test.cpp | 17 +++---- example/common/VulkanAppFramework.h | 17 ++----- inc/hgl/graph/RenderFramework.h | 3 +- inc/hgl/graph/module/SwapchainModule.h | 12 ++--- src/GUI/ThemeForm.cpp | 2 +- .../Vulkan/VKSwapchainRenderTarget.cpp | 2 - src/SceneGraph/module/RenderTargetManager.cpp | 2 +- src/SceneGraph/module/SwapchainModule.cpp | 46 ++++++------------- 8 files changed, 36 insertions(+), 65 deletions(-) diff --git a/example/Basic/rf_test.cpp b/example/Basic/rf_test.cpp index fc0ac9d4..6c8ca5b1 100644 --- a/example/Basic/rf_test.cpp +++ b/example/Basic/rf_test.cpp @@ -116,24 +116,21 @@ public: RenderFramework *rf=GetRenderFramework(); SwapchainModule *sm=rf->GetSwapchainModule(); - sm->BeginFrame(); //这里会有AcquireNextImage操作 + RenderCmdBuffer *cb=sm->BeginRender(); //这里会有AcquireNextImage操作 + if(cb) + { //这个使用完全不合理,录制CMD和推送swapchain是两回事,需要分开操作。 //比如场景有的物件分静态和动态 //可能静态物件就全部一次性录制好,而动态物件则是每帧录制 - RenderCmdBuffer *cb=sm->RecordCmdBuffer(); //这里会获取当前帧的RenderCmdBuffer、开启cmd录制、绑定FBO - - if(cb) - { - cb->SetClearColor(0,clear_color); + cb->SetClearColor(0,clear_color); - Render(cb,render_obj); + Render(cb,render_obj); - cb->End(); //结束cmd录制 - } - sm->EndFrame(); //这里会Submit和PresentBackbuffer + sm->EndRender(); //这里会Submit和PresentBackbuffer + } } };//class TestApp:public VulkanApplicationFramework diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 3a56d1f4..846e7974 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -220,12 +220,12 @@ public: } } - bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri) + bool BuildCommandBuffer(RenderCmdBuffer *cb,Framebuffer *fbo,Renderable *ri) { if(!ri)return(false); cb->Begin(); - cb->BindFramebuffer(rp,fb); + cb->BindFramebuffer(fbo); cb->SetClearColor(0,clear_color); cb->BeginRenderPass(); cb->BindPipeline(ri->GetPipeline()); @@ -238,19 +238,12 @@ public: return(true); } - void BuildCommandBuffer(RenderCmdBuffer *cb,RenderTarget *rt,Renderable *ri) - { - if(!cb||!rt||!ri) - return; - - BuildCommandBuffer(cb,rt->GetRenderPass(),rt->GetFramebuffer(),ri); - } - bool BuildCommandBuffer(uint32_t index,Renderable *ri) { if(!ri)return(false); - return BuildCommandBuffer(cmd_buf[index],sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index),ri); + return BuildCommandBuffer(cmd_buf[index], + sc_render_target->GetFramebuffer(),ri); } bool BuildCommandBuffer(Renderable *ri) @@ -277,7 +270,7 @@ public: RenderCmdBuffer *cb=cmd_buf[index]; cb->Begin(); - cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index)); + cb->BindFramebuffer(sc_render_target->GetFramebuffer(index)); cb->SetClearColor(0,clear_color); cb->BeginRenderPass(); rl->Render(cb); diff --git a/inc/hgl/graph/RenderFramework.h b/inc/hgl/graph/RenderFramework.h index 1eae71b6..fbc8b68f 100644 --- a/inc/hgl/graph/RenderFramework.h +++ b/inc/hgl/graph/RenderFramework.h @@ -3,6 +3,7 @@ #include #include #include +#include #include VK_NAMESPACE_BEGIN @@ -12,7 +13,6 @@ class TileFont; class RenderPassManager; class TextureManager; class RenderTargetManager; -class SwapchainModule; class RenderModule; @@ -55,6 +55,7 @@ public: RenderTargetManager * GetRenderTargetManager (){return rt_manager;} SwapchainModule * GetSwapchainModule (){return sc_module;} + RTSwapchain * GetSwapchainRenderTarget(){return sc_module?sc_module->GetRenderTarget():nullptr;} public: diff --git a/inc/hgl/graph/module/SwapchainModule.h b/inc/hgl/graph/module/SwapchainModule.h index 1e0125dc..9f8ac8ff 100644 --- a/inc/hgl/graph/module/SwapchainModule.h +++ b/inc/hgl/graph/module/SwapchainModule.h @@ -20,14 +20,14 @@ GRAPH_MODULE_CLASS(SwapchainModule) RTSwapchain * sc_render_target=nullptr; + SwapchainImage * current_sc_image=nullptr; + protected: bool CreateSwapchainFBO(); bool CreateSwapchain(); bool CreateSwapchainRenderTarget(); - RenderCmdBuffer *GetRenderCmdBuffer(int frame_index=-1); - public: virtual void OnResize(const VkExtent2D &)override; ///<窗口大小改变 @@ -37,8 +37,9 @@ public: SwapchainModule(GPUDevice *,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm); virtual ~SwapchainModule(); - bool BeginFrame(); - void EndFrame(); + RenderCmdBuffer *BeginRender(); + + void EndRender(); public: @@ -46,8 +47,7 @@ public: const VkExtent2D & GetSwapchainSize()const{return sc_render_target->GetExtent();} - RenderCmdBuffer * RecordCmdBuffer (int frame_index=-1); - + RTSwapchain * GetRenderTarget ()const{return sc_render_target;} };//class SwapchainModule:public GraphModule VK_NAMESPACE_END diff --git a/src/GUI/ThemeForm.cpp b/src/GUI/ThemeForm.cpp index ca8f9f92..e2c8b311 100644 --- a/src/GUI/ThemeForm.cpp +++ b/src/GUI/ThemeForm.cpp @@ -37,7 +37,7 @@ namespace hgl bool ThemeForm::BeginRender() { if(!cmd_buf->Begin())return(false); - if(!cmd_buf->BindFramebuffer(render_target->GetRenderPass(),render_target->GetFramebuffer()))return(false); + if(!cmd_buf->BindRenderTarget(render_target->GetRenderPass(),render_target->GetFramebuffer()))return(false); cmd_buf->SetClearColor(0,0,0,0,1.0f); diff --git a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp index eb0442cc..6fb0d3c3 100644 --- a/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp +++ b/src/SceneGraph/Vulkan/VKSwapchainRenderTarget.cpp @@ -15,8 +15,6 @@ RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rc present_info.pResults = nullptr; present_info.pSwapchains = &(swapchain->swap_chain); - render_pass=rp; - extent=swapchain->extent; current_frame=0; diff --git a/src/SceneGraph/module/RenderTargetManager.cpp b/src/SceneGraph/module/RenderTargetManager.cpp index 00c91242..96a98518 100644 --- a/src/SceneGraph/module/RenderTargetManager.cpp +++ b/src/SceneGraph/module/RenderTargetManager.cpp @@ -47,7 +47,7 @@ RenderTarget *RenderTargetManager::CreateRT(const FramebufferInfo *fbi,RenderPas DeviceQueue *q=dev->CreateQueue(fence_count,false); Semaphore *render_complete_semaphore=dev->CreateGPUSemaphore(); - RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,rp,fb,color_texture_list,image_count,depth_texture); + RenderTarget *rt=new RenderTarget(q,render_complete_semaphore,fb,color_texture_list,image_count,depth_texture); color_texture_list.DiscardObject(); return rt; diff --git a/src/SceneGraph/module/SwapchainModule.cpp b/src/SceneGraph/module/SwapchainModule.cpp index 73fbfccd..a3e96618 100644 --- a/src/SceneGraph/module/SwapchainModule.cpp +++ b/src/SceneGraph/module/SwapchainModule.cpp @@ -234,51 +234,33 @@ void SwapchainModule::OnResize(const VkExtent2D &extent) CreateSwapchainRenderTarget(); } -bool SwapchainModule::BeginFrame() +RenderCmdBuffer *SwapchainModule::BeginRender() { - uint32_t index=sc_render_target->AcquireNextImage(); + const int index=sc_render_target->AcquireNextImage(); - if(index>=swapchain->image_count) - return(false); - - return(true); -} - -RenderCmdBuffer *SwapchainModule::GetRenderCmdBuffer(int frame_index) -{ - if(frame_index<0) - frame_index=sc_render_target->GetCurrentFrameIndices(); - - if(frame_index>=swapchain->image_count) + if(index<0||index>=swapchain->image_count) return(nullptr); - return swapchain->sc_image[frame_index].cmd_buf; + current_sc_image=&(swapchain->sc_image[index]); + + current_sc_image->cmd_buf->Begin(); + current_sc_image->cmd_buf->BindFramebuffer(current_sc_image->fbo); + + return current_sc_image->cmd_buf; } -void SwapchainModule::EndFrame() +void SwapchainModule::EndRender() { - RenderCmdBuffer *rcb=GetRenderCmdBuffer(); - - if(!rcb) + if(!current_sc_image) return; - sc_render_target->Submit(*rcb); + current_sc_image->cmd_buf->End(); + sc_render_target->Submit(*(current_sc_image->cmd_buf)); sc_render_target->PresentBackbuffer(); sc_render_target->WaitQueue(); sc_render_target->WaitFence(); -} -RenderCmdBuffer *SwapchainModule::RecordCmdBuffer(int frame_index) -{ - RenderCmdBuffer *rcb=GetRenderCmdBuffer(frame_index); - - if(!rcb) - return(nullptr); - - rcb->Begin(); - rcb->BindFramebuffer(sc_render_pass,sc_render_target->GetFramebuffer()); - - return rcb; + current_sc_image=nullptr; } VK_NAMESPACE_END