diff --git a/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.hpp b/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.hpp index 8f19639c5..d34649164 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.hpp +++ b/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.hpp @@ -31,11 +31,12 @@ namespace Nz inline bool Present(const VkPresentInfoKHR& presentInfo) const; inline bool Present(VkSwapchainKHR swapchain, UInt32 imageIndex, VkSemaphore waitSemaphore = VK_NULL_HANDLE) const; + inline bool Submit(VkCommandBuffer commandBuffer, VkFence signalFence = VK_NULL_HANDLE) const; inline bool Submit(VkCommandBuffer commandBuffer, VkSemaphore waitSemaphore, VkPipelineStageFlags waitStage, VkSemaphore signalSemaphore, VkFence signalFence = VK_NULL_HANDLE) const; - inline bool Submit(VkCommandBuffer commandBuffer, std::initializer_list waitSemaphores, VkPipelineStageFlags waitStage, std::initializer_list signalSemaphores, VkFence signalFence = VK_NULL_HANDLE) const; - inline bool Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, std::initializer_list waitSemaphores, VkPipelineStageFlags waitStage, std::initializer_list signalSemaphores, VkFence signalFence = VK_NULL_HANDLE) const; + inline bool Submit(VkCommandBuffer commandBuffer, std::initializer_list waitSemaphores, std::initializer_list waitStages, std::initializer_list signalSemaphores, VkFence signalFence = VK_NULL_HANDLE) const; + inline bool Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, std::initializer_list waitSemaphores, std::initializer_list waitStages, std::initializer_list signalSemaphores, VkFence signalFence = VK_NULL_HANDLE) const; inline bool Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, VkSemaphore waitSemaphore, VkPipelineStageFlags waitStage, VkSemaphore signalSemaphore, VkFence signalFence = VK_NULL_HANDLE) const; - inline bool Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, UInt32 waitSemaphoreCount, const VkSemaphore* waitSemaphores, VkPipelineStageFlags waitStage, UInt32 signalSemaphoreCount, const VkSemaphore* signalSemaphores, VkFence signalFence = VK_NULL_HANDLE) const; + inline bool Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, UInt32 waitSemaphoreCount, const VkSemaphore* waitSemaphores, const VkPipelineStageFlags* waitStage, UInt32 signalSemaphoreCount, const VkSemaphore* signalSemaphores, VkFence signalFence = VK_NULL_HANDLE) const; inline bool Submit(const VkSubmitInfo& submit, VkFence signalFence = VK_NULL_HANDLE) const; inline bool Submit(UInt32 submitCount, const VkSubmitInfo* submits, VkFence signalFence = VK_NULL_HANDLE) const; diff --git a/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.inl b/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.inl index 96bc080d0..20ee10c4e 100644 --- a/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.inl +++ b/include/Nazara/VulkanRenderer/Wrapper/QueueHandle.inl @@ -64,21 +64,29 @@ namespace Nz return Present(presentInfo); } + inline bool QueueHandle::Submit(VkCommandBuffer commandBuffer, VkFence signalFence) const + { + return Submit(1U, &commandBuffer, VK_NULL_HANDLE, 0, VK_NULL_HANDLE, signalFence); + } + inline bool QueueHandle::Submit(VkCommandBuffer commandBuffer, VkSemaphore waitSemaphore, VkPipelineStageFlags waitStage, VkSemaphore signalSemaphore, VkFence signalFence) const { return Submit(1U, &commandBuffer, waitSemaphore, waitStage, signalSemaphore, signalFence); } - inline bool QueueHandle::Submit(VkCommandBuffer commandBuffer, std::initializer_list waitSemaphores, VkPipelineStageFlags waitStage, std::initializer_list signalSemaphores, VkFence signalFence) const + inline bool QueueHandle::Submit(VkCommandBuffer commandBuffer, std::initializer_list waitSemaphores, std::initializer_list waitStage, std::initializer_list signalSemaphores, VkFence signalFence) const { return Submit(1U, &commandBuffer, waitSemaphores, waitStage, signalSemaphores, signalFence); } - inline bool QueueHandle::Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, std::initializer_list waitSemaphores, VkPipelineStageFlags waitStage, std::initializer_list signalSemaphores, VkFence signalFence) const + inline bool QueueHandle::Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, std::initializer_list waitSemaphores, std::initializer_list waitStages, std::initializer_list signalSemaphores, VkFence signalFence) const { + NazaraAssert(waitSemaphores.size() == waitStages.size(), "Wait stage count must match wait semaphores count"); + // Make continuous array of semaphores (initializer_list doesn't have that guarantee) StackArray signalSemaphoresCont = NazaraStackArrayNoInit(VkSemaphore, signalSemaphores.size()); StackArray waitSemaphoresCont = NazaraStackArrayNoInit(VkSemaphore, waitSemaphores.size()); + StackArray waitStageCont = NazaraStackArrayNoInit(VkPipelineStageFlags, waitStages.size()); std::size_t i; i = 0; @@ -89,22 +97,26 @@ namespace Nz for (VkSemaphore semaphore : waitSemaphores) waitSemaphoresCont[i++] = semaphore; - return Submit(commandBufferCount, commandBuffers, UInt32(waitSemaphoresCont.size()), waitSemaphoresCont.data(), waitStage, UInt32(signalSemaphoresCont.size()), signalSemaphoresCont.data(), signalFence); + i = 0; + for (VkPipelineStageFlags flags : waitStages) + waitStageCont[i++] = flags; + + return Submit(commandBufferCount, commandBuffers, UInt32(waitSemaphoresCont.size()), waitSemaphoresCont.data(), waitStageCont.data(), UInt32(signalSemaphoresCont.size()), signalSemaphoresCont.data(), signalFence); } inline bool QueueHandle::Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, VkSemaphore waitSemaphore, VkPipelineStageFlags waitStage, VkSemaphore signalSemaphore, VkFence signalFence) const { - return Submit(commandBufferCount, commandBuffers, (waitSemaphore) ? 1U : 0U, &waitSemaphore, waitStage, (signalSemaphore) ? 1U : 0U, &signalSemaphore, signalFence); + return Submit(commandBufferCount, commandBuffers, (waitSemaphore) ? 1U : 0U, &waitSemaphore, &waitStage, (signalSemaphore) ? 1U : 0U, &signalSemaphore, signalFence); } - inline bool QueueHandle::Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, UInt32 waitSemaphoreCount, const VkSemaphore* waitSemaphores, VkPipelineStageFlags waitStage, UInt32 signalSemaphoreCount, const VkSemaphore* signalSemaphores, VkFence signalFence) const + inline bool QueueHandle::Submit(UInt32 commandBufferCount, const VkCommandBuffer* commandBuffers, UInt32 waitSemaphoreCount, const VkSemaphore* waitSemaphores, const VkPipelineStageFlags* waitStages, UInt32 signalSemaphoreCount, const VkSemaphore* signalSemaphores, VkFence signalFence) const { VkSubmitInfo submitInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, waitSemaphoreCount, waitSemaphores, - &waitStage, + waitStages, commandBufferCount, commandBuffers, signalSemaphoreCount,