@@ -986,7 +986,7 @@ struct ShaderBytecodeRemapper
986986
987987 IsSM51 = Header.VersionMajor == 5 && Header.VersionMinor >= 1 ;
988988
989- EndOffset = ( ChunkOffset + sizeof (ChunkHeader) + Header.Length ) / 4 ;
989+ EndOffset = ChunkOffset + sizeof (ChunkHeader) + Header.Length ;
990990 }
991991
992992 void PatchBytecode (const void * ChunkEnd) noexcept (false );
@@ -1004,29 +1004,34 @@ struct ShaderBytecodeRemapper
10041004 static constexpr Uint32 RuntimeSizedArraySize = ~0u ;
10051005
10061006private:
1007- void RemapResourceOperand (const OperandToken& Operand, Uint32* Token, const void * Finish);
1008- void RemapResourceOperandSM50 (const OperandToken& Operand, Uint32* Token, const void * Finish);
1009- void RemapResourceOperandSM51 (const OperandToken& Operand, Uint32* Token, const void * Finish);
1007+ const Uint32* GetChunkEnd () const
1008+ {
1009+ return reinterpret_cast <const Uint32*>(Bytecode.data () + EndOffset);
1010+ }
1011+
1012+ void RemapResourceOperand (const OperandToken& Operand, Uint32* Token);
1013+ void RemapResourceOperandSM50 (const OperandToken& Operand, Uint32* Token);
1014+ void RemapResourceOperandSM51 (const OperandToken& Operand, Uint32* Token);
10101015 void RemapResourceOperandSM51_2 (const OperandToken& Operand, Uint32* Token, RES_TYPE Type);
10111016
10121017 void RemapResourceBinding (const OpcodeToken& Opcode, Uint32* Token, const void * Finish);
10131018 void RemapResourceBindingSM51 (const OpcodeToken& Opcode, Uint32* Token, const void * Finish);
10141019
1015- void ParseOperand (Uint32*& Token, const void * Finish );
1016- void ParseIndex (D3D10_SB_OPERAND_INDEX_REPRESENTATION IndexType, Uint32*& Token, const void * Finish );
1017- void ParseCustomData (Uint32*& Token, const void * Finish, D3D10_SB_CUSTOMDATA_CLASS Type);
1018- void ParseOpcode (Uint32*& Token, const void * Finish );
1020+ void ParseOperand (Uint32*& Token);
1021+ void ParseIndex (D3D10_SB_OPERAND_INDEX_REPRESENTATION IndexType, Uint32*& Token);
1022+ void ParseCustomData (Uint32*& Token, D3D10_SB_CUSTOMDATA_CLASS Type);
1023+ void ParseOpcode (Uint32*& Token);
10191024};
10201025
1021- void ShaderBytecodeRemapper::RemapResourceOperand (const OperandToken& Operand, Uint32* Token, const void * Finish )
1026+ void ShaderBytecodeRemapper::RemapResourceOperand (const OperandToken& Operand, Uint32* Token)
10221027{
10231028 if (IsSM51)
10241029 {
1025- RemapResourceOperandSM51 (Operand, Token, Finish );
1030+ RemapResourceOperandSM51 (Operand, Token);
10261031 }
10271032 else
10281033 {
1029- RemapResourceOperandSM50 (Operand, Token, Finish );
1034+ RemapResourceOperandSM50 (Operand, Token);
10301035 }
10311036}
10321037
@@ -1038,7 +1043,7 @@ void ShaderBytecodeRemapper::RemapResourceBinding(const OpcodeToken& Opcode, Uin
10381043 }
10391044}
10401045
1041- void ShaderBytecodeRemapper::RemapResourceOperandSM50 (const OperandToken& Operand, Uint32* Token, const void * Finish )
1046+ void ShaderBytecodeRemapper::RemapResourceOperandSM50 (const OperandToken& Operand, Uint32* Token)
10421047{
10431048 const auto FindResourceBindings = [this ](RES_TYPE Type, Uint32& Token) //
10441049 {
@@ -1063,7 +1068,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM50(const OperandToken& Operan
10631068 // 0 - cbuffer bind point
10641069 // 1 - row offset (16 bytes per row) | cbuffer size
10651070
1066- VERIFY_EXPR (Token + 2 <= Finish );
1071+ VERIFY_EXPR (Token + 2 <= GetChunkEnd () );
10671072 VERIFY_EXPR (Operand.IndexDim == D3D10_SB_OPERAND_INDEX_2D);
10681073 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
10691074 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
@@ -1077,7 +1082,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM50(const OperandToken& Operan
10771082 {
10781083 // 0 - sampler bind point
10791084
1080- VERIFY_EXPR (Token + 1 <= Finish );
1085+ VERIFY_EXPR (Token + 1 <= GetChunkEnd () );
10811086 VERIFY_EXPR (Operand.IndexDim == D3D10_SB_OPERAND_INDEX_1D);
10821087 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
10831088
@@ -1090,7 +1095,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM50(const OperandToken& Operan
10901095 {
10911096 // 0 - texture bind point
10921097
1093- VERIFY_EXPR (Token + 1 <= Finish );
1098+ VERIFY_EXPR (Token + 1 <= GetChunkEnd () );
10941099 VERIFY_EXPR (Operand.IndexDim == D3D10_SB_OPERAND_INDEX_1D);
10951100 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
10961101
@@ -1103,7 +1108,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM50(const OperandToken& Operan
11031108 {
11041109 // 0 - UAV bind point
11051110
1106- VERIFY_EXPR (Token + 1 <= Finish );
1111+ VERIFY_EXPR (Token + 1 <= GetChunkEnd () );
11071112 VERIFY_EXPR (Operand.IndexDim == D3D10_SB_OPERAND_INDEX_1D);
11081113 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
11091114
@@ -1157,7 +1162,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM51_2(const OperandToken& Oper
11571162 }
11581163}
11591164
1160- void ShaderBytecodeRemapper::RemapResourceOperandSM51 (const OperandToken& Operand, Uint32* Token, const void * Finish )
1165+ void ShaderBytecodeRemapper::RemapResourceOperandSM51 (const OperandToken& Operand, Uint32* Token)
11611166{
11621167 switch (Operand.OperandType )
11631168 {
@@ -1167,7 +1172,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM51(const OperandToken& Operan
11671172 // 1 - cbuffer bind point
11681173 // 2 - row offset (16 bytes per row)
11691174
1170- VERIFY_EXPR (Token + 3 <= Finish );
1175+ VERIFY_EXPR (Token + 3 <= GetChunkEnd () );
11711176 VERIFY_EXPR (Operand.IndexDim == D3D10_SB_OPERAND_INDEX_3D);
11721177 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
11731178
@@ -1180,7 +1185,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM51(const OperandToken& Operan
11801185 // 0 - sampler index in resource definition
11811186 // 1 - sampler bind point
11821187
1183- VERIFY_EXPR (Token + 2 <= Finish );
1188+ VERIFY_EXPR (Token + 2 <= GetChunkEnd () );
11841189 VERIFY_EXPR (Operand.IndexDim >= D3D10_SB_OPERAND_INDEX_2D);
11851190 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
11861191
@@ -1193,7 +1198,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM51(const OperandToken& Operan
11931198 // 0 - texture index in resource definition
11941199 // 1 - texture bind point
11951200
1196- VERIFY_EXPR (Token + 2 <= Finish );
1201+ VERIFY_EXPR (Token + 2 <= GetChunkEnd () );
11971202 VERIFY_EXPR (Operand.IndexDim >= D3D10_SB_OPERAND_INDEX_2D);
11981203 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
11991204
@@ -1206,7 +1211,7 @@ void ShaderBytecodeRemapper::RemapResourceOperandSM51(const OperandToken& Operan
12061211 // 0 - UAV index in resource definition
12071212 // 1 - UAV bind point
12081213
1209- VERIFY_EXPR (Token + 2 <= Finish );
1214+ VERIFY_EXPR (Token + 2 <= GetChunkEnd () );
12101215 VERIFY_EXPR (Operand.IndexDim >= D3D10_SB_OPERAND_INDEX_2D);
12111216 VERIFY_EXPR (Operand.OperandIndex1D == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
12121217
@@ -1460,7 +1465,7 @@ void ShaderBytecodeRemapper::RemapResourceBindingSM51(const OpcodeToken& Opcode,
14601465 }
14611466}
14621467
1463- void ShaderBytecodeRemapper::ParseIndex (D3D10_SB_OPERAND_INDEX_REPRESENTATION IndexType, Uint32*& Token, const void * Finish )
1468+ void ShaderBytecodeRemapper::ParseIndex (D3D10_SB_OPERAND_INDEX_REPRESENTATION IndexType, Uint32*& Token)
14641469{
14651470 switch (IndexType)
14661471 {
@@ -1476,27 +1481,27 @@ void ShaderBytecodeRemapper::ParseIndex(D3D10_SB_OPERAND_INDEX_REPRESENTATION In
14761481 }
14771482 case D3D10_SB_OPERAND_INDEX_RELATIVE:
14781483 {
1479- ParseOperand (Token, Finish );
1484+ ParseOperand (Token);
14801485 break ;
14811486 }
14821487 case D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE:
14831488 {
14841489 Token += 1 ;
1485- ParseOperand (Token, Finish );
1490+ ParseOperand (Token);
14861491 break ;
14871492 }
14881493 case D3D10_SB_OPERAND_INDEX_IMMEDIATE64_PLUS_RELATIVE:
14891494 {
14901495 Token += 2 ;
1491- ParseOperand (Token, Finish );
1496+ ParseOperand (Token);
14921497 break ;
14931498 }
14941499 default :
14951500 LOG_ERROR_AND_THROW (" Unknown index type" );
14961501 }
14971502}
14981503
1499- void ShaderBytecodeRemapper::ParseOperand (Uint32*& Token, const void * Finish )
1504+ void ShaderBytecodeRemapper::ParseOperand (Uint32*& Token)
15001505{
15011506 const OperandToken& Operand = *reinterpret_cast <OperandToken*>(Token++);
15021507
@@ -1567,7 +1572,7 @@ void ShaderBytecodeRemapper::ParseOperand(Uint32*& Token, const void* Finish)
15671572 case D3D10_SB_OPERAND_TYPE_CONSTANT_BUFFER:
15681573 case D3D10_SB_OPERAND_TYPE_IMMEDIATE_CONSTANT_BUFFER:
15691574 case D3D11_SB_OPERAND_TYPE_UNORDERED_ACCESS_VIEW:
1570- RemapResourceOperand (Operand, Token, Finish );
1575+ RemapResourceOperand (Operand, Token);
15711576 break ;
15721577
15731578 default :
@@ -1577,19 +1582,19 @@ void ShaderBytecodeRemapper::ParseOperand(Uint32*& Token, const void* Finish)
15771582 if (Operand.IndexDim != D3D10_SB_OPERAND_INDEX_0D)
15781583 {
15791584 if (Operand.IndexDim >= D3D10_SB_OPERAND_INDEX_1D)
1580- ParseIndex (Operand.OperandIndex1D , Token, Finish );
1585+ ParseIndex (Operand.OperandIndex1D , Token);
15811586
15821587 if (Operand.IndexDim >= D3D10_SB_OPERAND_INDEX_2D)
1583- ParseIndex (Operand.OperandIndex2D , Token, Finish );
1588+ ParseIndex (Operand.OperandIndex2D , Token);
15841589
15851590 if (Operand.IndexDim >= D3D10_SB_OPERAND_INDEX_3D)
1586- ParseIndex (Operand.OperandIndex3D , Token, Finish );
1591+ ParseIndex (Operand.OperandIndex3D , Token);
15871592 }
15881593
1589- VERIFY_EXPR (Token <= Finish );
1594+ VERIFY_EXPR (Token <= GetChunkEnd () );
15901595}
15911596
1592- void ShaderBytecodeRemapper::ParseCustomData (Uint32*& Token, const void * Finish, D3D10_SB_CUSTOMDATA_CLASS Type)
1597+ void ShaderBytecodeRemapper::ParseCustomData (Uint32*& Token, D3D10_SB_CUSTOMDATA_CLASS Type)
15931598{
15941599 switch (Type)
15951600 {
@@ -1605,14 +1610,14 @@ void ShaderBytecodeRemapper::ParseCustomData(Uint32*& Token, const void* Finish,
16051610 }
16061611}
16071612
1608- void ShaderBytecodeRemapper::ParseOpcode (Uint32*& Token, const void * Finish )
1613+ void ShaderBytecodeRemapper::ParseOpcode (Uint32*& Token)
16091614{
16101615 // based on code from
16111616 // https://github.com/microsoft/D3D12TranslationLayer/blob/master/src/ShaderBinary.cpp
16121617 // Copyright (c) Microsoft Corporation.
16131618 // MIT License
16141619
1615- Uint32* StartToken = Token ;
1620+ const ptrdiff_t StartTokenOffset = reinterpret_cast < const Uint8*>(Token) - Bytecode. data () ;
16161621 const OpcodeToken Opcode = reinterpret_cast <OpcodeToken&>(*Token++);
16171622 const Uint32 NumOperands = GetNumOperands (Opcode.OpcodeType );
16181623 Uint32 InstructionLength = Opcode.OpcodeLength ;
@@ -1646,7 +1651,7 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token, const void* Finish)
16461651 InstructionLength = *Token;
16471652 VERIFY_EXPR (InstructionLength >= 2 );
16481653
1649- ParseCustomData (Token, Finish, Type);
1654+ ParseCustomData (Token, Type);
16501655 break ;
16511656 }
16521657
@@ -1678,18 +1683,18 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token, const void* Finish)
16781683
16791684 default :
16801685 for (Uint32 i = 0 ; i < NumOperands; ++i)
1681- ParseOperand (Token, Finish );
1686+ ParseOperand (Token);
16821687 break ;
16831688 }
16841689
1685- Uint32* EndToken = StartToken + InstructionLength;
1690+ Uint32* StartToken = reinterpret_cast <Uint32*>(&Bytecode[StartTokenOffset]);
1691+ Uint32* EndToken = StartToken + InstructionLength;
16861692 VERIFY_EXPR (Token <= EndToken);
16871693
16881694 RemapResourceBinding (Opcode, StartToken + 1 , EndToken);
16891695
16901696 Token = EndToken;
1691-
1692- if (Token < Finish)
1697+ if (Token < GetChunkEnd ())
16931698 {
16941699 const OpcodeToken& NextOpcode = reinterpret_cast <const OpcodeToken&>(*Token);
16951700 VERIFY_EXPR (NextOpcode.OpcodeType < D3D10_SB_NUM_OPCODES);
@@ -1698,12 +1703,12 @@ void ShaderBytecodeRemapper::ParseOpcode(Uint32*& Token, const void* Finish)
16981703
16991704void ShaderBytecodeRemapper::PatchBytecode (const void * ChunkEnd) noexcept (false )
17001705{
1701- VERIFY_EXPR (ChunkEnd == Bytecode. data () + EndOffset * 4 );
1706+ VERIFY_EXPR (ChunkEnd == GetChunkEnd () );
17021707
17031708 Uint32* Token = reinterpret_cast <Uint32*>(&Bytecode[ChunkOffset + sizeof (ShaderChunkHeader)]);
1704- for (; Token < ChunkEnd; )
1709+ while ( Token < GetChunkEnd () )
17051710 {
1706- ParseOpcode (Token, ChunkEnd );
1711+ ParseOpcode (Token);
17071712 }
17081713}
17091714
0 commit comments