From 4327f326676d5dff9fc5cfe8e4966e8f6ed798bb Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 1 Mar 2019 14:16:02 +0000 Subject: [PATCH] Deserialise arrays of complex structures --- renderdoc/serialise/serialiser.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index 73ee2feb2..f89f5904e 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -1902,14 +1902,20 @@ struct ScopedDeserialiseArray { typedef typename std::remove_pointer::type T; - ScopedDeserialiseArray(const SerialiserType &ser, T **el) : m_Ser(ser), m_El(el) {} + ScopedDeserialiseArray(const SerialiserType &ser, T **el) : m_Ser(ser), m_El(el), count(0) {} ~ScopedDeserialiseArray() { if(m_Ser.IsReading()) + { + for(uint64_t i = 0; i < count; i++) + Deserialise((*m_El)[i]); delete[] * m_El; + } } + void setCount(uint64_t c) { count = c; } const SerialiserType &m_Ser; T **m_El; + uint64_t count; }; template @@ -1921,6 +1927,7 @@ struct ScopedDeserialiseArray if(m_Ser.IsReading()) FreeAlignedBuffer((byte *)*m_El); } + void setCount(uint64_t c) {} const SerialiserType &m_Ser; void **m_El; }; @@ -1934,6 +1941,7 @@ struct ScopedDeserialiseArray if(m_Ser.IsReading()) FreeAlignedBuffer((byte *)*m_El); } + void setCount(uint64_t c) {} const SerialiserType &m_Ser; const void **m_El; }; @@ -1947,6 +1955,7 @@ struct ScopedDeserialiseArray if(m_Ser.IsReading()) FreeAlignedBuffer(*m_El); } + void setCount(uint64_t c) {} const SerialiserType &m_Ser; byte **m_El; }; @@ -1978,7 +1987,8 @@ struct ScopedDeserialiseArray (void)CONCAT(dummy_array_count, __LINE__); \ ScopedDeserialiseArray CONCAT(deserialise_, __LINE__)( \ GET_SERIALISER, &obj); \ - GET_SERIALISER.Serialise(#obj, obj, count, SerialiserFlags::AllocateMemory) + GET_SERIALISER.Serialise(#obj, obj, count, SerialiserFlags::AllocateMemory); \ + CONCAT(deserialise_, __LINE__).setCount(count); #define SERIALISE_ELEMENT_OPT(obj) \ ScopedDeserialiseNullable CONCAT( \