summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-serialize-ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-serialize-ir.cpp')
-rw-r--r--source/slang/slang-serialize-ir.cpp297
1 files changed, 15 insertions, 282 deletions
diff --git a/source/slang/slang-serialize-ir.cpp b/source/slang/slang-serialize-ir.cpp
index b8a1183b3..bdea2faaa 100644
--- a/source/slang/slang-serialize-ir.cpp
+++ b/source/slang/slang-serialize-ir.cpp
@@ -331,111 +331,7 @@ Result IRSerialWriter::write(
return SLANG_OK;
}
-Result _encodeInsts(
- SerialCompressionType compressionType,
- const List<IRSerialData::Inst>& instsIn,
- List<uint8_t>& encodeArrayOut)
-{
- typedef IRSerialData::Inst::PayloadType PayloadType;
-
- if (compressionType != SerialCompressionType::VariableByteLite)
- {
- return SLANG_FAIL;
- }
-
- encodeArrayOut.clear();
-
- const size_t numInsts = size_t(instsIn.getCount());
- const IRSerialData::Inst* insts = instsIn.begin();
-
- uint8_t* encodeOut = encodeArrayOut.begin();
- uint8_t* encodeEnd = encodeArrayOut.end();
-
- // Calculate the maximum instruction size with worst case possible encoding
- // 2 bytes hold the payload size, and the result type
- // Note that if there were some free bits, we could encode some of this stuff into bits, but if
- // we remove payloadType, then there are no free bits
- const size_t maxInstSize = 1 + ByteEncodeUtil::kMaxLiteEncodeUInt16 +
- Math::Max(
- sizeof(insts->m_payload.m_float64),
- size_t(2 * ByteEncodeUtil::kMaxLiteEncodeUInt32));
-
- for (size_t i = 0; i < numInsts; ++i)
- {
- const auto& inst = insts[i];
-
- // Make sure there is space for the largest possible instruction
- if (encodeOut + maxInstSize >= encodeEnd)
- {
- const size_t offset = size_t(encodeOut - encodeArrayOut.begin());
-
- const UInt oldCapacity = encodeArrayOut.getCapacity();
-
- encodeArrayOut.reserve(oldCapacity + (oldCapacity >> 1) + maxInstSize);
- const UInt capacity = encodeArrayOut.getCapacity();
- encodeArrayOut.setCount(capacity);
-
- encodeOut = encodeArrayOut.begin() + offset;
- encodeEnd = encodeArrayOut.end();
- }
- encodeOut += ByteEncodeUtil::encodeLiteUInt32(inst.m_op, encodeOut);
-
- *encodeOut++ = uint8_t(inst.m_payloadType);
-
- encodeOut += ByteEncodeUtil::encodeLiteUInt32((uint32_t)inst.m_resultTypeIndex, encodeOut);
-
- switch (inst.m_payloadType)
- {
- case PayloadType::Empty:
- {
- break;
- }
- case PayloadType::Operand_1:
- case PayloadType::String_1:
- case PayloadType::UInt32:
- {
- // 1 UInt32
- encodeOut += ByteEncodeUtil::encodeLiteUInt32(
- (uint32_t)inst.m_payload.m_operands[0],
- encodeOut);
- break;
- }
- case PayloadType::Operand_2:
- case PayloadType::OperandAndUInt32:
- case PayloadType::OperandExternal:
- case PayloadType::String_2:
- {
- // 2 UInt32
- encodeOut += ByteEncodeUtil::encodeLiteUInt32(
- (uint32_t)inst.m_payload.m_operands[0],
- encodeOut);
- encodeOut += ByteEncodeUtil::encodeLiteUInt32(
- (uint32_t)inst.m_payload.m_operands[1],
- encodeOut);
- break;
- }
- case PayloadType::Float64:
- {
- memcpy(encodeOut, &inst.m_payload.m_float64, sizeof(inst.m_payload.m_float64));
- encodeOut += sizeof(inst.m_payload.m_float64);
- break;
- }
- case PayloadType::Int64:
- {
- memcpy(encodeOut, &inst.m_payload.m_int64, sizeof(inst.m_payload.m_int64));
- encodeOut += sizeof(inst.m_payload.m_int64);
- break;
- }
- }
- }
-
- // Fix the size
- encodeArrayOut.setCount(UInt(encodeOut - encodeArrayOut.begin()));
- return SLANG_OK;
-}
-
Result _writeInstArrayChunk(
- SerialCompressionType compressionType,
FourCC chunkId,
const List<IRSerialData::Inst>& array,
RiffContainer* container)
@@ -448,37 +344,11 @@ Result _writeInstArrayChunk(
return SLANG_OK;
}
- switch (compressionType)
- {
- case SerialCompressionType::None:
- {
- return SerialRiffUtil::writeArrayChunk(compressionType, chunkId, array, container);
- }
- case SerialCompressionType::VariableByteLite:
- {
- List<uint8_t> compressedPayload;
- SLANG_RETURN_ON_FAIL(_encodeInsts(compressionType, array, compressedPayload));
-
- ScopeChunk scope(container, Chunk::Kind::Data, SLANG_MAKE_COMPRESSED_FOUR_CC(chunkId));
-
- SerialBinary::CompressedArrayHeader header;
- header.numEntries = uint32_t(array.getCount());
- header.numCompressedEntries = 0;
-
- container->write(&header, sizeof(header));
- container->write(compressedPayload.getBuffer(), compressedPayload.getCount());
-
- return SLANG_OK;
- }
- default:
- break;
- }
- return SLANG_FAIL;
+ return SerialRiffUtil::writeArrayChunk(chunkId, array, container);
}
/* static */ Result IRSerialWriter::writeContainer(
const IRSerialData& data,
- SerialCompressionType compressionType,
RiffContainer* container)
{
typedef RiffContainer::Chunk Chunk;
@@ -486,26 +356,19 @@ Result _writeInstArrayChunk(
ScopeChunk scopeModule(container, Chunk::Kind::List, Bin::kIRModuleFourCc);
+ SLANG_RETURN_ON_FAIL(_writeInstArrayChunk(Bin::kInstFourCc, data.m_insts, container));
SLANG_RETURN_ON_FAIL(
- _writeInstArrayChunk(compressionType, Bin::kInstFourCc, data.m_insts, container));
- SLANG_RETURN_ON_FAIL(SerialRiffUtil::writeArrayChunk(
- compressionType,
- Bin::kChildRunFourCc,
- data.m_childRuns,
- container));
+ SerialRiffUtil::writeArrayChunk(Bin::kChildRunFourCc, data.m_childRuns, container));
SLANG_RETURN_ON_FAIL(SerialRiffUtil::writeArrayChunk(
- compressionType,
Bin::kExternalOperandsFourCc,
data.m_externalOperands,
container));
SLANG_RETURN_ON_FAIL(SerialRiffUtil::writeArrayChunk(
- SerialCompressionType::None,
SerialBinary::kStringTableFourCc,
data.m_stringTable,
container));
SLANG_RETURN_ON_FAIL(SerialRiffUtil::writeArrayChunk(
- SerialCompressionType::None,
Bin::kUInt32RawSourceLocFourCc,
data.m_rawSourceLocs,
container));
@@ -513,7 +376,6 @@ Result _writeInstArrayChunk(
if (data.m_debugSourceLocRuns.getCount())
{
SerialRiffUtil::writeArrayChunk(
- compressionType,
Bin::kDebugSourceLocRunFourCc,
data.m_debugSourceLocRuns,
container);
@@ -555,133 +417,16 @@ Result _writeInstArrayChunk(
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IRSerialReader !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-static Result _decodeInsts(
- SerialCompressionType compressionType,
- const uint8_t* encodeCur,
- size_t encodeInSize,
- List<IRSerialData::Inst>& instsOut)
-{
- const uint8_t* encodeEnd = encodeCur + encodeInSize;
-
- typedef IRSerialData::Inst::PayloadType PayloadType;
-
- if (compressionType != SerialCompressionType::VariableByteLite)
- {
- return SLANG_FAIL;
- }
-
- const size_t numInsts = size_t(instsOut.getCount());
- IRSerialData::Inst* insts = instsOut.begin();
-
- for (size_t i = 0; i < numInsts; ++i)
- {
- if (encodeCur >= encodeEnd)
- {
- SLANG_ASSERT(!"Invalid decode");
- return SLANG_FAIL;
- }
-
- auto& inst = insts[i];
- uint32_t instOp = 0;
- encodeCur += ByteEncodeUtil::decodeLiteUInt32(encodeCur, &instOp);
- inst.m_op = (uint16_t)instOp;
-
- const PayloadType payloadType = PayloadType(*encodeCur++);
- inst.m_payloadType = payloadType;
-
- // Read the result value
- encodeCur +=
- ByteEncodeUtil::decodeLiteUInt32(encodeCur, (uint32_t*)&inst.m_resultTypeIndex);
-
- switch (inst.m_payloadType)
- {
- case PayloadType::Empty:
- {
- break;
- }
- case PayloadType::Operand_1:
- case PayloadType::String_1:
- case PayloadType::UInt32:
- {
- // 1 UInt32
- encodeCur += ByteEncodeUtil::decodeLiteUInt32(
- encodeCur,
- (uint32_t*)&inst.m_payload.m_operands[0]);
- break;
- }
- case PayloadType::Operand_2:
- case PayloadType::OperandAndUInt32:
- case PayloadType::OperandExternal:
- case PayloadType::String_2:
- {
- // 2 UInt32
- encodeCur += ByteEncodeUtil::decodeLiteUInt32(
- encodeCur,
- 2,
- (uint32_t*)&inst.m_payload.m_operands[0]);
- break;
- }
- case PayloadType::Float64:
- {
- memcpy(&inst.m_payload.m_float64, encodeCur, sizeof(inst.m_payload.m_float64));
- encodeCur += sizeof(inst.m_payload.m_float64);
- break;
- }
- case PayloadType::Int64:
- {
- memcpy(&inst.m_payload.m_int64, encodeCur, sizeof(inst.m_payload.m_int64));
- encodeCur += sizeof(inst.m_payload.m_int64);
- break;
- }
- }
- }
-
- return SLANG_OK;
-}
-
static Result _readInstArrayChunk(
- SerialCompressionType containerCompressionType,
RiffContainer::DataChunk* chunk,
List<IRSerialData::Inst>& arrayOut)
{
- SerialCompressionType compressionType = SerialCompressionType::None;
- if (chunk->m_fourCC == SLANG_MAKE_COMPRESSED_FOUR_CC(chunk->m_fourCC))
- {
- compressionType = SerialCompressionType(containerCompressionType);
- }
-
- switch (compressionType)
- {
- case SerialCompressionType::None:
- {
- SerialRiffUtil::ListResizerForType<IRSerialData::Inst> resizer(arrayOut);
- return SerialRiffUtil::readArrayChunk(compressionType, chunk, resizer);
- }
- case SerialCompressionType::VariableByteLite:
- {
- RiffReadHelper read = chunk->asReadHelper();
-
- SerialBinary::CompressedArrayHeader header;
- SLANG_RETURN_ON_FAIL(read.read(header));
-
- arrayOut.setCount(header.numEntries);
-
- SLANG_RETURN_ON_FAIL(
- _decodeInsts(compressionType, read.getData(), read.getRemainingSize(), arrayOut));
- break;
- }
- default:
- {
- return SLANG_FAIL;
- }
- }
-
- return SLANG_OK;
+ SerialRiffUtil::ListResizerForType<IRSerialData::Inst> resizer(arrayOut);
+ return SerialRiffUtil::readArrayChunk(chunk, resizer);
}
/* static */ Result IRSerialReader::readContainer(
RiffContainer::ListChunk* module,
- SerialCompressionType containerCompressionType,
IRSerialData* outData)
{
typedef IRSerialBinary Bin;
@@ -698,51 +443,39 @@ static Result _readInstArrayChunk(
switch (dataChunk->m_fourCC)
{
- case SLANG_MAKE_COMPRESSED_FOUR_CC(Bin::kInstFourCc):
case Bin::kInstFourCc:
{
- SLANG_RETURN_ON_FAIL(
- _readInstArrayChunk(containerCompressionType, dataChunk, outData->m_insts));
+ SLANG_RETURN_ON_FAIL(_readInstArrayChunk(dataChunk, outData->m_insts));
break;
}
- case SLANG_MAKE_COMPRESSED_FOUR_CC(Bin::kChildRunFourCc):
case Bin::kChildRunFourCc:
{
- SLANG_RETURN_ON_FAIL(SerialRiffUtil::readArrayChunk(
- containerCompressionType,
- dataChunk,
- outData->m_childRuns));
+ SLANG_RETURN_ON_FAIL(
+ SerialRiffUtil::readArrayChunk(dataChunk, outData->m_childRuns));
break;
}
- case SLANG_MAKE_COMPRESSED_FOUR_CC(Bin::kExternalOperandsFourCc):
case Bin::kExternalOperandsFourCc:
{
- SLANG_RETURN_ON_FAIL(SerialRiffUtil::readArrayChunk(
- containerCompressionType,
- dataChunk,
- outData->m_externalOperands));
+ SLANG_RETURN_ON_FAIL(
+ SerialRiffUtil::readArrayChunk(dataChunk, outData->m_externalOperands));
break;
}
case SerialBinary::kStringTableFourCc:
{
SLANG_RETURN_ON_FAIL(
- SerialRiffUtil::readArrayUncompressedChunk(dataChunk, outData->m_stringTable));
+ SerialRiffUtil::readArrayChunk(dataChunk, outData->m_stringTable));
break;
}
case Bin::kUInt32RawSourceLocFourCc:
{
- SLANG_RETURN_ON_FAIL(SerialRiffUtil::readArrayUncompressedChunk(
- dataChunk,
- outData->m_rawSourceLocs));
+ SLANG_RETURN_ON_FAIL(
+ SerialRiffUtil::readArrayChunk(dataChunk, outData->m_rawSourceLocs));
break;
}
- case SLANG_MAKE_COMPRESSED_FOUR_CC(Bin::kDebugSourceLocRunFourCc):
case Bin::kDebugSourceLocRunFourCc:
{
- SLANG_RETURN_ON_FAIL(SerialRiffUtil::readArrayChunk(
- containerCompressionType,
- dataChunk,
- outData->m_debugSourceLocRuns));
+ SLANG_RETURN_ON_FAIL(
+ SerialRiffUtil::readArrayChunk(dataChunk, outData->m_debugSourceLocRuns));
break;
}
default: