diff --git a/renderdoc/serialise/serialiser.cpp b/renderdoc/serialise/serialiser.cpp index 66e68eb90..1c7dd2e11 100644 --- a/renderdoc/serialise/serialiser.cpp +++ b/renderdoc/serialise/serialiser.cpp @@ -40,12 +40,16 @@ int64_t Chunk::m_TotalMem = 0; // Read Serialiser functions template <> -Serialiser::Serialiser(StreamReader *reader, Ownership own) +Serialiser::Serialiser(StreamReader *reader, Ownership own, + SDObject *rootStructuredObj) { m_Read = reader; m_Write = NULL; m_Ownership = own; + + if(rootStructuredObj) + m_StructureStack.push_back(rootStructuredObj); } template <> diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index 404521141..1e5eff92a 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -166,7 +166,7 @@ public: return StringFormat::Fmt("", m_ChunkMetadata.chunkID); } - + ChunkLookup GetChunkLookup() { return m_ChunkLookup; } ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// @@ -1520,7 +1520,7 @@ public: // constructors only available by the derived classes for each serialiser type protected: Serialiser(StreamWriter *writer, Ownership own); - Serialiser(StreamReader *reader, Ownership own); + Serialiser(StreamReader *reader, Ownership own, SDObject *rootStructuredObj); private: static const uint64_t ChunkAlignment = 64; @@ -1632,7 +1632,7 @@ public: class ReadSerialiser : public Serialiser { public: - ReadSerialiser(StreamReader *reader, Ownership own) : Serialiser(reader, own) {} + ReadSerialiser(StreamReader *reader, Ownership own) : Serialiser(reader, own, NULL) {} template ChunkType ReadChunk() { @@ -1640,6 +1640,16 @@ public: return (ChunkType)BeginChunk(0, 0); } }; + +class StructuredSerialiser : public Serialiser +{ +public: + StructuredSerialiser(SDObject *obj, ChunkLookup lookup) + : Serialiser(new StreamReader(StreamReader::DummyStream), Ownership::Stream, obj) + { + ConfigureStructuredExport(lookup, false); + } +}; #endif #define BASIC_TYPE_SERIALISE(typeName, member, type, byteSize) \ diff --git a/renderdoc/serialise/streamio.cpp b/renderdoc/serialise/streamio.cpp index b1a74e9c3..74f5d54bb 100644 --- a/renderdoc/serialise/streamio.cpp +++ b/renderdoc/serialise/streamio.cpp @@ -73,6 +73,18 @@ StreamReader::StreamReader(StreamInvalidType) m_HasError = true; } +StreamReader::StreamReader(StreamDummyType) +{ + m_InputSize = 0; + + m_BufferSize = 0; + m_BufferHead = m_BufferBase = NULL; + + m_Ownership = Ownership::Nothing; + + m_Dummy = true; +} + StreamReader::StreamReader(Network::Socket *sock, Ownership own) { m_Sock = sock; diff --git a/renderdoc/serialise/streamio.h b/renderdoc/serialise/streamio.h index 991a41a68..a22382bff 100644 --- a/renderdoc/serialise/streamio.h +++ b/renderdoc/serialise/streamio.h @@ -73,8 +73,13 @@ public: { InvalidStream }; + enum StreamDummyType + { + DummyStream + }; StreamReader(StreamInvalidType); + StreamReader(StreamDummyType); StreamReader(const byte *buffer, uint64_t bufferSize); StreamReader(const std::vector &buffer); @@ -93,6 +98,8 @@ public: inline uint64_t GetSize() { return m_InputSize; } inline bool AtEnd() { + if(m_Dummy) + return false; if(m_Sock) return Available() == 0; return GetOffset() >= GetSize(); @@ -113,7 +120,7 @@ public: bool Read(void *data, uint64_t numBytes) { - if(numBytes == 0) + if(numBytes == 0 || m_Dummy) return true; if(!m_BufferBase) @@ -229,6 +236,10 @@ private: // flag indicating if an error has been encountered and the stream is now invalid bool m_HasError = false; + // flag indicating this reader is a dummy and doesn't read anything or clear inputs. Used with a + // structured serialiser to 'read' pre-existing data. + bool m_Dummy = false; + // do we own the file/compressor? are we responsible for // cleaning it up? Ownership m_Ownership;