Add Deserialise class to deallocate nested Vulkan structs

Currently deallocating VkDeviceCreateInfo and VkPipelineLayoutCreateInfo.
Still more to be done.
This commit is contained in:
GregF
2015-10-06 18:52:19 -06:00
committed by baldurk
parent 8b7744e71c
commit 33ca020012
5 changed files with 57 additions and 2 deletions
+36
View File
@@ -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<VkDeviceCreateInfo>;
template<>
Serialiser::Deserialise<VkDeviceCreateInfo>::~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<VkPipelineLayoutCreateInfo>::~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<VkDescriptorSetLayoutBinding>::~Deserialise()
{
if(m_Mode == READING)
delete pImmutableSamplers;
}
template<>
void Serialiser::Serialise(const char *name, VkDescriptorSetLayoutCreateInfo &el)
{
+4
View File
@@ -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<VkDeviceCreateInfo>;
// template<> class Serialiser::Deserialise : VkDeviceCreateInfo;
#pragma region Chunks
enum VulkanChunkType
@@ -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)
@@ -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)
+14
View File
@@ -432,6 +432,18 @@ class Serialiser
DebugPrint("%s: %s\n", name, ToStr::Get<T>(el).c_str());
}
// object to serialise a single element
// used to instantiate destructors for structs
// with allocated members
template<class T>
class Deserialise : public T {
public:
Deserialise(T t) : T(t) {}
Deserialise() {}
virtual ~Deserialise() {}
Mode m_Mode;
};
template<typename X>
void Serialise(const char *name, std::vector<X> &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<type> name; if(m_State >= WRITING) { static_cast<type&>(name) = (inValue); name.m_Mode = Serialiser::WRITING; } else name.m_Mode = Serialiser::READING; GET_SERIALISER->Serialise(#name, static_cast<type&>(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]); } }