diff --git a/inc/hgl/graph/vulkan/VKDevice.h b/inc/hgl/graph/vulkan/VKDevice.h index 63918266..d08b8af4 100644 --- a/inc/hgl/graph/vulkan/VKDevice.h +++ b/inc/hgl/graph/vulkan/VKDevice.h @@ -198,9 +198,22 @@ public: //Command Buffer 相关 public: //提交相关 bool Wait (bool wait_all=VK_TRUE,uint64_t time_out=HGL_NANO_SEC_PER_SEC*0.1); ///<等待队列完成 - bool AcquireNextImage (); ///<请求获得下一帧的索引 - bool SubmitDraw (const VkCommandBuffer *,const uint32_t count=1); ///<提交绘制指令 + + /** + * 请求获得下一帧的索引,并将确认信息发送到指定信号 + */ + bool AcquireNextImage (VkSemaphore); ///<请求获得下一帧的索引 + + /** + * 提交一批绘制指令 + * @param cmd_list 绘制指令 + * @param wait_sems 指令开始前要等待的确认的信号 + * @param complete_semaphores 绘制完成后发送的信号 + */ + bool SubmitDraw (List &cmd_list,List &wait_sems,List &complete_semaphores); ///<提交绘制指令 + bool SubmitTexture (const VkCommandBuffer *cmd_bufs,const uint32_t count=1); ///<提交纹理处理到队列 + bool PresentBackbuffer (); ///<等待绘制队列完成,并将后台缓冲区呈现到前台 };//class Device VK_NAMESPACE_END diff --git a/src/RenderDevice/Vulkan/VKDevice.cpp b/src/RenderDevice/Vulkan/VKDevice.cpp index 51e50b00..a2b88d8f 100644 --- a/src/RenderDevice/Vulkan/VKDevice.cpp +++ b/src/RenderDevice/Vulkan/VKDevice.cpp @@ -172,18 +172,22 @@ bool Device::Wait(bool wait_all,uint64_t time_out) return(true); } -bool Device::AcquireNextImage() +bool Device::AcquireNextImage(VkSemaphore present_complete_semaphore) { - return(vkAcquireNextImageKHR(attr->device,attr->swap_chain,UINT64_MAX,*present_complete_semaphore,VK_NULL_HANDLE,¤t_frame)==VK_SUCCESS); + 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) +bool Device::SubmitDraw(List &cmd_lists,List &wait_sems,List &complete_sems) { - if(!cmd_bufs||count<=0) + if(cmd_lists.GetCount()<=0) return(false); - - submit_info.commandBufferCount = count; - submit_info.pCommandBuffers = cmd_bufs; + + submit_info.waitSemaphoreCount =wait_sems.GetCount(); + submit_info.pWaitSemaphores =wait_sems.GetData(); + submit_info.commandBufferCount =cmd_lists.GetCount(); + submit_info.pCommandBuffers =cmd_lists.GetData(); + submit_info.signalSemaphoreCount=complete_sems.GetCount(); + submit_info.pSignalSemaphores =complete_sems.GetData(); VkFence fence=*fence_list[current_fence];