From 6c869916df5d26c5444475e6c02c1650232d7977 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Sun, 18 Oct 2020 13:55:12 +0800 Subject: [PATCH] add present_complete_semaphore in SwapchainRenderTarget --- example/common/VulkanAppFramework.h | 25 ++++++----------- inc/hgl/graph/vulkan/VKRenderTarget.h | 20 +++++++------ src/RenderDevice/Vulkan/VKDevice.cpp | 4 +-- src/RenderDevice/Vulkan/VKDeviceTexture.cpp | 2 +- src/RenderDevice/Vulkan/VKRenderTarget.cpp | 31 +++++++++++++++------ 5 files changed, 45 insertions(+), 37 deletions(-) diff --git a/example/common/VulkanAppFramework.h b/example/common/VulkanAppFramework.h index 34ef7cc3..719178d5 100644 --- a/example/common/VulkanAppFramework.h +++ b/example/common/VulkanAppFramework.h @@ -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() diff --git a/inc/hgl/graph/vulkan/VKRenderTarget.h b/inc/hgl/graph/vulkan/VKRenderTarget.h index 9b727c4e..d02da7b5 100644 --- a/inc/hgl/graph/vulkan/VKRenderTarget.h +++ b/inc/hgl/graph/vulkan/VKRenderTarget.h @@ -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 diff --git a/src/RenderDevice/Vulkan/VKDevice.cpp b/src/RenderDevice/Vulkan/VKDevice.cpp index 6d015979..3a92222f 100644 --- a/src/RenderDevice/Vulkan/VKDevice.cpp +++ b/src/RenderDevice/Vulkan/VKDevice.cpp @@ -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 diff --git a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp index ecb6d1ee..d42e9c88 100644 --- a/src/RenderDevice/Vulkan/VKDeviceTexture.cpp +++ b/src/RenderDevice/Vulkan/VKDeviceTexture.cpp @@ -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); } diff --git a/src/RenderDevice/Vulkan/VKRenderTarget.cpp b/src/RenderDevice/Vulkan/VKRenderTarget.cpp index 874aca5a..e48cca91 100644 --- a/src/RenderDevice/Vulkan/VKRenderTarget.cpp +++ b/src/RenderDevice/Vulkan/VKRenderTarget.cpp @@ -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 \ No newline at end of file