optimized SwapchainModule and SwapchainRenderTarget
This commit is contained in:
parent
74a5847bbc
commit
f0a582271e
@ -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 &);
|
||||
|
@ -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
|
||||
|
@ -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(); ///<推送后台画面到前台
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
¤t_frame)==VK_SUCCESS)
|
||||
return current_frame;
|
||||
¤t_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()
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user