optimized SwapchainModule::BeginFrame/EndFrame

This commit is contained in:
hyzboy 2025-01-26 12:13:51 +08:00
parent af03f2967c
commit 768ebde879
8 changed files with 36 additions and 65 deletions

View File

@ -116,24 +116,21 @@ public:
RenderFramework *rf=GetRenderFramework(); RenderFramework *rf=GetRenderFramework();
SwapchainModule *sm=rf->GetSwapchainModule(); SwapchainModule *sm=rf->GetSwapchainModule();
sm->BeginFrame(); //这里会有AcquireNextImage操作 RenderCmdBuffer *cb=sm->BeginRender(); //这里会有AcquireNextImage操作
if(cb)
{
//这个使用完全不合理录制CMD和推送swapchain是两回事需要分开操作。 //这个使用完全不合理录制CMD和推送swapchain是两回事需要分开操作。
//比如场景有的物件分静态和动态 //比如场景有的物件分静态和动态
//可能静态物件就全部一次性录制好,而动态物件则是每帧录制 //可能静态物件就全部一次性录制好,而动态物件则是每帧录制
RenderCmdBuffer *cb=sm->RecordCmdBuffer(); //这里会获取当前帧的RenderCmdBuffer、开启cmd录制、绑定FBO cb->SetClearColor(0,clear_color);
if(cb)
{
cb->SetClearColor(0,clear_color);
Render(cb,render_obj); Render(cb,render_obj);
cb->End(); //结束cmd录制 sm->EndRender(); //这里会Submit和PresentBackbuffer
} }
sm->EndFrame(); //这里会Submit和PresentBackbuffer
} }
};//class TestApp:public VulkanApplicationFramework };//class TestApp:public VulkanApplicationFramework

View File

@ -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); if(!ri)return(false);
cb->Begin(); cb->Begin();
cb->BindFramebuffer(rp,fb); cb->BindFramebuffer(fbo);
cb->SetClearColor(0,clear_color); cb->SetClearColor(0,clear_color);
cb->BeginRenderPass(); cb->BeginRenderPass();
cb->BindPipeline(ri->GetPipeline()); cb->BindPipeline(ri->GetPipeline());
@ -238,19 +238,12 @@ public:
return(true); 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) bool BuildCommandBuffer(uint32_t index,Renderable *ri)
{ {
if(!ri)return(false); 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) bool BuildCommandBuffer(Renderable *ri)
@ -277,7 +270,7 @@ public:
RenderCmdBuffer *cb=cmd_buf[index]; RenderCmdBuffer *cb=cmd_buf[index];
cb->Begin(); 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->SetClearColor(0,clear_color);
cb->BeginRenderPass(); cb->BeginRenderPass();
rl->Render(cb); rl->Render(cb);

View File

@ -3,6 +3,7 @@
#include<hgl/platform/Window.h> #include<hgl/platform/Window.h>
#include<hgl/graph/VKDevice.h> #include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKCommandBuffer.h> #include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/module/SwapchainModule.h>
#include<hgl/graph/module/GraphModuleManager.h> #include<hgl/graph/module/GraphModuleManager.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
@ -12,7 +13,6 @@ class TileFont;
class RenderPassManager; class RenderPassManager;
class TextureManager; class TextureManager;
class RenderTargetManager; class RenderTargetManager;
class SwapchainModule;
class RenderModule; class RenderModule;
@ -55,6 +55,7 @@ public:
RenderTargetManager * GetRenderTargetManager (){return rt_manager;} RenderTargetManager * GetRenderTargetManager (){return rt_manager;}
SwapchainModule * GetSwapchainModule (){return sc_module;} SwapchainModule * GetSwapchainModule (){return sc_module;}
RTSwapchain * GetSwapchainRenderTarget(){return sc_module?sc_module->GetRenderTarget():nullptr;}
public: public:

View File

@ -20,14 +20,14 @@ GRAPH_MODULE_CLASS(SwapchainModule)
RTSwapchain * sc_render_target=nullptr; RTSwapchain * sc_render_target=nullptr;
SwapchainImage * current_sc_image=nullptr;
protected: protected:
bool CreateSwapchainFBO(); bool CreateSwapchainFBO();
bool CreateSwapchain(); bool CreateSwapchain();
bool CreateSwapchainRenderTarget(); bool CreateSwapchainRenderTarget();
RenderCmdBuffer *GetRenderCmdBuffer(int frame_index=-1);
public: public:
virtual void OnResize(const VkExtent2D &)override; ///<窗口大小改变 virtual void OnResize(const VkExtent2D &)override; ///<窗口大小改变
@ -37,8 +37,9 @@ public:
SwapchainModule(GPUDevice *,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm); SwapchainModule(GPUDevice *,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm);
virtual ~SwapchainModule(); virtual ~SwapchainModule();
bool BeginFrame(); RenderCmdBuffer *BeginRender();
void EndFrame();
void EndRender();
public: public:
@ -46,8 +47,7 @@ public:
const VkExtent2D & GetSwapchainSize()const{return sc_render_target->GetExtent();} 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 };//class SwapchainModule:public GraphModule
VK_NAMESPACE_END VK_NAMESPACE_END

View File

@ -37,7 +37,7 @@ namespace hgl
bool ThemeForm::BeginRender() bool ThemeForm::BeginRender()
{ {
if(!cmd_buf->Begin())return(false); 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); cmd_buf->SetClearColor(0,0,0,0,1.0f);

View File

@ -15,8 +15,6 @@ RTSwapchain::RTSwapchain(VkDevice dev,Swapchain *sc,DeviceQueue *q,Semaphore *rc
present_info.pResults = nullptr; present_info.pResults = nullptr;
present_info.pSwapchains = &(swapchain->swap_chain); present_info.pSwapchains = &(swapchain->swap_chain);
render_pass=rp;
extent=swapchain->extent; extent=swapchain->extent;
current_frame=0; current_frame=0;

View File

@ -47,7 +47,7 @@ RenderTarget *RenderTargetManager::CreateRT(const FramebufferInfo *fbi,RenderPas
DeviceQueue *q=dev->CreateQueue(fence_count,false); DeviceQueue *q=dev->CreateQueue(fence_count,false);
Semaphore *render_complete_semaphore=dev->CreateGPUSemaphore(); 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(); color_texture_list.DiscardObject();
return rt; return rt;

View File

@ -234,51 +234,33 @@ void SwapchainModule::OnResize(const VkExtent2D &extent)
CreateSwapchainRenderTarget(); 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) if(index<0||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)
return(nullptr); 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(!current_sc_image)
if(!rcb)
return; 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->PresentBackbuffer();
sc_render_target->WaitQueue(); sc_render_target->WaitQueue();
sc_render_target->WaitFence(); sc_render_target->WaitFence();
}
RenderCmdBuffer *SwapchainModule::RecordCmdBuffer(int frame_index) current_sc_image=nullptr;
{
RenderCmdBuffer *rcb=GetRenderCmdBuffer(frame_index);
if(!rcb)
return(nullptr);
rcb->Begin();
rcb->BindFramebuffer(sc_render_pass,sc_render_target->GetFramebuffer());
return rcb;
} }
VK_NAMESPACE_END VK_NAMESPACE_END