optimized SwapchainModule::BeginFrame/EndFrame
This commit is contained in:
parent
af03f2967c
commit
768ebde879
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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:
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user