Skip to content

Commit 9a6f33e

Browse files
DXBCUtils: refactored initialization of ShaderBytecodeRemapper
1 parent 44b80f9 commit 9a6f33e

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

Graphics/ShaderTools/src/DXBCUtils.cpp

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -968,21 +968,39 @@ void RemapShaderResources(const DXBCUtils::TResourceBindingMap& ResourceMap, con
968968
struct ShaderBytecodeRemapper
969969
{
970970
public:
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

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

9881006
private:
@@ -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

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

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

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

Comments
 (0)