summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-serialize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-serialize.cpp')
-rw-r--r--source/slang/slang-ir-serialize.cpp78
1 files changed, 25 insertions, 53 deletions
diff --git a/source/slang/slang-ir-serialize.cpp b/source/slang/slang-ir-serialize.cpp
index ebbb792f4..97b070f9c 100644
--- a/source/slang/slang-ir-serialize.cpp
+++ b/source/slang/slang-ir-serialize.cpp
@@ -827,7 +827,9 @@ static Result _writeArrayChunk(IRSerialBinary::CompressionType compressionType,
header.m_numCompressedEntries = uint32_t(numCompressedEntries);
container->write(&header, sizeof(header));
- container->write(compressedPayload.begin(), compressedPayload.getCount());
+
+ const size_t compressedSize = compressedPayload.getCount();
+ container->moveOwned(container->addData(), compressedPayload.detachBuffer(), compressedSize);
break;
}
default:
@@ -963,7 +965,10 @@ Result _writeInstArrayChunk(IRSerialBinary::CompressionType compressionType, uin
header.m_numCompressedEntries = 0;
container->write(&header, sizeof(header));
- container->write(compressedPayload.begin(), compressedPayload.getCount());
+
+ const size_t compressedPayloadSize = compressedPayload.getCount();
+ container->moveOwned(container->addData(), compressedPayload.detachBuffer(), compressedPayloadSize);
+
return SLANG_OK;
}
default: break;
@@ -1050,56 +1055,32 @@ static Result _readArrayChunk(IRSerialBinary::CompressionType compressionType, R
{
typedef IRSerialBinary Bin;
- RiffContainer::Data* data = dataChunk->getSingleData();
- const uint8_t* cur = (const uint8_t*)data->getPayload();
- const uint8_t* end = cur + data->m_size;
-
+ RiffReadHelper read = dataChunk->asReadHelper();
const size_t typeSize = listOut.getTypeSize();
switch (compressionType)
{
case Bin::CompressionType::VariableByteLite:
{
- if (cur + sizeof(Bin::CompressedArrayHeader) > end)
- {
- return SLANG_FAIL;
- }
+ Bin::CompressedArrayHeader header;
+ SLANG_RETURN_ON_FAIL(read.read(header));
- // We have a compressed header
- Bin::CompressedArrayHeader header = *(const Bin::CompressedArrayHeader*)cur;
- cur += sizeof(Bin::CompressedArrayHeader);
-
void* dst = listOut.setSize(header.m_numEntries);
-
- // Need to read all the compressed data...
- size_t payloadSize = size_t(end - cur);
-
- List<uint8_t> compressedPayload;
- compressedPayload.setCount(payloadSize);
-
SLANG_ASSERT(header.m_numCompressedEntries == uint32_t((header.m_numEntries * typeSize) / sizeof(uint32_t)));
// Decode..
- ByteEncodeUtil::decodeLiteUInt32(cur, header.m_numCompressedEntries, (uint32_t*)dst);
+ ByteEncodeUtil::decodeLiteUInt32(read.getData(), header.m_numCompressedEntries, (uint32_t*)dst);
break;
}
case Bin::CompressionType::None:
{
// Read uncompressed
- if (cur + sizeof(Bin::ArrayHeader) > end)
- {
- return SLANG_FAIL;
- }
-
- Bin::ArrayHeader header = *(const Bin::ArrayHeader*)cur;
- cur += sizeof(Bin::ArrayHeader);
-
+ Bin::ArrayHeader header;
+ SLANG_RETURN_ON_FAIL(read.read(header));
const size_t payloadSize = header.m_numEntries * typeSize;
-
- SLANG_ASSERT(payloadSize == size_t(end - cur));
+ SLANG_ASSERT(payloadSize == read.getRemainingSize());
void* dst = listOut.setSize(header.m_numEntries);
-
- ::memcpy(dst, cur, payloadSize);
+ ::memcpy(dst, read.getData(), payloadSize);
break;
}
}
@@ -1113,7 +1094,7 @@ static Result _readArrayChunk(const IRSerialBinary::ModuleHeader* header, RiffCo
Bin::CompressionType compressionType = Bin::CompressionType::None;
- if (dataChunk->m_type == SLANG_MAKE_COMPRESSED_FOUR_CC(dataChunk->m_type))
+ if (dataChunk->m_fourCC == SLANG_MAKE_COMPRESSED_FOUR_CC(dataChunk->m_fourCC))
{
// If it has compression, use the compression type set in the header
compressionType = Bin::CompressionType(header->m_compressionType);
@@ -1125,10 +1106,9 @@ static Result _readArrayChunk(const IRSerialBinary::ModuleHeader* header, RiffCo
template <typename T>
static Result _readArrayUncompressedChunk(const IRSerialBinary::ModuleHeader* header, RiffContainer::DataChunk* chunk, List<T>& arrayOut)
{
- typedef IRSerialBinary Bin;
SLANG_UNUSED(header);
ListResizerForType<T> resizer(arrayOut);
- return _readArrayChunk(Bin::CompressionType::None, chunk, resizer);
+ return _readArrayChunk(IRSerialBinary::CompressionType::None, chunk, resizer);
}
static Result _decodeInsts(IRSerialBinary::CompressionType compressionType, const uint8_t* encodeCur, size_t encodeInSize, List<IRSerialData::Inst>& instsOut)
@@ -1209,7 +1189,7 @@ static Result _readInstArrayChunk(const IRSerialBinary::ModuleHeader* moduleHead
typedef IRSerialBinary Bin;
Bin::CompressionType compressionType = Bin::CompressionType::None;
- if (chunk->m_type == SLANG_MAKE_COMPRESSED_FOUR_CC(chunk->m_type))
+ if (chunk->m_fourCC == SLANG_MAKE_COMPRESSED_FOUR_CC(chunk->m_fourCC))
{
compressionType = Bin::CompressionType(moduleHeader->m_compressionType);
}
@@ -1223,22 +1203,14 @@ static Result _readInstArrayChunk(const IRSerialBinary::ModuleHeader* moduleHead
}
case Bin::CompressionType::VariableByteLite:
{
- RiffContainer::Data* data = chunk->getSingleData();
- const uint8_t* cur = (const uint8_t*)data->getPayload();
- const uint8_t* end = cur + data->m_size;
- if (cur + sizeof(Bin::CompressedArrayHeader) <= end)
- {
- return SLANG_FAIL;
- }
- Bin::CompressedArrayHeader header = *(const Bin::CompressedArrayHeader*)cur;
- cur += sizeof(Bin::CompressedArrayHeader);
-
- arrayOut.setCount(header.m_numEntries);
+ RiffReadHelper read = chunk->asReadHelper();
- // Need to read all the compressed data...
- size_t payloadSize = size_t(end - cur);
+ Bin::CompressedArrayHeader header;
+ SLANG_RETURN_ON_FAIL(read.read(header));
+
+ arrayOut.setCount(header.m_numEntries);
- SLANG_RETURN_ON_FAIL(_decodeInsts(compressionType, cur, payloadSize, arrayOut));
+ SLANG_RETURN_ON_FAIL(_decodeInsts(compressionType, read.getData(), read.getRemainingSize(), arrayOut));
break;
}
default:
@@ -1270,7 +1242,7 @@ static Result _readInstArrayChunk(const IRSerialBinary::ModuleHeader* moduleHead
continue;
}
- switch (dataChunk->m_type)
+ switch (dataChunk->m_fourCC)
{
case SLANG_MAKE_COMPRESSED_FOUR_CC(Bin::kInstFourCc):
case Bin::kInstFourCc: