diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index c745daa69..3e5f4a43b 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -240,6 +240,10 @@ bool VkInitParams::IsSupportedVersion(uint64_t ver) if(ver == CurrentVersion) return true; + // 0xD -> 0xE - fixed serialisation directly of size_t members in VkDescriptorUpdateTemplateEntry + if(ver == 0xD) + return true; + // 0xC -> 0xD - supported multiple queues. This didn't cause a large change to the serialisation // but there were some slight inconsistencies that required a version bump if(ver == 0xC) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index aa9b6b326..ff2c86228 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -55,7 +55,7 @@ struct VkInitParams uint32_t GetSerialiseSize(); // check if a frame capture section version is supported - static const uint64_t CurrentVersion = 0xD; + static const uint64_t CurrentVersion = 0xE; static bool IsSupportedVersion(uint64_t ver); }; diff --git a/renderdoc/driver/vulkan/vk_serialise.cpp b/renderdoc/driver/vulkan/vk_serialise.cpp index 2012c2496..1dde4bee6 100644 --- a/renderdoc/driver/vulkan/vk_serialise.cpp +++ b/renderdoc/driver/vulkan/vk_serialise.cpp @@ -2235,8 +2235,25 @@ void DoSerialise(SerialiserType &ser, VkDescriptorUpdateTemplateEntry &el) SERIALISE_MEMBER(dstArrayElement); SERIALISE_MEMBER(descriptorCount); SERIALISE_MEMBER(descriptorType); - SERIALISE_MEMBER(offset); - SERIALISE_MEMBER(stride); + + // these fields are size_t and should not be serialised as-is. They're not used so we can just + // serialise them as uint64_t. Unfortunately this wasn't correct initially and they were + // serialised as-is making a 32-bit/64-bit incompatibility, so for older versions all we can do is + // continue to serialise them as size_t as it's impossible to know which one was used. + if(ser.VersionAtLeast(0xE)) + { + uint64_t offset = el.offset; + uint64_t stride = el.stride; + ser.Serialise("offset", offset); + ser.Serialise("stride", stride); + el.offset = (size_t)offset; + el.stride = (size_t)stride; + } + else + { + SERIALISE_MEMBER(offset); + SERIALISE_MEMBER(stride); + } } template