From 2f82e3a23a9c2da7e889cfa607f1ef0211d187a7 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 11 Oct 2019 12:50:05 +0100 Subject: [PATCH] Tweak SERIALISE_ELEMENT_ARRAY to allow chained properties * E.g. SERIALISE_ELEMENT_ARRAY(foo, bar).Named("foo_real"); --- renderdoc/driver/d3d12/d3d12_device.cpp | 3 ++- renderdoc/serialise/serialiser.h | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index c22f36039..0be120fae 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -1213,7 +1213,8 @@ bool WrappedID3D12Device::Serialise_MapDataWrite(SerialiserType &ser, ID3D12Reso // we serialise MappedData manually, so that when we don't need it we just skip instead of // actually allocating and memcpy'ing the buffer. - ScopedDeserialiseArray deserialise_map(ser, &MappedData); + ScopedDeserialiseArray deserialise_map(ser, &MappedData, + range.End - range.Begin); SerialiserFlags flags = SerialiserFlags::AllocateMemory; if(alreadyuploaded) { diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index db14f54a0..15edfc4cb 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -1850,7 +1850,10 @@ struct ScopedDeserialiseArray { typedef typename std::remove_pointer::type T; - ScopedDeserialiseArray(const SerialiserType &ser, T **el) : m_Ser(ser), m_El(el), count(0) {} + ScopedDeserialiseArray(const SerialiserType &ser, T **el, uint64_t c) + : m_Ser(ser), m_El(el), count(c) + { + } ~ScopedDeserialiseArray() { if(m_Ser.IsReading()) @@ -1860,7 +1863,6 @@ struct ScopedDeserialiseArray delete[] * m_El; } } - void setCount(uint64_t c) { count = c; } const SerialiserType &m_Ser; T **m_El; uint64_t count; @@ -1869,13 +1871,12 @@ struct ScopedDeserialiseArray template struct ScopedDeserialiseArray { - ScopedDeserialiseArray(const SerialiserType &ser, void **el) : m_Ser(ser), m_El(el) {} + ScopedDeserialiseArray(const SerialiserType &ser, void **el, uint64_t) : m_Ser(ser), m_El(el) {} ~ScopedDeserialiseArray() { if(m_Ser.IsReading()) FreeAlignedBuffer((byte *)*m_El); } - void setCount(uint64_t c) {} const SerialiserType &m_Ser; void **m_El; }; @@ -1883,13 +1884,15 @@ struct ScopedDeserialiseArray template struct ScopedDeserialiseArray { - ScopedDeserialiseArray(const SerialiserType &ser, const void **el) : m_Ser(ser), m_El(el) {} + ScopedDeserialiseArray(const SerialiserType &ser, const void **el, uint64_t) + : m_Ser(ser), m_El(el) + { + } ~ScopedDeserialiseArray() { if(m_Ser.IsReading()) FreeAlignedBuffer((byte *)*m_El); } - void setCount(uint64_t c) {} const SerialiserType &m_Ser; const void **m_El; }; @@ -1897,13 +1900,12 @@ struct ScopedDeserialiseArray template struct ScopedDeserialiseArray { - ScopedDeserialiseArray(const SerialiserType &ser, byte **el) : m_Ser(ser), m_El(el) {} + ScopedDeserialiseArray(const SerialiserType &ser, byte **el, uint64_t) : m_Ser(ser), m_El(el) {} ~ScopedDeserialiseArray() { if(m_Ser.IsReading()) FreeAlignedBuffer(*m_El); } - void setCount(uint64_t c) {} const SerialiserType &m_Ser; byte **m_El; }; @@ -1937,9 +1939,8 @@ struct ScopedDeserialiseArray uint64_t CONCAT(dummy_array_count, __LINE__) = 0; \ (void)CONCAT(dummy_array_count, __LINE__); \ ScopedDeserialiseArray CONCAT(deserialise_, __LINE__)( \ - GET_SERIALISER, &obj); \ - GET_SERIALISER.Serialise(STRING_LITERAL(#obj), obj, count, SerialiserFlags::AllocateMemory); \ - CONCAT(deserialise_, __LINE__).setCount(count); + GET_SERIALISER, &obj, count); \ + GET_SERIALISER.Serialise(STRING_LITERAL(#obj), obj, count, SerialiserFlags::AllocateMemory) #define SERIALISE_ELEMENT_OPT(obj) \ ScopedDeserialiseNullable CONCAT( \