From 2e439c0515a69f1c77631ead28c515450997fe1d Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 18 Apr 2016 12:22:30 +0200 Subject: [PATCH] Don't submit, signal, reset or wait on fences at all. * There's no point passing a fence to vkQueueSubmit to be signalled as it might not be in the right state, and we don't have anything going to wait for it. --- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 24 +++++++++++++------ .../driver/vulkan/wrappers/vk_sync_funcs.cpp | 16 ++++++------- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 3fe6801de..e11ce03c9 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -190,7 +190,9 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( if(m_State == READING) { - ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, Unwrap(fence)); + // 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); for(uint32_t i=0; i < numCmds; i++) { @@ -280,7 +282,9 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( submitInfo.commandBufferCount = (uint32_t)rerecordedCmds.size(); submitInfo.pCommandBuffers = &rerecordedCmds[0]; - ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, Unwrap(fence)); + // 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); } else if(m_LastEventID > startEID && m_LastEventID < m_RootEventID) { @@ -325,7 +329,9 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( submitInfo.commandBufferCount = (uint32_t)trimmedCmds.size(); submitInfo.pCommandBuffers = &trimmedCmds[0]; - ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, Unwrap(fence)); + // 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); for(uint32_t i=0; i < trimmedCmdIds.size(); i++) { @@ -336,8 +342,10 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( else { RDCDEBUG("Queue Submit full replay %u >= %u", m_LastEventID, m_RootEventID); - - ObjDisp(queue)->QueueSubmit(Unwrap(queue), 1, &submitInfo, Unwrap(fence)); + + // 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); for(uint32_t i=0; i < numCmds; i++) { @@ -714,8 +722,10 @@ bool WrappedVulkan::Serialise_vkQueueBindSparse( std::swap(im[i], im[noSemBindInfo.imageBindCount]); } } - - ObjDisp(queue)->QueueBindSparse(Unwrap(queue), 1, &noSemBindInfo, fence); + + // 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)->QueueBindSparse(Unwrap(queue), 1, &noSemBindInfo, VK_NULL_HANDLE); } return true; diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index 835cf8a5a..d1396ebf7 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -85,9 +85,9 @@ bool WrappedVulkan::Serialise_vkCreateFence( if(m_State == READING) { device = GetResourceManager()->GetLiveHandle(devId); - VkFence sem = VK_NULL_HANDLE; + VkFence fence = VK_NULL_HANDLE; - VkResult ret = ObjDisp(device)->CreateFence(Unwrap(device), &info, NULL, &sem); + VkResult ret = ObjDisp(device)->CreateFence(Unwrap(device), &info, NULL, &fence); if(ret != VK_SUCCESS) { @@ -95,8 +95,8 @@ bool WrappedVulkan::Serialise_vkCreateFence( } else { - ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), sem); - GetResourceManager()->AddLiveResource(id, sem); + ResourceId live = GetResourceManager()->WrapResource(Unwrap(device), fence); + GetResourceManager()->AddLiveResource(id, fence); } } @@ -203,12 +203,12 @@ bool WrappedVulkan::Serialise_vkResetFences( if(m_State < WRITING && !fences.empty()) { // we don't care about fence states ourselves as we cannot record them perfectly and just - // do full waitidle flushes. However if the fence is passed to vkQueueSubmit we need to - // make sure it is correctly unsignalled. - + // do full waitidle flushes. device = GetResourceManager()->GetLiveHandle(id); - ObjDisp(device)->ResetFences(Unwrap(device), (uint32_t)fences.size(), &fences[0]); + // since we don't have anything signalling or waiting on fences, don't bother to reset them + // either + //ObjDisp(device)->ResetFences(Unwrap(device), (uint32_t)fences.size(), &fences[0]); } return true;