From 1a2b2cca857870c235b31dafce06c483fdc41acc Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 5 Sep 2016 12:54:01 +0200 Subject: [PATCH] Mark resources as dirty when possibly written to in command buffers --- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index fe740c4d8..fe3dfb8be 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1382,6 +1382,25 @@ void WrappedVulkan::vkCmdBindDescriptorSets(VkCommandBuffer commandBuffer, record->AddChunk(scope.Get()); record->MarkResourceFrameReferenced(GetResID(layout), eFrameRef_Read); record->cmdInfo->boundDescSets.insert(pDescriptorSets, pDescriptorSets + setCount); + + // conservatively mark all writeable objects in the descriptor set as dirty here. + // Technically not all might be written although that required verifying what the + // shader does and is a large problem space. The binding could be overridden though + // but per Vulkan ethos we consider that the application's problem to solve. Plus, + // it would mean we'd need to dirty every drawcall instead of just every bind at + // lower frequency. + for(uint32_t i = 0; i < setCount; i++) + { + VkResourceRecord *descSet = GetRecord(pDescriptorSets[i]); + + map > &frameRefs = descSet->descInfo->bindFrameRefs; + + for(auto it = frameRefs.begin(); it != frameRefs.end(); ++it) + { + if(it->second.second == eFrameRef_Write || it->second.second == eFrameRef_ReadBeforeWrite) + record->cmdInfo->dirtied.insert(it->first); + } + } } }