@@ -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
6465struct 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
519520struct 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
534535enum D3D10_SB_CUSTOMDATA_CLASS
@@ -872,13 +873,13 @@ inline bool PatchSpace(ResourceBindingInfo50&, ResourceExtendedInfo& Ext, const
872873}
873874
874875template <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