diff --git a/renderdoc/driver/vulkan/vk_common.cpp b/renderdoc/driver/vulkan/vk_common.cpp index e352af8ed..9dbd2c0f1 100644 --- a/renderdoc/driver/vulkan/vk_common.cpp +++ b/renderdoc/driver/vulkan/vk_common.cpp @@ -2218,6 +2218,28 @@ void Serialiser::Serialise(const char *name, VkDeviceCreateInfo &el) SerialiseOptionalObject(this, "pEnabledFeatures", (VkPhysicalDeviceFeatures *&)el.pEnabledFeatures); } +//template<> +//class Serialiser::Deserialize : VkDeviceCreateInfo { +// public: +// ~Deserialise() +// { +// delete ppEnabledExtensionNames; +// delete ppEnabledLayerNames; +// } +//} + +//template <> class Serialiser::Deserialise; + +template<> +Serialiser::Deserialise::~Deserialise() +{ + if(m_Mode == READING) + { + delete ppEnabledExtensionNames; + delete ppEnabledLayerNames; + } +} + template<> void Serialiser::Serialise(const char *name, VkBufferCreateInfo &el) { @@ -2829,6 +2851,13 @@ void Serialiser::Serialise(const char *name, VkPipelineLayoutCreateInfo &el) SerialiseComplexArray("pPushConstantRanges", (VkPushConstantRange*&)el.pPushConstantRanges, el.pushConstantRangeCount); } +template<> +Serialiser::Deserialise::~Deserialise() +{ + if(m_Mode == READING) + delete pSetLayouts; +} + template<> void Serialiser::Serialise(const char *name, VkShaderModuleCreateInfo &el) { @@ -3140,6 +3169,13 @@ void Serialiser::Serialise(const char *name, VkDescriptorSetLayoutBinding &el) } } +template<> +Serialiser::Deserialise::~Deserialise() +{ + if(m_Mode == READING) + delete pImmutableSamplers; +} + template<> void Serialiser::Serialise(const char *name, VkDescriptorSetLayoutCreateInfo &el) { diff --git a/renderdoc/driver/vulkan/vk_common.h b/renderdoc/driver/vulkan/vk_common.h index abf14a0dc..f9cee7e70 100644 --- a/renderdoc/driver/vulkan/vk_common.h +++ b/renderdoc/driver/vulkan/vk_common.h @@ -133,6 +133,10 @@ template<> void Serialiser::Serialise(const char *name, VkImageResolve &el); template<> void Serialiser::Serialise(const char *name, VkSwapchainCreateInfoKHR &el); +//template<> class Serialiser::Deserialise; + +// template<> class Serialiser::Deserialise : VkDeviceCreateInfo; + #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 46122d500..26add8f29 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_device_funcs.cpp @@ -200,7 +200,8 @@ bool WrappedVulkan::Serialise_vkCreateDevice( VkDevice* pDevice) { SERIALISE_ELEMENT(ResourceId, physId, GetResID(physicalDevice)); - SERIALISE_ELEMENT(VkDeviceCreateInfo, createInfo, *pCreateInfo); + 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/driver/vulkan/wrappers/vk_shader_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp index a54acd404..d94382ed8 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_shader_funcs.cpp @@ -34,7 +34,7 @@ bool WrappedVulkan::Serialise_vkCreatePipelineLayout( VkPipelineLayout* pPipelineLayout) { SERIALISE_ELEMENT(ResourceId, devId, GetResID(device)); - SERIALISE_ELEMENT(VkPipelineLayoutCreateInfo, info, *pCreateInfo); + SERIALISE_ELEMENT_CLASS(VkPipelineLayoutCreateInfo, info, *pCreateInfo); SERIALISE_ELEMENT(ResourceId, id, GetResID(*pPipelineLayout)); if(m_State == READING) diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index b99e199f3..1b5311810 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -432,6 +432,18 @@ class Serialiser DebugPrint("%s: %s\n", name, ToStr::Get(el).c_str()); } + // object to serialise a single element + // used to instantiate destructors for structs + // with allocated members + template + class Deserialise : public T { + public: + Deserialise(T t) : T(t) {} + Deserialise() {} + virtual ~Deserialise() {} + Mode m_Mode; + }; + template void Serialise(const char *name, std::vector &el) { @@ -759,10 +771,12 @@ class ScopedContext // can be overridden to locally cache the serialiser pointer (e.g. for TLS lookup) #define GET_SERIALISER GetSerialiser() +#define SCOPED_SERIALISE_CONTEXT(n) ScopedContext scope(GET_SERIALISER, GetChunkName(n), n, false); #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_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]); } #define SERIALISE_ELEMENT_ARR_OPT(type, name, inValues, count, Condition) type *name = NULL; if(Condition) { 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]); } }