diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h index 56c9e53308674..960720858f21b 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainer.h +++ b/llvm/include/llvm/BinaryFormat/DXContainer.h @@ -740,10 +740,19 @@ struct RootDescriptor : public v1::RootDescriptor { } }; -struct DescriptorRange : public v1::DescriptorRange { +struct DescriptorRange { + uint32_t RangeType; + uint32_t NumDescriptors; + uint32_t BaseShaderRegister; + uint32_t RegisterSpace; uint32_t Flags; + uint32_t OffsetInDescriptorsFromTableStart; void swapBytes() { - v1::DescriptorRange::swapBytes(); + sys::swapByteOrder(RangeType); + sys::swapByteOrder(NumDescriptors); + sys::swapByteOrder(BaseShaderRegister); + sys::swapByteOrder(RegisterSpace); + sys::swapByteOrder(OffsetInDescriptorsFromTableStart); sys::swapByteOrder(Flags); } }; diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index 4417061da936c..51f570da6df52 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -178,19 +178,14 @@ struct RootDescriptorView : RootParameterView { return readParameter(); } }; - -struct DescriptorTable { +template struct DescriptorTable { uint32_t NumRanges; uint32_t RangesOffset; - ViewArray Ranges; + ViewArray Ranges; - typename ViewArray::iterator begin() const { - return Ranges.begin(); - } + typename ViewArray::iterator begin() const { return Ranges.begin(); } - typename ViewArray::iterator end() const { - return Ranges.end(); - } + typename ViewArray::iterator end() const { return Ranges.end(); } }; struct DescriptorTableView : RootParameterView { @@ -200,9 +195,9 @@ struct DescriptorTableView : RootParameterView { } // Define a type alias to access the template parameter from inside classof - llvm::Expected read(uint32_t Version) { + template llvm::Expected> read() { const char *Current = ParamData.begin(); - DescriptorTable Table; + DescriptorTable Table; Table.NumRanges = support::endian::read(Current); @@ -212,13 +207,8 @@ struct DescriptorTableView : RootParameterView { support::endian::read(Current); Current += sizeof(uint32_t); - size_t RangeSize = sizeof(dxbc::RTS0::v1::DescriptorRange); - if (Version > 1) - RangeSize = sizeof(dxbc::RTS0::v2::DescriptorRange); - - Table.Ranges.Stride = RangeSize; - Table.Ranges.Data = - ParamData.substr(2 * sizeof(uint32_t), Table.NumRanges * RangeSize); + Table.Ranges.Data = ParamData.substr(2 * sizeof(uint32_t), + Table.NumRanges * Table.Ranges.Stride); return Table; } }; diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 6c71823a51f85..0d51d96cfc7bf 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -133,10 +133,10 @@ void RootSignatureDesc::write(raw_ostream &OS) const { llvm::endianness::little); support::endian::write(BOS, Range.RegisterSpace, llvm::endianness::little); - support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart, - llvm::endianness::little); if (Version > 1) support::endian::write(BOS, Range.Flags, llvm::endianness::little); + support::endian::write(BOS, Range.OffsetInDescriptorsFromTableStart, + llvm::endianness::little); } break; } diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 3bca25f3fc6c6..f6d0e5227e64a 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -33,6 +33,47 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) { #include "llvm/BinaryFormat/DXContainerConstants.def" } +template +static llvm::Error +readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header, + DXContainerYAML::RootSignatureYamlDesc &RootSigDesc, + object::DirectX::DescriptorTableView *DTV) { + + llvm::Expected> TableOrErr = + DTV->read(); + if (Error E = TableOrErr.takeError()) + return E; + auto Table = *TableOrErr; + + DXContainerYAML::RootParameterLocationYaml Location(Header); + DXContainerYAML::DescriptorTableYaml &TableYaml = + RootSigDesc.Parameters.getOrInsertTable(Location); + RootSigDesc.Parameters.insertLocation(Location); + + TableYaml.NumRanges = Table.NumRanges; + TableYaml.RangesOffset = Table.RangesOffset; + + for (const auto &R : Table.Ranges) { + DXContainerYAML::DescriptorRangeYaml NewR; + NewR.OffsetInDescriptorsFromTableStart = + R.OffsetInDescriptorsFromTableStart; + NewR.NumDescriptors = R.NumDescriptors; + NewR.BaseShaderRegister = R.BaseShaderRegister; + NewR.RegisterSpace = R.RegisterSpace; + NewR.RangeType = R.RangeType; + if constexpr (std::is_same_v) { + // Set all flag fields for v2 +#define DESCRIPTOR_RANGE_FLAG(Num, Val) \ + NewR.Val = \ + (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlag::Val)) != 0; +#include "llvm/BinaryFormat/DXContainerConstants.def" + } + TableYaml.Ranges.push_back(NewR); + } + + return Error::success(); +} + llvm::Expected DXContainerYAML::RootSignatureYamlDesc::create( const object::DirectX::RootSignature &Data) { @@ -107,36 +148,16 @@ DXContainerYAML::RootSignatureYamlDesc::create( } } else if (auto *DTV = dyn_cast(&ParamView)) { - llvm::Expected TableOrErr = - DTV->read(Version); - if (Error E = TableOrErr.takeError()) - return std::move(E); - auto Table = *TableOrErr; - RootParameterLocationYaml Location(Header); - DescriptorTableYaml &TableYaml = - RootSigDesc.Parameters.getOrInsertTable(Location); - RootSigDesc.Parameters.insertLocation(Location); - - TableYaml.NumRanges = Table.NumRanges; - TableYaml.RangesOffset = Table.RangesOffset; - - for (const auto &R : Table) { - DescriptorRangeYaml NewR; - - NewR.OffsetInDescriptorsFromTableStart = - R.OffsetInDescriptorsFromTableStart; - NewR.NumDescriptors = R.NumDescriptors; - NewR.BaseShaderRegister = R.BaseShaderRegister; - NewR.RegisterSpace = R.RegisterSpace; - NewR.RangeType = R.RangeType; - if (Version > 1) { -#define DESCRIPTOR_RANGE_FLAG(Num, Val) \ - NewR.Val = \ - (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlag::Val)) > 0; -#include "llvm/BinaryFormat/DXContainerConstants.def" - } - TableYaml.Ranges.push_back(NewR); - } + if (Version == 1) { + if (Error E = readDescriptorRanges( + Header, RootSigDesc, DTV)) + return std::move(E); + } else if (Version == 2) { + if (Error E = readDescriptorRanges( + Header, RootSigDesc, DTV)) + return std::move(E); + } else + llvm_unreachable("Unknown version for DescriptorRanges"); } } diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp index 28012073d3c78..396d060a75bfd 100644 --- a/llvm/unittests/Object/DXContainerTest.cpp +++ b/llvm/unittests/Object/DXContainerTest.cpp @@ -1062,8 +1062,8 @@ TEST(RootSignature, ParseDescriptorTable) { 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; DXContainer C = @@ -1088,7 +1088,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto *DescriptorTableView = dyn_cast(&*ParamView); ASSERT_TRUE(DescriptorTableView != nullptr); - auto Table = DescriptorTableView->read(2); + auto Table = DescriptorTableView->read(); ASSERT_THAT_ERROR(Table.takeError(), Succeeded()); @@ -1140,7 +1140,7 @@ TEST(RootSignature, ParseDescriptorTable) { auto *DescriptorTableView = dyn_cast(&*ParamView); ASSERT_TRUE(DescriptorTableView != nullptr); - auto Table = DescriptorTableView->read(1); + auto Table = DescriptorTableView->read(); ASSERT_THAT_ERROR(Table.takeError(), Succeeded()); diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp index 879712f833e13..9e6f7cc4f7dbd 100644 --- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp +++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp @@ -459,8 +459,8 @@ TEST(RootSignature, ParseDescriptorTableV11) { 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, - 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2a, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};