I moved a RenderPass to SwapchainModule from SwapchainImage; RenderPass isn't recreated after recreating the swapchain.

This commit is contained in:
hyzboy 2025-01-25 20:27:26 +08:00
parent 7326765057
commit 0a072d846b
4 changed files with 40 additions and 43 deletions

2
CMCore

@ -1 +1 @@
Subproject commit 11e32b77f1136bcb552abb406cf73db799720e11 Subproject commit e475de1692f5554f8e8c7e1a8f4eb73f8a297d55

View File

@ -1,8 +1,6 @@
#pragma once #pragma once
#include<hgl/graph/VK.h> #include<hgl/graph/VK.h>
#include<hgl/graph/VKTexture.h>
#include<hgl/type/List.h>
#include<hgl/graph/VKFramebuffer.h> #include<hgl/graph/VKFramebuffer.h>
#include<hgl/graph/VKCommandBuffer.h> #include<hgl/graph/VKCommandBuffer.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
@ -40,8 +38,6 @@ public:
VkSurfaceFormatKHR surface_format {}; VkSurfaceFormatKHR surface_format {};
VkFormat depth_format =VK_FORMAT_UNDEFINED; VkFormat depth_format =VK_FORMAT_UNDEFINED;
RenderPass * render_pass =nullptr;
uint32_t image_count =0; uint32_t image_count =0;
SwapchainImage * sc_image =nullptr; SwapchainImage * sc_image =nullptr;

View File

@ -6,16 +6,19 @@ VK_NAMESPACE_BEGIN
class RenderTargetManager; class RenderTargetManager;
class RenderPassManager; class RenderPassManager;
class RenderPass;
GRAPH_MODULE_CLASS(SwapchainModule) GRAPH_MODULE_CLASS(SwapchainModule)
{ {
Swapchain *swapchain=nullptr; Swapchain * swapchain =nullptr;
TextureManager *tex_manager=nullptr; TextureManager * tex_manager =nullptr;
RenderTargetManager *rt_manager=nullptr; RenderTargetManager * rt_manager =nullptr;
RenderPassManager *rp_manager=nullptr; RenderPassManager * rp_manager =nullptr;
RTSwapchain *swapchain_rt=nullptr; RenderPass * sc_render_pass =nullptr;
RTSwapchain * sc_render_target=nullptr;
protected: protected:
@ -37,9 +40,9 @@ public:
public: public:
RenderPass * GetRenderPass ()const{return swapchain_rt->GetRenderPass();} RenderPass * GetRenderPass ()const{return sc_render_pass;}
const VkExtent2D & GetSwapchainSize()const{return swapchain_rt->GetExtent();} const VkExtent2D & GetSwapchainSize()const{return sc_render_target->GetExtent();}
RenderCmdBuffer *RecordCmdBuffer(int frame_index=-1); RenderCmdBuffer *RecordCmdBuffer(int frame_index=-1);

View File

@ -114,7 +114,7 @@ bool SwapchainModule::CreateSwapchainFBO()
if(!swapchain->sc_image[i].depth) if(!swapchain->sc_image[i].depth)
return(false); return(false);
swapchain->sc_image[i].fbo=rt_manager->CreateFBO( swapchain->render_pass, swapchain->sc_image[i].fbo=rt_manager->CreateFBO( sc_render_pass,
swapchain->sc_image[i].color->GetImageView(), swapchain->sc_image[i].color->GetImageView(),
swapchain->sc_image[i].depth->GetImageView()); swapchain->sc_image[i].depth->GetImageView());
@ -150,15 +150,6 @@ bool SwapchainModule::CreateSwapchain()
swapchain->transform =dev_attr->surface_caps.currentTransform; swapchain->transform =dev_attr->surface_caps.currentTransform;
swapchain->surface_format =dev_attr->surface_format; swapchain->surface_format =dev_attr->surface_format;
swapchain->depth_format =dev_attr->physical_device->GetDepthFormat(); swapchain->depth_format =dev_attr->physical_device->GetDepthFormat();
SwapchainRenderbufferInfo rbi(swapchain->surface_format.format,swapchain->depth_format);
swapchain->render_pass =rp_manager->AcquireRenderPass(&rbi);
#ifdef _DEBUG
if(dev_attr->debug_utils)
dev_attr->debug_utils->SetRenderPass(swapchain->render_pass->GetVkRenderPass(),"MainDeviceRenderPass");
#endif//_DEBUG
swapchain->swap_chain=CreateVulkanSwapChain(dev_attr); swapchain->swap_chain=CreateVulkanSwapChain(dev_attr);
@ -184,20 +175,20 @@ bool SwapchainModule::CreateSwapchainRenderTarget()
Semaphore *render_complete_semaphore=device->CreateGPUSemaphore(); Semaphore *render_complete_semaphore=device->CreateGPUSemaphore();
Semaphore *present_complete_semaphore=device->CreateGPUSemaphore(); Semaphore *present_complete_semaphore=device->CreateGPUSemaphore();
swapchain_rt=new RTSwapchain( device->GetDevice(), sc_render_target=new RTSwapchain( device->GetDevice(),
swapchain, swapchain,
q, q,
render_complete_semaphore, render_complete_semaphore,
present_complete_semaphore, present_complete_semaphore,
swapchain->render_pass sc_render_pass
); );
return true; return true;
} }
SwapchainModule::~SwapchainModule() SwapchainModule::~SwapchainModule()
{ {
SAFE_CLEAR(swapchain_rt); SAFE_CLEAR(sc_render_target);
} }
SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm):GraphModuleInherit<SwapchainModule,GraphModule>(dev,"SwapchainModule") SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetManager *rtm,RenderPassManager *rpm):GraphModuleInherit<SwapchainModule,GraphModule>(dev,"SwapchainModule")
@ -205,12 +196,19 @@ SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetM
tex_manager=tm; tex_manager=tm;
rt_manager=rtm; rt_manager=rtm;
rp_manager=rpm; rp_manager=rpm;
auto *dev_attr=GetDeviceAttribute();
SwapchainRenderbufferInfo rbi(dev_attr->surface_format.format,dev_attr->physical_device->GetDepthFormat());
//#ifdef _DEBUG sc_render_pass=rp_manager->AcquireRenderPass(&rbi);
// if(dev_attr->debug_utils)
// dev_attr->debug_utils->SetRenderPass(swapchain_rp->GetVkRenderPass(),"SwapchainRenderPass"); #ifdef _DEBUG
//#endif//_DEBUG {
if(dev_attr->debug_utils)
dev_attr->debug_utils->SetRenderPass(sc_render_pass->GetVkRenderPass(),"MainDeviceRenderPass");
}
#endif//_DEBUG
if(!CreateSwapchainRenderTarget()) if(!CreateSwapchainRenderTarget())
return; return;
@ -218,7 +216,7 @@ SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetM
void SwapchainModule::OnResize(const VkExtent2D &extent) void SwapchainModule::OnResize(const VkExtent2D &extent)
{ {
SAFE_CLEAR(swapchain_rt) SAFE_CLEAR(sc_render_target)
swapchain=nullptr; swapchain=nullptr;
GetDeviceAttribute()->RefreshSurfaceCaps(); GetDeviceAttribute()->RefreshSurfaceCaps();
@ -228,7 +226,7 @@ void SwapchainModule::OnResize(const VkExtent2D &extent)
bool SwapchainModule::BeginFrame() bool SwapchainModule::BeginFrame()
{ {
uint32_t index=swapchain_rt->AcquireNextImage(); uint32_t index=sc_render_target->AcquireNextImage();
if(index>=swapchain->image_count) if(index>=swapchain->image_count)
return(false); return(false);
@ -238,20 +236,20 @@ bool SwapchainModule::BeginFrame()
void SwapchainModule::EndFrame() void SwapchainModule::EndFrame()
{ {
int index=swapchain_rt->GetCurrentFrameIndices(); int index=sc_render_target->GetCurrentFrameIndices();
VkCommandBuffer cb=*(swapchain->sc_image[index].cmd_buf); VkCommandBuffer cb=*(swapchain->sc_image[index].cmd_buf);
swapchain_rt->Submit(cb); sc_render_target->Submit(cb);
swapchain_rt->PresentBackbuffer(); sc_render_target->PresentBackbuffer();
swapchain_rt->WaitQueue(); sc_render_target->WaitQueue();
swapchain_rt->WaitFence(); sc_render_target->WaitFence();
} }
RenderCmdBuffer *SwapchainModule::RecordCmdBuffer(int frame_index) RenderCmdBuffer *SwapchainModule::RecordCmdBuffer(int frame_index)
{ {
if(frame_index<0) if(frame_index<0)
frame_index=swapchain_rt->GetCurrentFrameIndices(); frame_index=sc_render_target->GetCurrentFrameIndices();
if(frame_index>=swapchain->image_count) if(frame_index>=swapchain->image_count)
return(nullptr); return(nullptr);
@ -259,7 +257,7 @@ RenderCmdBuffer *SwapchainModule::RecordCmdBuffer(int frame_index)
RenderCmdBuffer *rcb=swapchain->sc_image[frame_index].cmd_buf; RenderCmdBuffer *rcb=swapchain->sc_image[frame_index].cmd_buf;
rcb->Begin(); rcb->Begin();
rcb->BindFramebuffer(swapchain->render_pass,swapchain_rt->GetFramebuffer()); rcb->BindFramebuffer(sc_render_pass,sc_render_target->GetFramebuffer());
return rcb; return rcb;
} }