diff --git a/example/Vulkan/VulkanAppFramework.h b/example/Vulkan/VulkanAppFramework.h index 8ddf5f86..c6039c9e 100644 --- a/example/Vulkan/VulkanAppFramework.h +++ b/example/Vulkan/VulkanAppFramework.h @@ -195,20 +195,17 @@ private: device->AcquireNextImage(); } - void Submit(const VkCommandBuffer cmd_buf) - { - device->SubmitDraw(&cmd_buf); - device->Wait(); - device->QueuePresent(); - } - public: virtual void Draw() { - const vulkan::CommandBuffer *cb=cmd_buf[device->GetCurrentFrameIndices()]; + uint32_t index=device->GetCurrentFrameIndices(); - Submit(*cb); + VkCommandBuffer cb=*cmd_buf[index]; + + device->SubmitDraw(&cb); + device->Wait(&index); + device->QueuePresent(); } bool Run() diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index c1999e5e..668e6f05 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include VK_NAMESPACE_BEGIN @@ -15,16 +17,38 @@ class Device { DeviceAttribute *attr; - Semaphore *image_acquired_semaphore; - Fence *draw_fence,*texture_fence; + struct RenderFrame + { + Framebuffer *frame_buffer=nullptr; + + Semaphore *present_complete_semaphore=nullptr, + *render_complete_semaphore=nullptr; + + Fence *draw_fence=nullptr; + + public: + + ~RenderFrame() + { + SAFE_CLEAR(frame_buffer); + + SAFE_CLEAR(present_complete_semaphore); + SAFE_CLEAR(render_complete_semaphore); + SAFE_CLEAR(draw_fence); + } + };//struct RenderFrame + + void Create(RenderFrame *); + + Fence *texture_fence; VkSubmitInfo texture_submitInfo; CommandBuffer *texture_cmd_buf; RenderPass *main_rp; - ObjectList main_fb; uint32_t current_frame; + ObjectList render_frame; VkPresentInfoKHR present; @@ -59,9 +83,9 @@ public: ImageView *GetDepthImageView () {return attr->depth.view;} RenderPass * GetRenderPass () {return main_rp;} - Framebuffer * GetFramebuffer (int index) {return main_fb[index];} + Framebuffer * GetFramebuffer (int index) {return render_frame[index]->frame_buffer;} const uint32_t GetCurrentFrameIndices () {return current_frame;} - Framebuffer * GetCurrentFramebuffer () {return main_fb[current_frame];} + Framebuffer * GetCurrentFramebuffer () {return render_frame[current_frame]->frame_buffer;} bool Resize (uint,uint); diff --git a/src/RenderDevice/Vulkan/VKDevice.cpp b/src/RenderDevice/Vulkan/VKDevice.cpp index 1a6a7c02..cc0a6fb5 100644 --- a/src/RenderDevice/Vulkan/VKDevice.cpp +++ b/src/RenderDevice/Vulkan/VKDevice.cpp @@ -5,8 +5,6 @@ //#include #include #include -#include -#include #include #include @@ -19,8 +17,6 @@ Device::Device(DeviceAttribute *da) current_frame=0; - image_acquired_semaphore=this->CreateSem(); - draw_fence=this->CreateFence(); texture_fence=this->CreateFence(); hgl_zero(texture_submitInfo); @@ -33,38 +29,43 @@ Device::Device(DeviceAttribute *da) Device::~Device() { - main_fb.Clear(); + render_frame.Clear(); delete main_rp; - delete image_acquired_semaphore; - delete texture_cmd_buf; delete texture_fence; - delete draw_fence; delete attr; } void Device::RecreateDevice() { - main_fb.Clear(); + render_frame.Clear(); if(main_rp)delete main_rp; if(texture_cmd_buf)delete texture_cmd_buf; - present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; - present.pNext = nullptr; - present.swapchainCount = 1; - present.pSwapchains = &attr->swap_chain; - present.pWaitSemaphores = nullptr; - present.waitSemaphoreCount = 0; - present.pResults = nullptr; + present.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + present.pNext = nullptr; + present.swapchainCount = 1; + present.pSwapchains = &attr->swap_chain; + present.pResults = nullptr; main_rp=CreateRenderPass(attr->sc_image_views[0]->GetFormat(),attr->depth.view->GetFormat()); + const int sc_count=attr->sc_image_views.GetCount(); for(int i=0;isc_image_views[i],attr->depth.view)); + { + RenderFrame *rf=new RenderFrame; + + rf->frame_buffer =vulkan::CreateFramebuffer(this,main_rp,attr->sc_image_views[i],attr->depth.view); + rf->present_complete_semaphore =this->CreateSem(); + rf->render_complete_semaphore =this->CreateSem(); + rf->draw_fence =this->CreateFence(); + + render_frame.Add(rf); + } texture_cmd_buf=CreateCommandBuffer(); } @@ -226,7 +227,9 @@ ShaderModuleManage *Device::CreateShaderModuleManage() bool Device::AcquireNextImage() { - return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*image_acquired_semaphore,VK_NULL_HANDLE,¤t_frame)==VK_SUCCESS); + VkSemaphore present_complete_semaphore=*(render_frame[current_frame]->present_complete_semaphore); + + return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,present_complete_semaphore,VK_NULL_HANDLE,¤t_frame)==VK_SUCCESS); } bool Device::SubmitDraw(const VkCommandBuffer *cmd_bufs,const uint32_t count) @@ -237,26 +240,31 @@ bool Device::SubmitDraw(const VkCommandBuffer *cmd_bufs,const uint32_t count) VkPipelineStageFlags pipe_stage_flags = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; VkSubmitInfo submit_info = {}; - VkSemaphore wait_sem=*image_acquired_semaphore; + RenderFrame *rf=render_frame[current_frame]; + + VkSemaphore present_sem=*(rf->present_complete_semaphore); + VkSemaphore complete_sem=*(rf->render_complete_semaphore); submit_info.pNext = nullptr; submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; submit_info.waitSemaphoreCount = 1; - submit_info.pWaitSemaphores = &wait_sem; + submit_info.pWaitSemaphores = &present_sem; submit_info.pWaitDstStageMask = &pipe_stage_flags; submit_info.commandBufferCount = count; submit_info.pCommandBuffers = cmd_bufs; - submit_info.signalSemaphoreCount = 0; - submit_info.pSignalSemaphores = nullptr; + submit_info.signalSemaphoreCount = 1; + submit_info.pSignalSemaphores = &complete_sem; - return(vkQueueSubmit(attr->graphics_queue, 1, &submit_info, *draw_fence)==VK_SUCCESS); + VkFence fence=*(rf->draw_fence); + + return(vkQueueSubmit(attr->graphics_queue,1,&submit_info,fence)==VK_SUCCESS); } bool Device::Wait(bool wait_all,uint64_t time_out) { - VkFence fence=*draw_fence; - - vkWaitForFences(attr->device, 1, &fence, wait_all, time_out); + VkFence fence=*(render_frame[current_frame]->draw_fence); + + while(vkWaitForFences(attr->device,1,&fence,wait_all,time_out)==VK_TIMEOUT){} vkResetFences(attr->device,1,&fence); return(true); @@ -264,9 +272,11 @@ bool Device::Wait(bool wait_all,uint64_t time_out) bool Device::QueuePresent() { + VkSemaphore render_complete_semaphore=*(render_frame[current_frame]->render_complete_semaphore); + present.pImageIndices = ¤t_frame; - present.waitSemaphoreCount = 0; - present.pWaitSemaphores = nullptr; + present.waitSemaphoreCount = 1; + present.pWaitSemaphores = &render_complete_semaphore; return(vkQueuePresentKHR(attr->present_queue, &present)==VK_SUCCESS); }