diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index 016b49505..132d430bb 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -2221,15 +2221,15 @@ void Serialiser::Serialise(const char *name, VkDeviceCreateInfo &el) //template <> class Serialiser::Deserialise; template<> -Serialiser::Deserialise::~Deserialise() +void Serialiser::Deserialize(const VkDeviceCreateInfo* const el) const { if(m_Mode == READING) { - RDCASSERT(pNext == NULL); // otherwise delete - delete [] pRequestedQueues; - delete ppEnabledExtensionNames; - delete ppEnabledLayerNames; - delete pEnabledFeatures; + RDCASSERT(el->pNext == NULL); // otherwise delete + delete [] el->pRequestedQueues; + delete el->ppEnabledExtensionNames; + delete el->ppEnabledLayerNames; + delete el->pEnabledFeatures; } } diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index f9cee7e70..1e86bd8de 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -137,6 +137,8 @@ template<> void Serialiser::Serialise(const char *name, VkSwapchainCreateInfoKHR // template<> class Serialiser::Deserialise : VkDeviceCreateInfo; +//template<> void Serialiser::Deserialize(const VkDeviceCreateInfo* const el) const; + #pragma region Chunks enum VulkanChunkType diff --git a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp index 4b4e04b04..46122d500 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -200,7 +200,7 @@ bool WrappedVulkan::Serialise_vkCreateDevice( VkDevice* pDevice) { SERIALISE_ELEMENT(ResourceId, physId, GetResID(physicalDevice)); - SERIALISE_ELEMENT_CLASS(VkDeviceCreateInfo, createInfo, *pCreateInfo); + SERIALISE_ELEMENT(VkDeviceCreateInfo, createInfo, *pCreateInfo); SERIALISE_ELEMENT(ResourceId, devId, GetResID(*pDevice)); if(m_State == READING) diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index 1b5311810..0d2e2347b 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -444,6 +444,9 @@ class Serialiser Mode m_Mode; }; + // function to deallocate members + template void Deserialize(const T* const el) const {} + template void Serialise(const char *name, std::vector &el) { @@ -768,6 +771,16 @@ class ScopedContext } }; +template +struct ScopedDeserialise +{ + ScopedDeserialise(const Serialiser* const ser, const T* const t) : m_ser(ser), m_t(t) {} + ~ScopedDeserialise() { m_ser->Deserialize(m_t); } + const Serialiser* const m_ser; + const T* const m_t; +}; + + // can be overridden to locally cache the serialiser pointer (e.g. for TLS lookup) #define GET_SERIALISER GetSerialiser() @@ -775,7 +788,7 @@ class ScopedContext #define SCOPED_SERIALISE_CONTEXT(n) ScopedContext scope(GET_SERIALISER, GetChunkName(n), n, false); #define SCOPED_SERIALISE_SMALL_CONTEXT(n) ScopedContext scope(GET_SERIALISER, GetChunkName(n), n, true); -#define SERIALISE_ELEMENT(type, name, inValue) type name; if(m_State >= WRITING) name = (inValue); GET_SERIALISER->Serialise(#name, name); +#define SERIALISE_ELEMENT(type, name, inValue) type name; ScopedDeserialise CONCAT(deserialise_, name)(m_pSerialiser, &name); if(m_State >= WRITING) name = (inValue); GET_SERIALISER->Serialise(#name, name); #define SERIALISE_ELEMENT_CLASS(type, name, inValue) Serialiser::Deserialise name; if(m_State >= WRITING) { static_cast(name) = (inValue); name.m_Mode = Serialiser::WRITING; } else name.m_Mode = Serialiser::READING; GET_SERIALISER->Serialise(#name, static_cast(name)); #define SERIALISE_ELEMENT_OPT(type, name, inValue, Condition) type name = type(); if(Condition) { if(m_State >= WRITING) name = (inValue); GET_SERIALISER->Serialise(#name, name); } #define SERIALISE_ELEMENT_ARR(type, name, inValues, count) type *name = new type[count]; for(size_t serialiseIdx=0; serialiseIdx < count; serialiseIdx++) { if(m_State >= WRITING) name[serialiseIdx] = (inValues)[serialiseIdx]; GET_SERIALISER->Serialise(#name, name[serialiseIdx]); }