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

View File

@ -80,7 +80,6 @@ public:
~RTSwapchain();
const uint32_t GetColorCount ()const override {return 1;} ///Swapchain的FBO颜色成份只有一个
const uint32_t GetImageCount ()const {return swapchain->image_count;}
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 * GetDepthTexture () override{return swapchain->sc_image[current_frame].depth;}
RenderCmdBuffer *GetRenderCmdBuffer(const int index)
{
return swapchain->sc_image[index].cmd_buf;
}
public:
const uint32_t GetCurrentFrameIndices ()const {return current_frame;}

View File

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

View File

@ -95,6 +95,9 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain)
swapchain->sc_image=hgl_zero_new<SwapchainImage>(swapchain->image_count);
AnsiString num_string;
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]));
@ -111,15 +114,19 @@ bool GPUDevice::CreateSwapchainFBO(Swapchain *swapchain)
swapchain->sc_image[i].color->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
if(attr->debug_utils)
{
AnsiString num=AnsiString::numberOf(i);
attr->debug_utils->SetTexture(swapchain->sc_image[i].color,"SwapchainColor_"+num);
attr->debug_utils->SetTexture(swapchain->sc_image[i].depth,"SwapchainDepth_"+num);
attr->debug_utils->SetTexture(swapchain->sc_image[i].color,"SwapchainColor_"+num_string);
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
}