https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/124813
>From b02e7fe88bcafe236fc3eb592eae67eb47da8b0b Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 28 Jan 2025 17:46:23 +0000 Subject: [PATCH 1/2] adding support for root constants in dxcontainer for ob2jyaml and yaml2obj tools --- llvm/include/llvm/BinaryFormat/DXContainer.h | 50 +++++++++++++++++++ .../BinaryFormat/DXContainerConstants.def | 26 +++++----- .../llvm/MC/DXContainerRootSignature.h | 3 ++ llvm/include/llvm/Object/DXContainer.h | 10 ++++ .../include/llvm/ObjectYAML/DXContainerYAML.h | 11 ++++ llvm/lib/BinaryFormat/DXContainer.cpp | 20 ++++++++ llvm/lib/MC/DXContainerRootSignature.cpp | 17 +++++-- llvm/lib/Object/DXContainer.cpp | 20 ++++++++ llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 + llvm/lib/ObjectYAML/DXContainerYAML.cpp | 5 ++ .../DXContainer/RootSignature-Flags.yaml | 32 +++++++++--- 11 files changed, 171 insertions(+), 24 deletions(-) diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h index 71a6d15e46a81d..c241ec7e87348d 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainer.h +++ b/llvm/include/llvm/BinaryFormat/DXContainer.h @@ -17,6 +17,7 @@ #include "llvm/Support/SwapByteOrder.h" #include "llvm/TargetParser/Triple.h" +#include <cstdint> #include <stdint.h> namespace llvm { @@ -63,6 +64,7 @@ struct ShaderHash { void swapBytes() { sys::swapByteOrder(Flags); } }; +<<<<<<< HEAD struct RootSignatureDesc { uint32_t Size; uint32_t Flags; @@ -73,6 +75,8 @@ struct RootSignatureDesc { } }; +======= +>>>>>>> b1b967db8d32 (adding support for root constants in dxcontainer for ob2jyaml and yaml2obj tools) struct ContainerVersion { uint16_t Major; uint16_t Minor; @@ -167,6 +171,50 @@ enum class RootElementFlag : uint32_t { #include "DXContainerConstants.def" }; +#define ROOT_PARAMETER(Val, Enum) Enum = Val, +enum class RootParameterType : uint8_t { +#include "DXContainerConstants.def" +}; + +#define SHADER_VISIBILITY(Val, Enum) Enum = Val, +enum class ShaderVisibilityFlag : uint8_t { +#include "DXContainerConstants.def" +}; + +struct RootConstants { + uint32_t ShaderRegister; + uint32_t RegisterSpace; + uint32_t Num32BitValues; + + void swapBytes() { + sys::swapByteOrder(ShaderRegister); + sys::swapByteOrder(RegisterSpace); + sys::swapByteOrder(Num32BitValues); + } +}; + +struct RootParameter { + RootParameterType ParameterType; + union { + RootConstants Constants; + }; + ShaderVisibilityFlag ShaderVisibility; + + void swapBytes() { + switch (ParameterType) { + + case RootParameterType::Constants32Bit: + Constants.swapBytes(); + break; + case RootParameterType::DescriptorTable: + case RootParameterType::CBV: + case RootParameterType::SRV: + case RootParameterType::UAV: + break; + } + } +}; + PartType parsePartType(StringRef S); struct VertexPSVInfo { @@ -508,6 +556,8 @@ enum class SigComponentType : uint32_t { }; ArrayRef<EnumEntry<SigComponentType>> getSigComponentTypes(); +ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes(); +ArrayRef<EnumEntry<ShaderVisibilityFlag>> getShaderVisibilityFlags(); struct ProgramSignatureHeader { uint32_t ParamCount; diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def index 2134c2375f6d35..755322abf8140b 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def +++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def @@ -55,25 +55,25 @@ SHADER_FEATURE_FLAG(31, 36, NextUnusedBit, "Next reserved shader flag bit (not a #ifdef ROOT_PARAMETER -ROOT_PARAMETER(DescriptorTable) -ROOT_PARAMETER(Constants32Bit) -ROOT_PARAMETER(CBV) -ROOT_PARAMETER(SRV) -ROOT_PARAMETER(UAV) +ROOT_PARAMETER(0, DescriptorTable) +ROOT_PARAMETER(1, Constants32Bit) +ROOT_PARAMETER(2, CBV) +ROOT_PARAMETER(3, SRV) +ROOT_PARAMETER(4, UAV) #undef ROOT_PARAMETER #endif // ROOT_PARAMETER #ifdef SHADER_VISIBILITY -SHADER_VISIBILITY(All) -SHADER_VISIBILITY(Vertex) -SHADER_VISIBILITY(Hull) -SHADER_VISIBILITY(Domain) -SHADER_VISIBILITY(Geometry) -SHADER_VISIBILITY(Pixel) -SHADER_VISIBILITY(Amplification) -SHADER_VISIBILITY(Mesh) +SHADER_VISIBILITY(0, All) +SHADER_VISIBILITY(1, Vertex) +SHADER_VISIBILITY(2, Hull) +SHADER_VISIBILITY(3, Domain) +SHADER_VISIBILITY(4, Geometry) +SHADER_VISIBILITY(5, Pixel) +SHADER_VISIBILITY(6, Amplification) +SHADER_VISIBILITY(7, Mesh) #undef SHADER_VISIBILITY #endif // SHADER_VISIBILITY diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h index 20b4f5a4285f69..9102137c14b473 100644 --- a/llvm/include/llvm/MC/DXContainerRootSignature.h +++ b/llvm/include/llvm/MC/DXContainerRootSignature.h @@ -6,6 +6,8 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/SmallVector.h" +#include "llvm/BinaryFormat/DXContainer.h" #include <cstdint> #include <limits> @@ -16,6 +18,7 @@ class raw_ostream; namespace mcdxbc { struct RootSignatureHeader { uint32_t Flags; + SmallVector<dxbc::RootParameter> Parameters; void swapBytes(); void write(raw_ostream &OS); diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index 5f7737d2fa41d2..1d6590dacadaff 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -22,6 +22,7 @@ #include "llvm/Support/MemoryBufferRef.h" #include "llvm/TargetParser/Triple.h" #include <array> +#include <cstdint> #include <variant> namespace llvm { @@ -118,10 +119,15 @@ template <typename T> struct ViewArray { namespace DirectX { class RootSignature { + + using ParametersArray = ViewArray<dxbc::RootParameter>; + private: StringRef Data; uint32_t Size; uint32_t Flags; + uint32_t NParameters; + ParametersArray Parameters; public: RootSignature(StringRef Data) : Data(Data) {} @@ -131,6 +137,10 @@ class RootSignature { uint32_t getSize() const { return Size; } uint32_t getFlags() const { return Flags; } + + uint32_t getNParameters() const { return NParameters; } + + ParametersArray getParameters() const { return Parameters; } }; class PSVRuntimeInfo { diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h index a82083fa18de6b..5ac90a4f3e0731 100644 --- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h +++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h @@ -187,6 +187,7 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::ResourceBindInfo) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureElement) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::PSVInfo::MaskVector) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::DXContainerYAML::SignatureParameter) +LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::dxbc::RootParameter) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::SemanticKind) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::ComponentType) LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::PSV::InterpolationMode) @@ -195,6 +196,8 @@ 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::RootParameterType) +LLVM_YAML_DECLARE_ENUM_TRAITS(llvm::dxbc::ShaderVisibilityFlag) namespace llvm { @@ -259,6 +262,14 @@ template <> struct MappingTraits<DXContainerYAML::RootSignatureDesc> { DXContainerYAML::RootSignatureDesc &RootSignature); }; +template <> struct MappingTraits<dxbc::RootParameter> { + static void mapping(IO &IO, dxbc::RootParameter &RootParameter); +}; + +template <> struct MappingTraits<dxbc::RootConstants> { + static void mapping(IO &IO, dxbc::RootConstants &RootConstants); +}; + } // namespace yaml } // namespace llvm diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp index 97ceb16ccf53f4..d1a1f1f5441370 100644 --- a/llvm/lib/BinaryFormat/DXContainer.cpp +++ b/llvm/lib/BinaryFormat/DXContainer.cpp @@ -60,6 +60,26 @@ ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() { return ArrayRef(SigComponentTypes); } +#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibilityFlag::Enum}, + +static const EnumEntry<ShaderVisibilityFlag> ShaderVisibilityFlags[] = { +#include "llvm/BinaryFormat/DXContainerConstants.def" +}; + +ArrayRef<EnumEntry<ShaderVisibilityFlag>> dxbc::getShaderVisibilityFlags() { + return ArrayRef(ShaderVisibilityFlags); +} + +#define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum}, + +static const EnumEntry<RootParameterType> RootParameterTypes[] = { +#include "llvm/BinaryFormat/DXContainerConstants.def" +}; + +ArrayRef<EnumEntry<RootParameterType>> dxbc::getRootParameterTypes() { + return ArrayRef(RootParameterTypes); +} + #define SEMANTIC_KIND(Val, Enum) {#Enum, PSV::SemanticKind::Enum}, static const EnumEntry<PSV::SemanticKind> SemanticKindNames[] = { diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index 4e085654a1e5e1..df5a0dca769eb8 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -7,16 +7,27 @@ //===----------------------------------------------------------------------===// #include "llvm/MC/DXContainerRootSignature.h" +#include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Support/EndianStream.h" -#include "llvm/Support/SwapByteOrder.h" -#include <iterator> +#include <cstdint> using namespace llvm; using namespace llvm::mcdxbc; void RootSignatureHeader::write(raw_ostream &OS) { - uint32_t SizeInfo = sizeof(this); + uint32_t SizeInfo = sizeof(RootSignatureHeader); + uint32_t ParamsSize = Parameters.size(); support::endian::write(OS, SizeInfo, llvm::endianness::little); support::endian::write(OS, Flags, llvm::endianness::little); + support::endian::write(OS, ParamsSize, llvm::endianness::little); + + if (Parameters.size() > 0) { + uint32_t BindingSize = sizeof(dxbc::RootParameter); + + support::endian::write(OS, BindingSize, llvm::endianness::little); + + for (const auto &Param : Parameters) + OS.write(reinterpret_cast<const char *>(&Param), BindingSize); + } } diff --git a/llvm/lib/Object/DXContainer.cpp b/llvm/lib/Object/DXContainer.cpp index 6743911059cfd4..627433e38f51c0 100644 --- a/llvm/lib/Object/DXContainer.cpp +++ b/llvm/lib/Object/DXContainer.cpp @@ -251,6 +251,26 @@ Error DirectX::RootSignature::parse() { Flags = support::endian::read<uint32_t, llvm::endianness::little>(Current); Current += sizeof(uint32_t); + NParameters = + support::endian::read<uint32_t, llvm::endianness::little>(Current); + Current += sizeof(uint32_t); + + if (NParameters > 0) { + + Parameters.Stride = + support::endian::read<uint32_t, llvm::endianness::little>(Current); + Current += sizeof(uint32_t); + + size_t BindingDataSize = Parameters.Stride * NParameters; + Parameters.Data = Data.substr(Current - Data.begin(), BindingDataSize); + + if (Parameters.Data.size() < BindingDataSize) + return parseFailed( + "Resource binding data extends beyond the bounds of the part"); + + Current += BindingDataSize; + } + return Error::success(); } diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp index ada7383ea3c6b8..ecf3714d29d613 100644 --- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp +++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp @@ -268,6 +268,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) { mcdxbc::RootSignatureHeader Header; Header.Flags = P.RootSignature->getEncodedFlags(); + Header.Parameters = P.RootSignature->Parameters; Header.write(OS); break; diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index fd85d75dc32eb3..7d2ebef44b1bfb 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -33,6 +33,8 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) { DXContainerYAML::RootSignatureDesc::RootSignatureDesc( const object::DirectX::RootSignature &Data) : Size(Data.getSize()) { + : Size(Data.getSize()), Version(Data.getVersion()), + NumParameters(Data.getNParameters()) { uint32_t Flags = Data.getFlags(); #define ROOT_ELEMENT_FLAG(Num, Val, Str) \ Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0; @@ -210,6 +212,9 @@ void MappingTraits<DXContainerYAML::Signature>::mapping( void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping( IO &IO, DXContainerYAML::RootSignatureDesc &S) { IO.mapRequired("Size", S.Size); + IO.mapRequired("Version", S.Version); + IO.mapRequired("NumParameters", S.NumParameters); + IO.mapRequired("Parameters", S.Parameters); #define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false); #include "llvm/BinaryFormat/DXContainerConstants.def" } diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml index f5f7837d403780..2da4ef8db96825 100644 --- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml +++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Flags.yaml @@ -10,13 +10,29 @@ Header: PartOffsets: [ 60 ] Parts: - Name: RTS0 - Size: 4 + Size: 40 RootSignature: - Size: 8 + Size: 64 + NumParameters: 1 + Parameters: + - Type: Constants32Bit + ShaderVisibility: All + Constants: + Num32BitValues: 3 + ShaderRegister: 1 + RegisterSpace: 2 AllowInputAssemblerInputLayout: true - -#CHECK: - Name: RTS0 -#CHECK-NEXT: Size: 4 -#CHECK-NEXT: RootSignature: -#CHECK-NEXT: Size: 8 -#CHECK-NEXT: AllowInputAssemblerInputLayout: true + +#CHECK: - Name: RTS0 +#CHECK-NEXT: Size: 40 +#CHECK-NEXT: RootSignature: +#CHECK-NEXT: Size: 64 +#CHECK-NEXT: NumParameters: 1 +#CHECK-NEXT: Parameters: +#CHECK-NEXT: - Type: Constants32Bit +#CHECK-NEXT: ShaderVisibility: All +#CHECK-NEXT: Constants: +#CHECK-NEXT: Num32BitValues: 3 +#CHECK-NEXT: ShaderRegister: 1 +#CHECK-NEXT: RegisterSpace: 2 +#CHECK-NEXT: AllowInputAssemblerInputLayout: true >From a6934915165ec3a867a69121fdf646b5416ae91b Mon Sep 17 00:00:00 2001 From: joaosaffran <joao.saff...@microsoft.com> Date: Tue, 28 Jan 2025 18:02:54 +0000 Subject: [PATCH 2/2] updating test --- llvm/include/llvm/BinaryFormat/DXContainer.h | 99 +++++++++---------- llvm/include/llvm/Object/DXContainer.h | 1 - .../include/llvm/ObjectYAML/DXContainerYAML.h | 2 + llvm/lib/MC/DXContainerRootSignature.cpp | 1 - llvm/lib/ObjectYAML/DXContainerYAML.cpp | 47 ++++++++- .../ContainerData/RootSignature-Flags.ll | 8 +- 6 files changed, 94 insertions(+), 64 deletions(-) diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h index c241ec7e87348d..5993492dfd15d6 100644 --- a/llvm/include/llvm/BinaryFormat/DXContainer.h +++ b/llvm/include/llvm/BinaryFormat/DXContainer.h @@ -17,7 +17,6 @@ #include "llvm/Support/SwapByteOrder.h" #include "llvm/TargetParser/Triple.h" -#include <cstdint> #include <stdint.h> namespace llvm { @@ -64,19 +63,55 @@ struct ShaderHash { void swapBytes() { sys::swapByteOrder(Flags); } }; -<<<<<<< HEAD -struct RootSignatureDesc { - uint32_t Size; - uint32_t Flags; +#define ROOT_PARAMETER(Val, Enum) Enum = Val, +enum class RootParameterType : uint8_t { +#include "DXContainerConstants.def" +}; + +ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes(); + + +#define SHADER_VISIBILITY(Val, Enum) Enum = Val, +enum class ShaderVisibilityFlag : uint8_t { +#include "DXContainerConstants.def" +}; + +ArrayRef<EnumEntry<ShaderVisibilityFlag>> getShaderVisibilityFlags(); + +struct RootConstants { + uint32_t ShaderRegister; + uint32_t RegisterSpace; + uint32_t Num32BitValues; void swapBytes() { - sys::swapByteOrder(Size); - sys::swapByteOrder(Flags); + sys::swapByteOrder(ShaderRegister); + sys::swapByteOrder(RegisterSpace); + sys::swapByteOrder(Num32BitValues); + } +}; + +struct RootParameter { + RootParameterType ParameterType; + union { + RootConstants Constants; + }; + ShaderVisibilityFlag ShaderVisibility; + + void swapBytes() { + switch (ParameterType) { + + case RootParameterType::Constants32Bit: + Constants.swapBytes(); + break; + case RootParameterType::DescriptorTable: + case RootParameterType::CBV: + case RootParameterType::SRV: + case RootParameterType::UAV: + break; + } } }; -======= ->>>>>>> b1b967db8d32 (adding support for root constants in dxcontainer for ob2jyaml and yaml2obj tools) struct ContainerVersion { uint16_t Major; uint16_t Minor; @@ -171,50 +206,6 @@ enum class RootElementFlag : uint32_t { #include "DXContainerConstants.def" }; -#define ROOT_PARAMETER(Val, Enum) Enum = Val, -enum class RootParameterType : uint8_t { -#include "DXContainerConstants.def" -}; - -#define SHADER_VISIBILITY(Val, Enum) Enum = Val, -enum class ShaderVisibilityFlag : uint8_t { -#include "DXContainerConstants.def" -}; - -struct RootConstants { - uint32_t ShaderRegister; - uint32_t RegisterSpace; - uint32_t Num32BitValues; - - void swapBytes() { - sys::swapByteOrder(ShaderRegister); - sys::swapByteOrder(RegisterSpace); - sys::swapByteOrder(Num32BitValues); - } -}; - -struct RootParameter { - RootParameterType ParameterType; - union { - RootConstants Constants; - }; - ShaderVisibilityFlag ShaderVisibility; - - void swapBytes() { - switch (ParameterType) { - - case RootParameterType::Constants32Bit: - Constants.swapBytes(); - break; - case RootParameterType::DescriptorTable: - case RootParameterType::CBV: - case RootParameterType::SRV: - case RootParameterType::UAV: - break; - } - } -}; - PartType parsePartType(StringRef S); struct VertexPSVInfo { @@ -556,8 +547,6 @@ enum class SigComponentType : uint32_t { }; ArrayRef<EnumEntry<SigComponentType>> getSigComponentTypes(); -ArrayRef<EnumEntry<RootParameterType>> getRootParameterTypes(); -ArrayRef<EnumEntry<ShaderVisibilityFlag>> getShaderVisibilityFlags(); struct ProgramSignatureHeader { uint32_t ParamCount; diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h index 1d6590dacadaff..e2d9f7266fcb49 100644 --- a/llvm/include/llvm/Object/DXContainer.h +++ b/llvm/include/llvm/Object/DXContainer.h @@ -22,7 +22,6 @@ #include "llvm/Support/MemoryBufferRef.h" #include "llvm/TargetParser/Triple.h" #include <array> -#include <cstdint> #include <variant> namespace llvm { diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h index 5ac90a4f3e0731..a368d5bf3634af 100644 --- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h +++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h @@ -80,6 +80,8 @@ struct RootSignatureDesc { uint32_t getEncodedFlags(); uint32_t Size; + uint32_t NumParameters; + SmallVector<dxbc::RootParameter> Parameters; #include "llvm/BinaryFormat/DXContainerConstants.def" }; diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp index df5a0dca769eb8..0ac72be0d3b667 100644 --- a/llvm/lib/MC/DXContainerRootSignature.cpp +++ b/llvm/lib/MC/DXContainerRootSignature.cpp @@ -9,7 +9,6 @@ #include "llvm/MC/DXContainerRootSignature.h" #include "llvm/BinaryFormat/DXContainer.h" #include "llvm/Support/EndianStream.h" -#include <cstdint> using namespace llvm; using namespace llvm::mcdxbc; diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp index 7d2ebef44b1bfb..9174c1f11e2a2c 100644 --- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp +++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp @@ -32,10 +32,11 @@ DXContainerYAML::ShaderFeatureFlags::ShaderFeatureFlags(uint64_t FlagData) { DXContainerYAML::RootSignatureDesc::RootSignatureDesc( const object::DirectX::RootSignature &Data) - : Size(Data.getSize()) { - : Size(Data.getSize()), Version(Data.getVersion()), - NumParameters(Data.getNParameters()) { + : Size(Data.getSize()), NumParameters(Data.getNParameters()) { uint32_t Flags = Data.getFlags(); + for (const auto &Param : Data.getParameters()) + Parameters.push_back(Param); + #define ROOT_ELEMENT_FLAG(Num, Val, Str) \ Val = (Flags & (uint32_t)dxbc::RootElementFlag::Val) > 0; #include "llvm/BinaryFormat/DXContainerConstants.def" @@ -209,10 +210,48 @@ void MappingTraits<DXContainerYAML::Signature>::mapping( IO.mapRequired("Parameters", S.Parameters); } +void MappingTraits<dxbc::RootParameter>::mapping(IO &IO, + dxbc::RootParameter &S) { + + IO.mapRequired("Type", S.ParameterType); + IO.mapRequired("ShaderVisibility", S.ShaderVisibility); + + switch (S.ParameterType) { + + case dxbc::RootParameterType::Constants32Bit: + IO.mapRequired("Constants", S.Constants); + break; + case dxbc::RootParameterType::DescriptorTable: + case dxbc::RootParameterType::CBV: + case dxbc::RootParameterType::SRV: + case dxbc::RootParameterType::UAV: + break; + } +} + +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::ShaderVisibilityFlag>::enumeration( + IO &IO, dxbc::ShaderVisibilityFlag &Value) { + for (const auto &E : dxbc::getShaderVisibilityFlags()) + IO.enumCase(Value, E.Name.str().c_str(), E.Value); +} + +void MappingTraits<dxbc::RootConstants>::mapping(IO &IO, + dxbc::RootConstants &S) { + + IO.mapRequired("Num32BitValues", S.Num32BitValues); + IO.mapRequired("ShaderRegister", S.ShaderRegister); + IO.mapRequired("RegisterSpace", S.RegisterSpace); +} + void MappingTraits<DXContainerYAML::RootSignatureDesc>::mapping( IO &IO, DXContainerYAML::RootSignatureDesc &S) { IO.mapRequired("Size", S.Size); - IO.mapRequired("Version", S.Version); IO.mapRequired("NumParameters", S.NumParameters); IO.mapRequired("Parameters", S.Parameters); #define ROOT_ELEMENT_FLAG(Num, Val, Str) IO.mapOptional(#Val, S.Val, false); diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll index b44d31c5b38574..04a4f378ecb396 100644 --- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll +++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll @@ -3,7 +3,7 @@ target triple = "dxil-unknown-shadermodel6.0-compute" -; CHECK: @dx.rts0 = private constant [8 x i8] c"{{.*}}", section "RTS0", align 4 +; CHECK: @dx.rts0 = private constant [12 x i8] c"{{.*}}", section "RTS0", align 4 define void @main() #0 { @@ -24,7 +24,9 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" } ; DXC: - Name: RTS0 -; DXC-NEXT: Size: 8 +; DXC-NEXT: Size: 12 ; DXC-NEXT: RootSignature: -; DXC-NEXT: Size: 8 +; DXC-NEXT: Size: 64 +; DXC-NEXT: NumParameters: 0 +; DXC-NEXT: Parameters: [] ; DXC-NEXT: AllowInputAssemblerInputLayout: true _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits