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

View File

@ -6,16 +6,19 @@ VK_NAMESPACE_BEGIN
class RenderTargetManager;
class RenderPassManager;
class RenderPass;
GRAPH_MODULE_CLASS(SwapchainModule)
{
Swapchain *swapchain=nullptr;
Swapchain * swapchain =nullptr;
TextureManager *tex_manager=nullptr;
RenderTargetManager *rt_manager=nullptr;
RenderPassManager *rp_manager=nullptr;
TextureManager * tex_manager =nullptr;
RenderTargetManager * rt_manager =nullptr;
RenderPassManager * rp_manager =nullptr;
RTSwapchain *swapchain_rt=nullptr;
RenderPass * sc_render_pass =nullptr;
RTSwapchain * sc_render_target=nullptr;
protected:
@ -37,9 +40,9 @@ 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);

View File

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