add present_complete_semaphore in SwapchainRenderTarget

This commit is contained in:
hyzboy 2020-10-18 13:55:12 +08:00
parent ed2feb9165
commit 6c869916df
5 changed files with 45 additions and 37 deletions

View File

@ -49,9 +49,6 @@ protected:
vulkan::Device * device =nullptr;
vulkan::SwapchainRenderTarget * sc_render_target =nullptr;
vulkan::Semaphore * present_complete_semaphore =nullptr,
* render_complete_semaphore =nullptr;
protected:
int32_t swap_chain_count =0;
@ -68,9 +65,6 @@ public:
virtual ~VulkanApplicationFramework()
{
SAFE_CLEAR(present_complete_semaphore);
SAFE_CLEAR(render_complete_semaphore);
SAFE_CLEAR(db);
SAFE_CLEAR_OBJECT_ARRAY(cmd_buf,swap_chain_count);
@ -119,9 +113,6 @@ public:
if(!device)
return(false);
present_complete_semaphore =device->CreateSem();
render_complete_semaphore =device->CreateSem();
db=new vulkan::Database(device);
InitCommandBuffer();
@ -182,7 +173,7 @@ public:
const vulkan::IndexBuffer *ib=ri->GetIndexBuffer();
cb->Begin();
cb->BeginRenderPass(rt->GetRenderPass(),rt->GetFramebuffer());
cb->BindFramebuffer(rt);
cb->BindPipeline(ri->GetPipeline());
cb->BindDescriptorSets(ri->GetDescriptorSets());
cb->BindVAB(ri);
@ -206,7 +197,7 @@ public:
vulkan::CommandBuffer *cb=cmd_buf[index];
cb->Begin();
cb->BeginRenderPass(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
cb->BindPipeline(ri->GetPipeline());
cb->BindDescriptorSets(ri->GetDescriptorSets());
cb->BindVAB(ri);
@ -238,7 +229,7 @@ public:
vulkan::CommandBuffer *cb=cmd_buf[index];
cb->Begin();
cb->BeginRenderPass(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
cb->BindFramebuffer(sc_render_target->GetRenderPass(),sc_render_target->GetFramebuffer(index));
rl->Render(cb);
cb->EndRenderPass();
cb->End();
@ -259,17 +250,17 @@ public:
int AcquireNextImage()
{
return sc_render_target->AcquireNextImage(*present_complete_semaphore);
return sc_render_target->AcquireNextImage();
}
virtual void SubmitDraw(int index)
{
VkCommandBuffer cb=*cmd_buf[index];
sc_render_target->SubmitQueue::Submit(cb,present_complete_semaphore,render_complete_semaphore);
sc_render_target->PresentBackbuffer(*render_complete_semaphore);
sc_render_target->QueueWaitIdle();
sc_render_target->Wait();
sc_render_target->Submit(cb);
sc_render_target->PresentBackbuffer();
sc_render_target->WaitQueue();
sc_render_target->WaitFence();
}
virtual void Draw()

View File

@ -18,7 +18,7 @@ protected:
VkExtent2D extent;
Semaphore * render_complete_semaphore =nullptr;
GPUSemaphore * render_complete_semaphore =nullptr;
CommandBuffer * command_buffer =nullptr;
protected:
@ -38,7 +38,7 @@ public:
virtual ~RenderTarget();
const VkExtent2D & GetExtent ()const {return extent;}
Semaphore * GetCompleteSemaphore(){return render_complete_semaphore;}
GPUSemaphore * GetCompleteSemaphore(){return render_complete_semaphore;}
CommandBuffer * GetCommandBuffer () {return command_buffer;}
virtual const VkRenderPass GetRenderPass ()const {return fb->GetRenderPass();}
virtual const uint32_t GetColorCount ()const {return fb->GetColorCount();}
@ -47,7 +47,7 @@ public:
virtual Texture2D * GetColorTexture (const int index=0){return color_texture[index];}
virtual Texture2D * GetDepthTexture (){return depth_texture;}
virtual bool Submit (Semaphore *present_complete_semaphore=nullptr);
virtual bool Submit (GPUSemaphore *present_complete_semaphore=nullptr);
};//class RenderTarget
/**
@ -59,6 +59,8 @@ class SwapchainRenderTarget:public RenderTarget
VkSwapchainKHR vk_swapchain;
PresentInfo present_info;
GPUSemaphore *present_complete_semaphore=nullptr;
RenderPass *main_rp=nullptr;
uint32_t swap_chain_count;
@ -79,6 +81,7 @@ public:
const uint32_t GetImageCount ()const {return swap_chain_count;}
const uint32_t GetCurrentFrameIndices()const{return current_frame;}
GPUSemaphore * GetPresentCompleteSemaphore(){return present_complete_semaphore;}
virtual Texture2D * GetColorTexture(const int index=0) override{return swapchain->GetColorTexture(index);}
virtual Texture2D * GetDepthTexture() override{return swapchain->GetDepthTexture();}
@ -89,18 +92,17 @@ public:
*
* @param present_complete_semaphore
*/
int AcquireNextImage(VkSemaphore present_complete_semaphore);
int AcquireNextImage();
/**
*
* @param render_complete_semaphore
*/
bool PresentBackbuffer(VkSemaphore *render_complete_semaphore,const uint32_t count);
bool PresentBackbuffer(VkSemaphore *wait_semaphores,const uint32_t wait_semaphore_count);
bool PresentBackbuffer(VkSemaphore render_complete_semaphore)
{
return PresentBackbuffer(&render_complete_semaphore,1);
}
bool PresentBackbuffer();
bool Submit(VkCommandBuffer);
};//class SwapchainRenderTarget:public RenderTarget
VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_RENDER_TARGET_INCLUDE

View File

@ -92,7 +92,7 @@ Fence *Device::CreateFence(bool create_signaled)
return(new Fence(attr->device,fence));
}
vulkan::Semaphore *Device::CreateSem()
vulkan::GPUSemaphore *Device::CreateSemaphore()
{
SemaphoreCreateInfo SemaphoreCreateInfo;
@ -101,6 +101,6 @@ vulkan::Semaphore *Device::CreateSem()
if(vkCreateSemaphore(attr->device, &SemaphoreCreateInfo, nullptr, &sem)!=VK_SUCCESS)
return(nullptr);
return(new vulkan::Semaphore(attr->device,sem));
return(new vulkan::GPUSemaphore(attr->device,sem));
}
VK_NAMESPACE_END

