@@ -151,8 +151,36 @@ DeviceObjectArchive::DeviceObjectArchive(Uint32 ContentVersion) noexcept :
151151{
152152}
153153
154- void DeviceObjectArchive::Deserialize ( const CreateInfo& CI ) noexcept ( false )
154+ void DeviceObjectArchive::Clear ( ) noexcept
155155{
156+ m_NamedResources.clear ();
157+ m_DeviceShaders = {};
158+ m_pArchiveData.Release ();
159+ m_ContentVersion = 0 ;
160+ }
161+
162+
163+ bool DeviceObjectArchive::Deserialize (const CreateInfo& CI) noexcept
164+ {
165+ Clear ();
166+
167+ #define CHECK_ARCHIVE (Expr, ...) \
168+ do \
169+ { \
170+ if (!(Expr)) \
171+ { \
172+ LOG_ERROR_MESSAGE (__VA_ARGS__); \
173+ Clear (); \
174+ return false ; \
175+ } \
176+ } while (false )
177+
178+ CHECK_ARCHIVE (CI.pData != nullptr , " pData must not be null" );
179+
180+ m_pArchiveData = CI.MakeCopy ?
181+ DataBlobImpl::MakeCopy (CI.pData ) :
182+ const_cast <IDataBlob*>(CI.pData ); // Need to remove const for AddRef/Release
183+
156184 Serializer<SerializerMode::Read> Reader{
157185 SerializedData{
158186 const_cast <void *>(CI.pData ->GetConstDataPtr ()),
@@ -164,56 +192,48 @@ void DeviceObjectArchive::Deserialize(const CreateInfo& CI) noexcept(false)
164192 // NB: this must match header serialization in DeviceObjectArchive::SerializeHeader
165193 ArchiveHeader Header;
166194 ASSERT_SIZEOF64 (Header, 24 , " Please handle new members here" );
167- if (!ArchiveReader.Ser (Header.MagicNumber ))
168- LOG_ERROR_AND_THROW (" Failed to read device object archive header magic number." );
195+ CHECK_ARCHIVE (ArchiveReader.Ser (Header.MagicNumber ), " Failed to read device object archive header magic number." );
169196
170- if (Header.MagicNumber != HeaderMagicNumber)
171- LOG_ERROR_AND_THROW (" Invalid device object archive header." );
197+ CHECK_ARCHIVE (Header.MagicNumber == HeaderMagicNumber, " Invalid device object archive header." );
172198
173- if (!ArchiveReader.Ser (Header.Version ))
174- LOG_ERROR_AND_THROW (" Failed to read device object archive version." );
199+ CHECK_ARCHIVE (ArchiveReader.Ser (Header.Version ), " Failed to read device object archive version." );
175200
176- if (Header.Version != ArchiveVersion)
177- LOG_ERROR_AND_THROW (" Unsupported device object archive version: " , Header.Version , " . Expected version: " , Uint32{ArchiveVersion});
201+ CHECK_ARCHIVE (Header.Version == ArchiveVersion, " Unsupported device object archive version: " , Header.Version , " . Expected version: " , Uint32{ArchiveVersion});
178202
179- if (!ArchiveReader.Ser (Header.APIVersion ))
180- LOG_ERROR_AND_THROW (" Failed to read Diligent API version." );
203+ CHECK_ARCHIVE (ArchiveReader.Ser (Header.APIVersion ), " Failed to read Diligent API version." );
181204
182- if (!ArchiveReader.Ser (Header.ContentVersion ))
183- LOG_ERROR_AND_THROW (" Failed to read device object archive content version." );
205+ CHECK_ARCHIVE (ArchiveReader.Ser (Header.ContentVersion ), " Failed to read device object archive content version." );
184206
185- if (CI.ContentVersion != CreateInfo{}.ContentVersion && Header.ContentVersion != CI.ContentVersion )
186- LOG_ERROR_AND_THROW ( " Invalid archive content version: " , Header.ContentVersion , " . Expected version: " , CI.ContentVersion );
207+ CHECK_ARCHIVE (CI.ContentVersion == CreateInfo{}.ContentVersion || Header.ContentVersion == CI.ContentVersion ,
208+ " Invalid archive content version: " , Header.ContentVersion , " . Expected version: " , CI.ContentVersion );
187209 m_ContentVersion = Header.ContentVersion ;
188210
189- if (!ArchiveReader.Ser (Header.GitHash ))
190- LOG_ERROR_AND_THROW (" Failed to read Git Hash." );
211+ CHECK_ARCHIVE (ArchiveReader.Ser (Header.GitHash ), " Failed to read Git Hash." );
191212
192213 Uint32 NumResources = 0 ;
193- if (!Reader (NumResources))
194- LOG_ERROR_AND_THROW (" Failed to read the number of named resources in the device object archive." );
214+ CHECK_ARCHIVE (Reader (NumResources), " Failed to read the number of named resources in the device object archive." );
195215
196216 for (Uint32 res = 0 ; res < NumResources; ++res)
197217 {
198218 const char * Name = nullptr ;
199219 ResourceType ResType = ResourceType::Undefined;
200- if (!Reader (ResType, Name))
201- LOG_ERROR_AND_THROW (" Failed to read the type and name of resource " , res, " /" , NumResources, ' .' );
220+ CHECK_ARCHIVE (Reader (ResType, Name), " Failed to read the type and name of resource " , res, " /" , NumResources, ' .' );
202221 VERIFY_EXPR (Name != nullptr );
203222
204223 // No need to make the name copy as we keep the source data blob alive.
205- constexpr auto MakeNameCopy = false ;
206- auto & ResData = m_NamedResources[NamedResourceKey{ResType, Name, MakeNameCopy}];
224+ constexpr bool MakeNameCopy = false ;
225+ ResourceData& ResData = m_NamedResources[NamedResourceKey{ResType, Name, MakeNameCopy}];
207226
208- if (!ArchiveReader.SerializeResourceData (ResData))
209- LOG_ERROR_AND_THROW (" Failed to read data of resource '" , Name, " '." );
227+ CHECK_ARCHIVE (ArchiveReader.SerializeResourceData (ResData), " Failed to read data of resource '" , Name, " '." );
210228 }
211229
212- for (auto & Shaders : m_DeviceShaders)
230+ for (std::vector<SerializedData> & Shaders : m_DeviceShaders)
213231 {
214- if (!ArchiveReader.SerializeShaders (Shaders))
215- LOG_ERROR_AND_THROW (" Failed to read shader data from the device object archive." );
232+ CHECK_ARCHIVE (ArchiveReader.SerializeShaders (Shaders), " Failed to read shader data from the device object archive." );
216233 }
234+ #undef CHECK_ARCHIVE
235+
236+ return true ;
217237}
218238
219239void DeviceObjectArchive::Serialize (IDataBlob** ppDataBlob) const
@@ -320,17 +340,12 @@ const char* ResourceTypeToString(DeviceObjectArchive::ResourceType Type)
320340} // namespace
321341
322342
323- DeviceObjectArchive::DeviceObjectArchive (const CreateInfo& CI) noexcept (false ) :
324- m_pArchiveData{
325- CI.MakeCopy ?
326- DataBlobImpl::MakeCopy (CI.pData ) :
327- const_cast <IDataBlob*>(CI.pData ) // Need to remove const for AddRef/Release
328- }
343+ DeviceObjectArchive::DeviceObjectArchive (const CreateInfo& CI) noexcept (false )
329344{
330- if (!m_pArchiveData )
331- LOG_ERROR_AND_THROW ( " pData must not be null " );
332-
333- Deserialize (CI);
345+ if (!Deserialize (CI) )
346+ {
347+ LOG_ERROR_AND_THROW ( " Failed to deserialize device object archive " );
348+ }
334349}
335350
336351const SerializedData& DeviceObjectArchive::GetDeviceSpecificData (ResourceType Type,
0 commit comments