https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/151032
>From ea35c412bbfbefb50078bdd21b44156e1e1efe48 Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:02:34 -0700 Subject: [PATCH 1/7] remove the to_undernlying switch --- .../Frontend/HLSL/RootSignatureMetadata.cpp | 13 ++++--- .../HLSL/RootSignatureValidations.cpp | 7 ++-- llvm/lib/MC/DXContainerRootSignature.cpp | 36 ++++++++++++------- llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 28 +++++++++------ llvm/lib/ObjectYAML/DXContainerYAML.cpp | 18 ++++++---- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 14 ++++---- 6 files changed, 72 insertions(+), 44 deletions(-) diff --git a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp index 53f59349ae029..ed1e49c10818d 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp @@ -559,11 +559,14 @@ bool MetadataParser::validateRootSignature( assert(dxbc::isValidParameterType(Info.Header.ParameterType) && "Invalid value for ParameterType"); - switch (Info.Header.ParameterType) { + dxbc::RootParameterType PT = + static_cast<dxbc::RootParameterType>(Info.Header.ParameterType); - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): { + switch (PT) { + + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::UAV: + case dxbc::RootParameterType::SRV: { const dxbc::RTS0::v2::RootDescriptor &Descriptor = RSD.ParametersContainer.getRootDescriptor(Info.Location); if (!llvm::hlsl::rootsig::verifyRegisterValue(Descriptor.ShaderRegister)) @@ -580,7 +583,7 @@ bool MetadataParser::validateRootSignature( } break; } - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): { + case dxbc::RootParameterType::DescriptorTable: { const mcdxbc::DescriptorTable &Table = RSD.ParametersContainer.getDescriptorTable(Info.Location); for (const dxbc::RTS0::v2::DescriptorRange &Range : Table) { diff --git a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp index f11c7d2033bfb..e55d3ec15c19d 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp @@ -53,10 +53,9 @@ bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal) { bool verifyRangeType(uint32_t Type) { switch (Type) { - case llvm::to_underlying(dxbc::DescriptorRangeType::CBV): - case llvm::to_underlying(dxbc::DescriptorRangeType::SRV): - case llvm::to_underlying(dxbc::DescriptorRangeType::UAV): - case llvm::to_underlying(dxbc::DescriptorRangeType::Sampler): +#define DESCRIPTOR_RANGE(Num, Val) \ + case llvm::to_underlying(dxbc::DescriptorRangeType::Val): +#include "llvm/BinaryFormat/DXContainerConstants.def" return true; }; diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 482280b5ef289..454a0b88178f5 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -8,6 +8,7 @@ #include "llvm/MC/DXContainerRootSignature.h" #include "llvm/ADT/SmallString.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Support/EndianStream.h" using namespace llvm; @@ -35,20 +36,27 @@ size_t RootSignatureDesc::getSize() const { StaticSamplers.size() * sizeof(dxbc::RTS0::v1::StaticSampler); for (const RootParameterInfo &I : ParametersContainer) { - switch (I.Header.ParameterType) { - case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): + // Invalid parameters are allowed while writing. + if (!dxbc::isValidParameterType(I.Header.ParameterType)) + continue; + + dxbc::RootParameterType PT = + static_cast<dxbc::RootParameterType>(I.Header.ParameterType); + + switch (PT) { + case dxbc::RootParameterType::Constants32Bit: Size += sizeof(dxbc::RTS0::v1::RootConstants); break; - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::SRV: + case dxbc::RootParameterType::UAV: if (Version == 1) Size += sizeof(dxbc::RTS0::v1::RootDescriptor); else Size += sizeof(dxbc::RTS0::v2::RootDescriptor); break; - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): + case dxbc::RootParameterType::DescriptorTable: const DescriptorTable &Table = ParametersContainer.getDescriptorTable(I.Location); @@ -97,8 +105,12 @@ void RootSignatureDesc::write(raw_ostream &OS) const { for (size_t I = 0; I < NumParameters; ++I) { rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]); const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I); - switch (Type) { - case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { + if (!dxbc::isValidParameterType(Type)) + continue; + dxbc::RootParameterType PT = static_cast<dxbc::RootParameterType>(Type); + + switch (PT) { + case dxbc::RootParameterType::Constants32Bit: { const dxbc::RTS0::v1::RootConstants &Constants = ParametersContainer.getConstant(Loc); support::endian::write(BOS, Constants.ShaderRegister, @@ -109,9 +121,9 @@ void RootSignatureDesc::write(raw_ostream &OS) const { llvm::endianness::little); break; } - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): { + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::SRV: + case dxbc::RootParameterType::UAV: { const dxbc::RTS0::v2::RootDescriptor &Descriptor = ParametersContainer.getRootDescriptor(Loc); @@ -123,7 +135,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const { support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little); break; } - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): { + case dxbc::RootParameterType::DescriptorTable: { const DescriptorTable &Table = ParametersContainer.getDescriptorTable(Loc); support::endian::write(BOS, (uint32_t)Table.Ranges.size(), diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index 043b575a43b11..35e1c3e3b5953 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -278,8 +278,19 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { dxbc::RTS0::v1::RootParameterHeader Header{L.Header.Type, L.Header.Visibility, L.Header.Offset}; - switch (L.Header.Type) { - case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { + if (!dxbc::isValidParameterType(L.Header.Type)) { + // Handling invalid parameter type edge case. We intentionally let + // obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order + // for that to be used as a testing tool more effectively. + RS.ParametersContainer.addInvalidParameter(Header); + continue; + } + + dxbc::RootParameterType ParameterType = + static_cast<dxbc::RootParameterType>(L.Header.Type); + + switch (ParameterType) { + case dxbc::RootParameterType::Constants32Bit: { const DXContainerYAML::RootConstantsYaml &ConstantYaml = P.RootSignature->Parameters.getOrInsertConstants(L); dxbc::RTS0::v1::RootConstants Constants; @@ -289,9 +300,9 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.ParametersContainer.addParameter(Header, Constants); break; } - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): { + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::SRV: + case dxbc::RootParameterType::UAV: { const DXContainerYAML::RootDescriptorYaml &DescriptorYaml = P.RootSignature->Parameters.getOrInsertDescriptor(L); @@ -303,7 +314,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.ParametersContainer.addParameter(Header, Descriptor); break; } - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): { + case dxbc::RootParameterType::DescriptorTable: { const DXContainerYAML::DescriptorTableYaml &TableYaml = P.RootSignature->Parameters.getOrInsertTable(L); mcdxbc::DescriptorTable Table; @@ -323,11 +334,6 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { RS.ParametersContainer.addParameter(Header, Table); break; } - default: - // Handling invalid parameter type edge case. We intentionally let - // obj2yaml/yaml2obj parse and emit invalid dxcontainer data, in order - // for that to be used as a testing tool more effectively. - RS.ParametersContainer.addInvalidParameter(Header); } } diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 263f7bdf37bca..03d5725c21491 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -424,22 +424,28 @@ void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml, IO.mapRequired("ParameterType", L.Header.Type); IO.mapRequired("ShaderVisibility", L.Header.Visibility); - switch (L.Header.Type) { - case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { + if (!dxbc::isValidParameterType(L.Header.Type)) + return; + dxbc::RootParameterType PT = + static_cast<dxbc::RootParameterType>(L.Header.Type); + + // We allow ParameterType to be invalid here. + switch (PT) { + case dxbc::RootParameterType::Constants32Bit: { DXContainerYAML::RootConstantsYaml &Constants = S.Parameters.getOrInsertConstants(L); IO.mapRequired("Constants", Constants); break; } - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): { + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::SRV: + case dxbc::RootParameterType::UAV: { DXContainerYAML::RootDescriptorYaml &Descriptor = S.Parameters.getOrInsertDescriptor(L); IO.mapRequired("Descriptor", Descriptor); break; } - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): { + case dxbc::RootParameterType::DescriptorTable: { DXContainerYAML::DescriptorTableYaml &Table = S.Parameters.getOrInsertTable(L); IO.mapRequired("Table", Table); diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index ebdfcaa566b51..04c7c77953a5b 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -175,8 +175,10 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, OS << "- Parameter Type: " << Type << "\n" << " Shader Visibility: " << Header.ShaderVisibility << "\n"; - switch (Type) { - case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { + assert(dxbc::isValidParameterType(Type) && "Invalid Parameter Type"); + dxbc::RootParameterType PT = static_cast<dxbc::RootParameterType>(Type); + switch (PT) { + case dxbc::RootParameterType::Constants32Bit: { const dxbc::RTS0::v1::RootConstants &Constants = RS.ParametersContainer.getConstant(Loc); OS << " Register Space: " << Constants.RegisterSpace << "\n" @@ -184,9 +186,9 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, << " Num 32 Bit Values: " << Constants.Num32BitValues << "\n"; break; } - case llvm::to_underlying(dxbc::RootParameterType::CBV): - case llvm::to_underlying(dxbc::RootParameterType::UAV): - case llvm::to_underlying(dxbc::RootParameterType::SRV): { + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::UAV: + case dxbc::RootParameterType::SRV: { const dxbc::RTS0::v2::RootDescriptor &Descriptor = RS.ParametersContainer.getRootDescriptor(Loc); OS << " Register Space: " << Descriptor.RegisterSpace << "\n" @@ -195,7 +197,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, OS << " Flags: " << Descriptor.Flags << "\n"; break; } - case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): { + case dxbc::RootParameterType::DescriptorTable: { const mcdxbc::DescriptorTable &Table = RS.ParametersContainer.getDescriptorTable(Loc); OS << " NumRanges: " << Table.Ranges.size() << "\n"; >From 3c1fc513424cf45e5ab6f3d2fa402036390b5e74 Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:02:55 -0700 Subject: [PATCH 2/7] remove comment --- llvm/lib/MC/DXContainerRootSignature.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 454a0b88178f5..c94a39f80eeb2 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -36,7 +36,6 @@ size_t RootSignatureDesc::getSize() const { StaticSamplers.size() * sizeof(dxbc::RTS0::v1::StaticSampler); for (const RootParameterInfo &I : ParametersContainer) { - // Invalid parameters are allowed while writing. if (!dxbc::isValidParameterType(I.Header.ParameterType)) continue; >From 591d12a0071e43d0f14381028fa47b1b15f99b85 Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Mon, 28 Jul 2025 13:22:25 -0700 Subject: [PATCH 3/7] remove compiling errors --- llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp index ed1e49c10818d..742b2c55bcce9 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Frontend/HLSL/RootSignatureMetadata.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Frontend/HLSL/RootSignatureValidations.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/IRBuilder.h" @@ -563,6 +564,9 @@ bool MetadataParser::validateRootSignature( static_cast<dxbc::RootParameterType>(Info.Header.ParameterType); switch (PT) { + case dxbc::RootParameterType::Constants32Bit: + // ToDo: Add proper validation. + continue; case dxbc::RootParameterType::CBV: case dxbc::RootParameterType::UAV: >From 0d55d2898854ea0d3aada59e418ba231961d382f Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Tue, 29 Jul 2025 14:51:15 -0700 Subject: [PATCH 4/7] improve comment, maybe --- llvm/lib/ObjectYAML/DXContainerYAML.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 03d5725c21491..aca605e099535 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -424,12 +424,13 @@ void MappingContextTraits<DXContainerYAML::RootParameterLocationYaml, IO.mapRequired("ParameterType", L.Header.Type); IO.mapRequired("ShaderVisibility", L.Header.Visibility); + // If a parameter type is invalid, we don't have a body to parse. if (!dxbc::isValidParameterType(L.Header.Type)) return; + + // parses the body of a given root parameter type dxbc::RootParameterType PT = static_cast<dxbc::RootParameterType>(L.Header.Type); - - // We allow ParameterType to be invalid here. switch (PT) { case dxbc::RootParameterType::Constants32Bit: { DXContainerYAML::RootConstantsYaml &Constants = >From 25ee6d7c5b92c3d61aad261ff68974a244f8687b Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Wed, 6 Aug 2025 11:03:14 -0700 Subject: [PATCH 5/7] fixing merge issues --- llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp index 4ab70aaf20985..2b50493c21c7f 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp @@ -555,10 +555,13 @@ Error MetadataParser::validateRootSignature( dxbc::RootParameterType PT = static_cast<dxbc::RootParameterType>(Info.Header.ParameterType); - - case to_underlying(dxbc::RootParameterType::CBV): - case to_underlying(dxbc::RootParameterType::UAV): - case to_underlying(dxbc::RootParameterType::SRV): { + switch (PT) { + case dxbc::RootParameterType::Constants32Bit: + // ToDo: Add proper validation. + continue; + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::UAV: + case dxbc::RootParameterType::SRV: { const dxbc::RTS0::v2::RootDescriptor &Descriptor = RSD.ParametersContainer.getRootDescriptor(Info.Location); if (!hlsl::rootsig::verifyRegisterValue(Descriptor.ShaderRegister)) >From 3924438661ce2f8a7bc9bfc345e8e1cbbf8ee18a Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:10:05 -0700 Subject: [PATCH 6/7] fix --- llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp | 2 +- llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp index 050cc46e8c9b0..91152673df949 100644 --- a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp +++ b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp @@ -93,7 +93,7 @@ static raw_ostream &operator<<(raw_ostream &OS, } static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) { - OS << enumToStringRef(dxil::ResourceClass(llvm::to_underlying(Type)), + OS << enumToStringRef(dxil::ResourceClass(Type), dxil::getResourceClasses()); return OS; diff --git a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp index 7ae29c666d54c..c663c1db02a7b 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp @@ -121,7 +121,7 @@ MDNode *MetadataBuilder::BuildRootConstants(const RootConstants &Constants) { MDNode *MetadataBuilder::BuildRootDescriptor(const RootDescriptor &Descriptor) { IRBuilder<> Builder(Ctx); StringRef ResName = - enumToStringRef(dxil::ResourceClass(to_underlying(Descriptor.Type)), + enumToStringRef(dxil::ResourceClass(Descriptor.Type), dxil::getResourceClasses()); assert(!ResName.empty() && "Provided an invalid Resource Class"); SmallString<7> Name({"Root", ResName}); @@ -163,7 +163,7 @@ MDNode *MetadataBuilder::BuildDescriptorTableClause( const DescriptorTableClause &Clause) { IRBuilder<> Builder(Ctx); StringRef ResName = - enumToStringRef(dxil::ResourceClass(to_underlying(Clause.Type)), + enumToStringRef(dxil::ResourceClass(Clause.Type), dxil::getResourceClasses()); assert(!ResName.empty() && "Provided an invalid Resource Class"); Metadata *Operands[] = { >From 5f26016c74f2160ba5b236f8a7e945055f04477f Mon Sep 17 00:00:00 2001 From: Joao Saffran <{ID}+{username}@users.noreply.github.com> Date: Fri, 15 Aug 2025 15:17:28 -0700 Subject: [PATCH 7/7] finish changing --- clang/lib/Sema/SemaHLSL.cpp | 11 +- llvm/include/llvm/BinaryFormat/DXContainer.h | 44 +++--- .../Frontend/HLSL/RootSignatureMetadata.h | 2 +- .../Frontend/HLSL/RootSignatureValidations.h | 19 +-- .../llvm/MC/DXContainerRootSignature.h | 4 +- llvm/include/llvm/Object/DXContainer.h | 36 +++-- .../include/llvm/ObjectYAML/DXContainerYAML.h | 34 +++-- llvm/lib/BinaryFormat/DXContainer.cpp | 18 +++ .../Frontend/HLSL/RootSignatureMetadata.cpp | 134 +++++++++--------- .../HLSL/RootSignatureValidations.cpp | 46 +++--- llvm/lib/MC/DXContainerRootSignature.cpp | 8 +- llvm/lib/Object/DXContainer.cpp | 3 +- llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 4 +- llvm/lib/ObjectYAML/DXContainerYAML.cpp | 56 +++++++- llvm/lib/Target/DirectX/DXILRootSignature.cpp | 11 +- llvm/unittests/Object/DXContainerTest.cpp | 49 +++---- 16 files changed, 282 insertions(+), 197 deletions(-) diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 47a4874721db8..6263fddd1b0bb 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -39,6 +39,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/Twine.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Frontend/HLSL/HLSLBinding.h" #include "llvm/Frontend/HLSL/RootSignatureValidations.h" #include "llvm/Support/Casting.h" @@ -1218,9 +1219,9 @@ bool SemaHLSL::handleRootSignatureElements( ReportError(Loc, 0, 0xffffffef); }; - const uint32_t Version = - llvm::to_underlying(SemaRef.getLangOpts().HLSLRootSigVer); - const uint32_t VersionEnum = Version - 1; + const llvm::dxbc::RootSignatureVersion Version = + SemaRef.getLangOpts().HLSLRootSigVer; + const uint32_t VersionEnum = static_cast<uint32_t>(Version) - 1; auto ReportFlagError = [this, &HadError, VersionEnum](SourceLocation Loc) { HadError = true; this->Diag(Loc, diag::err_hlsl_invalid_rootsig_flag) @@ -1270,7 +1271,9 @@ bool SemaHLSL::handleRootSignatureElements( } if (!llvm::hlsl::rootsig::verifyDescriptorRangeFlag( - Version, llvm::to_underlying(Clause->Type), + Version, + llvm::dxbc::DescriptorRangeType( + llvm::to_underlying(Clause->Type)), llvm::to_underlying(Clause->Flags))) ReportFlagError(Loc); } diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h index f74c9775cb3f3..7010ffba0acd0 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainer.h +++ b/llvm/include/llvm/BinaryFormat/DXContainer.h @@ -200,9 +200,9 @@ enum class DescriptorRangeType : uint32_t { LLVM_ABI ArrayRef<EnumEntry<DescriptorRangeType>> getDescriptorRangeTypes(); #define ROOT_PARAMETER(Val, Enum) \ - case Val: \ + case dxbc::RootParameterType::Enum: \ return true; -inline bool isValidParameterType(uint32_t V) { +inline bool isValidParameterType(dxbc::RootParameterType V) { switch (V) { #include "DXContainerConstants.def" } @@ -217,9 +217,9 @@ enum class ShaderVisibility : uint32_t { LLVM_ABI ArrayRef<EnumEntry<ShaderVisibility>> getShaderVisibility(); #define SHADER_VISIBILITY(Val, Enum) \ - case Val: \ + case dxbc::ShaderVisibility::Enum: \ return true; -inline bool isValidShaderVisibility(uint32_t V) { +inline bool isValidShaderVisibility(dxbc::ShaderVisibility V) { switch (V) { #include "DXContainerConstants.def" } @@ -254,6 +254,14 @@ enum class StaticBorderColor : uint32_t { LLVM_ABI ArrayRef<EnumEntry<StaticBorderColor>> getStaticBorderColors(); +// D3D_ROOT_SIGNATURE_VERSION +enum class RootSignatureVersion { + V1_0 = 0x1, + V1_1 = 0x2, +}; + +LLVM_ABI ArrayRef<EnumEntry<RootSignatureVersion>> getRootSignatureVersions(); + LLVM_ABI PartType parsePartType(StringRef S); struct VertexPSVInfo { @@ -646,19 +654,19 @@ static_assert(sizeof(ProgramSignatureElement) == 32, namespace RTS0 { namespace v1 { struct StaticSampler { - uint32_t Filter; - uint32_t AddressU; - uint32_t AddressV; - uint32_t AddressW; + dxbc::SamplerFilter Filter; + dxbc::TextureAddressMode AddressU; + dxbc::TextureAddressMode AddressV; + dxbc::TextureAddressMode AddressW; float MipLODBias; uint32_t MaxAnisotropy; - uint32_t ComparisonFunc; - uint32_t BorderColor; + dxbc::ComparisonFunc ComparisonFunc; + dxbc::StaticBorderColor BorderColor; float MinLOD; float MaxLOD; uint32_t ShaderRegister; uint32_t RegisterSpace; - uint32_t ShaderVisibility; + dxbc::ShaderVisibility ShaderVisibility; void swapBytes() { sys::swapByteOrder(Filter); sys::swapByteOrder(AddressU); @@ -677,7 +685,7 @@ struct StaticSampler { }; struct DescriptorRange { - uint32_t RangeType; + dxbc::DescriptorRangeType RangeType; uint32_t NumDescriptors; uint32_t BaseShaderRegister; uint32_t RegisterSpace; @@ -715,8 +723,8 @@ struct RootConstants { }; struct RootParameterHeader { - uint32_t ParameterType; - uint32_t ShaderVisibility; + dxbc::RootParameterType ParameterType; + dxbc::ShaderVisibility ShaderVisibility; uint32_t ParameterOffset; void swapBytes() { @@ -760,7 +768,7 @@ struct RootDescriptor : public v1::RootDescriptor { }; struct DescriptorRange { - uint32_t RangeType; + dxbc::DescriptorRangeType RangeType; uint32_t NumDescriptors; uint32_t BaseShaderRegister; uint32_t RegisterSpace; @@ -778,12 +786,6 @@ struct DescriptorRange { } // namespace v2 } // namespace RTS0 -// D3D_ROOT_SIGNATURE_VERSION -enum class RootSignatureVersion { - V1_0 = 0x1, - V1_1 = 0x2, -}; - } // namespace dxbc } // namespace llvm diff --git a/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h b/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h index c6d7c32c4ad95..3ca1ebcc90bde 100644 --- a/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h +++ b/llvm/include/llvm/Frontend/HLSL/RootSignatureMetadata.h @@ -143,7 +143,7 @@ class MetadataParser { MetadataParser(MDNode *Root) : Root(Root) {} LLVM_ABI llvm::Expected<llvm::mcdxbc::RootSignatureDesc> - ParseRootSignature(uint32_t Version); + ParseRootSignature(dxbc::RootSignatureVersion Version); private: llvm::Error parseRootFlags(mcdxbc::RootSignatureDesc &RSD, diff --git a/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h index fde32a1fff591..ac3131fd05eb6 100644 --- a/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h +++ b/llvm/include/llvm/Frontend/HLSL/RootSignatureValidations.h @@ -15,6 +15,7 @@ #define LLVM_FRONTEND_HLSL_ROOTSIGNATUREVALIDATIONS_H #include "llvm/ADT/IntervalMap.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Frontend/HLSL/HLSLRootSignature.h" #include "llvm/Support/Compiler.h" @@ -25,20 +26,22 @@ namespace rootsig { // Basic verification of RootElements LLVM_ABI bool verifyRootFlag(uint32_t Flags); -LLVM_ABI bool verifyVersion(uint32_t Version); +LLVM_ABI bool verifyVersion(dxbc::RootSignatureVersion Version); LLVM_ABI bool verifyRegisterValue(uint32_t RegisterValue); LLVM_ABI bool verifyRegisterSpace(uint32_t RegisterSpace); -LLVM_ABI bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal); -LLVM_ABI bool verifyRangeType(uint32_t Type); -LLVM_ABI bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type, +LLVM_ABI bool verifyRootDescriptorFlag(dxbc::RootSignatureVersion Version, + uint32_t FlagsVal); +LLVM_ABI bool verifyRangeType(dxbc::DescriptorRangeType Type); +LLVM_ABI bool verifyDescriptorRangeFlag(dxbc::RootSignatureVersion Version, + dxbc::DescriptorRangeType Type, uint32_t FlagsVal); LLVM_ABI bool verifyNumDescriptors(uint32_t NumDescriptors); -LLVM_ABI bool verifySamplerFilter(uint32_t Value); -LLVM_ABI bool verifyAddress(uint32_t Address); +LLVM_ABI bool verifySamplerFilter(dxbc::SamplerFilter Value); +LLVM_ABI bool verifyAddress(dxbc::TextureAddressMode Address); LLVM_ABI bool verifyMipLODBias(float MipLODBias); LLVM_ABI bool verifyMaxAnisotropy(uint32_t MaxAnisotropy); -LLVM_ABI bool verifyComparisonFunc(uint32_t ComparisonFunc); -LLVM_ABI bool verifyBorderColor(uint32_t BorderColor); +LLVM_ABI bool verifyComparisonFunc(dxbc::ComparisonFunc ComparisonFunc); +LLVM_ABI bool verifyBorderColor(dxbc::StaticBorderColor BorderColor); LLVM_ABI bool verifyLOD(float LOD); } // namespace rootsig diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index 3c7c886e79fc3..6c2a4a75b7618 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -72,7 +72,7 @@ struct RootParametersContainer { Tables.push_back(Table); } - std::pair<uint32_t, uint32_t> + std::pair<dxbc::RootParameterType, uint32_t> getTypeAndLocForParameter(uint32_t Location) const { const RootParameterInfo &Info = ParametersInfo[Location]; return {Info.Header.ParameterType, Info.Location}; @@ -106,7 +106,7 @@ struct RootParametersContainer { }; struct RootSignatureDesc { - uint32_t Version = 2U; + dxbc::RootSignatureVersion Version = dxbc::RootSignatureVersion::V1_1; uint32_t Flags = 0U; uint32_t RootParameterOffset = 0U; uint32_t StaticSamplersOffset = 0u; diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index ad1b2361ff064..7398facdc42d7 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -146,8 +146,7 @@ struct RootParameterView { struct RootConstantView : RootParameterView { static bool classof(const RootParameterView *V) { - return V->Header.ParameterType == - (uint32_t)dxbc::RootParameterType::Constants32Bit; + return V->Header.ParameterType == dxbc::RootParameterType::Constants32Bit; } llvm::Expected<dxbc::RTS0::v1::RootConstants> read() { @@ -157,25 +156,24 @@ struct RootConstantView : RootParameterView { struct RootDescriptorView : RootParameterView { static bool classof(const RootParameterView *V) { - return (V->Header.ParameterType == - llvm::to_underlying(dxbc::RootParameterType::CBV) || - V->Header.ParameterType == - llvm::to_underlying(dxbc::RootParameterType::SRV) || - V->Header.ParameterType == - llvm::to_underlying(dxbc::RootParameterType::UAV)); + return (V->Header.ParameterType == dxbc::RootParameterType::CBV || + V->Header.ParameterType == dxbc::RootParameterType::SRV || + V->Header.ParameterType == dxbc::RootParameterType::UAV); } - llvm::Expected<dxbc::RTS0::v2::RootDescriptor> read(uint32_t Version) { - if (Version == 1) { + llvm::Expected<dxbc::RTS0::v2::RootDescriptor> + read(dxbc::RootSignatureVersion Version) { + if (Version == dxbc::RootSignatureVersion::V1_0) { auto Descriptor = readParameter<dxbc::RTS0::v1::RootDescriptor>(); if (Error E = Descriptor.takeError()) return E; return dxbc::RTS0::v2::RootDescriptor(*Descriptor); } - if (Version != 2) - return make_error<GenericBinaryError>("Invalid Root Signature version: " + - Twine(Version), - object_error::parse_failed); + if (Version != dxbc::RootSignatureVersion::V1_1) + return make_error<GenericBinaryError>( + "Invalid Root Signature version: " + + Twine(static_cast<uint32_t>(Version)), + object_error::parse_failed); return readParameter<dxbc::RTS0::v2::RootDescriptor>(); } }; @@ -192,7 +190,7 @@ template <typename T> struct DescriptorTable { struct DescriptorTableView : RootParameterView { static bool classof(const RootParameterView *V) { return (V->Header.ParameterType == - llvm::to_underlying(dxbc::RootParameterType::DescriptorTable)); + dxbc::RootParameterType::DescriptorTable); } // Define a type alias to access the template parameter from inside classof @@ -220,7 +218,7 @@ static Error parseFailed(const Twine &Msg) { class RootSignature { private: - uint32_t Version; + dxbc::RootSignatureVersion Version; uint32_t NumParameters; uint32_t RootParametersOffset; uint32_t NumStaticSamplers; @@ -238,7 +236,7 @@ class RootSignature { RootSignature(StringRef PD) : PartData(PD) {} LLVM_ABI Error parse(); - uint32_t getVersion() const { return Version; } + dxbc::RootSignatureVersion getVersion() const { return Version; } uint32_t getNumParameters() const { return NumParameters; } uint32_t getRootParametersOffset() const { return RootParametersOffset; } uint32_t getNumStaticSamplers() const { return NumStaticSamplers; } @@ -269,7 +267,7 @@ class RootSignature { case dxbc::RootParameterType::CBV: case dxbc::RootParameterType::SRV: case dxbc::RootParameterType::UAV: - if (Version == 1) + if (Version == dxbc::RootSignatureVersion::V1_0) DataSize = sizeof(dxbc::RTS0::v1::RootDescriptor); else DataSize = sizeof(dxbc::RTS0::v2::RootDescriptor); @@ -281,7 +279,7 @@ class RootSignature { uint32_t NumRanges = support::endian::read<uint32_t, llvm::endianness::little>( PartData.begin() + Header.ParameterOffset); - if (Version == 1) + if (Version == dxbc::RootSignatureVersion::V1_0) DataSize = sizeof(dxbc::RTS0::v1::DescriptorRange) * NumRanges; else DataSize = sizeof(dxbc::RTS0::v2::DescriptorRange) * NumRanges; diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h index 7e0a4c6b07039..dadc4d2ed6043 100644 --- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h +++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h @@ -92,7 +92,7 @@ struct RootDescriptorYaml { }; struct DescriptorRangeYaml { - uint32_t RangeType; + dxbc::DescriptorRangeType RangeType; uint32_t NumDescriptors; uint32_t BaseShaderRegister; uint32_t RegisterSpace; @@ -111,12 +111,12 @@ struct DescriptorTableYaml { }; struct RootParameterHeaderYaml { - uint32_t Type; - uint32_t Visibility; + dxbc::RootParameterType Type; + dxbc::ShaderVisibility Visibility; uint32_t Offset; RootParameterHeaderYaml(){}; - RootParameterHeaderYaml(uint32_t T) : Type(T) {} + RootParameterHeaderYaml(dxbc::RootParameterType T) : Type(T) {} }; struct RootParameterLocationYaml { @@ -165,27 +165,25 @@ struct RootParameterYamlDesc { }; struct StaticSamplerYamlDesc { - uint32_t Filter = llvm::to_underlying(dxbc::SamplerFilter::Anisotropic); - uint32_t AddressU = llvm::to_underlying(dxbc::TextureAddressMode::Wrap); - uint32_t AddressV = llvm::to_underlying(dxbc::TextureAddressMode::Wrap); - uint32_t AddressW = llvm::to_underlying(dxbc::TextureAddressMode::Wrap); + dxbc::SamplerFilter Filter = dxbc::SamplerFilter::Anisotropic; + dxbc::TextureAddressMode AddressU = dxbc::TextureAddressMode::Wrap; + dxbc::TextureAddressMode AddressV = dxbc::TextureAddressMode::Wrap; + dxbc::TextureAddressMode AddressW = dxbc::TextureAddressMode::Wrap; float MipLODBias = 0.f; uint32_t MaxAnisotropy = 16u; - uint32_t ComparisonFunc = - llvm::to_underlying(dxbc::ComparisonFunc::LessEqual); - uint32_t BorderColor = - llvm::to_underlying(dxbc::StaticBorderColor::OpaqueWhite); + dxbc::ComparisonFunc ComparisonFunc = dxbc::ComparisonFunc::LessEqual; + dxbc::StaticBorderColor BorderColor = dxbc::StaticBorderColor::OpaqueWhite; float MinLOD = 0.f; float MaxLOD = std::numeric_limits<float>::max(); uint32_t ShaderRegister; uint32_t RegisterSpace; - uint32_t ShaderVisibility; + dxbc::ShaderVisibility ShaderVisibility; }; struct RootSignatureYamlDesc { RootSignatureYamlDesc() = default; - uint32_t Version; + dxbc::RootSignatureVersion Version; uint32_t NumRootParameters; uint32_t RootParametersOffset; uint32_t NumStaticSamplers; @@ -321,6 +319,14 @@ LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ResourceKind) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::D3DSystemValue) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigComponentType) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SigMinPrecision) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibility) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootParameterType) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::DescriptorRangeType) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::SamplerFilter) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::TextureAddressMode) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::StaticBorderColor) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ComparisonFunc) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::RootSignatureVersion) namespace llvm { diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp index 36d10d0b63078..8d8cfbf163118 100644 --- a/llvm/lib/BinaryFormat/DXContainer.cpp +++ b/llvm/lib/BinaryFormat/DXContainer.cpp @@ -139,6 +139,24 @@ ArrayRef<EnumEntry<StaticBorderColor>> dxbc::getStaticBorderColors() { return ArrayRef(StaticBorderColorValues); } +#define DESCRIPTOR_RANGE(Val, Enum) {#Enum, DescriptorRangeType::Enum}, +static const EnumEntry<DescriptorRangeType> DescriptorRangeTypeValues[] = { +#include "llvm/BinaryFormat/DXContainerConstants.def" +}; + +ArrayRef<EnumEntry<DescriptorRangeType>> dxbc::getDescriptorRangeTypes() { + return ArrayRef(DescriptorRangeTypeValues); +} + +static const EnumEntry<RootSignatureVersion> RootSignatureVersionsValues[] = { + {"V1_0", RootSignatureVersion::V1_0}, + {"V1_1", RootSignatureVersion::V1_1}, +}; + +ArrayRef<EnumEntry<RootSignatureVersion>> dxbc::getRootSignatureVersions() { + return ArrayRef(RootSignatureVersionsValues); +} + #define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum}, static const EnumEntry<RootParameterType> RootParameterTypes[] = { diff --git a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp index c663c1db02a7b..5d2d02b344309 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureMetadata.cpp @@ -228,10 +228,10 @@ Error MetadataParser::parseRootConstants(mcdxbc::RootSignatureDesc &RSD, dxbc::RTS0::v1::RootParameterHeader Header; // The parameter offset doesn't matter here - we recalculate it during // serialization Header.ParameterOffset = 0; - Header.ParameterType = to_underlying(dxbc::RootParameterType::Constants32Bit); + Header.ParameterType = dxbc::RootParameterType::Constants32Bit; if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1)) - Header.ShaderVisibility = *Val; + Header.ShaderVisibility = static_cast<dxbc::ShaderVisibility>(*Val); else return make_error<InvalidRSMetadataValue>("ShaderVisibility"); @@ -270,13 +270,13 @@ Error MetadataParser::parseRootDescriptors( dxbc::RTS0::v1::RootParameterHeader Header; switch (ElementKind) { case RootSignatureElementKind::SRV: - Header.ParameterType = to_underlying(dxbc::RootParameterType::SRV); + Header.ParameterType = dxbc::RootParameterType::SRV; break; case RootSignatureElementKind::UAV: - Header.ParameterType = to_underlying(dxbc::RootParameterType::UAV); + Header.ParameterType = dxbc::RootParameterType::UAV; break; case RootSignatureElementKind::CBV: - Header.ParameterType = to_underlying(dxbc::RootParameterType::CBV); + Header.ParameterType = dxbc::RootParameterType::CBV; break; default: llvm_unreachable("invalid Root Descriptor kind"); @@ -284,7 +284,7 @@ Error MetadataParser::parseRootDescriptors( } if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1)) - Header.ShaderVisibility = *Val; + Header.ShaderVisibility = static_cast<dxbc::ShaderVisibility>(*Val); else return make_error<InvalidRSMetadataValue>("ShaderVisibility"); @@ -299,11 +299,11 @@ Error MetadataParser::parseRootDescriptors( else return make_error<InvalidRSMetadataValue>("RegisterSpace"); - if (RSD.Version == 1) { + if (RSD.Version == dxbc::RootSignatureVersion::V1_0) { RSD.ParametersContainer.addParameter(Header, Descriptor); return Error::success(); } - assert(RSD.Version > 1); + assert(RSD.Version > dxbc::RootSignatureVersion::V1_0); if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4)) Descriptor.Flags = *Val; @@ -327,15 +327,13 @@ Error MetadataParser::parseDescriptorRange(mcdxbc::DescriptorTable &Table, if (!ElementText.has_value()) return make_error<InvalidRSMetadataFormat>("Descriptor Range"); - Range.RangeType = - StringSwitch<uint32_t>(*ElementText) - .Case("CBV", to_underlying(dxbc::DescriptorRangeType::CBV)) - .Case("SRV", to_underlying(dxbc::DescriptorRangeType::SRV)) - .Case("UAV", to_underlying(dxbc::DescriptorRangeType::UAV)) - .Case("Sampler", to_underlying(dxbc::DescriptorRangeType::Sampler)) - .Default(~0U); + Range.RangeType = StringSwitch<dxbc::DescriptorRangeType>(*ElementText) + .Case("CBV", dxbc::DescriptorRangeType::CBV) + .Case("SRV", dxbc::DescriptorRangeType::SRV) + .Case("UAV", dxbc::DescriptorRangeType::UAV) + .Case("Sampler", dxbc::DescriptorRangeType::Sampler); - if (Range.RangeType == ~0U) + if (!verifyRangeType(Range.RangeType)) return make_error<GenericRSMetadataError>("Invalid Descriptor Range type.", RangeDescriptorNode); @@ -378,13 +376,12 @@ Error MetadataParser::parseDescriptorTable(mcdxbc::RootSignatureDesc &RSD, dxbc::RTS0::v1::RootParameterHeader Header; if (std::optional<uint32_t> Val = extractMdIntValue(DescriptorTableNode, 1)) - Header.ShaderVisibility = *Val; + Header.ShaderVisibility = static_cast<dxbc::ShaderVisibility>(*Val); else return make_error<InvalidRSMetadataValue>("ShaderVisibility"); mcdxbc::DescriptorTable Table; - Header.ParameterType = - to_underlying(dxbc::RootParameterType::DescriptorTable); + Header.ParameterType = dxbc::RootParameterType::DescriptorTable; for (unsigned int I = 2; I < NumOperands; I++) { MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I)); @@ -407,22 +404,22 @@ Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD, dxbc::RTS0::v1::StaticSampler Sampler; if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 1)) - Sampler.Filter = *Val; + Sampler.Filter = static_cast<dxbc::SamplerFilter>(*Val); else return make_error<InvalidRSMetadataValue>("Filter"); if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 2)) - Sampler.AddressU = *Val; + Sampler.AddressU = static_cast<dxbc::TextureAddressMode>(*Val); else return make_error<InvalidRSMetadataValue>("AddressU"); if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 3)) - Sampler.AddressV = *Val; + Sampler.AddressV = static_cast<dxbc::TextureAddressMode>(*Val); else return make_error<InvalidRSMetadataValue>("AddressV"); if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 4)) - Sampler.AddressW = *Val; + Sampler.AddressW = static_cast<dxbc::TextureAddressMode>(*Val); else return make_error<InvalidRSMetadataValue>("AddressW"); @@ -437,12 +434,12 @@ Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD, return make_error<InvalidRSMetadataValue>("MaxAnisotropy"); if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 7)) - Sampler.ComparisonFunc = *Val; + Sampler.ComparisonFunc = static_cast<dxbc::ComparisonFunc>(*Val); else return make_error<InvalidRSMetadataValue>("ComparisonFunc"); if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 8)) - Sampler.BorderColor = *Val; + Sampler.BorderColor = static_cast<dxbc::StaticBorderColor>(*Val); else return make_error<InvalidRSMetadataValue>("ComparisonFunc"); @@ -467,7 +464,7 @@ Error MetadataParser::parseStaticSampler(mcdxbc::RootSignatureDesc &RSD, return make_error<InvalidRSMetadataValue>("RegisterSpace"); if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 13)) - Sampler.ShaderVisibility = *Val; + Sampler.ShaderVisibility = static_cast<dxbc::ShaderVisibility>(*Val); else return make_error<InvalidRSMetadataValue>("ShaderVisibility"); @@ -518,10 +515,10 @@ Error MetadataParser::validateRootSignature( const mcdxbc::RootSignatureDesc &RSD) { Error DeferredErrs = Error::success(); if (!hlsl::rootsig::verifyVersion(RSD.Version)) { - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "Version", RSD.Version)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::RootSignatureVersion>>( + "Version", RSD.Version)); } if (!hlsl::rootsig::verifyRootFlag(RSD.Flags)) { @@ -533,10 +530,10 @@ Error MetadataParser::validateRootSignature( for (const mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) { if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "ShaderVisibility", Info.Header.ShaderVisibility)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::ShaderVisibility>>( + "ShaderVisibility", Info.Header.ShaderVisibility)); assert(dxbc::isValidParameterType(Info.Header.ParameterType) && "Invalid value for ParameterType"); @@ -564,7 +561,7 @@ Error MetadataParser::validateRootSignature( make_error<RootSignatureValidationError<uint32_t>>( "RegisterSpace", Descriptor.RegisterSpace)); - if (RSD.Version > 1) { + if (RSD.Version > dxbc::RootSignatureVersion::V1_0) { if (!hlsl::rootsig::verifyRootDescriptorFlag(RSD.Version, Descriptor.Flags)) DeferredErrs = @@ -579,10 +576,11 @@ Error MetadataParser::validateRootSignature( RSD.ParametersContainer.getDescriptorTable(Info.Location); for (const dxbc::RTS0::v2::DescriptorRange &Range : Table) { if (!hlsl::rootsig::verifyRangeType(Range.RangeType)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "RangeType", Range.RangeType)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error< + RootSignatureValidationError<dxbc::DescriptorRangeType>>( + "RangeType", Range.RangeType)); if (!hlsl::rootsig::verifyRegisterSpace(Range.RegisterSpace)) DeferredErrs = @@ -610,28 +608,28 @@ Error MetadataParser::validateRootSignature( for (const dxbc::RTS0::v1::StaticSampler &Sampler : RSD.StaticSamplers) { if (!hlsl::rootsig::verifySamplerFilter(Sampler.Filter)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "Filter", Sampler.Filter)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::SamplerFilter>>( + "Filter", Sampler.Filter)); if (!hlsl::rootsig::verifyAddress(Sampler.AddressU)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "AddressU", Sampler.AddressU)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::TextureAddressMode>>( + "AddressU", Sampler.AddressU)); if (!hlsl::rootsig::verifyAddress(Sampler.AddressV)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "AddressV", Sampler.AddressV)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::TextureAddressMode>>( + "AddressV", Sampler.AddressV)); if (!hlsl::rootsig::verifyAddress(Sampler.AddressW)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "AddressW", Sampler.AddressW)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::TextureAddressMode>>( + "AddressW", Sampler.AddressW)); if (!hlsl::rootsig::verifyMipLODBias(Sampler.MipLODBias)) DeferredErrs = joinErrors(std::move(DeferredErrs), @@ -645,16 +643,16 @@ Error MetadataParser::validateRootSignature( "MaxAnisotropy", Sampler.MaxAnisotropy)); if (!hlsl::rootsig::verifyComparisonFunc(Sampler.ComparisonFunc)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "ComparisonFunc", Sampler.ComparisonFunc)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::ComparisonFunc>>( + "ComparisonFunc", Sampler.ComparisonFunc)); if (!hlsl::rootsig::verifyBorderColor(Sampler.BorderColor)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "BorderColor", Sampler.BorderColor)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::StaticBorderColor>>( + "BorderColor", Sampler.BorderColor)); if (!hlsl::rootsig::verifyLOD(Sampler.MinLOD)) DeferredErrs = joinErrors(std::move(DeferredErrs), @@ -679,17 +677,17 @@ Error MetadataParser::validateRootSignature( "RegisterSpace", Sampler.RegisterSpace)); if (!dxbc::isValidShaderVisibility(Sampler.ShaderVisibility)) - DeferredErrs = - joinErrors(std::move(DeferredErrs), - make_error<RootSignatureValidationError<uint32_t>>( - "ShaderVisibility", Sampler.ShaderVisibility)); + DeferredErrs = joinErrors( + std::move(DeferredErrs), + make_error<RootSignatureValidationError<dxbc::ShaderVisibility>>( + "ShaderVisibility", Sampler.ShaderVisibility)); } return DeferredErrs; } Expected<mcdxbc::RootSignatureDesc> -MetadataParser::ParseRootSignature(uint32_t Version) { +MetadataParser::ParseRootSignature(dxbc::RootSignatureVersion Version) { Error DeferredErrs = Error::success(); mcdxbc::RootSignatureDesc RSD; RSD.Version = Version; diff --git a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp index ebd12169b86ab..9a5b3b8cae4f6 100644 --- a/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp +++ b/llvm/lib/Frontend/HLSL/RootSignatureValidations.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "llvm/Frontend/HLSL/RootSignatureValidations.h" +#include "llvm/BinaryFormat/DXContainer.h" #include <cmath> @@ -20,7 +21,10 @@ namespace rootsig { bool verifyRootFlag(uint32_t Flags) { return (Flags & ~0xfff) == 0; } -bool verifyVersion(uint32_t Version) { return (Version == 1 || Version == 2); } +bool verifyVersion(dxbc::RootSignatureVersion Version) { + return (Version == dxbc::RootSignatureVersion::V1_0 || + Version == dxbc::RootSignatureVersion::V1_1); +} bool verifyRegisterValue(uint32_t RegisterValue) { return RegisterValue != ~0U; @@ -32,13 +36,15 @@ bool verifyRegisterSpace(uint32_t RegisterSpace) { return !(RegisterSpace >= 0xFFFFFFF0); } -bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal) { +bool verifyRootDescriptorFlag(dxbc::RootSignatureVersion Version, + uint32_t FlagsVal) { using FlagT = dxbc::RootDescriptorFlags; FlagT Flags = FlagT(FlagsVal); - if (Version == 1) + if (Version == dxbc::RootSignatureVersion::V1_0) return Flags == FlagT::DataVolatile; - assert(Version == 2 && "Provided invalid root signature version"); + assert(Version == dxbc::RootSignatureVersion::V1_1 && + "Provided invalid root signature version"); // The data-specific flags are mutually exclusive. FlagT DataFlags = FlagT::DataVolatile | FlagT::DataStatic | @@ -51,10 +57,9 @@ bool verifyRootDescriptorFlag(uint32_t Version, uint32_t FlagsVal) { return (Flags | DataFlags) == DataFlags; } -bool verifyRangeType(uint32_t Type) { +bool verifyRangeType(dxbc::DescriptorRangeType Type) { switch (Type) { -#define DESCRIPTOR_RANGE(Num, Val) \ - case llvm::to_underlying(dxbc::DescriptorRangeType::Val): +#define DESCRIPTOR_RANGE(Num, Val) case dxbc::DescriptorRangeType::Val: #include "llvm/BinaryFormat/DXContainerConstants.def" return true; }; @@ -62,15 +67,15 @@ bool verifyRangeType(uint32_t Type) { return false; } -bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type, +bool verifyDescriptorRangeFlag(llvm::dxbc::RootSignatureVersion Version, + llvm::dxbc::DescriptorRangeType Type, uint32_t FlagsVal) { using FlagT = dxbc::DescriptorRangeFlags; FlagT Flags = FlagT(FlagsVal); - const bool IsSampler = - (Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)); + const bool IsSampler = (Type == dxbc::DescriptorRangeType::Sampler); - if (Version == 1) { + if (Version == dxbc::RootSignatureVersion::V1_0) { // Since the metadata is unversioned, we expect to explicitly see the values // that map to the version 1 behaviour here. if (IsSampler) @@ -128,9 +133,9 @@ bool verifyNumDescriptors(uint32_t NumDescriptors) { return NumDescriptors > 0; } -bool verifySamplerFilter(uint32_t Value) { +bool verifySamplerFilter(dxbc::SamplerFilter Value) { switch (Value) { -#define FILTER(Num, Val) case llvm::to_underlying(dxbc::SamplerFilter::Val): +#define FILTER(Num, Val) case dxbc::SamplerFilter::Val: #include "llvm/BinaryFormat/DXContainerConstants.def" return true; } @@ -139,10 +144,9 @@ bool verifySamplerFilter(uint32_t Value) { // Values allowed here: // https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_texture_address_mode#syntax -bool verifyAddress(uint32_t Address) { +bool verifyAddress(dxbc::TextureAddressMode Address) { switch (Address) { -#define TEXTURE_ADDRESS_MODE(Num, Val) \ - case llvm::to_underlying(dxbc::TextureAddressMode::Val): +#define TEXTURE_ADDRESS_MODE(Num, Val) case dxbc::TextureAddressMode::Val: #include "llvm/BinaryFormat/DXContainerConstants.def" return true; } @@ -157,20 +161,18 @@ bool verifyMaxAnisotropy(uint32_t MaxAnisotropy) { return MaxAnisotropy <= 16u; } -bool verifyComparisonFunc(uint32_t ComparisonFunc) { +bool verifyComparisonFunc(dxbc::ComparisonFunc ComparisonFunc) { switch (ComparisonFunc) { -#define COMPARISON_FUNC(Num, Val) \ - case llvm::to_underlying(dxbc::ComparisonFunc::Val): +#define COMPARISON_FUNC(Num, Val) case dxbc::ComparisonFunc::Val: #include "llvm/BinaryFormat/DXContainerConstants.def" return true; } return false; } -bool verifyBorderColor(uint32_t BorderColor) { +bool verifyBorderColor(dxbc::StaticBorderColor BorderColor) { switch (BorderColor) { -#define STATIC_BORDER_COLOR(Num, Val) \ - case llvm::to_underlying(dxbc::StaticBorderColor::Val): +#define STATIC_BORDER_COLOR(Num, Val) case dxbc::StaticBorderColor::Val: #include "llvm/BinaryFormat/DXContainerConstants.def" return true; } diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index c94a39f80eeb2..ebd1b201d6f00 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -49,7 +49,7 @@ size_t RootSignatureDesc::getSize() const { case dxbc::RootParameterType::CBV: case dxbc::RootParameterType::SRV: case dxbc::RootParameterType::UAV: - if (Version == 1) + if (Version == dxbc::RootSignatureVersion::V1_0) Size += sizeof(dxbc::RTS0::v1::RootDescriptor); else Size += sizeof(dxbc::RTS0::v2::RootDescriptor); @@ -62,7 +62,7 @@ size_t RootSignatureDesc::getSize() const { // 4 bytes for the number of ranges in table and // 4 bytes for the ranges offset Size += 2 * sizeof(uint32_t); - if (Version == 1) + if (Version == dxbc::RootSignatureVersion::V1_0) Size += sizeof(dxbc::RTS0::v1::DescriptorRange) * Table.Ranges.size(); else Size += sizeof(dxbc::RTS0::v2::DescriptorRange) * Table.Ranges.size(); @@ -130,7 +130,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const { llvm::endianness::little); support::endian::write(BOS, Descriptor.RegisterSpace, llvm::endianness::little); - if (Version > 1) + if (Version > dxbc::RootSignatureVersion::V1_0) support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little); break; } @@ -148,7 +148,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const { llvm::endianness::little); support::endian::write(BOS, Range.RegisterSpace, llvm::endianness::little); - if (Version > 1) + if (Version > dxbc::RootSignatureVersion::V1_0) support::endian::write(BOS, Range.Flags, llvm::endianness::little); support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart, llvm::endianness::little); diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 031b9414f4c1a..431befc24b673 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -250,7 +250,8 @@ Error DirectX::RootSignature::parse() { return parseFailed( "Invalid root signature, insufficient space for header."); - Version = support::endian::read<uint32_t, llvm::endianness::little>(Current); + Version = support::endian::read<dxbc::RootSignatureVersion, + llvm::endianness::little>(Current); Current += sizeof(uint32_t); NumParameters = diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index 35e1c3e3b5953..bf36bfe6647e5 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -309,7 +309,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { dxbc::RTS0::v2::RootDescriptor Descriptor; Descriptor.RegisterSpace = DescriptorYaml.RegisterSpace; Descriptor.ShaderRegister = DescriptorYaml.ShaderRegister; - if (RS.Version > 1) + if (RS.Version > dxbc::RootSignatureVersion::V1_0) Descriptor.Flags = DescriptorYaml.getEncodedFlags(); RS.ParametersContainer.addParameter(Header, Descriptor); break; @@ -327,7 +327,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { Range.RegisterSpace = R.RegisterSpace; Range.OffsetInDescriptorsFromTableStart = R.OffsetInDescriptorsFromTableStart; - if (RS.Version > 1) + if (RS.Version > dxbc::RootSignatureVersion::V1_0) Range.Flags = R.getEncodedFlags(); Table.Ranges.push_back(Range); } diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index aca605e099535..8cc38a3f928ff 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -79,7 +79,7 @@ DXContainerYAML::RootSignatureYamlDesc::create( const object::DirectX::RootSignature &Data) { RootSignatureYamlDesc RootSigDesc; - uint32_t Version = Data.getVersion(); + dxbc::RootSignatureVersion Version = Data.getVersion(); RootSigDesc.Version = Version; RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers(); @@ -139,7 +139,7 @@ DXContainerYAML::RootSignatureYamlDesc::create( YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister; YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace; - if (Version > 1) { + if (Version > dxbc::RootSignatureVersion::V1_0) { #define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \ YamlDescriptor.Enum = \ (Descriptor.Flags & \ @@ -148,11 +148,11 @@ DXContainerYAML::RootSignatureYamlDesc::create( } } else if (auto *DTV = dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) { - if (Version == 1) { + if (Version == dxbc::RootSignatureVersion::V1_0) { if (Error E = readDescriptorRanges<dxbc::RTS0::v1::DescriptorRange>( Header, RootSigDesc, DTV)) return std::move(E); - } else if (Version == 2) { + } else if (Version == dxbc::RootSignatureVersion::V1_1) { if (Error E = readDescriptorRanges<dxbc::RTS0::v2::DescriptorRange>( Header, RootSigDesc, DTV)) return std::move(E); @@ -592,6 +592,54 @@ void ScalarEnumerationTraits<dxbc::SigComponentType>::enumeration( IO.enumCase(Value, E.Name.str().c_str(), E.Value); } +void ScalarEnumerationTraits<dxbc::ShaderVisibility>::enumeration( + IO &IO, dxbc::ShaderVisibility &Value) { + for (const auto &E : dxbc::getShaderVisibility()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::RootParameterType>::enumeration( + IO &IO, dxbc::RootParameterType &Value) { + for (const auto &E : dxbc::getRootParameterTypes()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::DescriptorRangeType>::enumeration( + IO &IO, dxbc::DescriptorRangeType &Value) { + for (const auto &E : dxbc::getDescriptorRangeTypes()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::SamplerFilter>::enumeration( + IO &IO, dxbc::SamplerFilter &Value) { + for (const auto &E : dxbc::getSamplerFilters()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::TextureAddressMode>::enumeration( + IO &IO, dxbc::TextureAddressMode &Value) { + for (const auto &E : dxbc::getTextureAddressModes()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::StaticBorderColor>::enumeration( + IO &IO, dxbc::StaticBorderColor &Value) { + for (const auto &E : dxbc::getStaticBorderColors()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::ComparisonFunc>::enumeration( + IO &IO, dxbc::ComparisonFunc &Value) { + for (const auto &E : dxbc::getComparisonFuncs()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void ScalarEnumerationTraits<dxbc::RootSignatureVersion>::enumeration( + IO &IO, dxbc::RootSignatureVersion &Value) { + for (const auto &E : dxbc::getRootSignatureVersions()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + } // namespace yaml void DXContainerYAML::PSVInfo::mapInfoForVersion(yaml::IO &IO) { diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 4d46d97d5e1df..ba5d08a76ee2a 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -17,6 +17,7 @@ #include "llvm/Analysis/DXILMetadataAnalysis.h" #include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Frontend/HLSL/RootSignatureMetadata.h" +#include "llvm/Frontend/HLSL/RootSignatureValidations.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Function.h" @@ -116,9 +117,13 @@ analyzeModule(Module &M) { continue; } + assert(hlsl::rootsig::verifyVersion( + static_cast<dxbc::RootSignatureVersion>(*V))); + llvm::hlsl::rootsig::MetadataParser MDParser(RootElementListNode); llvm::Expected<mcdxbc::RootSignatureDesc> RSDOrErr = - MDParser.ParseRootSignature(V.value()); + MDParser.ParseRootSignature( + static_cast<dxbc::RootSignatureVersion>(*V)); if (!RSDOrErr) { handleAllErrors(RSDOrErr.takeError(), [&](ErrorInfoBase &EIB) { @@ -197,7 +202,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, RS.ParametersContainer.getRootDescriptor(Loc); OS << " Register Space: " << Descriptor.RegisterSpace << "\n" << " Shader Register: " << Descriptor.ShaderRegister << "\n"; - if (RS.Version > 1) + if (RS.Version > dxbc::RootSignatureVersion::V1_0) OS << " Flags: " << Descriptor.Flags << "\n"; break; } @@ -213,7 +218,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, << " Num Descriptors: " << Range.NumDescriptors << "\n" << " Offset In Descriptors From Table Start: " << Range.OffsetInDescriptorsFromTableStart << "\n"; - if (RS.Version > 1) + if (RS.Version > dxbc::RootSignatureVersion::V1_0) OS << " Flags: " << Range.Flags << "\n"; } break; diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp index 396d060a75bfd..f9fb464380a01 100644 --- a/llvm/unittests/Object/DXContainerTest.cpp +++ b/llvm/unittests/Object/DXContainerTest.cpp @@ -8,6 +8,7 @@ #include "llvm/Object/DXContainer.h" #include "llvm/ADT/StringRef.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/BinaryFormat/Magic.h" #include "llvm/ObjectYAML/DXContainerYAML.h" #include "llvm/ObjectYAML/yaml2obj.h" @@ -848,7 +849,7 @@ TEST(RootSignature, RootParameters) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 2u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_1); ASSERT_EQ(RS.getNumParameters(), 1u); ASSERT_EQ(RS.getRootParametersOffset(), 36u); ASSERT_EQ(RS.getNumStaticSamplers(), 0u); @@ -856,8 +857,8 @@ TEST(RootSignature, RootParameters) { ASSERT_EQ(RS.getFlags(), 17u); auto RootParam = *RS.param_headers().begin(); - ASSERT_EQ((unsigned)RootParam.ParameterType, 1u); - ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 2u); + ASSERT_EQ(RootParam.ParameterType, dxbc::RootParameterType::Constants32Bit); + ASSERT_EQ(RootParam.ShaderVisibility, dxbc::ShaderVisibility::Hull); auto ParamView = RS.getParameter(RootParam); ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); @@ -889,7 +890,7 @@ TEST(RootSignature, ParseRootFlags) { const auto &RS = C.getRootSignature(); ASSERT_TRUE(RS.has_value()); - ASSERT_EQ(RS->getVersion(), 2u); + ASSERT_EQ(RS->getVersion(), dxbc::RootSignatureVersion::V1_1); ASSERT_EQ(RS->getNumParameters(), 0u); ASSERT_EQ(RS->getRootParametersOffset(), 24u); ASSERT_EQ(RS->getNumStaticSamplers(), 0u); @@ -934,7 +935,7 @@ TEST(RootSignature, ParseRootConstant) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 2u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_1); ASSERT_EQ(RS.getNumParameters(), 1u); ASSERT_EQ(RS.getRootParametersOffset(), 24u); ASSERT_EQ(RS.getNumStaticSamplers(), 0u); @@ -943,7 +944,7 @@ TEST(RootSignature, ParseRootConstant) { auto RootParam = *RS.param_headers().begin(); ASSERT_EQ((unsigned)RootParam.ParameterType, 1u); - ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 2u); + ASSERT_EQ(RootParam.ShaderVisibility, dxbc::ShaderVisibility::Hull); auto ParamView = RS.getParameter(RootParam); ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); @@ -981,7 +982,7 @@ TEST(RootSignature, ParseRootDescriptor) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 1u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_0); ASSERT_EQ(RS.getNumParameters(), 1u); ASSERT_EQ(RS.getRootParametersOffset(), 24u); ASSERT_EQ(RS.getNumStaticSamplers(), 0u); @@ -990,7 +991,7 @@ TEST(RootSignature, ParseRootDescriptor) { auto RootParam = *RS.param_headers().begin(); ASSERT_EQ((unsigned)RootParam.ParameterType, 2u); - ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 3u); + ASSERT_EQ(RootParam.ShaderVisibility, dxbc::ShaderVisibility::Domain); auto ParamView = RS.getParameter(RootParam); ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); @@ -1025,7 +1026,7 @@ TEST(RootSignature, ParseRootDescriptor) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 2u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_1); ASSERT_EQ(RS.getNumParameters(), 1u); ASSERT_EQ(RS.getRootParametersOffset(), 24u); ASSERT_EQ(RS.getNumStaticSamplers(), 0u); @@ -1034,7 +1035,7 @@ TEST(RootSignature, ParseRootDescriptor) { auto RootParam = *RS.param_headers().begin(); ASSERT_EQ((unsigned)RootParam.ParameterType, 2u); - ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 3u); + ASSERT_EQ(RootParam.ShaderVisibility, dxbc::ShaderVisibility::Domain); auto ParamView = RS.getParameter(RootParam); ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); @@ -1072,7 +1073,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 2u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_1); ASSERT_EQ(RS.getNumParameters(), 1u); ASSERT_EQ(RS.getRootParametersOffset(), 24u); ASSERT_EQ(RS.getNumStaticSamplers(), 0u); @@ -1081,7 +1082,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto RootParam = *RS.param_headers().begin(); ASSERT_EQ((unsigned)RootParam.ParameterType, 0u); - ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 3u); + ASSERT_EQ(RootParam.ShaderVisibility, dxbc::ShaderVisibility::Domain); auto ParamView = RS.getParameter(RootParam); ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); @@ -1096,7 +1097,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto Range = *Table->begin(); - ASSERT_EQ(Range.RangeType, 0u); + ASSERT_EQ(Range.RangeType, dxbc::DescriptorRangeType::SRV); ASSERT_EQ(Range.NumDescriptors, -1u); ASSERT_EQ(Range.BaseShaderRegister, 42u); ASSERT_EQ(Range.RegisterSpace, 43u); @@ -1124,7 +1125,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 1u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_0); ASSERT_EQ(RS.getNumParameters(), 1u); ASSERT_EQ(RS.getRootParametersOffset(), 24u); ASSERT_EQ(RS.getNumStaticSamplers(), 0u); @@ -1133,7 +1134,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto RootParam = *RS.param_headers().begin(); ASSERT_EQ((unsigned)RootParam.ParameterType, 0u); - ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 3u); + ASSERT_EQ(RootParam.ShaderVisibility, dxbc::ShaderVisibility::Domain); auto ParamView = RS.getParameter(RootParam); ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded()); @@ -1148,7 +1149,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto Range = *Table->begin(); - ASSERT_EQ(Range.RangeType, 0u); + ASSERT_EQ(Range.RangeType, dxbc::DescriptorRangeType::SRV); ASSERT_EQ(Range.NumDescriptors, -1u); ASSERT_EQ(Range.BaseShaderRegister, 42u); ASSERT_EQ(Range.RegisterSpace, 43u); @@ -1177,7 +1178,7 @@ TEST(RootSignature, ParseStaticSamplers) { auto MaybeRS = C.getRootSignature(); ASSERT_TRUE(MaybeRS.has_value()); const auto &RS = MaybeRS.value(); - ASSERT_EQ(RS.getVersion(), 2u); + ASSERT_EQ(RS.getVersion(), dxbc::RootSignatureVersion::V1_1); ASSERT_EQ(RS.getNumParameters(), 0u); ASSERT_EQ(RS.getRootParametersOffset(), 0u); ASSERT_EQ(RS.getNumStaticSamplers(), 1u); @@ -1186,18 +1187,18 @@ TEST(RootSignature, ParseStaticSamplers) { auto Sampler = *RS.samplers().begin(); - ASSERT_EQ(Sampler.Filter, 10u); - ASSERT_EQ(Sampler.AddressU, 1u); - ASSERT_EQ(Sampler.AddressV, 2u); - ASSERT_EQ(Sampler.AddressW, 5u); + ASSERT_EQ(Sampler.Filter, dxbc::SamplerFilter::MinLinearMagMipPoint); + ASSERT_EQ(Sampler.AddressU, dxbc::TextureAddressMode::Wrap); + ASSERT_EQ(Sampler.AddressV, dxbc::TextureAddressMode::Mirror); + ASSERT_EQ(Sampler.AddressW, dxbc::TextureAddressMode::MirrorOnce); ASSERT_FLOAT_EQ(Sampler.MipLODBias, 1.23f); ASSERT_EQ(Sampler.MaxAnisotropy, 20u); - ASSERT_EQ(Sampler.ComparisonFunc, 4u); - ASSERT_EQ(Sampler.BorderColor, 0u); + ASSERT_EQ(Sampler.ComparisonFunc, dxbc::ComparisonFunc::LessEqual); + ASSERT_EQ(Sampler.BorderColor, dxbc::StaticBorderColor::TransparentBlack); ASSERT_FLOAT_EQ(Sampler.MinLOD, 4.56f); ASSERT_FLOAT_EQ(Sampler.MaxLOD, 8.9f); ASSERT_EQ(Sampler.ShaderRegister, 31u); ASSERT_EQ(Sampler.RegisterSpace, 32u); - ASSERT_EQ(Sampler.ShaderVisibility, 7u); + ASSERT_EQ(Sampler.ShaderVisibility, dxbc::ShaderVisibility::Mesh); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits