optimized SwapchainModule and SwapchainRenderTarget

This commit is contained in:
hyzboy 2025-01-26 23:47:04 +08:00
parent 74a5847bbc
commit f0a582271e
8 changed files with 49 additions and 42 deletions

View File

@ -15,6 +15,8 @@ protected:
VkCommandBuffer cmd_buf;
bool cmd_begin;
public:
GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
@ -24,8 +26,18 @@ public:
operator const VkCommandBuffer()const{return cmd_buf;}
operator const VkCommandBuffer *()const{return &cmd_buf;}
const bool IsBegin()const{return cmd_begin;}
bool Begin();
bool End(){return(vkEndCommandBuffer(cmd_buf)==VK_SUCCESS);}
bool End()
{
if(!cmd_begin)
return(false);
cmd_begin=false;
return(vkEndCommandBuffer(cmd_buf)==VK_SUCCESS);
}
#ifdef _DEBUG
void SetDebugName(const AnsiString &);

View File

@ -33,8 +33,8 @@ public:
bool WaitQueue();
bool WaitFence(const bool wait_all=true,const uint64_t time_out=HGL_NANO_SEC_PER_SEC);
bool Submit(const VkCommandBuffer &cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem);
bool Submit(const VkCommandBuffer *cmd_buf,const uint32_t count,Semaphore *wait_sem,Semaphore *complete_sem);
bool Submit(GPUCmdBuffer *cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem);
};//class DeviceQueue
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SUBMIT_QUEUE_INCLUDE

View File

@ -131,7 +131,7 @@ public: // Command Buffer
if(!data)
return(false);
return data->queue->Submit(*data->cmd_buf,wait_sem,data->render_complete_semaphore);
return data->queue->Submit(data->cmd_buf,wait_sem,data->render_complete_semaphore);
}
bool WaitQueue ()override{return data->queue->WaitQueue();}
@ -238,7 +238,7 @@ public:
public:
int AcquireNextImage(); ///<获取下一帧的索引
RenderCmdBuffer *AcquireNextImage(); ///<获取下一帧的索引
bool PresentBackbuffer(); ///<推送后台画面到前台

View File

@ -10,8 +10,6 @@ class RenderPass;
GRAPH_MODULE_CLASS(SwapchainModule)
{
Swapchain * swapchain =nullptr;
TextureManager * tex_manager =nullptr;
RenderTargetManager * rt_manager =nullptr;
RenderPassManager * rp_manager =nullptr;
@ -20,12 +18,10 @@ GRAPH_MODULE_CLASS(SwapchainModule)
SwapchainRenderTarget * sc_render_target=nullptr;
SwapchainImage * current_sc_image=nullptr;
protected:
bool CreateSwapchainFBO();
bool CreateSwapchain();
bool CreateSwapchainFBO(Swapchain *);
Swapchain *CreateSwapchain();
bool CreateSwapchainRenderTarget();
public:

View File

@ -6,6 +6,8 @@ GPUCmdBuffer::GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb)
{
dev_attr=attr;
cmd_buf=cb;
cmd_begin=false;
}
GPUCmdBuffer::~GPUCmdBuffer()
@ -22,6 +24,7 @@ bool GPUCmdBuffer::Begin()
if(vkBeginCommandBuffer(cmd_buf, &cmd_buf_info)!=VK_SUCCESS)
return(false);
cmd_begin=true;
return(true);
}

View File

@ -1,5 +1,6 @@
#include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKSemaphore.h>
#include<hgl/graph/VKCommandBuffer.h>
VK_NAMESPACE_BEGIN
namespace
@ -91,8 +92,13 @@ bool DeviceQueue::Submit(const VkCommandBuffer *cmd_buf,const uint32_t cb_count,
return(result==VK_SUCCESS);
}
bool DeviceQueue::Submit(const VkCommandBuffer &cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem)
bool DeviceQueue::Submit(GPUCmdBuffer *cmd_buf,Semaphore *wait_sem,Semaphore *complete_sem)
{
return Submit(&cmd_buf,1,wait_sem,complete_sem);
if(cmd_buf->IsBegin())
cmd_buf->End();
VkCommandBuffer vk_cmd=*cmd_buf;
return Submit(&vk_cmd,1,wait_sem,complete_sem);
}
VK_NAMESPACE_END

