Skip to content

Commit 5f1fd99

Browse files
DXBCUtils: dynamically compute chunk end in ShaderBytecodeRemapper
1 parent ab3f15a commit 5f1fd99

File tree

1 file changed

+47
-42
lines changed

1 file changed

+47
-42
lines changed

Graphics/ShaderTools/src/DXBCUtils.cpp

Lines changed: 47 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

10061006
private:
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

16991704
void 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

Comments
 (0)