Skip to content

Commit 3e17a10

Browse files
DXBCUtils: a few minor updates
1 parent 033e954 commit 3e17a10

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

Graphics/ShaderTools/src/DXBCUtils.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ struct ChunkHeader
6060
Uint32 Magic; // 0..3 fourCC
6161
Uint32 Length; // 4..7
6262
};
63+
static_assert(sizeof(ChunkHeader) == 8, "The size of chunk header must be 8 bytes");
6364

6465
struct ResourceDefChunkHeader : ChunkHeader
6566
{
@@ -514,7 +515,7 @@ struct OpcodeToken
514515
Uint32 OpcodeLength : 7; // bits 24..30
515516
Uint32 Extended : 1; // bit 31, 1 if opcode is "extended", otherwise 0
516517
};
517-
static_assert(sizeof(OpcodeToken) == 4, "");
518+
static_assert(sizeof(OpcodeToken) == 4, "The size of opcode token must be 4 bytes");
518519

519520
struct OperandToken
520521
{
@@ -528,7 +529,7 @@ struct OperandToken
528529
D3D10_SB_OPERAND_INDEX_REPRESENTATION OperandIndex3D : 3; // 28..30
529530
Uint32 Extended : 1; // 31
530531
};
531-
static_assert(sizeof(OperandToken) == 4, "");
532+
static_assert(sizeof(OperandToken) == 4, "The size of operand token must be 4 bytes");
532533

533534
// from d3d11TokenizedProgramFormat.hpp
534535
enum D3D10_SB_CUSTOMDATA_CLASS
@@ -872,13 +873,13 @@ inline bool PatchSpace(ResourceBindingInfo50&, ResourceExtendedInfo& Ext, const
872873
}
873874

874875
template <typename ResourceBindingInfoType>
875-
void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, const void* EndPtr, ResourceDefChunkHeader& RDEFHeader, TExtendedResourceMap& ExtResMap, ResourceBindingPerType& BindingsPerType)
876+
void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, const void* ChunkEnd, ResourceDefChunkHeader& RDEFHeader, TExtendedResourceMap& ExtResMap, ResourceBindingPerType& BindingsPerType)
876877
{
877878
VERIFY_EXPR(RDEFHeader.Magic == RDEFFourCC);
878879

879880
char* Ptr = reinterpret_cast<char*>(&RDEFHeader) + sizeof(ChunkHeader);
880881
ResourceBindingInfoType* ResBinding = reinterpret_cast<ResourceBindingInfoType*>(Ptr + RDEFHeader.ResBindingOffset);
881-
if (ResBinding + RDEFHeader.ResBindingCount > EndPtr)
882+
if (ResBinding + RDEFHeader.ResBindingCount > ChunkEnd)
882883
{
883884
LOG_ERROR_AND_THROW("Resource binding data is outside of the specified byte code range. The byte code may be corrupted.");
884885
}
@@ -888,7 +889,7 @@ void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, con
888889
{
889890
ResourceBindingInfoType& Res = ResBinding[r];
890891
const char* Name = Ptr + Res.NameOffset;
891-
if (Name + 1 > EndPtr)
892+
if (Name + 1 > ChunkEnd)
892893
{
893894
LOG_ERROR_AND_THROW("Resource name pointer is outside of the specified byte code range. The byte code may be corrupted.");
894895
}
@@ -977,7 +978,7 @@ struct ShaderBytecodeRemapper
977978
ExtResourceMap{_ExtResMap},
978979
BindingsPerType{_BindingsPerType}
979980
{
980-
ShaderChunkHeader& Header = reinterpret_cast<ShaderChunkHeader&>(Bytecode[ChunkOffset]);
981+
const ShaderChunkHeader& Header = GetHeader();
981982

982983
VERIFY_EXPR(Header.VersionMajor >= 4);
983984
VERIFY_EXPR(Header.ProgramType < PROGRAM_TYPE_COUNT_SM5);
@@ -1014,6 +1015,8 @@ struct ShaderBytecodeRemapper
10141015
return reinterpret_cast<const Uint32*>(Bytecode.data() + EndOffset);
10151016
}
10161017

1018+
// Inserts a new token at the specified offset (in tokens) and sets its value.
1019+
// Updates the Token pointer and the chunk header.
10171020
void InsertToken(Uint32*& Token, Uint32 Offset, Uint32 Value)
10181021
{
10191022
const ptrdiff_t TokenIdx = reinterpret_cast<Uint8*>(Token) - Bytecode.data();
@@ -1180,6 +1183,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM51_2(OperandToken*& Operand,
11801183
const ptrdiff_t OperandOffset = reinterpret_cast<Uint8*>(Operand) - Bytecode.data();
11811184
VERIFY_EXPR(static_cast<size_t>(OperandOffset) < Bytecode.size());
11821185

1186+
// Insert immediate index token
11831187
InsertToken(Token, 1, Info.BindPoint);
11841188

11851189
Operand = reinterpret_cast<OperandToken*>(&Bytecode[OperandOffset]);
@@ -1678,7 +1682,7 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token)
16781682
}
16791683
}
16801684

1681-
size_t Length = Bytecode.size();
1685+
const size_t BytecodeSize = Bytecode.size();
16821686
switch (Opcode.OpcodeType)
16831687
{
16841688
case D3D10_SB_OPCODE_CUSTOMDATA:
@@ -1723,9 +1727,10 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token)
17231727
break;
17241728
}
17251729

1726-
if (Bytecode.size() > Length)
1730+
if (Bytecode.size() > BytecodeSize)
17271731
{
1728-
InstructionLength += static_cast<Uint32>(Bytecode.size() - Length) / 4;
1732+
// New tokens were inserted - update instruction length
1733+
InstructionLength += static_cast<Uint32>(Bytecode.size() - BytecodeSize) / 4;
17291734
reinterpret_cast<OpcodeToken&>(Bytecode[OpcodeOffset]).OpcodeLength = InstructionLength;
17301735
}
17311736

@@ -1875,6 +1880,7 @@ RefCntAutoPtr<IDataBlob> RemapResourceBindings(const TResourceBindingMap& Resour
18751880
const Uint32 ExtraBytes = Remapper.GetHeader().Length - ChunkLength;
18761881
if (ExtraBytes > 0)
18771882
{
1883+
// Chunk size has changed, update offsets of all subsequent chunks
18781884
for (Uint32 j = i + 1; j < Header.ChunkCount; ++j)
18791885
{
18801886
UpdateChunkOffset(j, ExtraBytes);

0 commit comments

Comments
 (0)