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