From a595df5cf78bea53436df41cbddfb35451162a68 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 6 Oct 2015 21:50:13 +0200 Subject: [PATCH] Don't mark ref'd descriptor sets that are just updated. --- renderdoc/driver/vulkan/vk_initstate.cpp | 7 +++++- .../vulkan/wrappers/vk_descriptor_funcs.cpp | 25 ++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_initstate.cpp b/renderdoc/driver/vulkan/vk_initstate.cpp index bbc3e0eea..41837aabc 100644 --- a/renderdoc/driver/vulkan/vk_initstate.cpp +++ b/renderdoc/driver/vulkan/vk_initstate.cpp @@ -382,7 +382,12 @@ void WrappedVulkan::Create_InitialState(ResourceId id, WrappedVkRes *live, bool if(type == eResDescriptorSet) { - RDCERR("Unexpected attempt to create initial state for descriptor set"); + // VKTODOMED need to create some default initial state for descriptor sets. + // if a descriptor set is alloc'd then used in frame we won't have prepared anything, + // but likewise all writes must happen within that frame so the initial state doesn't + // technically matter. We assume the app doesn't try to read from an uninitialised + // descriptor, so for now we can leave the initial state empty. + VULKANNOTIMP("Need to create initial state for descriptor set"); } else if(type == eResImage) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp index bac16f1b8..6ff713b28 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_descriptor_funcs.cpp @@ -363,7 +363,11 @@ bool WrappedVulkan::Serialise_vkUpdateDescriptorSets( // will be invalid with some missing handles. It's safe though to just skip this // update as we only get here if it's never used. - bool valid = true; + // if a set was never bind, it will have been omitted and we just drop any writes to it + bool valid = (writeDesc.destSet != VK_NULL_HANDLE); + + if(!valid) + return true; switch(writeDesc.descriptorType) { @@ -501,6 +505,9 @@ VkResult WrappedVulkan::vkUpdateDescriptorSets( { if(m_State == WRITING_CAPFRAME) { + // don't have to mark referenced any of the resources pointed to by the descriptor set - that's handled + // on queue submission by marking ref'd all the current bindings of the sets referenced by the cmd buffer + for(uint32_t i=0; i < writeCount; i++) { { @@ -512,9 +519,11 @@ VkResult WrappedVulkan::vkUpdateDescriptorSets( m_FrameCaptureRecord->AddChunk(scope.Get()); } - // don't have to mark referenced any of the resources pointed to by the descriptor set - that's handled - // on queue submission by marking ref'd all the current bindings of the sets referenced by the cmd buffer - GetResourceManager()->MarkResourceFrameReferenced(GetResID(pDescriptorWrites[i].destSet), eFrameRef_Write); + // as long as descriptor sets are forced to have initial states, we don't have to mark them ref'd for + // write here. The reason being that as long as we only mark them as ref'd when they're actually bound, + // we can safely skip the ref here and it means any descriptor set updates of descriptor sets that are + // never used in the frame can be ignored. + //GetResourceManager()->MarkResourceFrameReferenced(GetResID(pDescriptorWrites[i].destSet), eFrameRef_Write); } for(uint32_t i=0; i < copyCount; i++) @@ -528,8 +537,12 @@ VkResult WrappedVulkan::vkUpdateDescriptorSets( m_FrameCaptureRecord->AddChunk(scope.Get()); } - GetResourceManager()->MarkResourceFrameReferenced(GetResID(pDescriptorCopies[i].destSet), eFrameRef_Write); - GetResourceManager()->MarkResourceFrameReferenced(GetResID(pDescriptorCopies[i].srcSet), eFrameRef_Read); + // as long as descriptor sets are forced to have initial states, we don't have to mark them ref'd for + // write here. The reason being that as long as we only mark them as ref'd when they're actually bound, + // we can safely skip the ref here and it means any descriptor set updates of descriptor sets that are + // never used in the frame can be ignored. + //GetResourceManager()->MarkResourceFrameReferenced(GetResID(pDescriptorCopies[i].destSet), eFrameRef_Write); + //GetResourceManager()->MarkResourceFrameReferenced(GetResID(pDescriptorCopies[i].srcSet), eFrameRef_Read); } }