From bc56fd091df915a4823a4bb7a9450c59252b53fc Mon Sep 17 00:00:00 2001 From: Benson Joeris Date: Thu, 5 Mar 2020 10:46:00 -0500 Subject: [PATCH] Fix image subresource order When importing captures from v1.6 and before, the order that image subresource states are listed in the capture differs from the order expected in `ImageState`. This change sorts the subresources into the correct order before importing. Change-Id: I1bb1420bc79e39ba8e1fb2e932307a218878e1c2 --- renderdoc/driver/vulkan/vk_manager.cpp | 4 ++++ renderdoc/driver/vulkan/vk_resources.h | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/renderdoc/driver/vulkan/vk_manager.cpp b/renderdoc/driver/vulkan/vk_manager.cpp index c4e5faeeb..82fcc8143 100644 --- a/renderdoc/driver/vulkan/vk_manager.cpp +++ b/renderdoc/driver/vulkan/vk_manager.cpp @@ -320,7 +320,11 @@ void VulkanResourceManager::SerialiseImageStates(SerialiserType &ser, } if(!subresourceStates.empty()) + { + std::sort(subresourceStates.begin(), subresourceStates.end(), + ImageSubresourceStateForRange::CompareRangeBegin); imageState.subresourceStates.FromArray(subresourceStates); + } imageState.maxRefType = eFrameRef_Unknown; } } diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 11fb76201..bc3680583 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -1317,6 +1317,30 @@ struct ImageSubresourceStateForRange { ImageSubresourceRange range; ImageSubresourceState state; + inline static bool CompareRangeBegin(const ImageSubresourceStateForRange &x, + const ImageSubresourceStateForRange &y) + { + const ImageSubresourceRange &rx = x.range; + const ImageSubresourceRange &ry = y.range; + + // Find the first (least significant) aspcet bit + VkImageAspectFlags ax = *ImageAspectFlagIter::begin(rx.aspectMask); + VkImageAspectFlags ay = *ImageAspectFlagIter::begin(ry.aspectMask); + + if(ax == ay) + { + if(rx.baseMipLevel == ry.baseMipLevel) + { + if(rx.baseArrayLayer == ry.baseArrayLayer) + { + return rx.baseDepthSlice < ry.baseDepthSlice; + } + return rx.baseArrayLayer < ry.baseArrayLayer; + } + return rx.baseMipLevel < ry.baseMipLevel; + } + return ax < ay; + } }; DECLARE_REFLECTION_STRUCT(ImageSubresourceStateForRange);