From 3ef0c52e738eeb621f6f5bffe5cf46484364db35 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 11 Sep 2017 18:19:12 +0100 Subject: [PATCH] Add single-flush-validate code to queue submission --- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 29e2baf1f..5e1c2d2a9 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -316,9 +316,22 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue submitInfo.commandBufferCount = (uint32_t)rerecordedCmds.size(); submitInfo.pCommandBuffers = &rerecordedCmds[0]; + +#if ENABLED(SINGLE_FLUSH_VALIDATE) + uint32_t cmdCount = submitInfo.commandBufferCount; + submitInfo.commandBufferCount = 1; + for(uint32_t i = 0; i < cmdCount; i++) + { + ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, VK_NULL_HANDLE); + submitInfo.pCommandBuffers++; + + FlushQ(); + } +#else // don't submit the fence, since we have nothing to wait on it being signalled, and we might // not have it correctly in the unsignalled state. ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, VK_NULL_HANDLE); +#endif } else if(m_LastEventID > startEID && m_LastEventID < m_RootEventID) { @@ -373,9 +386,22 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue submitInfo.commandBufferCount = (uint32_t)trimmedCmds.size(); submitInfo.pCommandBuffers = &trimmedCmds[0]; + +#if ENABLED(SINGLE_FLUSH_VALIDATE) + uint32_t cmdCount = submitInfo.commandBufferCount; + submitInfo.commandBufferCount = 1; + for(uint32_t i = 0; i < cmdCount; i++) + { + ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, VK_NULL_HANDLE); + submitInfo.pCommandBuffers++; + + FlushQ(); + } +#else // don't submit the fence, since we have nothing to wait on it being signalled, and we might // not have it correctly in the unsignalled state. ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, VK_NULL_HANDLE); +#endif for(uint32_t i = 0; i < trimmedCmdIds.size(); i++) { @@ -389,9 +415,21 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue RDCDEBUG("Queue Submit full replay %u >= %u", m_LastEventID, m_RootEventID); #endif +#if ENABLED(SINGLE_FLUSH_VALIDATE) + uint32_t cmdCount = submitInfo.commandBufferCount; + submitInfo.commandBufferCount = 1; + for(uint32_t i = 0; i < cmdCount; i++) + { + ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, VK_NULL_HANDLE); + submitInfo.pCommandBuffers++; + + FlushQ(); + } +#else // don't submit the fence, since we have nothing to wait on it being signalled, and we might // not have it correctly in the unsignalled state. ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, VK_NULL_HANDLE); +#endif for(uint32_t i = 0; i < numCmds; i++) { @@ -401,6 +439,10 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue } } +#if ENABLED(SINGLE_FLUSH_VALIDATE) + FlushQ(); +#endif + SAFE_DELETE_ARRAY(cmds); return true;