@@ -968,21 +968,39 @@ void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, con
968968struct ShaderBytecodeRemapper
969969{
970970public:
971- ShaderBytecodeRemapper (ShaderChunkHeader& _Header,
971+ ShaderBytecodeRemapper (DataBlobImpl::DataBufferType& _Bytecode,
972+ size_t _ChunkOffset,
972973 TExtendedResourceMap& _ExtResMap,
973974 ResourceBindingPerType const & _BindingsPerType) :
974- Header{_Header},
975+ Bytecode{_Bytecode},
976+ ChunkOffset{_ChunkOffset},
975977 ExtResourceMap{_ExtResMap},
976978 BindingsPerType{_BindingsPerType}
977- {}
979+ {
980+ ShaderChunkHeader& Header = reinterpret_cast <ShaderChunkHeader&>(Bytecode[ChunkOffset]);
981+
982+ VERIFY_EXPR (Header.VersionMajor >= 4 );
983+ VERIFY_EXPR (Header.ProgramType < PROGRAM_TYPE_COUNT_SM5);
984+ VERIFY_EXPR (Header.NumDWords * 4 == Header.Length );
985+ VERIFY (ChunkOffset % 4 == 0 , " Chunk offset must be a multiple of 4" );
986+
987+ IsSM51 = Header.VersionMajor == 5 && Header.VersionMinor >= 1 ;
988+
989+ EndOffset = (ChunkOffset + sizeof (ChunkOffset) + Header.Length ) / 4 ;
990+ }
978991
979992 void PatchBytecode (const void * ChunkEnd) noexcept (false );
980993
981994private:
982- ShaderChunkHeader& Header;
995+ DataBlobImpl::DataBufferType& Bytecode;
996+ const size_t ChunkOffset;
983997 TExtendedResourceMap& ExtResourceMap;
984998 ResourceBindingPerType const & BindingsPerType;
985999
1000+ size_t EndOffset = 0 ;
1001+
1002+ bool IsSM51 = false ;
1003+
9861004 static constexpr Uint32 RuntimeSizedArraySize = ~0u ;
9871005
9881006private:
@@ -998,13 +1016,11 @@ struct ShaderBytecodeRemapper
9981016 void ParseIndex (D3D10_SB_OPERAND_INDEX_REPRESENTATION IndexType, Uint32*& Token, const void * Finish);
9991017 void ParseCustomData (Uint32*& Token, const void * Finish, D3D10_SB_CUSTOMDATA_CLASS Type);
10001018 void ParseOpcode (Uint32*& Token, const void * Finish);
1001-
1002- bool IsSM51 () const { return Header.VersionMajor == 5 && Header.VersionMinor >= 1 ; }
10031019};
10041020
10051021void ShaderBytecodeRemapper::RemapResourceOperand (const OperandToken& Operand, Uint32* Token, const void * Finish)
10061022{
1007- if (IsSM51 () )
1023+ if (IsSM51)
10081024 {
10091025 RemapResourceOperandSM51 (Operand, Token, Finish);
10101026 }
@@ -1016,7 +1032,7 @@ void ShaderBytecodeRemapper::RemapResourceOperand(const OperandToken& Operand, U
10161032
10171033void ShaderBytecodeRemapper::RemapResourceBinding (const OpcodeToken& Opcode, Uint32* Token, const void * Finish)
10181034{
1019- if (IsSM51 () )
1035+ if (IsSM51)
10201036 {
10211037 RemapResourceBindingSM51 (Opcode, Token, Finish);
10221038 }
@@ -1682,12 +1698,10 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token, const void* Finish)
16821698
16831699void ShaderBytecodeRemapper::PatchBytecode (const void * ChunkEnd) noexcept (false )
16841700{
1685- VERIFY_EXPR (ChunkEnd == reinterpret_cast <const Uint8*>(&Header) + sizeof (ChunkHeader) + Header.Length );
1686- VERIFY_EXPR (Header.VersionMajor >= 4 );
1687- VERIFY_EXPR (Header.ProgramType < PROGRAM_TYPE_COUNT_SM5);
1688- VERIFY_EXPR (Header.NumDWords * 4 == Header.Length );
1701+ VERIFY_EXPR (ChunkEnd == Bytecode.data () + EndOffset * 4 );
16891702
1690- for (Uint32* Token = reinterpret_cast <Uint32*>(&Header + 1 ); Token < ChunkEnd;)
1703+ Uint32* Token = reinterpret_cast <Uint32*>(&Bytecode[ChunkOffset + sizeof (ShaderChunkHeader)]);
1704+ for (; Token < ChunkEnd;)
16911705 {
16921706 ParseOpcode (Token, ChunkEnd);
16931707 }
@@ -1803,8 +1817,7 @@ RefCntAutoPtr<IDataBlob> RemapResourceBindings(const TResourceBindingMap& Resour
18031817
18041818 if (Chunk.Magic == SHDRFourCC || Chunk.Magic == SHEXFourCC)
18051819 {
1806- ShaderChunkHeader& SBHeader = reinterpret_cast <ShaderChunkHeader&>(Chunk);
1807- ShaderBytecodeRemapper Remapper{SBHeader, ExtResourceMap, BindingsPerType};
1820+ ShaderBytecodeRemapper Remapper{RemappedBytecode, ChunkOffset, ExtResourceMap, BindingsPerType};
18081821 Remapper.PatchBytecode (ChunkEnd);
18091822 PatchOK = true ;
18101823 }
0 commit comments