Moved render_cmd_buffer to SwapchainImage from VulkanAppFramework

This commit is contained in:
hyzboy 2025-01-25 01:30:13 +08:00
parent c9b99dd125
commit d73966b1d0
4 changed files with 31 additions and 39 deletions

View File

@ -54,15 +54,10 @@ protected:
protected: protected:
GPUDevice * device =nullptr; GPUDevice * device =nullptr;
RenderPass * device_render_pass =nullptr;
RTSwapchain * sc_render_target =nullptr; RTSwapchain * sc_render_target =nullptr;
protected: protected:
int32_t swap_chain_count =0;
RenderCmdBuffer ** cmd_buf =nullptr;
Color4f clear_color; Color4f clear_color;
protected: protected:
@ -91,7 +86,6 @@ public:
win->Unjoin(this); win->Unjoin(this);
SAFE_CLEAR(db); SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
SAFE_CLEAR(device); SAFE_CLEAR(device);
SAFE_CLEAR(win); SAFE_CLEAR(win);
@ -146,14 +140,12 @@ public:
if(!device) if(!device)
return(false); return(false);
sc_render_target=device->GetSwapchainRT();
} }
device_render_pass=device->GetRenderPass();
db=new RenderResource(device); db=new RenderResource(device);
InitCommandBuffer();
win->Join(this); win->Join(this);
{ {
@ -198,26 +190,9 @@ public:
if(w>0&&h>0) if(w>0&&h>0)
device->Resize(w,h); device->Resize(w,h);
InitCommandBuffer();
Resize(w,h);
}
void InitCommandBuffer()
{
if(cmd_buf)
SAFE_CLEAR_OBJECT_ARRAY_OBJECT(cmd_buf,swap_chain_count);
sc_render_target=device->GetSwapchainRT(); sc_render_target=device->GetSwapchainRT();
swap_chain_count=sc_render_target->GetImageCount(); Resize(w,h);
{
const VkExtent2D extent=sc_render_target->GetExtent();
cmd_buf=hgl_zero_new<RenderCmdBuffer *>(swap_chain_count);
for(int32_t i=0;i<swap_chain_count;i++)
cmd_buf[i]=device->CreateRenderCommandBuffer(device->GetPhysicalDevice()->GetDeviceName()+AnsiString(":RenderCmdBuffer_")+AnsiString::numberOf(i));
}
} }
bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri) bool BuildCommandBuffer(RenderCmdBuffer *cb,RenderPass *rp,Framebuffer *fb,Renderable *ri)
@ -250,14 +225,16 @@ public:
{ {
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(sc_render_target->GetRenderCmdBuffer(index),
sc_render_target->GetRenderPass(),
sc_render_target->GetFramebuffer(index),ri);
} }
bool BuildCommandBuffer(Renderable *ri) bool BuildCommandBuffer(Renderable *ri)
{ {
if(!ri)return(false); if(!ri)return(false);
for(int32_t i=0;i<swap_chain_count;i++) for(int32_t i=0;i<sc_render_target->GetImageCount();i++)
BuildCommandBuffer(i,ri); BuildCommandBuffer(i,ri);
return(true); return(true);
@ -274,7 +251,7 @@ public:
{ {
if(!rl)return; if(!rl)return;
RenderCmdBuffer *cb=cmd_buf[index]; RenderCmdBuffer *cb=sc_render_target->GetRenderCmdBuffer(index);
cb->Begin(); cb->Begin();
cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index)); cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
@ -287,7 +264,7 @@ public:
void BuildCommandBuffer(RenderList *rl) void BuildCommandBuffer(RenderList *rl)
{ {
for(int32_t i=0;i<swap_chain_count;i++) for(int32_t i=0;i<sc_render_target->GetImageCount();i++)
BuildCommandBuffer(i,rl); BuildCommandBuffer(i,rl);
} }
@ -299,7 +276,7 @@ public:
template<typename ...ARGS> template<typename ...ARGS>
Pipeline *CreatePipeline(ARGS...args) Pipeline *CreatePipeline(ARGS...args)
{ {
Pipeline *p=device_render_pass->CreatePipeline(args...); Pipeline *p=sc_render_target->GetRenderPass()->CreatePipeline(args...);
if(!p) if(!p)
return(nullptr); return(nullptr);
@ -323,7 +300,7 @@ public:
virtual void SubmitDraw(int index) virtual void SubmitDraw(int index)
{ {
VkCommandBuffer cb=*cmd_buf[index]; VkCommandBuffer cb=*(sc_render_target->GetRenderCmdBuffer(index));
sc_render_target->Submit(cb); sc_render_target->Submit(cb);
sc_render_target->PresentBackbuffer(); sc_render_target->PresentBackbuffer();
@ -335,7 +312,7 @@ public:
{ {
int index=AcquireNextImage(); int index=AcquireNextImage();
if(index<0||index>=swap_chain_count)return; if(index<0||index>=sc_render_target->GetImageCount())return;
SubmitDraw(index); SubmitDraw(index);
} }

View File

@ -80,7 +80,6 @@ public:
~RTSwapchain(); ~RTSwapchain();
const uint32_t GetColorCount ()const override {return 1;} ///Swapchain的FBO颜色成份只有一个 const uint32_t GetColorCount ()const override {return 1;} ///Swapchain的FBO颜色成份只有一个
const uint32_t GetImageCount ()const {return swapchain->image_count;} const uint32_t GetImageCount ()const {return swapchain->image_count;}
Framebuffer * GetFramebuffer ()override {return swapchain->sc_image[current_frame].fbo;} Framebuffer * GetFramebuffer ()override {return swapchain->sc_image[current_frame].fbo;}
@ -89,6 +88,11 @@ public:
virtual Texture2D * GetColorTexture (const int index=0) override{return swapchain->sc_image[current_frame].color;} virtual Texture2D * GetColorTexture (const int index=0) override{return swapchain->sc_image[current_frame].color;}
virtual Texture2D * GetDepthTexture () override{return swapchain->sc_image[current_frame].depth;} virtual Texture2D * GetDepthTexture () override{return swapchain->sc_image[current_frame].depth;}
RenderCmdBuffer *GetRenderCmdBuffer(const int index)
{
return swapchain->sc_image[index].cmd_buf;
}
public: public:
const uint32_t GetCurrentFrameIndices ()const {return current_frame;} const uint32_t GetCurrentFrameIndices ()const {return current_frame;}

View File

@ -4,6 +4,7 @@
#include<hgl/graph/VKTexture.h> #include<hgl/graph/VKTexture.h>
#include<hgl/type/List.h> #include<hgl/type/List.h>
#include<hgl/graph/VKFramebuffer.h> #include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKCommandBuffer.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
struct SwapchainImage struct SwapchainImage
@ -13,10 +14,13 @@ struct SwapchainImage
Framebuffer * fbo =nullptr; Framebuffer * fbo =nullptr;
RenderCmdBuffer * cmd_buf =nullptr;
public: public:
~SwapchainImage() ~SwapchainImage()
{ {
delete cmd_buf;
delete fbo; delete fbo;
delete depth; delete depth;
delete color; delete color;

View File

@ -95,6 +95,9 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain)
swapchain->sc_image=hgl_zero_new<SwapchainImage>(swapchain->image_count); swapchain->sc_image=hgl_zero_new<SwapchainImage>(swapchain->image_count);
AnsiString num_string;
for(uint32_t i=0;i<swapchain->image_count;i++) for(uint32_t i=0;i<swapchain->image_count;i++)
{ {
swapchain->sc_image[i].color=CreateTexture2D(new SwapchainColorTextureCreateInfo(swapchain->surface_format.format,swapchain->extent,sc_images[i])); swapchain->sc_image[i].color=CreateTexture2D(new SwapchainColorTextureCreateInfo(swapchain->surface_format.format,swapchain->extent,sc_images[i]));
@ -111,15 +114,19 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain)
swapchain->sc_image[i].color->GetImageView(), swapchain->sc_image[i].color->GetImageView(),
swapchain->sc_image[i].depth->GetImageView()); swapchain->sc_image[i].depth->GetImageView());
AnsiString num_string=AnsiString::numberOf(i);
swapchain->sc_image[i].cmd_buf=CreateRenderCommandBuffer(AnsiString("Swapchain_RenderCmdBuffer_")+num_string);
#ifdef _DEBUG #ifdef _DEBUG
if(attr->debug_utils) if(attr->debug_utils)
{ {
AnsiString num=AnsiString::numberOf(i); AnsiString num=AnsiString::numberOf(i);
attr->debug_utils->SetTexture(swapchain->sc_image[i].color,"SwapchainColor_"+num); attr->debug_utils->SetTexture(swapchain->sc_image[i].color,"SwapchainColor_"+num_string);
attr->debug_utils->SetTexture(swapchain->sc_image[i].depth,"SwapchainDepth_"+num); attr->debug_utils->SetTexture(swapchain->sc_image[i].depth,"SwapchainDepth_"+num_string);
attr->debug_utils->SetFramebuffer(swapchain->sc_image[i].fbo->GetFramebuffer(),"SwapchainFBO_"+num); attr->debug_utils->SetFramebuffer(swapchain->sc_image[i].fbo->GetFramebuffer(),"SwapchainFBO_"+num_string);
} }
#endif//_DEBUG #endif//_DEBUG
} }