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; VkCommandBuffer cmd_buf;
bool cmd_begin;
public: public:
GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb); GPUCmdBuffer(const GPUDeviceAttribute *attr,VkCommandBuffer cb);
@ -23,9 +25,19 @@ public:
operator VkCommandBuffer(){return cmd_buf;} operator VkCommandBuffer(){return cmd_buf;}
operator const VkCommandBuffer()const{return cmd_buf;} operator const VkCommandBuffer()const{return cmd_buf;}
operator const VkCommandBuffer *()const{return &cmd_buf;} operator const VkCommandBuffer *()const{return &cmd_buf;}
const bool IsBegin()const{return cmd_begin;}
bool 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 #ifdef _DEBUG
void SetDebugName(const AnsiString &); void SetDebugName(const AnsiString &);

View File

@ -33,8 +33,8 @@ public:
bool WaitQueue(); bool WaitQueue();
bool WaitFence(const bool wait_all=true,const uint64_t time_out=HGL_NANO_SEC_PER_SEC); 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(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 };//class DeviceQueue
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_SUBMIT_QUEUE_INCLUDE #endif//HGL_GRAPH_VULKAN_SUBMIT_QUEUE_INCLUDE

View File

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

View File

@ -10,8 +10,6 @@ class RenderPass;
GRAPH_MODULE_CLASS(SwapchainModule) GRAPH_MODULE_CLASS(SwapchainModule)
{ {
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;
@ -20,12 +18,10 @@ GRAPH_MODULE_CLASS(SwapchainModule)
SwapchainRenderTarget * sc_render_target=nullptr; SwapchainRenderTarget * sc_render_target=nullptr;
SwapchainImage * current_sc_image=nullptr;
protected: protected:
bool CreateSwapchainFBO(); bool CreateSwapchainFBO(Swapchain *);
bool CreateSwapchain(); Swapchain *CreateSwapchain();
bool CreateSwapchainRenderTarget(); bool CreateSwapchainRenderTarget();
public: public:

View File

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

View File

@ -1,5 +1,6 @@
#include<hgl/graph/VKQueue.h> #include<hgl/graph/VKQueue.h>
#include<hgl/graph/VKSemaphore.h> #include<hgl/graph/VKSemaphore.h>
#include<hgl/graph/VKCommandBuffer.h>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
namespace namespace
@ -91,8 +92,13 @@ bool DeviceQueue::Submit(const VkCommandBuffer *cmd_buf,const uint32_t cb_count,
return(result==VK_SUCCESS); 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 VK_NAMESPACE_END

View File

@ -24,17 +24,22 @@ SwapchainRenderTarget::~SwapchainRenderTarget()
delete swapchain; delete swapchain;
} }
int SwapchainRenderTarget::AcquireNextImage() RenderCmdBuffer *SwapchainRenderTarget::AcquireNextImage()
{ {
if(vkAcquireNextImageKHR(device, if(vkAcquireNextImageKHR(device,
swapchain->swap_chain, swapchain->swap_chain,
UINT64_MAX, UINT64_MAX,
*present_complete_semaphore, *present_complete_semaphore,
VK_NULL_HANDLE, VK_NULL_HANDLE,
&current_frame)==VK_SUCCESS) &current_frame)!=VK_SUCCESS)
return current_frame; 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() bool SwapchainRenderTarget::PresentBackbuffer()

View File

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