diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index 985b7974e..910a17e1f 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -325,6 +325,40 @@ void VulkanResourceManager::SerialiseImageStates(map & else ++it; } + + // try to merge images that have been split up by subresource but are now all in the same state + // again. + for(auto it = states.begin(); it != states.end(); ++it) + { + ImageLayouts &layouts = it->second; + + if(layouts.subresourceStates.size() > 1 && + layouts.subresourceStates.size() == layouts.layerCount * layouts.levelCount) + { + VkImageLayout layout = layouts.subresourceStates[0].newLayout; + + bool allIdentical = true; + + for(size_t i = 0; i < layouts.subresourceStates.size(); i++) + { + if(layouts.subresourceStates[i].newLayout != layout) + { + allIdentical = false; + break; + } + } + + if(allIdentical) + { + layouts.subresourceStates.erase(layouts.subresourceStates.begin() + 1, + layouts.subresourceStates.end()); + layouts.subresourceStates[0].subresourceRange.baseArrayLayer = 0; + layouts.subresourceStates[0].subresourceRange.baseMipLevel = 0; + layouts.subresourceStates[0].subresourceRange.layerCount = layouts.layerCount; + layouts.subresourceStates[0].subresourceRange.levelCount = layouts.levelCount; + } + } + } } void VulkanResourceManager::MarkSparseMapReferenced(SparseMapping *sparse)