| 579 | |
| 580 | template <> |
| 581 | void Serialiser<SerialiserMode::Writing>::WriteStructuredFile(const SDFile &file, |
| 582 | RENDERDOC_ProgressCallback progress) |
| 583 | { |
| 584 | Serialiser<SerialiserMode::Writing> scratchWriter( |
| 585 | new StreamWriter(StreamWriter::DefaultScratchSize), Ownership::Stream); |
| 586 | |
| 587 | // slightly cheeky to cast away the const, but we don't modify it in a writing serialiser |
| 588 | scratchWriter.m_StructuredFile = m_StructuredFile = (SDFile *)&file; |
| 589 | |
| 590 | for(size_t i = 0; i < file.chunks.size(); i++) |
| 591 | { |
| 592 | const SDChunk &chunk = *file.chunks[i]; |
| 593 | |
| 594 | m_ChunkMetadata = chunk.metadata; |
| 595 | |
| 596 | m_ChunkFlags = 0; |
| 597 | |
| 598 | if(m_ChunkMetadata.flags & SDChunkFlags::HasCallstack) |
| 599 | m_ChunkFlags |= ChunkCallstack; |
| 600 | |
| 601 | if(m_ChunkMetadata.threadID != 0) |
| 602 | m_ChunkFlags |= ChunkThreadID; |
| 603 | |
| 604 | if(m_ChunkMetadata.durationMicro >= 0) |
| 605 | m_ChunkFlags |= ChunkDuration; |
| 606 | |
| 607 | if(m_ChunkMetadata.timestampMicro != 0) |
| 608 | m_ChunkFlags |= ChunkTimestamp; |
| 609 | |
| 610 | Serialiser<SerialiserMode::Writing> *ser = this; |
| 611 | |
| 612 | if(m_ChunkMetadata.length == 0) |
| 613 | { |
| 614 | ser = &scratchWriter; |
| 615 | scratchWriter.m_ChunkMetadata = m_ChunkMetadata; |
| 616 | scratchWriter.m_ChunkFlags = m_ChunkFlags; |
| 617 | } |
| 618 | |
| 619 | m_ChunkMetadata.chunkID = 0; |
| 620 | |
| 621 | ser->BeginChunk(chunk.metadata.chunkID, m_ChunkMetadata.length); |
| 622 | |
| 623 | if(chunk.metadata.flags & SDChunkFlags::OpaqueChunk) |
| 624 | { |
| 625 | RDCASSERT(chunk.NumChildren() == 1); |
| 626 | |
| 627 | size_t bufID = (size_t)chunk.GetChild(0)->data.basic.u; |
| 628 | byte *ptr = m_StructuredFile->buffers[bufID]->data(); |
| 629 | size_t len = m_StructuredFile->buffers[bufID]->size(); |
| 630 | |
| 631 | ser->GetWriter()->Write(ptr, len); |
| 632 | } |
| 633 | else |
| 634 | { |
| 635 | for(size_t o = 0; o < chunk.NumChildren(); o++) |
| 636 | { |
| 637 | // note, we don't need names because we aren't exporting structured data |
| 638 | ser->Serialise(""_lit, (SDObject *)chunk.GetChild(o)); |