View File

@ -24,17 +24,22 @@ SwapchainRenderTarget::~SwapchainRenderTarget()
delete swapchain;
}
int SwapchainRenderTarget::AcquireNextImage()
RenderCmdBuffer *SwapchainRenderTarget::AcquireNextImage()
{
if(vkAcquireNextImageKHR(device,
swapchain->swap_chain,
UINT64_MAX,
*present_complete_semaphore,
VK_NULL_HANDLE,
&current_frame)==VK_SUCCESS)
return current_frame;
&current_frame)!=VK_SUCCESS)
return(nullptr);
return -1;
SwapchainImage *sc_image=&(swapchain->sc_image[current_frame]);
sc_image->cmd_buf->Begin();
sc_image->cmd_buf->BindFramebuffer(sc_image->fbo);
return sc_image->cmd_buf;
}
bool SwapchainRenderTarget::PresentBackbuffer()

View File

@ -96,7 +96,7 @@ namespace
}
}//namespace
bool SwapchainModule::CreateSwapchainFBO()
bool SwapchainModule::CreateSwapchainFBO(Swapchain *swapchain)
{
if(vkGetSwapchainImagesKHR(swapchain->device,swapchain->swap_chain,&(swapchain->image_count),nullptr)!=VK_SUCCESS)
return(false);
@ -119,7 +119,7 @@ bool SwapchainModule::CreateSwapchainFBO()
if(!swapchain->sc_image[i].color)
return(false);
swapchain->sc_image[i].depth =tex_manager->CreateTexture2D(new SwapchainDepthTextureCreateInfo(swapchain->depth_format,swapchain->extent));
swapchain->sc_image[i].depth=tex_manager->CreateTexture2D(new SwapchainDepthTextureCreateInfo(swapchain->depth_format,swapchain->extent));
if(!swapchain->sc_image[i].depth)
return(false);
@ -146,14 +146,14 @@ bool SwapchainModule::CreateSwapchainFBO()
return(true);
}
bool SwapchainModule::CreateSwapchain()
Swapchain *SwapchainModule::CreateSwapchain()
{
auto *dev_attr=GetDeviceAttribute();
if(!dev_attr)
return(false);
return(nullptr);
swapchain=new Swapchain;
Swapchain *swapchain=new Swapchain;
swapchain->device =dev_attr->device;
swapchain->extent =dev_attr->surface_caps.currentExtent;
@ -165,13 +165,13 @@ bool SwapchainModule::CreateSwapchain()
if(swapchain->swap_chain)
{
if(CreateSwapchainFBO())
if(CreateSwapchainFBO(swapchain))
return swapchain;
}
delete swapchain;
swapchain=nullptr;
return(false);
return(nullptr);
}
namespace
@ -190,7 +190,9 @@ namespace
bool SwapchainModule::CreateSwapchainRenderTarget()
{
if(!CreateSwapchain())
Swapchain *swapchain=CreateSwapchain();
if(!swapchain)
return(false);
GPUDevice *device=GetDevice();
@ -259,7 +261,6 @@ SwapchainModule::SwapchainModule(GPUDevice *dev,TextureManager *tm,RenderTargetM
void SwapchainModule::OnResize(const VkExtent2D &extent)
{
SAFE_CLEAR(sc_render_target)
swapchain=nullptr;
GetDeviceAttribute()->RefreshSurfaceCaps();
@ -268,31 +269,15 @@ void SwapchainModule::OnResize(const VkExtent2D &extent)
RenderCmdBuffer *SwapchainModule::BeginRender()
{
const int index=sc_render_target->AcquireNextImage();
if(index<0||index>=swapchain->image_count)
return(nullptr);
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;
return sc_render_target->AcquireNextImage();
}
void SwapchainModule::EndRender()
{
if(!current_sc_image)
return;
current_sc_image->cmd_buf->End();
sc_render_target->Submit();
sc_render_target->PresentBackbuffer();
sc_render_target->WaitQueue();
sc_render_target->WaitFence();
current_sc_image=nullptr;
}
VK_NAMESPACE_END