add present_complete_semaphore in SwapchainRenderTarget
This commit is contained in:
parent
ed2feb9165
commit
6c869916df
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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,¤t_frame)==VK_SUCCESS)
|
||||
if(vkAcquireNextImageKHR(device->GetDevice(),vk_swapchain,UINT64_MAX,*(this->present_complete_semaphore),VK_NULL_HANDLE,¤t_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 =¤t_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
|
Loading…
x
Reference in New Issue
Block a user