-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[DirectX] Fix order of v2::DescriptorRange
#145555
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -178,19 +178,14 @@ struct RootDescriptorView : RootParameterView { | |
| return readParameter<dxbc::RTS0::v2::RootDescriptor>(); | ||
| } | ||
| }; | ||
|
|
||
| struct DescriptorTable { | ||
| template <typename T> struct DescriptorTable { | ||
| uint32_t NumRanges; | ||
| uint32_t RangesOffset; | ||
| ViewArray<dxbc::RTS0::v2::DescriptorRange> Ranges; | ||
| ViewArray<T> Ranges; | ||
|
|
||
| typename ViewArray<dxbc::RTS0::v2::DescriptorRange>::iterator begin() const { | ||
| return Ranges.begin(); | ||
| } | ||
| typename ViewArray<T>::iterator begin() const { return Ranges.begin(); } | ||
|
|
||
| typename ViewArray<dxbc::RTS0::v2::DescriptorRange>::iterator end() const { | ||
| return Ranges.end(); | ||
| } | ||
| typename ViewArray<T>::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<DescriptorTable> read(uint32_t Version) { | ||
| template <typename T> llvm::Expected<DescriptorTable<T>> read() { | ||
| const char *Current = ParamData.begin(); | ||
| DescriptorTable Table; | ||
| DescriptorTable<T> Table; | ||
|
|
||
| Table.NumRanges = | ||
| support::endian::read<uint32_t, llvm::endianness::little>(Current); | ||
|
|
@@ -212,9 +207,7 @@ struct DescriptorTableView : RootParameterView { | |
| support::endian::read<uint32_t, llvm::endianness::little>(Current); | ||
| Current += sizeof(uint32_t); | ||
|
|
||
| size_t RangeSize = sizeof(dxbc::RTS0::v1::DescriptorRange); | ||
| if (Version > 1) | ||
| RangeSize = sizeof(dxbc::RTS0::v2::DescriptorRange); | ||
| size_t RangeSize = sizeof(T); | ||
|
|
||
| Table.Ranges.Stride = RangeSize; | ||
|
||
| Table.Ranges.Data = | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -33,6 +33,39 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) { | |
| #include "llvm/BinaryFormat/DXContainerConstants.def" | ||
| } | ||
|
|
||
| template <typename T> | ||
| static void | ||
| addDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header, | ||
| DXContainerYAML::RootSignatureYamlDesc &RootSigDesc, | ||
| const object::DirectX::DescriptorTable<T> &Table) { | ||
|
|
||
| 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<T, dxbc::RTS0::v2::DescriptorRange>) { | ||
| // 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); | ||
| } | ||
| } | ||
|
|
||
| llvm::Expected<DXContainerYAML::RootSignatureYamlDesc> | ||
| DXContainerYAML::RootSignatureYamlDesc::create( | ||
| const object::DirectX::RootSignature &Data) { | ||
|
|
@@ -107,35 +140,23 @@ DXContainerYAML::RootSignatureYamlDesc::create( | |
| } | ||
| } else if (auto *DTV = | ||
| dyn_cast<object::DirectX::DescriptorTableView>(&ParamView)) { | ||
| llvm::Expected<object::DirectX::DescriptorTable> 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) { | ||
| llvm::Expected< | ||
| object::DirectX::DescriptorTable<dxbc::RTS0::v1::DescriptorRange>> | ||
| TableOrErr = DTV->read<dxbc::RTS0::v1::DescriptorRange>(); | ||
| if (Error E = TableOrErr.takeError()) | ||
| return std::move(E); | ||
| auto Table = *TableOrErr; | ||
| addDescriptorRanges(Header, RootSigDesc, Table); | ||
|
||
| } else { | ||
|
||
| llvm::Expected< | ||
| object::DirectX::DescriptorTable<dxbc::RTS0::v2::DescriptorRange>> | ||
| TableOrErr = DTV->read<dxbc::RTS0::v2::DescriptorRange>(); | ||
| if (Error E = TableOrErr.takeError()) | ||
| return std::move(E); | ||
| auto Table = *TableOrErr; | ||
| addDescriptorRanges(Header, RootSigDesc, Table); | ||
| } | ||
| } | ||
| } | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah I see now. The old struct is still defined in the v1 namespace and this is defined in the v2 namespace.