View File

@ -314,7 +314,7 @@ bool Device::SubmitTexture(const VkCommandBuffer *cmd_bufs,const uint32_t count)
return(false);
textureSQ->Submit(cmd_bufs,count,nullptr,nullptr);
textureSQ->Wait();
textureSQ->WaitFence();
return(true);
}

View File

@ -16,7 +16,7 @@ RenderTarget::RenderTarget(Device *dev,Framebuffer *_fb,CommandBuffer *_cb,const
command_buffer=_cb;
depth_texture=nullptr;
render_complete_semaphore=dev->CreateSem();
render_complete_semaphore=dev->CreateSemaphore();
}
RenderTarget::RenderTarget(Device *dev,Framebuffer *_fb,CommandBuffer *_cb,Texture2D **ctl,const uint32_t cc,Texture2D *dt,const uint32_t fence_count):SubmitQueue(dev,dev->GetGraphicsQueue(),fence_count)
@ -26,7 +26,7 @@ RenderTarget::RenderTarget(Device *dev,Framebuffer *_fb,CommandBuffer *_cb,Textu
color_texture.Add(ctl,cc);
depth_texture=dt;
render_complete_semaphore=dev->CreateSem();
render_complete_semaphore=dev->CreateSemaphore();
}
RenderTarget::~RenderTarget()
@ -38,7 +38,7 @@ RenderTarget::~RenderTarget()
SAFE_CLEAR(command_buffer);
}
bool RenderTarget::Submit(Semaphore *present_complete_semaphore)
bool RenderTarget::Submit(GPUSemaphore *present_complete_semaphore)
{
return this->SubmitQueue::Submit(*command_buffer,present_complete_semaphore,render_complete_semaphore);
}
@ -70,27 +70,30 @@ SwapchainRenderTarget::SwapchainRenderTarget(Device *dev,Swapchain *sc):RenderTa
}
current_frame=0;
present_complete_semaphore=dev->CreateSemaphore();
}
SwapchainRenderTarget::~SwapchainRenderTarget()
{
render_frame.Clear();
delete present_complete_semaphore;
delete main_rp;
}
int SwapchainRenderTarget::AcquireNextImage(VkSemaphore present_complete_semaphore)
int SwapchainRenderTarget::AcquireNextImage()
{
if(vkAcquireNextImageKHR(device->GetDevice(),vk_swapchain,UINT64_MAX,present_complete_semaphore,VK_NULL_HANDLE,&current_frame)==VK_SUCCESS)
if(vkAcquireNextImageKHR(device->GetDevice(),vk_swapchain,UINT64_MAX,*(this->present_complete_semaphore),VK_NULL_HANDLE,&current_frame)==VK_SUCCESS)
return current_frame;
return -1;
}
bool SwapchainRenderTarget::PresentBackbuffer(VkSemaphore *render_complete_semaphore,const uint32_t count)
bool SwapchainRenderTarget::PresentBackbuffer(VkSemaphore *wait_semaphores,const uint32_t count)
{
present_info.waitSemaphoreCount =count;
present_info.pWaitSemaphores =render_complete_semaphore;
present_info.pWaitSemaphores =wait_semaphores;
present_info.pImageIndices =&current_frame;
VkResult result=vkQueuePresentKHR(queue,&present_info);
@ -106,4 +109,16 @@ bool SwapchainRenderTarget::PresentBackbuffer(VkSemaphore *render_complete_semap
return(true);
}
VK_NAMESPACE_END
bool SwapchainRenderTarget::PresentBackbuffer()
{
VkSemaphore sem=*render_complete_semaphore;
return this->PresentBackbuffer(&sem,1);
}
bool SwapchainRenderTarget::Submit(VkCommandBuffer cb)
{
return SubmitQueue::Submit(cb,present_complete_semaphore,render_complete_semaphore);
}
VK_NAMESPACE_END