diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h index 82890bf814935..3494e0fe1a0e9 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainer.h +++ b/llvm/include/llvm/BinaryFormat/DXContainer.h @@ -585,6 +585,7 @@ struct ProgramSignatureElement { static_assert(sizeof(ProgramSignatureElement) == 32, "ProgramSignatureElement is misaligned"); + namespace RTS0 { namespace v1 { struct RootDescriptor { @@ -595,23 +596,7 @@ struct RootDescriptor { sys::swapByteOrder(RegisterSpace); } }; -} // namespace v1 - -namespace v2 { -struct RootDescriptor : public v1::RootDescriptor { - uint32_t Flags; - - RootDescriptor() = default; - explicit RootDescriptor(v1::RootDescriptor &Base) - : v1::RootDescriptor(Base), Flags(0u) {} - void swapBytes() { - v1::RootDescriptor::swapBytes(); - sys::swapByteOrder(Flags); - } -}; -} // namespace v2 -} // namespace RTS0 // following dx12 naming // https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants struct RootConstants { @@ -655,6 +640,24 @@ struct RootSignatureHeader { sys::swapByteOrder(Flags); } }; +} // namespace v1 + +namespace v2 { +struct RootDescriptor : public v1::RootDescriptor { + uint32_t Flags; + + RootDescriptor() = default; + explicit RootDescriptor(v1::RootDescriptor &Base) + : v1::RootDescriptor(Base), Flags(0u) {} + + void swapBytes() { + v1::RootDescriptor::swapBytes(); + sys::swapByteOrder(Flags); + } +}; +} // namespace v2 +} // namespace RTS0 + } // namespace dxbc } // namespace llvm diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index 3496b5fff398f..5f5919122b3c5 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -16,36 +16,36 @@ class raw_ostream; namespace mcdxbc { struct RootParameterInfo { - dxbc::RootParameterHeader Header; + dxbc::RTS0::v1::RootParameterHeader Header; size_t Location; RootParameterInfo() = default; - RootParameterInfo(dxbc::RootParameterHeader Header, size_t Location) + RootParameterInfo(dxbc::RTS0::v1::RootParameterHeader Header, size_t Location) : Header(Header), Location(Location) {} }; struct RootParametersContainer { SmallVector ParametersInfo; - SmallVector Constants; + SmallVector Constants; SmallVector Descriptors; - void addInfo(dxbc::RootParameterHeader Header, size_t Location) { + void addInfo(dxbc::RTS0::v1::RootParameterHeader Header, size_t Location) { ParametersInfo.push_back(RootParameterInfo(Header, Location)); } - void addParameter(dxbc::RootParameterHeader Header, - dxbc::RootConstants Constant) { + void addParameter(dxbc::RTS0::v1::RootParameterHeader Header, + dxbc::RTS0::v1::RootConstants Constant) { addInfo(Header, Constants.size()); Constants.push_back(Constant); } - void addInvalidParameter(dxbc::RootParameterHeader Header) { + void addInvalidParameter(dxbc::RTS0::v1::RootParameterHeader Header) { addInfo(Header, -1); } - void addParameter(dxbc::RootParameterHeader Header, + void addParameter(dxbc::RTS0::v1::RootParameterHeader Header, dxbc::RTS0::v2::RootDescriptor Descriptor) { addInfo(Header, Descriptors.size()); Descriptors.push_back(Descriptor); @@ -57,12 +57,12 @@ struct RootParametersContainer { return {Info.Header.ParameterType, Info.Location}; } - const dxbc::RootParameterHeader &getHeader(size_t Location) const { + const dxbc::RTS0::v1::RootParameterHeader &getHeader(size_t Location) const { const RootParameterInfo &Info = ParametersInfo[Location]; return Info.Header; } - const dxbc::RootConstants &getConstant(size_t Index) const { + const dxbc::RTS0::v1::RootConstants &getConstant(size_t Index) const { return Constants[Index]; } diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index 61bfa9411cc57..37cd5ca7dc935 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -121,10 +121,10 @@ template struct ViewArray { namespace DirectX { struct RootParameterView { - const dxbc::RootParameterHeader &Header; + const dxbc::RTS0::v1::RootParameterHeader &Header; StringRef ParamData; - RootParameterView(const dxbc::RootParameterHeader &H, StringRef P) + RootParameterView(const dxbc::RTS0::v1::RootParameterHeader &H, StringRef P) : Header(H), ParamData(P) {} template Expected readParameter() { @@ -147,8 +147,8 @@ struct RootConstantView : RootParameterView { (uint32_t)dxbc::RootParameterType::Constants32Bit; } - llvm::Expected read() { - return readParameter(); + llvm::Expected read() { + return readParameter(); } }; @@ -189,10 +189,11 @@ class RootSignature { uint32_t NumStaticSamplers; uint32_t StaticSamplersOffset; uint32_t Flags; - ViewArray ParametersHeaders; + ViewArray ParametersHeaders; StringRef PartData; - using param_header_iterator = ViewArray::iterator; + using param_header_iterator = + ViewArray::iterator; public: RootSignature(StringRef PD) : PartData(PD) {} @@ -210,7 +211,7 @@ class RootSignature { uint32_t getFlags() const { return Flags; } llvm::Expected - getParameter(const dxbc::RootParameterHeader &Header) const { + getParameter(const dxbc::RTS0::v1::RootParameterHeader &Header) const { size_t DataSize; if (!dxbc::isValidParameterType(Header.ParameterType)) @@ -218,7 +219,7 @@ class RootSignature { switch (static_cast(Header.ParameterType)) { case dxbc::RootParameterType::Constants32Bit: - DataSize = sizeof(dxbc::RootConstants); + DataSize = sizeof(dxbc::RTS0::v1::RootConstants); break; case dxbc::RootParameterType::CBV: case dxbc::RootParameterType::SRV: diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index a9394541d18da..3a4bd8321eb95 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -29,13 +29,14 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream, } size_t RootSignatureDesc::getSize() const { - size_t Size = sizeof(dxbc::RootSignatureHeader) + - ParametersContainer.size() * sizeof(dxbc::RootParameterHeader); + size_t Size = + sizeof(dxbc::RTS0::v1::RootSignatureHeader) + + ParametersContainer.size() * sizeof(dxbc::RTS0::v1::RootParameterHeader); for (const RootParameterInfo &I : ParametersContainer) { switch (I.Header.ParameterType) { case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): - Size += sizeof(dxbc::RootConstants); + Size += sizeof(dxbc::RTS0::v1::RootConstants); break; case llvm::to_underlying(dxbc::RootParameterType::CBV): case llvm::to_underlying(dxbc::RootParameterType::SRV): @@ -81,7 +82,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const { const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I); switch (Type) { case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { - const dxbc::RootConstants &Constants = + const dxbc::RTS0::v1::RootConstants &Constants = ParametersContainer.getConstant(Loc); support::endian::write(BOS, Constants.ShaderRegister, llvm::endianness::little); diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 95f6788e75aa6..2d05566626bfc 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -273,7 +273,8 @@ Error DirectX::RootSignature::parse() { Current += sizeof(uint32_t); ParametersHeaders.Data = PartData.substr( - RootParametersOffset, NumParameters * sizeof(dxbc::RootParameterHeader)); + RootParametersOffset, + NumParameters * sizeof(dxbc::RTS0::v1::RootParameterHeader)); return Error::success(); } diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index e5501d2d3c89a..d5fdf0bda68c3 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -275,14 +275,14 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { for (DXContainerYAML::RootParameterLocationYaml &L : P.RootSignature->Parameters.Locations) { - dxbc::RootParameterHeader Header{L.Header.Type, L.Header.Visibility, + 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): { const DXContainerYAML::RootConstantsYaml &ConstantYaml = P.RootSignature->Parameters.getOrInsertConstants(L); - dxbc::RootConstants Constants; + dxbc::RTS0::v1::RootConstants Constants; Constants.Num32BitValues = ConstantYaml.Num32BitValues; Constants.RegisterSpace = ConstantYaml.RegisterSpace; Constants.ShaderRegister = ConstantYaml.ShaderRegister; diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 5a2279e334f42..22561ec0ac9b9 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -47,7 +47,7 @@ DXContainerYAML::RootSignatureYamlDesc::create( RootSigDesc.RootParametersOffset = Data.getRootParametersOffset(); uint32_t Flags = Data.getFlags(); - for (const dxbc::RootParameterHeader &PH : Data.param_headers()) { + for (const dxbc::RTS0::v1::RootParameterHeader &PH : Data.param_headers()) { if (!dxbc::isValidParameterType(PH.ParameterType)) return createStringError(std::errc::invalid_argument, @@ -70,7 +70,8 @@ DXContainerYAML::RootSignatureYamlDesc::create( object::DirectX::RootParameterView ParamView = ParamViewOrErr.get(); if (auto *RCV = dyn_cast(&ParamView)) { - llvm::Expected ConstantsOrErr = RCV->read(); + llvm::Expected ConstantsOrErr = + RCV->read(); if (Error E = ConstantsOrErr.takeError()) return std::move(E); diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp index 43e06ee278b49..40277899b5c7e 100644 --- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp +++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp @@ -75,7 +75,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, if (RootConstantNode->getNumOperands() != 5) return reportError(Ctx, "Invalid format for RootConstants Element"); - dxbc::RootParameterHeader Header; + dxbc::RTS0::v1::RootParameterHeader Header; // The parameter offset doesn't matter here - we recalculate it during // serialization Header.ParameterOffset = 0; Header.ParameterType = @@ -86,7 +86,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD, else return reportError(Ctx, "Invalid value for ShaderVisibility"); - dxbc::RootConstants Constants; + dxbc::RTS0::v1::RootConstants Constants; if (std::optional Val = extractMdIntValue(RootConstantNode, 2)) Constants.ShaderRegister = *Val; else @@ -247,7 +247,7 @@ analyzeModule(Module &M) { // Clang emits the root signature data in dxcontainer following a specific // sequence. First the header, then the root parameters. So the header // offset will always equal to the header size. - RSD.RootParameterOffset = sizeof(dxbc::RootSignatureHeader); + RSD.RootParameterOffset = sizeof(dxbc::RTS0::v1::RootSignatureHeader); if (parse(Ctx, RSD, RootElementListNode) || validate(Ctx, RSD)) { return RSDMap; @@ -296,7 +296,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, for (size_t I = 0; I < RS.ParametersContainer.size(); I++) { const auto &[Type, Loc] = RS.ParametersContainer.getTypeAndLocForParameter(I); - const dxbc::RootParameterHeader Header = + const dxbc::RTS0::v1::RootParameterHeader Header = RS.ParametersContainer.getHeader(I); OS << indent(Space) << "- Parameter Type: " << Type << "\n"; @@ -305,7 +305,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M, switch (Type) { case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): { - const dxbc::RootConstants &Constants = + const dxbc::RTS0::v1::RootConstants &Constants = RS.ParametersContainer.getConstant(Loc); OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace << "\n";