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();
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

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);
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);

View File

@ -3,6 +3,7 @@
#include<hgl/platform/Window.h>
#include<hgl/graph/VKDevice.h>
#include<hgl/graph/VKCommandBuffer.h>
#include<hgl/graph/module/SwapchainModule.h>
#include<hgl/graph/module/GraphModuleManager.h>
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:

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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