[llvm] [DirectX] Add static sampler support to root signature (PR #143422)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 20 12:16:31 PDT 2025
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/143422
>From 0abacfcb1e5b0602cd5b535cd224768028337077 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 24 Apr 2025 21:54:56 +0000
Subject: [PATCH 01/69] adding support for Root Descriptors
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 28 ++++-
.../BinaryFormat/DXContainerConstants.def | 15 +++
.../llvm/MC/DXContainerRootSignature.h | 4 +-
llvm/include/llvm/Object/DXContainer.h | 47 +++++++-
.../include/llvm/ObjectYAML/DXContainerYAML.h | 34 +++++-
llvm/lib/MC/DXContainerRootSignature.cpp | 25 +++++
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 17 +++
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 53 ++++++++-
.../RootSignature-Descriptor1.0.yaml | 45 ++++++++
.../RootSignature-Descriptor1.1.yaml | 47 ++++++++
.../RootSignature-MultipleParameters.yaml | 20 +++-
llvm/unittests/Object/DXContainerTest.cpp | 91 ++++++++++++++++
.../ObjectYAML/DXContainerYAMLTest.cpp | 103 ++++++++++++++++++
13 files changed, 514 insertions(+), 15 deletions(-)
create mode 100644 llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml
create mode 100644 llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.1.yaml
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 455657980bf40..439bf7b40f31b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -158,6 +158,11 @@ enum class RootElementFlag : uint32_t {
#include "DXContainerConstants.def"
};
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) Val = 1ull << Num,
+enum class RootDescriptorFlag : uint32_t {
+#include "DXContainerConstants.def"
+};
+
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
enum class RootParameterType : uint32_t {
#include "DXContainerConstants.def"
@@ -422,7 +427,6 @@ struct SignatureElement {
static_assert(sizeof(SignatureElement) == 4 * sizeof(uint32_t),
"PSV Signature elements must fit in 16 bytes.");
-
} // namespace v0
namespace v1 {
@@ -463,7 +467,6 @@ struct RuntimeInfo : public v0::RuntimeInfo {
sys::swapByteOrder(GeomData.MaxVertexCount);
}
};
-
} // namespace v1
namespace v2 {
@@ -580,7 +583,28 @@ struct ProgramSignatureElement {
static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");
+namespace RST0 {
+namespace v0 {
+struct RootDescriptor {
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+ void swapBytes() {
+ sys::swapByteOrder(ShaderRegister);
+ sys::swapByteOrder(RegisterSpace);
+ }
+};
+} // namespace v0
+namespace v1 {
+struct RootDescriptor : public v0::RootDescriptor {
+ uint32_t Flags;
+ void swapBytes() {
+ v0::RootDescriptor::swapBytes();
+ sys::swapByteOrder(Flags);
+ }
+};
+} // namespace v1
+} // namespace RST0
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
struct RootConstants {
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 590ded5e8c899..bd9bd760547dc 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -72,9 +72,24 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
#undef ROOT_ELEMENT_FLAG
#endif // ROOT_ELEMENT_FLAG
+
+// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
+#ifdef ROOT_DESCRIPTOR_FLAG
+
+ROOT_DESCRIPTOR_FLAG(0, NONE)
+ROOT_DESCRIPTOR_FLAG(1, DATA_VOLATILE)
+ROOT_DESCRIPTOR_FLAG(2, DATA_STATIC_WHILE_SET_AT_EXECUTE)
+ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
+#undef ROOT_DESCRIPTOR_FLAG
+#endif // ROOT_DESCRIPTOR_FLAG
+
+
#ifdef ROOT_PARAMETER
ROOT_PARAMETER(1, Constants32Bit)
+ROOT_PARAMETER(2, CBV)
+ROOT_PARAMETER(3, SRV)
+ROOT_PARAMETER(4, UAV)
#undef ROOT_PARAMETER
#endif // ROOT_PARAMETER
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index fee799249b255..ac062a375818c 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -19,13 +19,15 @@ struct RootParameter {
dxbc::RootParameterHeader Header;
union {
dxbc::RootConstants Constants;
+ dxbc::RST0::v0::RootDescriptor Descriptor_V10;
+ dxbc::RST0::v1::RootDescriptor Descriptor_V11;
};
};
struct RootSignatureDesc {
uint32_t Version = 2U;
uint32_t Flags = 0U;
- uint32_t RootParameterOffset = 0U;
+ uint32_t RootParameterOffset = 24U;
uint32_t StaticSamplersOffset = 0u;
uint32_t NumStaticSamplers = 0u;
SmallVector<mcdxbc::RootParameter> Parameters;
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e8287ce078365..ba261a9e42aea 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -120,9 +120,10 @@ template <typename T> struct ViewArray {
namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
+ uint32_t Version;
StringRef ParamData;
- RootParameterView(const dxbc::RootParameterHeader &H, StringRef P)
- : Header(H), ParamData(P) {}
+ RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
+ : Header(H), Version(V), ParamData(P) {}
template <typename T> Expected<T> readParameter() {
T Struct;
@@ -149,6 +150,38 @@ struct RootConstantView : RootParameterView {
}
};
+struct RootDescriptorView_V1_0 : RootParameterView {
+ static bool classof(const RootParameterView *V) {
+ return (V->Version == 1 &&
+ (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)));
+ }
+
+ llvm::Expected<dxbc::RST0::v0::RootDescriptor> read() {
+ return readParameter<dxbc::RST0::v0::RootDescriptor>();
+ }
+};
+
+struct RootDescriptorView_V1_1 : RootParameterView {
+ static bool classof(const RootParameterView *V) {
+ return (V->Version == 2 &&
+ (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)));
+ }
+
+ llvm::Expected<dxbc::RST0::v1::RootDescriptor> read() {
+ return readParameter<dxbc::RST0::v1::RootDescriptor>();
+ }
+};
+
static Error parseFailed(const Twine &Msg) {
return make_error<GenericBinaryError>(Msg.str(), object_error::parse_failed);
}
@@ -192,6 +225,14 @@ class RootSignature {
case dxbc::RootParameterType::Constants32Bit:
DataSize = sizeof(dxbc::RootConstants);
break;
+ case dxbc::RootParameterType::CBV:
+ case dxbc::RootParameterType::SRV:
+ case dxbc::RootParameterType::UAV:
+ if (Version == 1)
+ DataSize = sizeof(dxbc::RST0::v0::RootDescriptor);
+ else
+ DataSize = sizeof(dxbc::RST0::v1::RootDescriptor);
+ break;
}
size_t EndOfSectionByte = getNumStaticSamplers() == 0
? PartData.size()
@@ -201,7 +242,7 @@ class RootSignature {
return parseFailed("Reading structure out of file bounds");
StringRef Buff = PartData.substr(Header.ParameterOffset, DataSize);
- RootParameterView View = RootParameterView(Header, Buff);
+ RootParameterView View = RootParameterView(Version, Header, Buff);
return View;
}
};
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 393bba9c79bf8..e86a869da99bc 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -73,24 +73,50 @@ struct ShaderHash {
std::vector<llvm::yaml::Hex8> Digest;
};
-#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
-
struct RootConstantsYaml {
uint32_t ShaderRegister;
uint32_t RegisterSpace;
uint32_t Num32BitValues;
};
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) bool Val = false;
+struct RootDescriptorYaml {
+ RootDescriptorYaml() = default;
+
+ uint32_t ShaderRegister;
+ uint32_t RegisterSpace;
+
+ uint32_t getEncodedFlags() const;
+
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
+ RootParameterYamlDesc(){};
+ RootParameterYamlDesc(uint32_t T) : Type(T) {
+ switch (T) {
+
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
+ Constants = RootConstantsYaml();
+ break;
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ Descriptor = RootDescriptorYaml();
+ break;
+ }
+ }
union {
RootConstantsYaml Constants;
+ RootDescriptorYaml Descriptor;
};
};
+#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
struct RootSignatureYamlDesc {
RootSignatureYamlDesc() = default;
@@ -298,6 +324,10 @@ template <> struct MappingTraits<llvm::DXContainerYAML::RootConstantsYaml> {
static void mapping(IO &IO, llvm::DXContainerYAML::RootConstantsYaml &C);
};
+template <> struct MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml> {
+ static void mapping(IO &IO, llvm::DXContainerYAML::RootDescriptorYaml &D);
+};
+
} // namespace yaml
} // namespace llvm
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index c2731d95c955e..a5210f4768f16 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -37,6 +37,15 @@ size_t RootSignatureDesc::getSize() const {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
Size += sizeof(dxbc::RootConstants);
break;
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ if (Version == 1)
+ Size += sizeof(dxbc::RST0::v0::RootDescriptor);
+ else
+ Size += sizeof(dxbc::RST0::v1::RootDescriptor);
+
+ break;
}
}
return Size;
@@ -80,6 +89,22 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, P.Constants.Num32BitValues,
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):
+ if (Version == 1) {
+ support::endian::write(BOS, P.Descriptor_V10.ShaderRegister,
+ llvm::endianness::little);
+ support::endian::write(BOS, P.Descriptor_V10.RegisterSpace,
+ llvm::endianness::little);
+ } else {
+ support::endian::write(BOS, P.Descriptor_V11.ShaderRegister,
+ llvm::endianness::little);
+ support::endian::write(BOS, P.Descriptor_V11.RegisterSpace,
+ llvm::endianness::little);
+ support::endian::write(BOS, P.Descriptor_V11.Flags,
+ llvm::endianness::little);
+ }
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 86e24eae4abc6..be0e52fef04f5 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -283,6 +283,23 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
+ break;
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ if (RS.Version == 1) {
+ NewParam.Descriptor_V10.RegisterSpace =
+ Param.Descriptor.RegisterSpace;
+ NewParam.Descriptor_V10.ShaderRegister =
+ Param.Descriptor.ShaderRegister;
+ } else {
+ NewParam.Descriptor_V11.RegisterSpace =
+ Param.Descriptor.RegisterSpace;
+ NewParam.Descriptor_V11.ShaderRegister =
+ Param.Descriptor.ShaderRegister;
+ NewParam.Descriptor_V11.Flags = Param.Descriptor.getEncodedFlags();
+ }
+
break;
}
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 59914fe30082d..ef86da85989e6 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Object/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
@@ -48,13 +49,12 @@ DXContainerYAML::RootSignatureYamlDesc::create(
uint32_t Flags = Data.getFlags();
for (const dxbc::RootParameterHeader &PH : Data.param_headers()) {
- RootParameterYamlDesc NewP;
- NewP.Offset = PH.ParameterOffset;
-
if (!dxbc::isValidParameterType(PH.ParameterType))
return createStringError(std::errc::invalid_argument,
"Invalid value for parameter type");
+ RootParameterYamlDesc NewP(PH.ParameterType);
+ NewP.Offset = PH.ParameterOffset;
NewP.Type = PH.ParameterType;
if (!dxbc::isValidShaderVisibility(PH.ShaderVisibility))
@@ -79,7 +79,32 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Constants.Num32BitValues = Constants.Num32BitValues;
NewP.Constants.ShaderRegister = Constants.ShaderRegister;
NewP.Constants.RegisterSpace = Constants.RegisterSpace;
+ } else if (auto *RDV = dyn_cast<object::DirectX::RootDescriptorView_V1_0>(
+ &ParamView)) {
+ llvm::Expected<dxbc::RST0::v0::RootDescriptor> DescriptorOrErr =
+ RDV->read();
+ if (Error E = DescriptorOrErr.takeError())
+ return std::move(E);
+ auto Descriptor = *DescriptorOrErr;
+
+ NewP.Descriptor.ShaderRegister = Descriptor.ShaderRegister;
+ NewP.Descriptor.RegisterSpace = Descriptor.RegisterSpace;
+ } else if (auto *RDV = dyn_cast<object::DirectX::RootDescriptorView_V1_1>(
+ &ParamView)) {
+ llvm::Expected<dxbc::RST0::v1::RootDescriptor> DescriptorOrErr =
+ RDV->read();
+ if (Error E = DescriptorOrErr.takeError())
+ return std::move(E);
+ auto Descriptor = *DescriptorOrErr;
+ NewP.Descriptor.ShaderRegister = Descriptor.ShaderRegister;
+ NewP.Descriptor.RegisterSpace = Descriptor.RegisterSpace;
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
+ NewP.Descriptor.Val = \
+ (Descriptor.Flags & \
+ llvm::to_underlying(dxbc::RootDescriptorFlag::Val)) > 0;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
}
+
RootSigDesc.Parameters.push_back(NewP);
}
#define ROOT_ELEMENT_FLAG(Num, Val) \
@@ -89,6 +114,15 @@ DXContainerYAML::RootSignatureYamlDesc::create(
return RootSigDesc;
}
+uint32_t DXContainerYAML::RootDescriptorYaml::getEncodedFlags() const {
+ uint64_t Flag = 0;
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
+ if (Val) \
+ Flag |= (uint32_t)dxbc::RootDescriptorFlag::Val;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+ return Flag;
+}
+
uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
uint64_t Flag = 0;
#define ROOT_ELEMENT_FLAG(Num, Val) \
@@ -276,6 +310,14 @@ void MappingTraits<llvm::DXContainerYAML::RootConstantsYaml>::mapping(
IO.mapRequired("ShaderRegister", C.ShaderRegister);
}
+void MappingTraits<llvm::DXContainerYAML::RootDescriptorYaml>::mapping(
+ IO &IO, llvm::DXContainerYAML::RootDescriptorYaml &D) {
+ IO.mapRequired("RegisterSpace", D.RegisterSpace);
+ IO.mapRequired("ShaderRegister", D.ShaderRegister);
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) IO.mapOptional(#Val, D.Val, false);
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+}
+
void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
IO &IO, llvm::DXContainerYAML::RootParameterYamlDesc &P) {
IO.mapRequired("ParameterType", P.Type);
@@ -285,6 +327,11 @@ void MappingTraits<llvm::DXContainerYAML::RootParameterYamlDesc>::mapping(
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
IO.mapRequired("Constants", P.Constants);
break;
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ IO.mapRequired("Descriptor", P.Descriptor);
+ break;
}
}
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml
new file mode 100644
index 0000000000000..46cdf416ffcae
--- /dev/null
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml
@@ -0,0 +1,45 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !dxcontainer
+Header:
+ Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+ Version:
+ Major: 1
+ Minor: 0
+ PartCount: 1
+ PartOffsets: [ 60 ]
+Parts:
+ - Name: RTS0
+ Size: 96
+ RootSignature:
+ Version: 1
+ NumRootParameters: 1
+ RootParametersOffset: 24
+ NumStaticSamplers: 0
+ StaticSamplersOffset: 60
+ Parameters:
+ - ParameterType: 2 # SRV
+ ShaderVisibility: 3 # Domain
+ Descriptor:
+ ShaderRegister: 31
+ RegisterSpace: 32
+ AllowInputAssemblerInputLayout: true
+ DenyGeometryShaderRootAccess: true
+
+# CHECK: - Name: RTS0
+# CHECK-NEXT: Size: 96
+# CHECK-NEXT: RootSignature:
+# CHECK-NEXT: Version: 1
+# CHECK-NEXT: NumRootParameters: 1
+# CHECK-NEXT: RootParametersOffset: 24
+# CHECK-NEXT: NumStaticSamplers: 0
+# CHECK-NEXT: StaticSamplersOffset: 60
+# CHECK-NEXT: Parameters:
+# CHECK-NEXT: - ParameterType: 2
+# CHECK-NEXT: ShaderVisibility: 3
+# CHECK-NEXT: Descriptor:
+# CHECK-NEXT: RegisterSpace: 32
+# CHECK-NEXT: ShaderRegister: 31
+# CHECK-NEXT: AllowInputAssemblerInputLayout: true
+# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.1.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.1.yaml
new file mode 100644
index 0000000000000..64e01c6836e32
--- /dev/null
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.1.yaml
@@ -0,0 +1,47 @@
+# RUN: yaml2obj %s | obj2yaml | FileCheck %s
+
+--- !dxcontainer
+Header:
+ Hash: [ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 ]
+ Version:
+ Major: 1
+ Minor: 0
+ PartCount: 1
+ PartOffsets: [ 60 ]
+Parts:
+ - Name: RTS0
+ Size: 89
+ RootSignature:
+ Version: 2
+ NumRootParameters: 1
+ RootParametersOffset: 24
+ NumStaticSamplers: 0
+ StaticSamplersOffset: 60
+ Parameters:
+ - ParameterType: 2 # SRV
+ ShaderVisibility: 3 # Domain
+ Descriptor:
+ ShaderRegister: 31
+ RegisterSpace: 32
+ DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+ AllowInputAssemblerInputLayout: true
+ DenyGeometryShaderRootAccess: true
+
+# CHECK: - Name: RTS0
+# CHECK-NEXT: Size: 89
+# CHECK-NEXT: RootSignature:
+# CHECK-NEXT: Version: 2
+# CHECK-NEXT: NumRootParameters: 1
+# CHECK-NEXT: RootParametersOffset: 24
+# CHECK-NEXT: NumStaticSamplers: 0
+# CHECK-NEXT: StaticSamplersOffset: 60
+# CHECK-NEXT: Parameters:
+# CHECK-NEXT: - ParameterType: 2
+# CHECK-NEXT: ShaderVisibility: 3
+# CHECK-NEXT: Descriptor:
+# CHECK-NEXT: RegisterSpace: 32
+# CHECK-NEXT: ShaderRegister: 31
+# CHECK-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+# CHECK-NEXT: AllowInputAssemblerInputLayout: true
+# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
index f366d71714359..debb459c3944e 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-MultipleParameters.yaml
@@ -11,10 +11,10 @@ Header:
PartOffsets: [ 60 ]
Parts:
- Name: RTS0
- Size: 80
+ Size: 96
RootSignature:
Version: 2
- NumRootParameters: 2
+ NumRootParameters: 3
RootParametersOffset: 24
NumStaticSamplers: 0
StaticSamplersOffset: 60
@@ -31,14 +31,20 @@ Parts:
Num32BitValues: 21
ShaderRegister: 22
RegisterSpace: 23
+ - ParameterType: 2 # SRV
+ ShaderVisibility: 3 # Domain
+ Descriptor:
+ ShaderRegister: 31
+ RegisterSpace: 32
+ DATA_STATIC_WHILE_SET_AT_EXECUTE: true
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
# CHECK: - Name: RTS0
-# CHECK-NEXT: Size: 80
+# CHECK-NEXT: Size: 96
# CHECK-NEXT: RootSignature:
# CHECK-NEXT: Version: 2
-# CHECK-NEXT: NumRootParameters: 2
+# CHECK-NEXT: NumRootParameters: 3
# CHECK-NEXT: RootParametersOffset: 24
# CHECK-NEXT: NumStaticSamplers: 0
# CHECK-NEXT: StaticSamplersOffset: 60
@@ -55,5 +61,11 @@ Parts:
# CHECK-NEXT: Num32BitValues: 21
# CHECK-NEXT: RegisterSpace: 23
# CHECK-NEXT: ShaderRegister: 22
+# CHECK-NEXT: - ParameterType: 2
+# CHECK-NEXT: ShaderVisibility: 3
+# CHECK-NEXT: Descriptor:
+# CHECK-NEXT: RegisterSpace: 32
+# CHECK-NEXT: ShaderRegister: 31
+# CHECK-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
# CHECK-NEXT: AllowInputAssemblerInputLayout: true
# CHECK-NEXT: DenyGeometryShaderRootAccess: true
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index 62ef8e385373f..ed43f6deaa951 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -959,3 +959,94 @@ TEST(RootSignature, ParseRootConstant) {
ASSERT_EQ(Constants->Num32BitValues, 16u);
}
}
+
+TEST(RootSignature, ParseRootDescriptor) {
+ {
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 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 =
+ llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
+
+ auto MaybeRS = C.getRootSignature();
+ ASSERT_TRUE(MaybeRS.has_value());
+ const auto &RS = MaybeRS.value();
+ ASSERT_EQ(RS.getVersion(), 1u);
+ ASSERT_EQ(RS.getNumParameters(), 1u);
+ ASSERT_EQ(RS.getRootParametersOffset(), 24u);
+ ASSERT_EQ(RS.getNumStaticSamplers(), 0u);
+ ASSERT_EQ(RS.getStaticSamplersOffset(), 60u);
+ ASSERT_EQ(RS.getFlags(), 17u);
+
+ auto RootParam = *RS.param_headers().begin();
+ ASSERT_EQ((unsigned)RootParam.ParameterType, 2u);
+ ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 3u);
+ auto ParamView = RS.getParameter(RootParam);
+ ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
+
+ DirectX::RootDescriptorView_V1_0 *RootDescriptorView =
+ dyn_cast<DirectX::RootDescriptorView_V1_0>(&*ParamView);
+ ASSERT_TRUE(RootDescriptorView != nullptr);
+ auto Descriptor = RootDescriptorView->read();
+
+ ASSERT_THAT_ERROR(Descriptor.takeError(), Succeeded());
+
+ ASSERT_EQ(Descriptor->ShaderRegister, 31u);
+ ASSERT_EQ(Descriptor->RegisterSpace, 32u);
+ }
+
+ {
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 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 =
+ llvm::cantFail(DXContainer::create(getMemoryBuffer<133>(Buffer)));
+
+ auto MaybeRS = C.getRootSignature();
+ ASSERT_TRUE(MaybeRS.has_value());
+ const auto &RS = MaybeRS.value();
+ ASSERT_EQ(RS.getVersion(), 2u);
+ ASSERT_EQ(RS.getNumParameters(), 1u);
+ ASSERT_EQ(RS.getRootParametersOffset(), 24u);
+ ASSERT_EQ(RS.getNumStaticSamplers(), 0u);
+ ASSERT_EQ(RS.getStaticSamplersOffset(), 60u);
+ ASSERT_EQ(RS.getFlags(), 17u);
+
+ auto RootParam = *RS.param_headers().begin();
+ ASSERT_EQ((unsigned)RootParam.ParameterType, 2u);
+ ASSERT_EQ((unsigned)RootParam.ShaderVisibility, 3u);
+ auto ParamView = RS.getParameter(RootParam);
+ ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
+
+ DirectX::RootDescriptorView_V1_1 *RootDescriptorView =
+ dyn_cast<DirectX::RootDescriptorView_V1_1>(&*ParamView);
+ ASSERT_TRUE(RootDescriptorView != nullptr);
+ auto Descriptor = RootDescriptorView->read();
+
+ ASSERT_THAT_ERROR(Descriptor.takeError(), Succeeded());
+
+ ASSERT_EQ(Descriptor->ShaderRegister, 31u);
+ ASSERT_EQ(Descriptor->RegisterSpace, 32u);
+ ASSERT_EQ(Descriptor->Flags, 4u);
+ }
+}
diff --git a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
index 61390049bc0df..b6a5cee24b29d 100644
--- a/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
+++ b/llvm/unittests/ObjectYAML/DXContainerYAMLTest.cpp
@@ -251,3 +251,106 @@ TEST(RootSignature, ParseRootConstants) {
EXPECT_EQ(Storage.size(), 133u);
EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0);
}
+
+TEST(RootSignature, ParseRootDescriptorsV10) {
+ SmallString<128> Storage;
+
+ // First read a fully explicit yaml with all sizes and offsets provided
+ ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer
+ Header:
+ Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5,
+ 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ]
+ Version:
+ Major: 1
+ Minor: 0
+ FileSize: 133
+ PartCount: 1
+ PartOffsets: [ 36 ]
+ Parts:
+ - Name: RTS0
+ Size: 89
+ RootSignature:
+ Version: 1
+ NumRootParameters: 1
+ RootParametersOffset: 24
+ NumStaticSamplers: 0
+ StaticSamplersOffset: 60
+ Parameters:
+ - ParameterType: 2 # SRV
+ ShaderVisibility: 3 # Domain
+ Descriptor:
+ ShaderRegister: 31
+ RegisterSpace: 32
+ AllowInputAssemblerInputLayout: true
+ DenyGeometryShaderRootAccess: true
+ )"));
+
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00};
+
+ EXPECT_EQ(Storage.size(), 133u);
+ EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0);
+}
+
+TEST(RootSignature, ParseRootDescriptorsV11) {
+ SmallString<128> Storage;
+
+ // First read a fully explicit yaml with all sizes and offsets provided
+ ASSERT_TRUE(convert(Storage, R"(--- !dxcontainer
+ Header:
+ Hash: [ 0x32, 0x9A, 0x53, 0xD8, 0xEC, 0xBE, 0x35, 0x6F, 0x5,
+ 0x39, 0xE1, 0xFE, 0x31, 0x20, 0xF0, 0xC1 ]
+ Version:
+ Major: 1
+ Minor: 0
+ FileSize: 133
+ PartCount: 1
+ PartOffsets: [ 36 ]
+ Parts:
+ - Name: RTS0
+ Size: 89
+ RootSignature:
+ Version: 2
+ NumRootParameters: 1
+ RootParametersOffset: 24
+ NumStaticSamplers: 0
+ StaticSamplersOffset: 60
+ Parameters:
+ - ParameterType: 2 # SRV
+ ShaderVisibility: 3 # Domain
+ Descriptor:
+ ShaderRegister: 31
+ RegisterSpace: 32
+ DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+ AllowInputAssemblerInputLayout: true
+ DenyGeometryShaderRootAccess: true
+ )"));
+
+ uint8_t Buffer[] = {
+ 0x44, 0x58, 0x42, 0x43, 0x32, 0x9a, 0x53, 0xd8, 0xec, 0xbe, 0x35, 0x6f,
+ 0x05, 0x39, 0xe1, 0xfe, 0x31, 0x20, 0xf0, 0xc1, 0x01, 0x00, 0x00, 0x00,
+ 0x85, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
+ 0x52, 0x54, 0x53, 0x30, 0x59, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00};
+
+ EXPECT_EQ(Storage.size(), 133u);
+ EXPECT_TRUE(memcmp(Buffer, Storage.data(), 133u) == 0);
+}
>From 8b8c02a6107b2b01bbc9cc9d84504d71e2726523 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 24 Apr 2025 22:34:06 +0000
Subject: [PATCH 02/69] clean up
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 2 ++
llvm/include/llvm/MC/DXContainerRootSignature.h | 2 +-
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 1 -
4 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 439bf7b40f31b..3dbcfa82f3d7c 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -427,6 +427,7 @@ struct SignatureElement {
static_assert(sizeof(SignatureElement) == 4 * sizeof(uint32_t),
"PSV Signature elements must fit in 16 bytes.");
+
} // namespace v0
namespace v1 {
@@ -467,6 +468,7 @@ struct RuntimeInfo : public v0::RuntimeInfo {
sys::swapByteOrder(GeomData.MaxVertexCount);
}
};
+
} // namespace v1
namespace v2 {
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index ac062a375818c..1f421d726bf38 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -27,7 +27,7 @@ struct RootSignatureDesc {
uint32_t Version = 2U;
uint32_t Flags = 0U;
- uint32_t RootParameterOffset = 24U;
+ uint32_t RootParameterOffset = 0U;
uint32_t StaticSamplersOffset = 0u;
uint32_t NumStaticSamplers = 0u;
SmallVector<mcdxbc::RootParameter> Parameters;
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index e86a869da99bc..c54c995acd263 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -95,7 +95,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc(){};
+ RootParameterYamlDesc() {};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index ef86da85989e6..e49712852d612 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,7 +15,6 @@
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Object/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
>From 7ac964196fc9195165dc1128d0f889f6ff1a93b4 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 25 Apr 2025 22:28:48 +0000
Subject: [PATCH 03/69] addressing comments
---
llvm/include/llvm/Object/DXContainer.h | 50 +++++++------------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 6 +--
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 17 ++-----
llvm/unittests/Object/DXContainerTest.cpp | 12 ++---
4 files changed, 32 insertions(+), 53 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index ba261a9e42aea..e359d85f08bec 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -120,18 +120,20 @@ template <typename T> struct ViewArray {
namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
- uint32_t Version;
StringRef ParamData;
RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
- : Header(H), Version(V), ParamData(P) {}
+ : Header(H), ParamData(P) {}
- template <typename T> Expected<T> readParameter() {
- T Struct;
- if (sizeof(T) != ParamData.size())
+ template <typename T, typename VersionT = T> Expected<T> readParameter() {
+ assert(sizeof(VersionT) <= sizeof(T) &&
+ "Parameter of higher version must inherit all previous version data "
+ "members");
+ if (sizeof(VersionT) != ParamData.size())
return make_error<GenericBinaryError>(
"Reading structure out of file bounds", object_error::parse_failed);
- memcpy(&Struct, ParamData.data(), sizeof(T));
+ T Struct;
+ memcpy(&Struct, ParamData.data(), sizeof(VersionT));
// DXContainer is always little endian
if (sys::IsBigEndianHost)
Struct.swapBytes();
@@ -150,34 +152,20 @@ struct RootConstantView : RootParameterView {
}
};
-struct RootDescriptorView_V1_0 : RootParameterView {
- static bool classof(const RootParameterView *V) {
- return (V->Version == 1 &&
- (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)));
- }
-
- llvm::Expected<dxbc::RST0::v0::RootDescriptor> read() {
- return readParameter<dxbc::RST0::v0::RootDescriptor>();
- }
-};
-
-struct RootDescriptorView_V1_1 : RootParameterView {
+struct RootDescriptorView : RootParameterView {
static bool classof(const RootParameterView *V) {
- return (V->Version == 2 &&
- (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 ==
+ llvm::to_underlying(dxbc::RootParameterType::CBV) ||
+ V->Header.ParameterType ==
+ llvm::to_underlying(dxbc::RootParameterType::SRV) ||
+ V->Header.ParameterType ==
+ llvm::to_underlying(dxbc::RootParameterType::UAV));
}
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> read() {
+ llvm::Expected<dxbc::RST0::v1::RootDescriptor> read(uint32_t Version) {
+ if (Version == 1)
+ return readParameter<dxbc::RST0::v1::RootDescriptor,
+ dxbc::RST0::v0::RootDescriptor>();
return readParameter<dxbc::RST0::v1::RootDescriptor>();
}
};
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index c54c995acd263..8bb9da7884bed 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -79,7 +79,6 @@ struct RootConstantsYaml {
uint32_t Num32BitValues;
};
-#define ROOT_DESCRIPTOR_FLAG(Num, Val) bool Val = false;
struct RootDescriptorYaml {
RootDescriptorYaml() = default;
@@ -88,6 +87,7 @@ struct RootDescriptorYaml {
uint32_t getEncodedFlags() const;
+#define ROOT_DESCRIPTOR_FLAG(Num, Val) bool Val = false;
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
@@ -95,7 +95,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc() {};
+ RootParameterYamlDesc(){};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
@@ -116,7 +116,6 @@ struct RootParameterYamlDesc {
};
};
-#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
struct RootSignatureYamlDesc {
RootSignatureYamlDesc() = default;
@@ -137,6 +136,7 @@ struct RootSignatureYamlDesc {
static llvm::Expected<DXContainerYAML::RootSignatureYamlDesc>
create(const object::DirectX::RootSignature &Data);
+#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index e49712852d612..c9d2084226b7a 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,6 +15,7 @@
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Object/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
@@ -78,20 +79,10 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Constants.Num32BitValues = Constants.Num32BitValues;
NewP.Constants.ShaderRegister = Constants.ShaderRegister;
NewP.Constants.RegisterSpace = Constants.RegisterSpace;
- } else if (auto *RDV = dyn_cast<object::DirectX::RootDescriptorView_V1_0>(
- &ParamView)) {
- llvm::Expected<dxbc::RST0::v0::RootDescriptor> DescriptorOrErr =
- RDV->read();
- if (Error E = DescriptorOrErr.takeError())
- return std::move(E);
- auto Descriptor = *DescriptorOrErr;
-
- NewP.Descriptor.ShaderRegister = Descriptor.ShaderRegister;
- NewP.Descriptor.RegisterSpace = Descriptor.RegisterSpace;
- } else if (auto *RDV = dyn_cast<object::DirectX::RootDescriptorView_V1_1>(
- &ParamView)) {
+ } else if (auto *RDV =
+ dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
llvm::Expected<dxbc::RST0::v1::RootDescriptor> DescriptorOrErr =
- RDV->read();
+ RDV->read(Data.getVersion());
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
auto Descriptor = *DescriptorOrErr;
diff --git a/llvm/unittests/Object/DXContainerTest.cpp b/llvm/unittests/Object/DXContainerTest.cpp
index ed43f6deaa951..72f860a5039ff 100644
--- a/llvm/unittests/Object/DXContainerTest.cpp
+++ b/llvm/unittests/Object/DXContainerTest.cpp
@@ -994,10 +994,10 @@ TEST(RootSignature, ParseRootDescriptor) {
auto ParamView = RS.getParameter(RootParam);
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
- DirectX::RootDescriptorView_V1_0 *RootDescriptorView =
- dyn_cast<DirectX::RootDescriptorView_V1_0>(&*ParamView);
+ DirectX::RootDescriptorView *RootDescriptorView =
+ dyn_cast<DirectX::RootDescriptorView>(&*ParamView);
ASSERT_TRUE(RootDescriptorView != nullptr);
- auto Descriptor = RootDescriptorView->read();
+ auto Descriptor = RootDescriptorView->read(RS.getVersion());
ASSERT_THAT_ERROR(Descriptor.takeError(), Succeeded());
@@ -1038,10 +1038,10 @@ TEST(RootSignature, ParseRootDescriptor) {
auto ParamView = RS.getParameter(RootParam);
ASSERT_THAT_ERROR(ParamView.takeError(), Succeeded());
- DirectX::RootDescriptorView_V1_1 *RootDescriptorView =
- dyn_cast<DirectX::RootDescriptorView_V1_1>(&*ParamView);
+ DirectX::RootDescriptorView *RootDescriptorView =
+ dyn_cast<DirectX::RootDescriptorView>(&*ParamView);
ASSERT_TRUE(RootDescriptorView != nullptr);
- auto Descriptor = RootDescriptorView->read();
+ auto Descriptor = RootDescriptorView->read(RS.getVersion());
ASSERT_THAT_ERROR(Descriptor.takeError(), Succeeded());
>From c1054581e1a9973408991e863a5e7eec51e74f04 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Sat, 26 Apr 2025 01:45:29 +0000
Subject: [PATCH 04/69] formating
---
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 8bb9da7884bed..d9d43b40db299 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -95,7 +95,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc(){};
+ RootParameterYamlDesc() {};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
>From efe76aafee2c07e5e1df69daa404d48682ed5434 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Sat, 26 Apr 2025 02:02:53 +0000
Subject: [PATCH 05/69] try fix test
---
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 7 +++++--
.../DXContainer/RootSignature-Descriptor1.0.yaml | 2 +-
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index c9d2084226b7a..18c1299d4b867 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -39,8 +39,9 @@ DXContainerYAML::RootSignatureYamlDesc::create(
const object::DirectX::RootSignature &Data) {
RootSignatureYamlDesc RootSigDesc;
+ uint32_t Version = Data.getVersion();
- RootSigDesc.Version = Data.getVersion();
+ RootSigDesc.Version = Version;
RootSigDesc.NumStaticSamplers = Data.getNumStaticSamplers();
RootSigDesc.StaticSamplersOffset = Data.getStaticSamplersOffset();
RootSigDesc.NumRootParameters = Data.getNumRootParameters();
@@ -82,17 +83,19 @@ DXContainerYAML::RootSignatureYamlDesc::create(
} else if (auto *RDV =
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
llvm::Expected<dxbc::RST0::v1::RootDescriptor> DescriptorOrErr =
- RDV->read(Data.getVersion());
+ RDV->read(Version);
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
auto Descriptor = *DescriptorOrErr;
NewP.Descriptor.ShaderRegister = Descriptor.ShaderRegister;
NewP.Descriptor.RegisterSpace = Descriptor.RegisterSpace;
+ if (Version > 1) {
#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
NewP.Descriptor.Val = \
(Descriptor.Flags & \
llvm::to_underlying(dxbc::RootDescriptorFlag::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
+ }
}
RootSigDesc.Parameters.push_back(NewP);
diff --git a/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml b/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml
index 46cdf416ffcae..889eccf74001f 100644
--- a/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml
+++ b/llvm/test/ObjectYAML/DXContainer/RootSignature-Descriptor1.0.yaml
@@ -27,7 +27,7 @@ Parts:
AllowInputAssemblerInputLayout: true
DenyGeometryShaderRootAccess: true
-# CHECK: - Name: RTS0
+# CHECK: - Name: RTS0
# CHECK-NEXT: Size: 96
# CHECK-NEXT: RootSignature:
# CHECK-NEXT: Version: 1
>From a928e9d9a12fd1114e2c1732094ad1f32ebc196c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Sat, 26 Apr 2025 06:33:13 +0000
Subject: [PATCH 06/69] addressing comments
---
.../include/llvm/MC/DXContainerRootSignature.h | 3 +--
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 18 ++++++------------
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 17 ++++-------------
4 files changed, 12 insertions(+), 28 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 1f421d726bf38..44e26c81eedc1 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -19,8 +19,7 @@ struct RootParameter {
dxbc::RootParameterHeader Header;
union {
dxbc::RootConstants Constants;
- dxbc::RST0::v0::RootDescriptor Descriptor_V10;
- dxbc::RST0::v1::RootDescriptor Descriptor_V11;
+ dxbc::RST0::v1::RootDescriptor Descriptor;
};
};
struct RootSignatureDesc {
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index d9d43b40db299..8bb9da7884bed 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -95,7 +95,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc() {};
+ RootParameterYamlDesc(){};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index a5210f4768f16..2693cb9943d5e 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -92,19 +92,13 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
- if (Version == 1) {
- support::endian::write(BOS, P.Descriptor_V10.ShaderRegister,
- llvm::endianness::little);
- support::endian::write(BOS, P.Descriptor_V10.RegisterSpace,
- llvm::endianness::little);
- } else {
- support::endian::write(BOS, P.Descriptor_V11.ShaderRegister,
- llvm::endianness::little);
- support::endian::write(BOS, P.Descriptor_V11.RegisterSpace,
- llvm::endianness::little);
- support::endian::write(BOS, P.Descriptor_V11.Flags,
+ support::endian::write(BOS, P.Descriptor.ShaderRegister,
+ llvm::endianness::little);
+ support::endian::write(BOS, P.Descriptor.RegisterSpace,
+ llvm::endianness::little);
+ if (Version > 1)
+ support::endian::write(BOS, P.Descriptor.Flags,
llvm::endianness::little);
- }
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index be0e52fef04f5..239ee9e3de9b1 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -287,19 +287,10 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::CBV):
- if (RS.Version == 1) {
- NewParam.Descriptor_V10.RegisterSpace =
- Param.Descriptor.RegisterSpace;
- NewParam.Descriptor_V10.ShaderRegister =
- Param.Descriptor.ShaderRegister;
- } else {
- NewParam.Descriptor_V11.RegisterSpace =
- Param.Descriptor.RegisterSpace;
- NewParam.Descriptor_V11.ShaderRegister =
- Param.Descriptor.ShaderRegister;
- NewParam.Descriptor_V11.Flags = Param.Descriptor.getEncodedFlags();
- }
-
+ NewParam.Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
+ NewParam.Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
+ if (P.RootSignature->Version > 1)
+ NewParam.Descriptor.Flags = Param.Descriptor.getEncodedFlags();
break;
}
>From a38f10b51ac930be4bb5a5718d204d9f2d0c0396 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 25 Apr 2025 05:09:08 +0000
Subject: [PATCH 07/69] refactoring mcdxbc struct to store root parameters out
of order
---
.../llvm/MC/DXContainerRootSignature.h | 137 +++++++++++++++++-
llvm/lib/MC/DXContainerRootSignature.cpp | 68 ++++-----
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 26 ++--
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 45 +++---
4 files changed, 201 insertions(+), 75 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 44e26c81eedc1..e1f4abbcebf8f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,21 +6,146 @@
//
//===----------------------------------------------------------------------===//
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/BinaryFormat/DXContainer.h"
+#include "llvm/Support/ErrorHandling.h"
+#include <cstddef>
#include <cstdint>
-#include <limits>
+#include <variant>
namespace llvm {
class raw_ostream;
namespace mcdxbc {
+struct RootParameterHeader : public dxbc::RootParameterHeader {
+
+ size_t Location;
+
+ RootParameterHeader() = default;
+
+ RootParameterHeader(dxbc::RootParameterHeader H, size_t L)
+ : dxbc::RootParameterHeader(H), Location(L) {}
+};
+
+using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor,
+ dxbc::RST0::v1::RootDescriptor>;
+using ParametersView =
+ std::variant<dxbc::RootConstants, dxbc::RST0::v0::RootDescriptor,
+ dxbc::RST0::v1::RootDescriptor>;
struct RootParameter {
- dxbc::RootParameterHeader Header;
- union {
- dxbc::RootConstants Constants;
- dxbc::RST0::v1::RootDescriptor Descriptor;
+ SmallVector<RootParameterHeader> Headers;
+
+ SmallVector<dxbc::RootConstants> Constants;
+ SmallVector<RootDescriptor> Descriptors;
+
+ void addHeader(dxbc::RootParameterHeader H, size_t L) {
+ Headers.push_back(RootParameterHeader(H, L));
+ }
+
+ void addParameter(dxbc::RootParameterHeader H, dxbc::RootConstants C) {
+ addHeader(H, Constants.size());
+ Constants.push_back(C);
+ }
+
+ void addParameter(dxbc::RootParameterHeader H,
+ dxbc::RST0::v0::RootDescriptor D) {
+ addHeader(H, Descriptors.size());
+ Descriptors.push_back(D);
+ }
+
+ void addParameter(dxbc::RootParameterHeader H,
+ dxbc::RST0::v1::RootDescriptor D) {
+ addHeader(H, Descriptors.size());
+ Descriptors.push_back(D);
+ }
+
+ ParametersView get(const RootParameterHeader &H) const {
+ switch (H.ParameterType) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
+ return Constants[H.Location];
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ RootDescriptor VersionedParam = Descriptors[H.Location];
+ if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
+ VersionedParam))
+ return std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
+ return std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
+ }
+
+ llvm_unreachable("Unimplemented parameter type");
+ }
+
+ struct iterator {
+ const RootParameter &Parameters;
+ SmallVector<RootParameterHeader>::const_iterator Current;
+
+ // Changed parameter type to match member variable (removed const)
+ iterator(const RootParameter &P,
+ SmallVector<RootParameterHeader>::const_iterator C)
+ : Parameters(P), Current(C) {}
+ iterator(const iterator &) = default;
+
+ ParametersView operator*() {
+ ParametersView Val;
+ switch (Current->ParameterType) {
+ case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
+ Val = Parameters.Constants[Current->Location];
+ break;
+
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ RootDescriptor VersionedParam =
+ Parameters.Descriptors[Current->Location];
+ if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
+ VersionedParam))
+ Val = std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
+ else
+ Val = std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
+ break;
+ }
+ return Val;
+ }
+
+ iterator operator++() {
+ Current++;
+ return *this;
+ }
+
+ iterator operator++(int) {
+ iterator Tmp = *this;
+ ++*this;
+ return Tmp;
+ }
+
+ iterator operator--() {
+ Current--;
+ return *this;
+ }
+
+ iterator operator--(int) {
+ iterator Tmp = *this;
+ --*this;
+ return Tmp;
+ }
+
+ bool operator==(const iterator I) { return I.Current == Current; }
+ bool operator!=(const iterator I) { return !(*this == I); }
};
+
+ iterator begin() const { return iterator(*this, Headers.begin()); }
+
+ iterator end() const { return iterator(*this, Headers.end()); }
+
+ size_t size() const { return Headers.size(); }
+
+ bool isEmpty() const { return Headers.empty(); }
+
+ llvm::iterator_range<RootParameter::iterator> getAll() const {
+ return llvm::make_range(begin(), end());
+ }
};
struct RootSignatureDesc {
@@ -29,7 +154,7 @@ struct RootSignatureDesc {
uint32_t RootParameterOffset = 0U;
uint32_t StaticSamplersOffset = 0u;
uint32_t NumStaticSamplers = 0u;
- SmallVector<mcdxbc::RootParameter> Parameters;
+ mcdxbc::RootParameter Parameters;
void write(raw_ostream &OS) const;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 2693cb9943d5e..18242ccc1e935 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -8,7 +8,9 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallString.h"
+#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
+#include <variant>
using namespace llvm;
using namespace llvm::mcdxbc;
@@ -32,22 +34,15 @@ size_t RootSignatureDesc::getSize() const {
size_t Size = sizeof(dxbc::RootSignatureHeader) +
Parameters.size() * sizeof(dxbc::RootParameterHeader);
- for (const mcdxbc::RootParameter &P : Parameters) {
- switch (P.Header.ParameterType) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- Size += sizeof(dxbc::RootConstants);
- break;
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
- case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV):
- if (Version == 1)
- Size += sizeof(dxbc::RST0::v0::RootDescriptor);
- else
- Size += sizeof(dxbc::RST0::v1::RootDescriptor);
-
- break;
- }
+ for (const auto &P : Parameters) {
+ std::visit(
+ [&Size](auto &Value) -> void {
+ using T = std::decay_t<decltype(Value)>;
+ Size += sizeof(T);
+ },
+ P);
}
+
return Size;
}
@@ -66,39 +61,40 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, Flags, llvm::endianness::little);
SmallVector<uint32_t> ParamsOffsets;
- for (const mcdxbc::RootParameter &P : Parameters) {
- support::endian::write(BOS, P.Header.ParameterType,
- llvm::endianness::little);
- support::endian::write(BOS, P.Header.ShaderVisibility,
- llvm::endianness::little);
+ for (const auto &P : Parameters.Headers) {
+ support::endian::write(BOS, P.ParameterType, llvm::endianness::little);
+ support::endian::write(BOS, P.ShaderVisibility, llvm::endianness::little);
ParamsOffsets.push_back(writePlaceholder(BOS));
}
assert(NumParameters == ParamsOffsets.size());
- for (size_t I = 0; I < NumParameters; ++I) {
+ auto P = Parameters.begin();
+ for (size_t I = 0; I < NumParameters; ++I, P++) {
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
- const mcdxbc::RootParameter &P = Parameters[I];
- switch (P.Header.ParameterType) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- support::endian::write(BOS, P.Constants.ShaderRegister,
+ if (std::holds_alternative<dxbc::RootConstants>(*P)) {
+ auto Constants = std::get<dxbc::RootConstants>(*P);
+ support::endian::write(BOS, Constants.ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, P.Constants.RegisterSpace,
+ support::endian::write(BOS, Constants.RegisterSpace,
llvm::endianness::little);
- support::endian::write(BOS, P.Constants.Num32BitValues,
+ support::endian::write(BOS, Constants.Num32BitValues,
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):
- support::endian::write(BOS, P.Descriptor.ShaderRegister,
+ } else if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(*P)) {
+ auto Descriptor = std::get<dxbc::RST0::v0::RootDescriptor>(*P);
+ support::endian::write(BOS, Descriptor.ShaderRegister,
+ llvm::endianness::little);
+ support::endian::write(BOS, Descriptor.RegisterSpace,
+ llvm::endianness::little);
+ } else if (std::holds_alternative<dxbc::RST0::v1::RootDescriptor>(*P)) {
+ auto Descriptor = std::get<dxbc::RST0::v1::RootDescriptor>(*P);
+
+ support::endian::write(BOS, Descriptor.ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, P.Descriptor.RegisterSpace,
+ support::endian::write(BOS, Descriptor.RegisterSpace,
llvm::endianness::little);
- if (Version > 1)
- support::endian::write(BOS, P.Descriptor.Flags,
- llvm::endianness::little);
+ support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 239ee9e3de9b1..3e58c2cd7497b 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -274,27 +274,31 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.StaticSamplersOffset = P.RootSignature->StaticSamplersOffset;
for (const auto &Param : P.RootSignature->Parameters) {
- mcdxbc::RootParameter NewParam;
- NewParam.Header = dxbc::RootParameterHeader{
- Param.Type, Param.Visibility, Param.Offset};
+ auto Header = dxbc::RootParameterHeader{Param.Type, Param.Visibility,
+ Param.Offset};
switch (Param.Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- NewParam.Constants.Num32BitValues = Param.Constants.Num32BitValues;
- NewParam.Constants.RegisterSpace = Param.Constants.RegisterSpace;
- NewParam.Constants.ShaderRegister = Param.Constants.ShaderRegister;
+ dxbc::RootConstants Constants;
+ Constants.Num32BitValues = Param.Constants.Num32BitValues;
+ Constants.RegisterSpace = Param.Constants.RegisterSpace;
+ Constants.ShaderRegister = Param.Constants.ShaderRegister;
+ RS.Parameters.addParameter(Header, Constants);
break;
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::CBV):
- NewParam.Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
- NewParam.Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
+ dxbc::RST0::v1::RootDescriptor Descriptor;
+ Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
+ Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
if (P.RootSignature->Version > 1)
- NewParam.Descriptor.Flags = Param.Descriptor.getEncodedFlags();
+ Descriptor.Flags = Param.Descriptor.getEncodedFlags();
+ RS.Parameters.addParameter(Header, Descriptor);
break;
+ default:
+ // Handling invalid parameter type edge case
+ RS.Parameters.addHeader(Header, -1);
}
-
- RS.Parameters.push_back(NewParam);
}
RS.write(OS);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index ef299c17baf76..a2141aa1364ad 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -30,6 +30,7 @@
#include <cstdint>
#include <optional>
#include <utility>
+#include <variant>
using namespace llvm;
using namespace llvm::dxil;
@@ -75,31 +76,32 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
if (RootConstantNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for RootConstants Element");
- mcdxbc::RootParameter NewParameter;
- NewParameter.Header.ParameterType =
+ dxbc::RootParameterHeader Header;
+ Header.ParameterType =
llvm::to_underlying(dxbc::RootParameterType::Constants32Bit);
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 1))
- NewParameter.Header.ShaderVisibility = *Val;
+ Header.ShaderVisibility = *Val;
else
return reportError(Ctx, "Invalid value for ShaderVisibility");
+ dxbc::RootConstants Constants;
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 2))
- NewParameter.Constants.ShaderRegister = *Val;
+ Constants.ShaderRegister = *Val;
else
return reportError(Ctx, "Invalid value for ShaderRegister");
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 3))
- NewParameter.Constants.RegisterSpace = *Val;
+ Constants.RegisterSpace = *Val;
else
return reportError(Ctx, "Invalid value for RegisterSpace");
if (std::optional<uint32_t> Val = extractMdIntValue(RootConstantNode, 4))
- NewParameter.Constants.Num32BitValues = *Val;
+ Constants.Num32BitValues = *Val;
else
return reportError(Ctx, "Invalid value for Num32BitValues");
- RSD.Parameters.push_back(NewParameter);
+ RSD.Parameters.addParameter(Header, Constants);
return false;
}
@@ -164,12 +166,11 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
return reportValueError(Ctx, "RootFlags", RSD.Flags);
}
- for (const mcdxbc::RootParameter &P : RSD.Parameters) {
- if (!dxbc::isValidShaderVisibility(P.Header.ShaderVisibility))
- return reportValueError(Ctx, "ShaderVisibility",
- P.Header.ShaderVisibility);
+ for (const mcdxbc::RootParameterHeader &Header : RSD.Parameters.Headers) {
+ if (!dxbc::isValidShaderVisibility(Header.ShaderVisibility))
+ return reportValueError(Ctx, "ShaderVisibility", Header.ShaderVisibility);
- assert(dxbc::isValidParameterType(P.Header.ParameterType) &&
+ assert(dxbc::isValidParameterType(Header.ParameterType) &&
"Invalid value for ParameterType");
}
@@ -289,20 +290,20 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
<< "\n";
OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << "\n";
Space++;
- for (auto const &P : RS.Parameters) {
- OS << indent(Space) << "- Parameter Type: " << P.Header.ParameterType
+ for (auto const &Header : RS.Parameters.Headers) {
+ OS << indent(Space) << "- Parameter Type: " << Header.ParameterType
<< "\n";
OS << indent(Space + 2)
- << "Shader Visibility: " << P.Header.ShaderVisibility << "\n";
- switch (P.Header.ParameterType) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
+ << "Shader Visibility: " << Header.ShaderVisibility << "\n";
+ mcdxbc::ParametersView P = RS.Parameters.get(Header);
+ if (std::holds_alternative<dxbc::RootConstants>(P)) {
+ auto Constants = std::get<dxbc::RootConstants>(P);
+ OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
+ << "\n";
OS << indent(Space + 2)
- << "Register Space: " << P.Constants.RegisterSpace << "\n";
+ << "Shader Register: " << Constants.ShaderRegister << "\n";
OS << indent(Space + 2)
- << "Shader Register: " << P.Constants.ShaderRegister << "\n";
- OS << indent(Space + 2)
- << "Num 32 Bit Values: " << P.Constants.Num32BitValues << "\n";
- break;
+ << "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
}
}
Space--;
>From 9a7c359fd5ce3621647e35f4656b0ae5e46abf2e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 28 Apr 2025 18:12:28 +0000
Subject: [PATCH 08/69] changing name
---
.../llvm/MC/DXContainerRootSignature.h | 111 +++++-------------
llvm/lib/MC/DXContainerRootSignature.cpp | 27 +++--
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 19 +--
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 29 +++--
4 files changed, 74 insertions(+), 112 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index e1f4abbcebf8f..2ac79f4c454d8 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -11,6 +11,7 @@
#include "llvm/Support/ErrorHandling.h"
#include <cstddef>
#include <cstdint>
+#include <optional>
#include <variant>
namespace llvm {
@@ -18,14 +19,14 @@ namespace llvm {
class raw_ostream;
namespace mcdxbc {
-struct RootParameterHeader : public dxbc::RootParameterHeader {
-
+struct RootParameterInfo {
+ dxbc::RootParameterHeader Header;
size_t Location;
- RootParameterHeader() = default;
+ RootParameterInfo() = default;
- RootParameterHeader(dxbc::RootParameterHeader H, size_t L)
- : dxbc::RootParameterHeader(H), Location(L) {}
+ RootParameterInfo(dxbc::RootParameterHeader H, size_t L)
+ : Header(H), Location(L) {}
};
using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor,
@@ -33,117 +34,61 @@ using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor,
using ParametersView =
std::variant<dxbc::RootConstants, dxbc::RST0::v0::RootDescriptor,
dxbc::RST0::v1::RootDescriptor>;
-struct RootParameter {
- SmallVector<RootParameterHeader> Headers;
+struct RootParametersContainer {
+ SmallVector<RootParameterInfo> ParametersInfo;
SmallVector<dxbc::RootConstants> Constants;
SmallVector<RootDescriptor> Descriptors;
- void addHeader(dxbc::RootParameterHeader H, size_t L) {
- Headers.push_back(RootParameterHeader(H, L));
+ void addInfo(dxbc::RootParameterHeader H, size_t L) {
+ ParametersInfo.push_back(RootParameterInfo(H, L));
}
void addParameter(dxbc::RootParameterHeader H, dxbc::RootConstants C) {
- addHeader(H, Constants.size());
+ addInfo(H, Constants.size());
Constants.push_back(C);
}
void addParameter(dxbc::RootParameterHeader H,
dxbc::RST0::v0::RootDescriptor D) {
- addHeader(H, Descriptors.size());
+ addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
void addParameter(dxbc::RootParameterHeader H,
dxbc::RST0::v1::RootDescriptor D) {
- addHeader(H, Descriptors.size());
+ addInfo(H, Descriptors.size());
Descriptors.push_back(D);
}
- ParametersView get(const RootParameterHeader &H) const {
- switch (H.ParameterType) {
+ std::optional<ParametersView> getParameter(const RootParameterInfo *H) const {
+ switch (H->Header.ParameterType) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- return Constants[H.Location];
+ return Constants[H->Location];
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
- RootDescriptor VersionedParam = Descriptors[H.Location];
+ RootDescriptor VersionedParam = Descriptors[H->Location];
if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
VersionedParam))
return std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
return std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
}
- llvm_unreachable("Unimplemented parameter type");
+ return std::nullopt;
}
- struct iterator {
- const RootParameter &Parameters;
- SmallVector<RootParameterHeader>::const_iterator Current;
-
- // Changed parameter type to match member variable (removed const)
- iterator(const RootParameter &P,
- SmallVector<RootParameterHeader>::const_iterator C)
- : Parameters(P), Current(C) {}
- iterator(const iterator &) = default;
-
- ParametersView operator*() {
- ParametersView Val;
- switch (Current->ParameterType) {
- case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- Val = Parameters.Constants[Current->Location];
- break;
-
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
- case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV):
- RootDescriptor VersionedParam =
- Parameters.Descriptors[Current->Location];
- if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
- VersionedParam))
- Val = std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
- else
- Val = std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
- break;
- }
- return Val;
- }
-
- iterator operator++() {
- Current++;
- return *this;
- }
-
- iterator operator++(int) {
- iterator Tmp = *this;
- ++*this;
- return Tmp;
- }
-
- iterator operator--() {
- Current--;
- return *this;
- }
-
- iterator operator--(int) {
- iterator Tmp = *this;
- --*this;
- return Tmp;
- }
-
- bool operator==(const iterator I) { return I.Current == Current; }
- bool operator!=(const iterator I) { return !(*this == I); }
- };
-
- iterator begin() const { return iterator(*this, Headers.begin()); }
+ size_t size() const { return ParametersInfo.size(); }
- iterator end() const { return iterator(*this, Headers.end()); }
-
- size_t size() const { return Headers.size(); }
-
- bool isEmpty() const { return Headers.empty(); }
+ SmallVector<RootParameterInfo>::const_iterator begin() const {
+ return ParametersInfo.begin();
+ }
+ SmallVector<RootParameterInfo>::const_iterator end() const {
+ return ParametersInfo.end();
+ }
- llvm::iterator_range<RootParameter::iterator> getAll() const {
+ llvm::iterator_range<SmallVector<RootParameterInfo>::const_iterator>
+ getInfo() const {
return llvm::make_range(begin(), end());
}
};
@@ -154,7 +99,7 @@ struct RootSignatureDesc {
uint32_t RootParameterOffset = 0U;
uint32_t StaticSamplersOffset = 0u;
uint32_t NumStaticSamplers = 0u;
- mcdxbc::RootParameter Parameters;
+ mcdxbc::RootParametersContainer ParametersContainer;
void write(raw_ostream &OS) const;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 18242ccc1e935..6cc8a9167bf40 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -32,15 +32,18 @@ static void rewriteOffsetToCurrentByte(raw_svector_ostream &Stream,
size_t RootSignatureDesc::getSize() const {
size_t Size = sizeof(dxbc::RootSignatureHeader) +
- Parameters.size() * sizeof(dxbc::RootParameterHeader);
+ ParametersContainer.size() * sizeof(dxbc::RootParameterHeader);
- for (const auto &P : Parameters) {
+ for (const auto &I : ParametersContainer) {
+ std::optional<ParametersView> P = ParametersContainer.getParameter(&I);
+ if (!P)
+ continue;
std::visit(
[&Size](auto &Value) -> void {
using T = std::decay_t<decltype(Value)>;
Size += sizeof(T);
},
- P);
+ *P);
}
return Size;
@@ -51,7 +54,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
raw_svector_ostream BOS(Storage);
BOS.reserveExtraSpace(getSize());
- const uint32_t NumParameters = Parameters.size();
+ const uint32_t NumParameters = ParametersContainer.size();
support::endian::write(BOS, Version, llvm::endianness::little);
support::endian::write(BOS, NumParameters, llvm::endianness::little);
@@ -61,18 +64,22 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
support::endian::write(BOS, Flags, llvm::endianness::little);
SmallVector<uint32_t> ParamsOffsets;
- for (const auto &P : Parameters.Headers) {
- support::endian::write(BOS, P.ParameterType, llvm::endianness::little);
- support::endian::write(BOS, P.ShaderVisibility, llvm::endianness::little);
+ for (const auto &P : ParametersContainer) {
+ support::endian::write(BOS, P.Header.ParameterType,
+ llvm::endianness::little);
+ support::endian::write(BOS, P.Header.ShaderVisibility,
+ llvm::endianness::little);
ParamsOffsets.push_back(writePlaceholder(BOS));
}
assert(NumParameters == ParamsOffsets.size());
- auto P = Parameters.begin();
- for (size_t I = 0; I < NumParameters; ++I, P++) {
+ const RootParameterInfo *H = ParametersContainer.begin();
+ for (size_t I = 0; I < NumParameters; ++I, H++) {
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
-
+ auto P = ParametersContainer.getParameter(H);
+ if (!P)
+ continue;
if (std::holds_alternative<dxbc::RootConstants>(*P)) {
auto Constants = std::get<dxbc::RootConstants>(*P);
support::endian::write(BOS, Constants.ShaderRegister,
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 3e58c2cd7497b..381fe41d8b01c 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -283,21 +283,26 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
Constants.Num32BitValues = Param.Constants.Num32BitValues;
Constants.RegisterSpace = Param.Constants.RegisterSpace;
Constants.ShaderRegister = Param.Constants.ShaderRegister;
- RS.Parameters.addParameter(Header, Constants);
+ RS.ParametersContainer.addParameter(Header, Constants);
break;
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::CBV):
- dxbc::RST0::v1::RootDescriptor Descriptor;
- Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
- Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
- if (P.RootSignature->Version > 1)
+ if (RS.Version == 1) {
+ dxbc::RST0::v0::RootDescriptor Descriptor;
+ Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
+ Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
+ RS.ParametersContainer.addParameter(Header, Descriptor);
+ } else {
+ dxbc::RST0::v1::RootDescriptor Descriptor;
+ Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
+ Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
Descriptor.Flags = Param.Descriptor.getEncodedFlags();
- RS.Parameters.addParameter(Header, Descriptor);
+ RS.ParametersContainer.addParameter(Header, Descriptor);
break;
default:
// Handling invalid parameter type edge case
- RS.Parameters.addHeader(Header, -1);
+ RS.ParametersContainer.addInfo(Header, -1);
}
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a2141aa1364ad..40dcff3999b8f 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -101,7 +101,7 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
else
return reportError(Ctx, "Invalid value for Num32BitValues");
- RSD.Parameters.addParameter(Header, Constants);
+ RSD.ParametersContainer.addParameter(Header, Constants);
return false;
}
@@ -166,11 +166,12 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
return reportValueError(Ctx, "RootFlags", RSD.Flags);
}
- for (const mcdxbc::RootParameterHeader &Header : RSD.Parameters.Headers) {
- if (!dxbc::isValidShaderVisibility(Header.ShaderVisibility))
- return reportValueError(Ctx, "ShaderVisibility", Header.ShaderVisibility);
+ for (const llvm::mcdxbc::RootParameterInfo &Info : RSD.ParametersContainer) {
+ if (!dxbc::isValidShaderVisibility(Info.Header.ShaderVisibility))
+ return reportValueError(Ctx, "ShaderVisibility",
+ Info.Header.ShaderVisibility);
- assert(dxbc::isValidParameterType(Header.ParameterType) &&
+ assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
}
@@ -288,16 +289,20 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space) << "Version: " << RS.Version << "\n";
OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
<< "\n";
- OS << indent(Space) << "NumParameters: " << RS.Parameters.size() << "\n";
+ OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
+ << "\n";
Space++;
- for (auto const &Header : RS.Parameters.Headers) {
- OS << indent(Space) << "- Parameter Type: " << Header.ParameterType
+ for (auto const &Info : RS.ParametersContainer) {
+ OS << indent(Space) << "- Parameter Type: " << Info.Header.ParameterType
<< "\n";
OS << indent(Space + 2)
- << "Shader Visibility: " << Header.ShaderVisibility << "\n";
- mcdxbc::ParametersView P = RS.Parameters.get(Header);
- if (std::holds_alternative<dxbc::RootConstants>(P)) {
- auto Constants = std::get<dxbc::RootConstants>(P);
+ << "Shader Visibility: " << Info.Header.ShaderVisibility << "\n";
+ std::optional<mcdxbc::ParametersView> P =
+ RS.ParametersContainer.getParameter(&Info);
+ if (!P)
+ continue;
+ if (std::holds_alternative<dxbc::RootConstants>(*P)) {
+ auto Constants = std::get<dxbc::RootConstants>(*P);
OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
<< "\n";
OS << indent(Space + 2)
>From d6c2b5583d3c13dcc96a5d5b36a8ac5741d8f6ce Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 28 Apr 2025 22:29:53 +0000
Subject: [PATCH 09/69] changing variant to host pointers
---
.../llvm/MC/DXContainerRootSignature.h | 22 +++++++-------
llvm/lib/MC/DXContainerRootSignature.cpp | 30 +++++++++----------
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 10 +++----
3 files changed, 31 insertions(+), 31 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 2ac79f4c454d8..33680c90d595f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -8,10 +8,10 @@
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Support/ErrorHandling.h"
#include <cstddef>
#include <cstdint>
#include <optional>
+#include <utility>
#include <variant>
namespace llvm {
@@ -29,11 +29,11 @@ struct RootParameterInfo {
: Header(H), Location(L) {}
};
-using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor,
- dxbc::RST0::v1::RootDescriptor>;
+using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor*,
+ dxbc::RST0::v1::RootDescriptor*>;
using ParametersView =
- std::variant<dxbc::RootConstants, dxbc::RST0::v0::RootDescriptor,
- dxbc::RST0::v1::RootDescriptor>;
+ std::variant<const dxbc::RootConstants*, const dxbc::RST0::v0::RootDescriptor*,
+ const dxbc::RST0::v1::RootDescriptor*>;
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
@@ -52,27 +52,27 @@ struct RootParametersContainer {
void addParameter(dxbc::RootParameterHeader H,
dxbc::RST0::v0::RootDescriptor D) {
addInfo(H, Descriptors.size());
- Descriptors.push_back(D);
+ Descriptors.push_back(std::move(&D));
}
void addParameter(dxbc::RootParameterHeader H,
dxbc::RST0::v1::RootDescriptor D) {
addInfo(H, Descriptors.size());
- Descriptors.push_back(D);
+ Descriptors.push_back(std::move(&D));
}
std::optional<ParametersView> getParameter(const RootParameterInfo *H) const {
switch (H->Header.ParameterType) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit):
- return Constants[H->Location];
+ return &Constants[H->Location];
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
RootDescriptor VersionedParam = Descriptors[H->Location];
- if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
+ if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor*>(
VersionedParam))
- return std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
- return std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
+ return std::get<dxbc::RST0::v0::RootDescriptor*>(VersionedParam);
+ return std::get<dxbc::RST0::v1::RootDescriptor*>(VersionedParam);
}
return std::nullopt;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 6cc8a9167bf40..c3a535592b78f 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -40,7 +40,7 @@ size_t RootSignatureDesc::getSize() const {
continue;
std::visit(
[&Size](auto &Value) -> void {
- using T = std::decay_t<decltype(Value)>;
+ using T = std::decay_t<decltype(*Value)>;
Size += sizeof(T);
},
*P);
@@ -80,28 +80,28 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
auto P = ParametersContainer.getParameter(H);
if (!P)
continue;
- if (std::holds_alternative<dxbc::RootConstants>(*P)) {
- auto Constants = std::get<dxbc::RootConstants>(*P);
- support::endian::write(BOS, Constants.ShaderRegister,
+ if (std::holds_alternative<const dxbc::RootConstants*>(*P)) {
+ auto* Constants = std::get<const dxbc::RootConstants*>(*P);
+ support::endian::write(BOS, Constants->ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, Constants.RegisterSpace,
+ support::endian::write(BOS, Constants->RegisterSpace,
llvm::endianness::little);
- support::endian::write(BOS, Constants.Num32BitValues,
+ support::endian::write(BOS, Constants->Num32BitValues,
llvm::endianness::little);
- } else if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(*P)) {
- auto Descriptor = std::get<dxbc::RST0::v0::RootDescriptor>(*P);
- support::endian::write(BOS, Descriptor.ShaderRegister,
+ } else if (std::holds_alternative<const dxbc::RST0::v0::RootDescriptor*>(*P)) {
+ auto* Descriptor = std::get<const dxbc::RST0::v0::RootDescriptor*>(*P);
+ support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, Descriptor.RegisterSpace,
+ support::endian::write(BOS, Descriptor->RegisterSpace,
llvm::endianness::little);
- } else if (std::holds_alternative<dxbc::RST0::v1::RootDescriptor>(*P)) {
- auto Descriptor = std::get<dxbc::RST0::v1::RootDescriptor>(*P);
+ } else if (std::holds_alternative<const dxbc::RST0::v1::RootDescriptor*>(*P)) {
+ auto* Descriptor = std::get<const dxbc::RST0::v1::RootDescriptor*>(*P);
- support::endian::write(BOS, Descriptor.ShaderRegister,
+ support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
- support::endian::write(BOS, Descriptor.RegisterSpace,
+ support::endian::write(BOS, Descriptor->RegisterSpace,
llvm::endianness::little);
- support::endian::write(BOS, Descriptor.Flags, llvm::endianness::little);
+ support::endian::write(BOS, Descriptor->Flags, llvm::endianness::little);
}
}
assert(Storage.size() == getSize());
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 40dcff3999b8f..4e5d44f30e908 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -301,14 +301,14 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
RS.ParametersContainer.getParameter(&Info);
if (!P)
continue;
- if (std::holds_alternative<dxbc::RootConstants>(*P)) {
- auto Constants = std::get<dxbc::RootConstants>(*P);
- OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
+ if (std::holds_alternative<const dxbc::RootConstants*>(*P)) {
+ auto* Constants = std::get<const dxbc::RootConstants*>(*P);
+ OS << indent(Space + 2) << "Register Space: " << Constants->RegisterSpace
<< "\n";
OS << indent(Space + 2)
- << "Shader Register: " << Constants.ShaderRegister << "\n";
+ << "Shader Register: " << Constants->ShaderRegister << "\n";
OS << indent(Space + 2)
- << "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
+ << "Num 32 Bit Values: " << Constants->Num32BitValues << "\n";
}
}
Space--;
>From 93e4cf299ba6898be9178f1c039eba052a8c9255 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 28 Apr 2025 22:39:36 +0000
Subject: [PATCH 10/69] clean up
---
.../llvm/MC/DXContainerRootSignature.h | 21 +++++++------------
llvm/lib/MC/DXContainerRootSignature.cpp | 14 +++++++------
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 8 +++----
3 files changed, 20 insertions(+), 23 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 33680c90d595f..507204d5b2ba4 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -29,11 +29,11 @@ struct RootParameterInfo {
: Header(H), Location(L) {}
};
-using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor*,
- dxbc::RST0::v1::RootDescriptor*>;
-using ParametersView =
- std::variant<const dxbc::RootConstants*, const dxbc::RST0::v0::RootDescriptor*,
- const dxbc::RST0::v1::RootDescriptor*>;
+using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor *,
+ dxbc::RST0::v1::RootDescriptor *>;
+using ParametersView = std::variant<const dxbc::RootConstants *,
+ const dxbc::RST0::v0::RootDescriptor *,
+ const dxbc::RST0::v1::RootDescriptor *>;
struct RootParametersContainer {
SmallVector<RootParameterInfo> ParametersInfo;
@@ -69,10 +69,10 @@ struct RootParametersContainer {
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
RootDescriptor VersionedParam = Descriptors[H->Location];
- if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor*>(
+ if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor *>(
VersionedParam))
- return std::get<dxbc::RST0::v0::RootDescriptor*>(VersionedParam);
- return std::get<dxbc::RST0::v1::RootDescriptor*>(VersionedParam);
+ return std::get<dxbc::RST0::v0::RootDescriptor *>(VersionedParam);
+ return std::get<dxbc::RST0::v1::RootDescriptor *>(VersionedParam);
}
return std::nullopt;
@@ -86,11 +86,6 @@ struct RootParametersContainer {
SmallVector<RootParameterInfo>::const_iterator end() const {
return ParametersInfo.end();
}
-
- llvm::iterator_range<SmallVector<RootParameterInfo>::const_iterator>
- getInfo() const {
- return llvm::make_range(begin(), end());
- }
};
struct RootSignatureDesc {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index c3a535592b78f..252f864f6f4bd 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -80,22 +80,24 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
auto P = ParametersContainer.getParameter(H);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RootConstants*>(*P)) {
- auto* Constants = std::get<const dxbc::RootConstants*>(*P);
+ if (std::holds_alternative<const dxbc::RootConstants *>(*P)) {
+ auto *Constants = std::get<const dxbc::RootConstants *>(*P);
support::endian::write(BOS, Constants->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Constants->RegisterSpace,
llvm::endianness::little);
support::endian::write(BOS, Constants->Num32BitValues,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RST0::v0::RootDescriptor*>(*P)) {
- auto* Descriptor = std::get<const dxbc::RST0::v0::RootDescriptor*>(*P);
+ } else if (std::holds_alternative<const dxbc::RST0::v0::RootDescriptor *>(
+ *P)) {
+ auto *Descriptor = std::get<const dxbc::RST0::v0::RootDescriptor *>(*P);
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Descriptor->RegisterSpace,
llvm::endianness::little);
- } else if (std::holds_alternative<const dxbc::RST0::v1::RootDescriptor*>(*P)) {
- auto* Descriptor = std::get<const dxbc::RST0::v1::RootDescriptor*>(*P);
+ } else if (std::holds_alternative<const dxbc::RST0::v1::RootDescriptor *>(
+ *P)) {
+ auto *Descriptor = std::get<const dxbc::RST0::v1::RootDescriptor *>(*P);
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 4e5d44f30e908..30ca4d8f7c8ed 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -301,10 +301,10 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
RS.ParametersContainer.getParameter(&Info);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RootConstants*>(*P)) {
- auto* Constants = std::get<const dxbc::RootConstants*>(*P);
- OS << indent(Space + 2) << "Register Space: " << Constants->RegisterSpace
- << "\n";
+ if (std::holds_alternative<const dxbc::RootConstants *>(*P)) {
+ auto *Constants = std::get<const dxbc::RootConstants *>(*P);
+ OS << indent(Space + 2)
+ << "Register Space: " << Constants->RegisterSpace << "\n";
OS << indent(Space + 2)
<< "Shader Register: " << Constants->ShaderRegister << "\n";
OS << indent(Space + 2)
>From b45b1b611730589a9a378ea5a6b9e411fb959c84 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 28 Apr 2025 22:49:22 +0000
Subject: [PATCH 11/69] fix
---
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 381fe41d8b01c..5f2e71ac2495e 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -305,6 +305,7 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
RS.ParametersContainer.addInfo(Header, -1);
}
}
+ }
RS.write(OS);
break;
>From f804a23d7a3f29149b7b8c88c68fa24bbb1b23a0 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 28 Apr 2025 23:49:45 +0000
Subject: [PATCH 12/69] fix
---
.../llvm/MC/DXContainerRootSignature.h | 19 ++++++++++---------
llvm/lib/MC/DXContainerRootSignature.cpp | 10 ++++++----
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 2 +-
3 files changed, 17 insertions(+), 14 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 507204d5b2ba4..c8af613a57094 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -29,8 +29,8 @@ struct RootParameterInfo {
: Header(H), Location(L) {}
};
-using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor *,
- dxbc::RST0::v1::RootDescriptor *>;
+using RootDescriptor = std::variant<dxbc::RST0::v0::RootDescriptor,
+ dxbc::RST0::v1::RootDescriptor>;
using ParametersView = std::variant<const dxbc::RootConstants *,
const dxbc::RST0::v0::RootDescriptor *,
const dxbc::RST0::v1::RootDescriptor *>;
@@ -52,13 +52,13 @@ struct RootParametersContainer {
void addParameter(dxbc::RootParameterHeader H,
dxbc::RST0::v0::RootDescriptor D) {
addInfo(H, Descriptors.size());
- Descriptors.push_back(std::move(&D));
+ Descriptors.push_back(D);
}
void addParameter(dxbc::RootParameterHeader H,
dxbc::RST0::v1::RootDescriptor D) {
addInfo(H, Descriptors.size());
- Descriptors.push_back(std::move(&D));
+ Descriptors.push_back(D);
}
std::optional<ParametersView> getParameter(const RootParameterInfo *H) const {
@@ -68,11 +68,12 @@ struct RootParametersContainer {
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
- RootDescriptor VersionedParam = Descriptors[H->Location];
- if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor *>(
- VersionedParam))
- return std::get<dxbc::RST0::v0::RootDescriptor *>(VersionedParam);
- return std::get<dxbc::RST0::v1::RootDescriptor *>(VersionedParam);
+ const RootDescriptor &VersionedParam = Descriptors[H->Location];
+ if (std::holds_alternative<dxbc::RST0::v0::RootDescriptor>(
+ VersionedParam)) {
+ return &std::get<dxbc::RST0::v0::RootDescriptor>(VersionedParam);
+ }
+ return &std::get<dxbc::RST0::v1::RootDescriptor>(VersionedParam);
}
return std::nullopt;
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 252f864f6f4bd..641c2f5fa1b1b 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -80,8 +80,8 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
auto P = ParametersContainer.getParameter(H);
if (!P)
continue;
- if (std::holds_alternative<const dxbc::RootConstants *>(*P)) {
- auto *Constants = std::get<const dxbc::RootConstants *>(*P);
+ if (std::holds_alternative<const dxbc::RootConstants *>(P.value())) {
+ auto *Constants = std::get<const dxbc::RootConstants *>(P.value());
support::endian::write(BOS, Constants->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Constants->RegisterSpace,
@@ -90,14 +90,16 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
} else if (std::holds_alternative<const dxbc::RST0::v0::RootDescriptor *>(
*P)) {
- auto *Descriptor = std::get<const dxbc::RST0::v0::RootDescriptor *>(*P);
+ auto *Descriptor =
+ std::get<const dxbc::RST0::v0::RootDescriptor *>(P.value());
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
support::endian::write(BOS, Descriptor->RegisterSpace,
llvm::endianness::little);
} else if (std::holds_alternative<const dxbc::RST0::v1::RootDescriptor *>(
*P)) {
- auto *Descriptor = std::get<const dxbc::RST0::v1::RootDescriptor *>(*P);
+ auto *Descriptor =
+ std::get<const dxbc::RST0::v1::RootDescriptor *>(P.value());
support::endian::write(BOS, Descriptor->ShaderRegister,
llvm::endianness::little);
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index 5f2e71ac2495e..b8ea1b048edfe 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -299,13 +299,13 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
Descriptor.Flags = Param.Descriptor.getEncodedFlags();
RS.ParametersContainer.addParameter(Header, Descriptor);
+ }
break;
default:
// Handling invalid parameter type edge case
RS.ParametersContainer.addInfo(Header, -1);
}
}
- }
RS.write(OS);
break;
>From 15eb6f50b947f59b265fd092d6a97c51e5742e6b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 5 May 2025 18:26:14 +0000
Subject: [PATCH 13/69] fix naming
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index bd9bd760547dc..db0379b90ef6b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -73,7 +73,7 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
#endif // ROOT_ELEMENT_FLAG
-// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
+// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
ROOT_DESCRIPTOR_FLAG(0, NONE)
>From b9d7f076e9c1b3a1c1027b4ed9e8012a58b7cd2b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 5 May 2025 18:26:14 +0000
Subject: [PATCH 14/69] fix naming
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index bd9bd760547dc..db0379b90ef6b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -73,7 +73,7 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
#endif // ROOT_ELEMENT_FLAG
-// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
+// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
ROOT_DESCRIPTOR_FLAG(0, NONE)
>From 46cc8c1a557c2783159411b72543e1d350e2b55b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 17:37:32 +0000
Subject: [PATCH 15/69] addressing comments
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 2 --
llvm/lib/MC/DXContainerRootSignature.cpp | 2 --
llvm/lib/ObjectYAML/DXContainerEmitter.cpp | 6 ++++--
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 1 -
4 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index c8af613a57094..b290f4c96c20f 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -6,9 +6,7 @@
//
//===----------------------------------------------------------------------===//
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 641c2f5fa1b1b..54a8bd3e90c69 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -8,9 +8,7 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallString.h"
-#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/EndianStream.h"
-#include <variant>
using namespace llvm;
using namespace llvm::mcdxbc;
diff --git a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
index b8ea1b048edfe..1c163587d295c 100644
--- a/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerEmitter.cpp
@@ -298,11 +298,13 @@ void DXContainerWriter::writeParts(raw_ostream &OS) {
Descriptor.RegisterSpace = Param.Descriptor.RegisterSpace;
Descriptor.ShaderRegister = Param.Descriptor.ShaderRegister;
Descriptor.Flags = Param.Descriptor.getEncodedFlags();
- RS.ParametersContainer.addParameter(Header, Descriptor);
+ RS.ParametersContainer.addParameter(Header, Descriptor);
}
break;
default:
- // Handling invalid parameter type edge case
+ // 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.addInfo(Header, -1);
}
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 30ca4d8f7c8ed..1bd816b026fec 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -30,7 +30,6 @@
#include <cstdint>
#include <optional>
#include <utility>
-#include <variant>
using namespace llvm;
using namespace llvm::dxil;
>From 1b3e10ab85716e194ce16c273a6091e0136bf890 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 21:44:55 +0000
Subject: [PATCH 16/69] addressing comments
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 21 ++++++++-----
.../llvm/MC/DXContainerRootSignature.h | 2 +-
llvm/include/llvm/Object/DXContainer.h | 31 +++++++++++--------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/MC/DXContainerRootSignature.cpp | 4 +--
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 2 +-
6 files changed, 36 insertions(+), 26 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 3dbcfa82f3d7c..4fbc0cf1e5954 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -585,8 +585,8 @@ struct ProgramSignatureElement {
static_assert(sizeof(ProgramSignatureElement) == 32,
"ProgramSignatureElement is misaligned");
-namespace RST0 {
-namespace v0 {
+namespace RTS0 {
+namespace v1 {
struct RootDescriptor {
uint32_t ShaderRegister;
uint32_t RegisterSpace;
@@ -595,18 +595,23 @@ struct RootDescriptor {
sys::swapByteOrder(RegisterSpace);
}
};
-} // namespace v0
+} // namespace v1
-namespace v1 {
-struct RootDescriptor : public v0::RootDescriptor {
+namespace v2 {
+struct RootDescriptor : public v1::RootDescriptor {
uint32_t Flags;
+
+ RootDescriptor() = default;
+ RootDescriptor(v1::RootDescriptor &Base)
+ : v1::RootDescriptor(Base), Flags(0u) {}
+
void swapBytes() {
- v0::RootDescriptor::swapBytes();
+ v1::RootDescriptor::swapBytes();
sys::swapByteOrder(Flags);
}
};
-} // namespace v1
-} // namespace RST0
+} // namespace v2
+} // namespace RTS0
// following dx12 naming
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ns-d3d12-d3d12_root_constants
struct RootConstants {
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 44e26c81eedc1..e3c4900ba175c 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -19,7 +19,7 @@ struct RootParameter {
dxbc::RootParameterHeader Header;
union {
dxbc::RootConstants Constants;
- dxbc::RST0::v1::RootDescriptor Descriptor;
+ dxbc::RTS0::v2::RootDescriptor Descriptor;
};
};
struct RootSignatureDesc {
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index e359d85f08bec..f23797149d377 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -17,6 +17,7 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Object/Error.h"
#include "llvm/Support/Error.h"
@@ -124,16 +125,13 @@ struct RootParameterView {
RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
: Header(H), ParamData(P) {}
- template <typename T, typename VersionT = T> Expected<T> readParameter() {
- assert(sizeof(VersionT) <= sizeof(T) &&
- "Parameter of higher version must inherit all previous version data "
- "members");
- if (sizeof(VersionT) != ParamData.size())
+ template <typename T> Expected<T> readParameter() {
+ if (sizeof(T) != ParamData.size())
return make_error<GenericBinaryError>(
"Reading structure out of file bounds", object_error::parse_failed);
T Struct;
- memcpy(&Struct, ParamData.data(), sizeof(VersionT));
+ memcpy(&Struct, ParamData.data(), sizeof(T));
// DXContainer is always little endian
if (sys::IsBigEndianHost)
Struct.swapBytes();
@@ -162,11 +160,18 @@ struct RootDescriptorView : RootParameterView {
llvm::to_underlying(dxbc::RootParameterType::UAV));
}
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> read(uint32_t Version) {
- if (Version == 1)
- return readParameter<dxbc::RST0::v1::RootDescriptor,
- dxbc::RST0::v0::RootDescriptor>();
- return readParameter<dxbc::RST0::v1::RootDescriptor>();
+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> read(uint32_t Version) {
+ if (Version == 1) {
+ 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);
+ return readParameter<dxbc::RTS0::v2::RootDescriptor>();
}
};
@@ -217,9 +222,9 @@ class RootSignature {
case dxbc::RootParameterType::SRV:
case dxbc::RootParameterType::UAV:
if (Version == 1)
- DataSize = sizeof(dxbc::RST0::v0::RootDescriptor);
+ DataSize = sizeof(dxbc::RTS0::v1::RootDescriptor);
else
- DataSize = sizeof(dxbc::RST0::v1::RootDescriptor);
+ DataSize = sizeof(dxbc::RTS0::v2::RootDescriptor);
break;
}
size_t EndOfSectionByte = getNumStaticSamplers() == 0
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 8bb9da7884bed..d9d43b40db299 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -95,7 +95,7 @@ struct RootParameterYamlDesc {
uint32_t Type;
uint32_t Visibility;
uint32_t Offset;
- RootParameterYamlDesc(){};
+ RootParameterYamlDesc() {};
RootParameterYamlDesc(uint32_t T) : Type(T) {
switch (T) {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 2693cb9943d5e..161711a79e467 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -41,9 +41,9 @@ size_t RootSignatureDesc::getSize() const {
case llvm::to_underlying(dxbc::RootParameterType::SRV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
if (Version == 1)
- Size += sizeof(dxbc::RST0::v0::RootDescriptor);
+ Size += sizeof(dxbc::RTS0::v1::RootDescriptor);
else
- Size += sizeof(dxbc::RST0::v1::RootDescriptor);
+ Size += sizeof(dxbc::RTS0::v2::RootDescriptor);
break;
}
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 18c1299d4b867..4c681d80b3358 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -82,7 +82,7 @@ DXContainerYAML::RootSignatureYamlDesc::create(
NewP.Constants.RegisterSpace = Constants.RegisterSpace;
} else if (auto *RDV =
dyn_cast<object::DirectX::RootDescriptorView>(&ParamView)) {
- llvm::Expected<dxbc::RST0::v1::RootDescriptor> DescriptorOrErr =
+ llvm::Expected<dxbc::RTS0::v2::RootDescriptor> DescriptorOrErr =
RDV->read(Version);
if (Error E = DescriptorOrErr.takeError())
return std::move(E);
>From 1f3195784775b3244fd6c0d7447026d290605e85 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 21:48:35 +0000
Subject: [PATCH 17/69] addressing comments
---
llvm/include/llvm/Object/DXContainer.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index f23797149d377..c93c85e638f7b 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -25,6 +25,7 @@
#include "llvm/TargetParser/Triple.h"
#include <array>
#include <cstddef>
+#include <cstdint>
#include <variant>
namespace llvm {
@@ -122,8 +123,10 @@ namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
StringRef ParamData;
+ uint32_t Version;
+
RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
- : Header(H), ParamData(P) {}
+ : Header(H), ParamData(P), Version(V) {}
template <typename T> Expected<T> readParameter() {
if (sizeof(T) != ParamData.size())
>From e8fbfce6d9c761a640534e8d9ed731a5a4ac986a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 8 May 2025 22:03:45 +0000
Subject: [PATCH 18/69] clean up
---
llvm/include/llvm/Object/DXContainer.h | 2 +-
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 1 -
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 1 -
3 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index c93c85e638f7b..985a4b0c49e5a 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -129,11 +129,11 @@ struct RootParameterView {
: Header(H), ParamData(P), Version(V) {}
template <typename T> Expected<T> readParameter() {
+ T Struct;
if (sizeof(T) != ParamData.size())
return make_error<GenericBinaryError>(
"Reading structure out of file bounds", object_error::parse_failed);
- T Struct;
memcpy(&Struct, ParamData.data(), sizeof(T));
// DXContainer is always little endian
if (sys::IsBigEndianHost)
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index d9d43b40db299..73532fa392520 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -21,7 +21,6 @@
#include "llvm/ObjectYAML/YAML.h"
#include "llvm/Support/YAMLTraits.h"
#include <array>
-#include <cstdint>
#include <optional>
#include <string>
#include <vector>
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 4c681d80b3358..8964c913946f2 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -15,7 +15,6 @@
#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/BinaryFormat/DXContainer.h"
-#include "llvm/Object/DXContainer.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ScopedPrinter.h"
#include <cstdint>
>From a31e5a5d14a2e81a411e30e2b50150a0ba85d409 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 9 May 2025 00:10:39 +0000
Subject: [PATCH 19/69] removing v parameter
---
llvm/include/llvm/Object/DXContainer.h | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/Object/DXContainer.h b/llvm/include/llvm/Object/DXContainer.h
index 985a4b0c49e5a..61bfa9411cc57 100644
--- a/llvm/include/llvm/Object/DXContainer.h
+++ b/llvm/include/llvm/Object/DXContainer.h
@@ -123,10 +123,9 @@ namespace DirectX {
struct RootParameterView {
const dxbc::RootParameterHeader &Header;
StringRef ParamData;
- uint32_t Version;
- RootParameterView(uint32_t V, const dxbc::RootParameterHeader &H, StringRef P)
- : Header(H), ParamData(P), Version(V) {}
+ RootParameterView(const dxbc::RootParameterHeader &H, StringRef P)
+ : Header(H), ParamData(P) {}
template <typename T> Expected<T> readParameter() {
T Struct;
@@ -238,7 +237,7 @@ class RootSignature {
return parseFailed("Reading structure out of file bounds");
StringRef Buff = PartData.substr(Header.ParameterOffset, DataSize);
- RootParameterView View = RootParameterView(Version, Header, Buff);
+ RootParameterView View = RootParameterView(Header, Buff);
return View;
}
};
>From ad415a7a5a4ac5be41445f2d0527895b60e05d7b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 9 May 2025 00:28:07 +0000
Subject: [PATCH 20/69] clean up
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index 7489b7437ff69..b07d0f66e02a4 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -8,8 +8,7 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
-#include <optional>
-#include <utility>
+#include <limits>
#include <variant>
namespace llvm {
>From f8755551e2049418d6f09bedaa685e72d3a76f15 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 13 May 2025 02:07:31 +0000
Subject: [PATCH 21/69] adding support for root descriptors
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 64 ++++++++++++++++++-
llvm/lib/Target/DirectX/DXILRootSignature.h | 3 +-
.../RootSignature-RootDescriptor.ll | 34 ++++++++++
3 files changed, 99 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 1bd816b026fec..77bdb2c2f588f 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -55,6 +55,14 @@ static std::optional<uint32_t> extractMdIntValue(MDNode *Node,
return std::nullopt;
}
+static std::optional<StringRef> extractMdStringValue(MDNode *Node,
+ unsigned int OpId) {
+ MDString *NodeText = cast<MDString>(Node->getOperand(OpId));
+ if (NodeText == nullptr)
+ return std::nullopt;
+ return NodeText->getString();
+}
+
static bool parseRootFlags(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
MDNode *RootFlagNode) {
@@ -105,6 +113,56 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
return false;
}
+static bool parseRootDescriptors(LLVMContext *Ctx,
+ mcdxbc::RootSignatureDesc &RSD,
+ MDNode *RootDescriptorNode) {
+
+ if (RootDescriptorNode->getNumOperands() != 5)
+ return reportError(Ctx, "Invalid format for RootConstants Element");
+
+ std::optional<StringRef> ElementText =
+ extractMdStringValue(RootDescriptorNode, 0);
+ assert(!ElementText->empty());
+
+ dxbc::RootParameterHeader Header;
+ Header.ParameterType =
+ StringSwitch<uint32_t>(*ElementText)
+ .Case("RootCBV", llvm::to_underlying(dxbc::RootParameterType::CBV))
+ .Case("RootSRV", llvm::to_underlying(dxbc::RootParameterType::SRV))
+ .Case("RootUAV", llvm::to_underlying(dxbc::RootParameterType::UAV));
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1))
+ Header.ShaderVisibility = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ShaderVisibility");
+
+ dxbc::RTS0::v1::RootDescriptor Descriptor;
+ if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 2))
+ Descriptor.ShaderRegister = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ShaderRegister");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 3))
+ Descriptor.RegisterSpace = *Val;
+ else
+ return reportError(Ctx, "Invalid value for RegisterSpace");
+
+ if (RSD.Version == 1) {
+ RSD.ParametersContainer.addParameter(Header, Descriptor);
+ return false;
+ }
+ assert(RSD.Version > 1);
+ dxbc::RTS0::v2::RootDescriptor DescriptorV2(Descriptor);
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 4))
+ DescriptorV2.Flags = *Val;
+ else
+ return reportError(Ctx, "Invalid value for Root Descriptor Flags");
+
+ RSD.ParametersContainer.addParameter(Header, DescriptorV2);
+ return false;
+}
+
static bool parseRootSignatureElement(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *Element) {
@@ -116,6 +174,9 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
StringSwitch<RootSignatureElementKind>(ElementText->getString())
.Case("RootFlags", RootSignatureElementKind::RootFlags)
.Case("RootConstants", RootSignatureElementKind::RootConstants)
+ .Case("RootCBV", RootSignatureElementKind::RootDescriptors)
+ .Case("RootSRV", RootSignatureElementKind::RootDescriptors)
+ .Case("RootUAV", RootSignatureElementKind::RootDescriptors)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
@@ -124,7 +185,8 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
return parseRootFlags(Ctx, RSD, Element);
case RootSignatureElementKind::RootConstants:
return parseRootConstants(Ctx, RSD, Element);
- break;
+ case RootSignatureElementKind::RootDescriptors:
+ return parseRootDescriptors(Ctx, RSD, Element);
case RootSignatureElementKind::Error:
return reportError(Ctx, "Invalid Root Signature Element: " +
ElementText->getString());
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index 93ec614f1ab85..b8742d1b1fdfd 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -27,7 +27,8 @@ namespace dxil {
enum class RootSignatureElementKind {
Error = 0,
RootFlags = 1,
- RootConstants = 2
+ RootConstants = 2,
+ RootDescriptors = 3
};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
new file mode 100644
index 0000000000000..4143e56b609b9
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
@@ -0,0 +1,34 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.rts0 = private constant [48 x i8] c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 48
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumRootParameters: 1
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: 2
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: Descriptor:
+; DXC-NEXT: RegisterSpace: 2
+; DXC-NEXT: ShaderRegister: 1
+; DXC: DATA_VOLATILE: true
>From 4f7f9986503dca40f01b1a8bc7a54a440a620cdf Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 13 May 2025 16:34:57 +0000
Subject: [PATCH 22/69] removing none as a flag option
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 1 -
.../DirectX/ContainerData/RootSignature-RootDescriptor.ll | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 1645018aebedb..eb67c82628716 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -78,7 +78,6 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
-ROOT_DESCRIPTOR_FLAG(0, NONE)
ROOT_DESCRIPTOR_FLAG(1, DATA_VOLATILE)
ROOT_DESCRIPTOR_FLAG(2, DATA_STATIC_WHILE_SET_AT_EXECUTE)
ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
index 4143e56b609b9..5f2ce37afd893 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
@@ -31,4 +31,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: Descriptor:
; DXC-NEXT: RegisterSpace: 2
; DXC-NEXT: ShaderRegister: 1
-; DXC: DATA_VOLATILE: true
+; DXC-NEXT: DATA_VOLATILE: true
>From 3eb5e101b0087fcb29f7ecb6655c82fddf34428a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 13 May 2025 18:06:42 +0000
Subject: [PATCH 23/69] adding tests
---
.../BinaryFormat/DXContainerConstants.def | 1 +
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 61 +++++++++++++++++++
...tSignature-RootDescriptor-Invalid-Flags.ll | 18 ++++++
...re-RootDescriptor-Invalid-RegisterSpace.ll | 18 ++++++
...re-RootDescriptor-Invalid-RegisterValue.ll | 18 ++++++
.../RootSignature-RootDescriptor.ll | 4 +-
6 files changed, 118 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index eb67c82628716..1645018aebedb 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -78,6 +78,7 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
+ROOT_DESCRIPTOR_FLAG(0, NONE)
ROOT_DESCRIPTOR_FLAG(1, DATA_VOLATILE)
ROOT_DESCRIPTOR_FLAG(2, DATA_STATIC_WHILE_SET_AT_EXECUTE)
ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 77bdb2c2f588f..a2242dff2c2c1 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -30,6 +31,7 @@
#include <cstdint>
#include <optional>
#include <utility>
+#include <variant>
using namespace llvm;
using namespace llvm::dxil;
@@ -217,6 +219,19 @@ static bool verifyVersion(uint32_t Version) {
return (Version == 1 || Version == 2);
}
+static bool verifyRegisterValue(uint32_t RegisterValue) {
+ return !(RegisterValue == 0xFFFFFFFF);
+}
+
+static bool verifyRegisterSpace(uint32_t RegisterSpace) {
+ return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
+}
+
+static bool verifyDescriptorFlag(uint32_t Flags) {
+ return (Flags & ~0xE) == 0;
+}
+
+
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (!verifyVersion(RSD.Version)) {
@@ -234,6 +249,38 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
+
+
+ auto P = RSD.ParametersContainer.getParameter(&Info);
+ if(!P)
+ return reportError(Ctx, "Cannot locate parameter from Header Info");
+
+ if( std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)){
+ auto *Descriptor = std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
+
+ if(!verifyRegisterValue(Descriptor->ShaderRegister))
+ return reportValueError(Ctx, "ShaderRegister",
+ Descriptor->ShaderRegister);
+
+ if(!verifyRegisterSpace(Descriptor->RegisterSpace))
+ return reportValueError(Ctx, "RegisterSpace",
+ Descriptor->RegisterSpace);
+
+ } else if( std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)){
+ auto *Descriptor = std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value());
+
+ if(!verifyRegisterValue(Descriptor->ShaderRegister))
+ return reportValueError(Ctx, "ShaderRegister",
+ Descriptor->ShaderRegister);
+
+ if(!verifyRegisterSpace(Descriptor->RegisterSpace))
+ return reportValueError(Ctx, "RegisterSpace",
+ Descriptor->RegisterSpace);
+
+ if(!verifyDescriptorFlag(Descriptor->Flags))
+ return reportValueError(Ctx, "DescriptorFlag",
+ Descriptor->Flags);
+ }
}
return false;
@@ -370,6 +417,20 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
<< "Shader Register: " << Constants->ShaderRegister << "\n";
OS << indent(Space + 2)
<< "Num 32 Bit Values: " << Constants->Num32BitValues << "\n";
+ } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) {
+ auto *Constants = std::get<const dxbc::RTS0::v1::RootDescriptor *>(*P);
+ OS << indent(Space + 2)
+ << "Register Space: " << Constants->RegisterSpace << "\n";
+ OS << indent(Space + 2)
+ << "Shader Register: " << Constants->ShaderRegister << "\n";
+ } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)) {
+ auto *Constants = std::get<const dxbc::RTS0::v2::RootDescriptor *>(*P);
+ OS << indent(Space + 2)
+ << "Register Space: " << Constants->RegisterSpace << "\n";
+ OS << indent(Space + 2)
+ << "Shader Register: " << Constants->ShaderRegister << "\n";
+ OS << indent(Space + 2)
+ << "Flags: " << Constants->Flags << "\n";
}
}
Space--;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
new file mode 100644
index 0000000000000..4229981240918
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+; CHECK: error: Invalid value for DescriptorFlag: 3
+; CHECK-NOT: Root Signature Definitions
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll
new file mode 100644
index 0000000000000..020d117ba45dc
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+; CHECK: error: Invalid value for RegisterSpace: 4294967280
+; CHECK-NOT: Root Signature Definitions
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootCBV", i32 0, i32 1, i32 4294967280, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll
new file mode 100644
index 0000000000000..edb8b943c6e35
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+; CHECK: error: Invalid value for ShaderRegister: 4294967295
+; CHECK-NOT: Root Signature Definitions
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootCBV", i32 0, i32 4294967295, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
index 5f2ce37afd893..9217945855cd9 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
@@ -15,7 +15,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!2 = !{ ptr @main, !3 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
-!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 }
+!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 8 }
; DXC: - Name: RTS0
; DXC-NEXT: Size: 48
@@ -31,4 +31,4 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: Descriptor:
; DXC-NEXT: RegisterSpace: 2
; DXC-NEXT: ShaderRegister: 1
-; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: DATA_STATIC: true
>From 58e17890afd06822d4fd663e8bd9195b4bc206a8 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 13 May 2025 19:30:07 +0000
Subject: [PATCH 24/69] clean up and add more tests
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 53 +++++++++----------
...ure-RootDescriptor-Invalid-RegisterKind.ll | 18 +++++++
2 files changed, 43 insertions(+), 28 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a2242dff2c2c1..3ee52d32eaf2d 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -31,7 +30,6 @@
#include <cstdint>
#include <optional>
#include <utility>
-#include <variant>
using namespace llvm;
using namespace llvm::dxil;
@@ -227,10 +225,7 @@ static bool verifyRegisterSpace(uint32_t RegisterSpace) {
return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
}
-static bool verifyDescriptorFlag(uint32_t Flags) {
- return (Flags & ~0xE) == 0;
-}
-
+static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
@@ -249,37 +244,38 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
-
-
+
auto P = RSD.ParametersContainer.getParameter(&Info);
- if(!P)
- return reportError(Ctx, "Cannot locate parameter from Header Info");
-
- if( std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)){
- auto *Descriptor = std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
+ if (!P)
+ return reportError(Ctx, "Cannot locate parameter from Header Info");
+
+ if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) {
+ auto *Descriptor =
+ std::get<const dxbc::RTS0::v1::RootDescriptor *>(P.value());
- if(!verifyRegisterValue(Descriptor->ShaderRegister))
+ if (!verifyRegisterValue(Descriptor->ShaderRegister))
return reportValueError(Ctx, "ShaderRegister",
Descriptor->ShaderRegister);
-
- if(!verifyRegisterSpace(Descriptor->RegisterSpace))
+
+ if (!verifyRegisterSpace(Descriptor->RegisterSpace))
return reportValueError(Ctx, "RegisterSpace",
Descriptor->RegisterSpace);
- } else if( std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)){
- auto *Descriptor = std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value());
+ } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(
+ *P)) {
+ auto *Descriptor =
+ std::get<const dxbc::RTS0::v2::RootDescriptor *>(P.value());
- if(!verifyRegisterValue(Descriptor->ShaderRegister))
+ if (!verifyRegisterValue(Descriptor->ShaderRegister))
return reportValueError(Ctx, "ShaderRegister",
Descriptor->ShaderRegister);
-
- if(!verifyRegisterSpace(Descriptor->RegisterSpace))
+
+ if (!verifyRegisterSpace(Descriptor->RegisterSpace))
return reportValueError(Ctx, "RegisterSpace",
Descriptor->RegisterSpace);
- if(!verifyDescriptorFlag(Descriptor->Flags))
- return reportValueError(Ctx, "DescriptorFlag",
- Descriptor->Flags);
+ if (!verifyDescriptorFlag(Descriptor->Flags))
+ return reportValueError(Ctx, "DescriptorFlag", Descriptor->Flags);
}
}
@@ -417,20 +413,21 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
<< "Shader Register: " << Constants->ShaderRegister << "\n";
OS << indent(Space + 2)
<< "Num 32 Bit Values: " << Constants->Num32BitValues << "\n";
- } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(*P)) {
+ } else if (std::holds_alternative<const dxbc::RTS0::v1::RootDescriptor *>(
+ *P)) {
auto *Constants = std::get<const dxbc::RTS0::v1::RootDescriptor *>(*P);
OS << indent(Space + 2)
<< "Register Space: " << Constants->RegisterSpace << "\n";
OS << indent(Space + 2)
<< "Shader Register: " << Constants->ShaderRegister << "\n";
- } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(*P)) {
+ } else if (std::holds_alternative<const dxbc::RTS0::v2::RootDescriptor *>(
+ *P)) {
auto *Constants = std::get<const dxbc::RTS0::v2::RootDescriptor *>(*P);
OS << indent(Space + 2)
<< "Register Space: " << Constants->RegisterSpace << "\n";
OS << indent(Space + 2)
<< "Shader Register: " << Constants->ShaderRegister << "\n";
- OS << indent(Space + 2)
- << "Flags: " << Constants->Flags << "\n";
+ OS << indent(Space + 2) << "Flags: " << Constants->Flags << "\n";
}
}
Space--;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll
new file mode 100644
index 0000000000000..4aed84efbe2bc
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll
@@ -0,0 +1,18 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+; CHECK: error: Invalid Root Signature Element: Invalid
+; CHECK-NOT: Root Signature Definitions
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"Invalid", i32 0, i32 1, i32 2, i32 3 }
>From 81915ad5d9cb44a65cbdcd7945233519d395232f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 30 May 2025 21:43:56 +0000
Subject: [PATCH 25/69] addressing comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 12 +++++++-----
.../ContainerData/RootSignature-Parameters.ll | 10 ++++++++--
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 3ee52d32eaf2d..e3e1734bf67d2 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -118,11 +118,13 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
MDNode *RootDescriptorNode) {
if (RootDescriptorNode->getNumOperands() != 5)
- return reportError(Ctx, "Invalid format for RootConstants Element");
+ return reportError(Ctx, "Invalid format for Root Descriptor Element");
std::optional<StringRef> ElementText =
extractMdStringValue(RootDescriptorNode, 0);
- assert(!ElementText->empty());
+
+ if (!ElementText.has_value())
+ return reportError(Ctx, "Root Descriptor, first element is not a string.");
dxbc::RootParameterHeader Header;
Header.ParameterType =
@@ -273,9 +275,9 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (!verifyRegisterSpace(Descriptor->RegisterSpace))
return reportValueError(Ctx, "RegisterSpace",
Descriptor->RegisterSpace);
-
- if (!verifyDescriptorFlag(Descriptor->Flags))
- return reportValueError(Ctx, "DescriptorFlag", Descriptor->Flags);
+ if (RSD.Version > 1)
+ if (!verifyDescriptorFlag(Descriptor->Flags))
+ return reportValueError(Ctx, "DescriptorFlag", Descriptor->Flags);
}
}
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
index b55d1283df0c9..714c76213e1b5 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -12,19 +12,25 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4, !5 } ; list of root signature elements
+!3 = !{ !4, !5, !6 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
+!6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 6 }
;CHECK-LABEL: Definition for 'main':
;CHECK-NEXT: Flags: 0x000001
;CHECK-NEXT: Version: 2
;CHECK-NEXT: RootParametersOffset: 24
-;CHECK-NEXT: NumParameters: 1
+;CHECK-NEXT: NumParameters: 2
;CHECK-NEXT: - Parameter Type: 1
;CHECK-NEXT: Shader Visibility: 0
;CHECK-NEXT: Register Space: 2
;CHECK-NEXT: Shader Register: 1
;CHECK-NEXT: Num 32 Bit Values: 3
+;CHECK-NEXT: - Parameter Type: 3
+;CHECK-NEXT: Shader Visibility: 1
+;CHECK-NEXT: Register Space: 5
+;CHECK-NEXT: Shader Register: 4
+;CHECK-NEXT: Flags: 6
;CHECK-NEXT: NumStaticSamplers: 0
;CHECK-NEXT: StaticSamplersOffset: 0
>From 0d541624e447c053ab68aa5d53e91da01eef7f1b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 18:12:25 +0000
Subject: [PATCH 26/69] clean
---
llvm/include/llvm/MC/DXContainerRootSignature.h | 1 -
llvm/lib/MC/DXContainerRootSignature.cpp | 10 +++++-----
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/llvm/include/llvm/MC/DXContainerRootSignature.h b/llvm/include/llvm/MC/DXContainerRootSignature.h
index c49a13fb0012d..4c2ca063158c4 100644
--- a/llvm/include/llvm/MC/DXContainerRootSignature.h
+++ b/llvm/include/llvm/MC/DXContainerRootSignature.h
@@ -9,7 +9,6 @@
#include "llvm/BinaryFormat/DXContainer.h"
#include <cstdint>
#include <limits>
-#include <variant>
namespace llvm {
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index ebbb9cbda4111..6c71823a51f85 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -90,8 +90,7 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
}
assert(NumParameters == ParamsOffsets.size());
- const RootParameterInfo *H = ParametersContainer.begin();
- for (size_t I = 0; I < NumParameters; ++I, H++) {
+ for (size_t I = 0; I < NumParameters; ++I) {
rewriteOffsetToCurrentByte(BOS, ParamsOffsets[I]);
const auto &[Type, Loc] = ParametersContainer.getTypeAndLocForParameter(I);
switch (Type) {
@@ -104,12 +103,13 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
llvm::endianness::little);
support::endian::write(BOS, Constants.Num32BitValues,
llvm::endianness::little);
- } break;
+ break;
+ }
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::SRV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV):{
+ case llvm::to_underlying(dxbc::RootParameterType::UAV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
- ParametersContainer.getRootDescriptor(Loc);
+ ParametersContainer.getRootDescriptor(Loc);
support::endian::write(BOS, Descriptor.ShaderRegister,
llvm::endianness::little);
>From 7f70dc55ddbfee28c50b4f2e10f64557875433b3 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 18:22:50 +0000
Subject: [PATCH 27/69] cleanup
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 1064a53679583..878272537d366 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
>From 3e6b07e119988058defd305199ad3e08d424eebd Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 19:36:32 +0000
Subject: [PATCH 28/69] add parsing
---
.../BinaryFormat/DXContainerConstants.def | 11 ++
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 176 ++++++++++++++++++
llvm/lib/Target/DirectX/DXILRootSignature.h | 3 +-
3 files changed, 189 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 501ef0c31cdd0..fa66450c563c4 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -98,6 +98,17 @@ DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
#undef DESCRIPTOR_RANGE_FLAG
#endif // DESCRIPTOR_RANGE_FLAG
+// DESCRIPTOR_RANGE(value, name).
+#ifdef DESCRIPTOR_RANGE
+ DESCRIPTOR_RANGE(4, ERROR)
+ DESCRIPTOR_RANGE(0, SRV)
+ DESCRIPTOR_RANGE(1, UAV)
+ DESCRIPTOR_RANGE(2, CBV)
+ DESCRIPTOR_RANGE(3, Sampler)
+DESCRIPTOR_RANGE(0, NONE)
+#undef DESCRIPTOR_RANGE
+#endif // DESCRIPTOR_RANGE
+
#ifdef ROOT_PARAMETER
ROOT_PARAMETER(0, DescriptorTable)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 878272537d366..a14a9fdce5cbd 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -27,6 +28,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
+#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
@@ -166,6 +168,88 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
return false;
}
+static bool parseDescriptorRange(LLVMContext *Ctx,
+ mcdxbc::RootSignatureDesc &RSD,
+ mcdxbc::DescriptorTable &Table,
+ MDNode *RangeDescriptorNode) {
+
+ if (RangeDescriptorNode->getNumOperands() != 6)
+ return reportError(Ctx, "Invalid format for Descriptor Range");
+
+ dxbc::RTS0::v2::DescriptorRange Range;
+
+ std::optional<StringRef> ElementText =
+ extractMdStringValue(RangeDescriptorNode, 0);
+
+ if (!ElementText.has_value())
+ return reportError(Ctx, "Descriptor Range, first element is not a string.");
+
+ Range.RangeType =
+ StringSwitch<uint32_t>(*ElementText)
+ .Case("CBV", llvm::to_underlying(dxbc::DescriptorRangeType::CBV))
+ .Case("SRV", llvm::to_underlying(dxbc::DescriptorRangeType::SRV))
+ .Case("UAV", llvm::to_underlying(dxbc::DescriptorRangeType::UAV))
+ .Case("Sampler",
+ llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ .Default(llvm::to_underlying(dxbc::DescriptorRangeType::ERROR));
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
+ Range.NumDescriptors = *Val;
+ else
+ return reportError(Ctx, "Invalid value for Number of Descriptor in Range");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 2))
+ Range.BaseShaderRegister = *Val;
+ else
+ return reportError(Ctx, "Invalid value for BaseShaderRegister");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 3))
+ Range.RegisterSpace = *Val;
+ else
+ return reportError(Ctx, "Invalid value for RegisterSpace");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 4))
+ Range.OffsetInDescriptorsFromTableStart = *Val;
+ else
+ return reportError(Ctx,
+ "Invalid value for OffsetInDescriptorsFromTableStart");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 5))
+ Range.Flags = *Val;
+ else
+ return reportError(Ctx, "Invalid value for Descriptor Range Flags");
+
+ Table.Ranges.push_back(Range);
+ return false;
+}
+
+static bool parseDescriptorTable(LLVMContext *Ctx,
+ mcdxbc::RootSignatureDesc &RSD,
+ MDNode *DescriptorTableNode) {
+ if (DescriptorTableNode->getNumOperands() < 2)
+ return reportError(Ctx, "Invalid format for Descriptor Table");
+
+ dxbc::RTS0::v1::RootParameterHeader Header;
+ if (std::optional<uint32_t> Val = extractMdIntValue(DescriptorTableNode, 1))
+ Header.ShaderVisibility = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ShaderVisibility");
+
+ mcdxbc::DescriptorTable Table;
+
+ for (unsigned int I = 2; I < DescriptorTableNode->getNumOperands(); I++) {
+ MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
+ if (Element == nullptr)
+ return reportError(Ctx, "Missing Root Element Metadata Node.");
+
+ if (parseDescriptorRange(Ctx, RSD, Table, Element))
+ return true;
+ }
+
+ RSD.ParametersContainer.addParameter(Header, Table);
+ return false;
+}
+
static bool parseRootSignatureElement(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *Element) {
@@ -180,6 +264,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
.Case("RootCBV", RootSignatureElementKind::RootDescriptors)
.Case("RootSRV", RootSignatureElementKind::RootDescriptors)
.Case("RootUAV", RootSignatureElementKind::RootDescriptors)
+ .Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
@@ -190,6 +275,8 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
return parseRootConstants(Ctx, RSD, Element);
case RootSignatureElementKind::RootDescriptors:
return parseRootDescriptors(Ctx, RSD, Element);
+ case RootSignatureElementKind::DescriptorTable:
+ return parseDescriptorTable(Ctx, RSD, Element);
case RootSignatureElementKind::Error:
return reportError(Ctx, "Invalid Root Signature Element: " +
ElementText->getString());
@@ -230,6 +317,79 @@ static bool verifyRegisterSpace(uint32_t RegisterSpace) {
static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
+static 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):
+ return true;
+ };
+
+ return false;
+}
+
+static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
+ uint32_t Flags) {
+ if (Version == 1 &&
+ Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ return Flags == 0;
+
+ if (Version == 2 &&
+ Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)) {
+ switch (Flags) {
+ case 0:
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
+ return true;
+ }
+ return false;
+ }
+
+ if (Version == 1 &&
+ Type != llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ return Flags ==
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE);
+
+ if (Version == 2 &&
+ Type != llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)) {
+ switch (Flags) {
+ case 0:
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_STATIC):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
+ llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
+ llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_STATIC):
+ case llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
+ llvm::to_underlying(
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
+ return true;
+ }
+ return false;
+ }
+ return false;
+}
+
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (!verifyVersion(RSD.Version)) {
@@ -268,6 +428,22 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
}
break;
}
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RSD.ParametersContainer.getDescriptorTable(Info.Location);
+ for (const dxbc::RTS0::v2::DescriptorRange &Range : Table) {
+ if (!verifyRangeType(Range.RangeType))
+ return reportValueError(Ctx, "RangeType", Range.RangeType);
+
+ if (!verifyRegisterSpace(Range.RegisterSpace))
+ return reportValueError(Ctx, "RegisterSpace", Range.RegisterSpace);
+
+ if (!verifyDescriptorRangeFlag(RSD.Version, Range.RangeType,
+ Range.Flags))
+ return reportValueError(Ctx, "DescriptorFlag", Range.Flags);
+ }
+ break;
+ }
}
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index b8742d1b1fdfd..d1ffc8cacd6f0 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -28,7 +28,8 @@ enum class RootSignatureElementKind {
Error = 0,
RootFlags = 1,
RootConstants = 2,
- RootDescriptors = 3
+ RootDescriptors = 3,
+ DescriptorTable = 4,
};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
>From bb1a61f94b28fc9d908b83e2ae6ed9af2dcdcedb Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:20:37 +0000
Subject: [PATCH 29/69] add tests
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 4 +-
...tSignature-DescriptorTable-Invalid-Flag.ll | 20 ++++++++
...ature-DescriptorTable-Invalid-RangeType.ll | 20 ++++++++
...e-DescriptorTable-Invalid-RegisterSpace.ll | 20 ++++++++
.../RootSignature-DescriptorTable.ll | 48 +++++++++++++++++++
5 files changed, 111 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a14a9fdce5cbd..0e34e480e38d5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -236,6 +236,8 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
return reportError(Ctx, "Invalid value for ShaderVisibility");
mcdxbc::DescriptorTable Table;
+ Header.ParameterType =
+ llvm::to_underlying(dxbc::RootParameterType::DescriptorTable);
for (unsigned int I = 2; I < DescriptorTableNode->getNumOperands(); I++) {
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
@@ -312,7 +314,7 @@ static bool verifyRegisterValue(uint32_t RegisterValue) {
}
static bool verifyRegisterSpace(uint32_t RegisterSpace) {
- return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
+ return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace < 0xFFFFFFFF);
}
static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
new file mode 100644
index 0000000000000..37d87986aa25f
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for DescriptorFlag: 22
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 22 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
new file mode 100644
index 0000000000000..1d18c0c7ff882
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for RangeType: 4
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"Invalid", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll
new file mode 100644
index 0000000000000..7f046a5748d5b
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RegisterSpace.ll
@@ -0,0 +1,20 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for RegisterSpace: 4294967280
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"SRV", i32 0, i32 0, i32 10, i32 -1, i32 4 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 4294967280, i32 5, i32 2 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
new file mode 100644
index 0000000000000..af4acfd2736d9
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
@@ -0,0 +1,48 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.rts0 = private constant [92 x i8] c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 92
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumRootParameters: 1
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: 0
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: Table:
+; DXC-NEXT: NumRanges: 2
+; DXC-NEXT: RangesOffset: 44
+; DXC-NEXT: Ranges:
+; DXC-NEXT: - RangeType: 0
+; DXC-NEXT: NumDescriptors: 0
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 4294967295
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 10
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DESCRIPTORS_VOLATILE: true
>From 8979ab71d182a590153d8fc16cbe09eb327b0c3d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:45:02 +0000
Subject: [PATCH 30/69] adding support on analysis printer
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 27 ++++++++++++++++---
.../ContainerData/RootSignature-Parameters.ll | 22 +++++++++++++--
2 files changed, 43 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 0e34e480e38d5..c4d5fe254cbf5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -558,14 +558,12 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << "Definition for '" << F.getName() << "':\n";
// start root signature header
- Space++;
OS << indent(Space) << "Flags: " << format_hex(RS.Flags, 8) << "\n";
OS << indent(Space) << "Version: " << RS.Version << "\n";
OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
<< "\n";
OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
<< "\n";
- Space++;
for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
const auto &[Type, Loc] =
RS.ParametersContainer.getTypeAndLocForParameter(I);
@@ -588,7 +586,7 @@ 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::CBV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
@@ -601,8 +599,29 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
break;
}
+ case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
+ const mcdxbc::DescriptorTable &Table =
+ RS.ParametersContainer.getDescriptorTable(Loc);
+ OS << indent(Space+ 2) << "NumRanges: " << Table.Ranges.size() << "\n";
+
+ for(const dxbc::RTS0::v2::DescriptorRange Range : Table){
+ OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
+ << "\n";
+ OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
+ << "\n";
+ OS << indent(Space + 4) << "Base Shader Register: " << Range.BaseShaderRegister
+ << "\n";
+ OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
+ << "\n";
+ OS << indent(Space + 4) << "Offset In Descriptors From Table Start: " << Range.OffsetInDescriptorsFromTableStart
+ << "\n";
+ if(RS.Version > 1)
+ OS << indent(Space + 4) << "Flags: " << Range.Flags
+ << "\n";
+ }
+ break;
+ }
}
- Space--;
}
OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
OS << indent(Space) << "StaticSamplersOffset: " << RS.StaticSamplersOffset
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
index 714c76213e1b5..28768e252d85a 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -12,16 +12,19 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!2 = !{ ptr @main, !3 } ; function, root signature
-!3 = !{ !4, !5, !6 } ; list of root signature elements
+!3 = !{ !4, !5, !6, !7 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
!6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 6 }
+!7 = !{ !"DescriptorTable", i32 0, !8, !9 }
+!8 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!9 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
;CHECK-LABEL: Definition for 'main':
;CHECK-NEXT: Flags: 0x000001
;CHECK-NEXT: Version: 2
;CHECK-NEXT: RootParametersOffset: 24
-;CHECK-NEXT: NumParameters: 2
+;CHECK-NEXT: NumParameters: 3
;CHECK-NEXT: - Parameter Type: 1
;CHECK-NEXT: Shader Visibility: 0
;CHECK-NEXT: Register Space: 2
@@ -32,5 +35,20 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
;CHECK-NEXT: Register Space: 5
;CHECK-NEXT: Shader Register: 4
;CHECK-NEXT: Flags: 6
+;CHECK-NEXT: - Parameter Type: 0
+;CHECK-NEXT: Shader Visibility: 0
+;CHECK-NEXT: NumRanges: 2
+;CHECK-NEXT: - Range Type: 0
+;CHECK-NEXT: Register Space: 4294967295
+;CHECK-NEXT: Base Shader Register: 0
+;CHECK-NEXT: Num Descriptors: 0
+;CHECK-NEXT: Offset In Descriptors From Table Start: 4294967295
+;CHECK-NEXT: Flags: 4
+;CHECK-NEXT: - Range Type: 1
+;CHECK-NEXT: Register Space: 10
+;CHECK-NEXT: Base Shader Register: 1
+;CHECK-NEXT: Num Descriptors: 5
+;CHECK-NEXT: Offset In Descriptors From Table Start: 5
+;CHECK-NEXT: Flags: 2
;CHECK-NEXT: NumStaticSamplers: 0
;CHECK-NEXT: StaticSamplersOffset: 0
>From be60d51757c62c137b1ca62d6df39eda58dad46e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:49:17 +0000
Subject: [PATCH 31/69] adding support on analysis printer
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 31 +++++++++----------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index c4d5fe254cbf5..33a74d71027aa 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -602,22 +602,21 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
const mcdxbc::DescriptorTable &Table =
RS.ParametersContainer.getDescriptorTable(Loc);
- OS << indent(Space+ 2) << "NumRanges: " << Table.Ranges.size() << "\n";
-
- for(const dxbc::RTS0::v2::DescriptorRange Range : Table){
- OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
- << "\n";
- OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
- << "\n";
- OS << indent(Space + 4) << "Base Shader Register: " << Range.BaseShaderRegister
- << "\n";
- OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
- << "\n";
- OS << indent(Space + 4) << "Offset In Descriptors From Table Start: " << Range.OffsetInDescriptorsFromTableStart
- << "\n";
- if(RS.Version > 1)
- OS << indent(Space + 4) << "Flags: " << Range.Flags
- << "\n";
+ OS << indent(Space + 2) << "NumRanges: " << Table.Ranges.size() << "\n";
+
+ for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
+ OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
+ << "\n";
+ OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
+ << "\n";
+ OS << indent(Space + 4)
+ << "Base Shader Register: " << Range.BaseShaderRegister << "\n";
+ OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
+ << "\n";
+ OS << indent(Space + 4) << "Offset In Descriptors From Table Start: "
+ << Range.OffsetInDescriptorsFromTableStart << "\n";
+ if (RS.Version > 1)
+ OS << indent(Space + 4) << "Flags: " << Range.Flags << "\n";
}
break;
}
>From 0c570c8bb77ff4091af4ce66bbb2f2fcdf00b963 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 2 Jun 2025 21:56:05 +0000
Subject: [PATCH 32/69] adding requested comment
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 878272537d366..12f7066f5d349 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -129,6 +129,8 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
return reportError(Ctx, "Root Descriptor, first element is not a string.");
dxbc::RTS0::v1::RootParameterHeader Header;
+ // a default scenario is not needed here. Scenarios where ElementText is
+ // invalid is previously checked and error handled when this method is called.
Header.ParameterType =
StringSwitch<uint32_t>(*ElementText)
.Case("RootCBV", llvm::to_underlying(dxbc::RootParameterType::CBV))
>From c3d24b6133ff7f6f128e56e42f20dfe111a780c7 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:12:35 +0000
Subject: [PATCH 33/69] clean up
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 --
1 file changed, 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 33a74d71027aa..0dca2582bc714 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -28,7 +27,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include <cstddef>
#include <cstdint>
#include <optional>
#include <utility>
>From d1ca37ddd4eed677b6b86842b2f8d96b64595a38 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:36:39 +0000
Subject: [PATCH 34/69] addressing PR comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 62 +++++++++++--------
llvm/lib/Target/DirectX/DXILRootSignature.h | 4 +-
2 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 12f7066f5d349..5d3855b22058c 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -57,7 +58,7 @@ static std::optional<uint32_t> extractMdIntValue(MDNode *Node,
static std::optional<StringRef> extractMdStringValue(MDNode *Node,
unsigned int OpId) {
- MDString *NodeText = cast<MDString>(Node->getOperand(OpId));
+ MDString *NodeText = dyn_cast<MDString>(Node->getOperand(OpId));
if (NodeText == nullptr)
return std::nullopt;
return NodeText->getString();
@@ -117,25 +118,31 @@ static bool parseRootConstants(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
static bool parseRootDescriptors(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
- MDNode *RootDescriptorNode) {
-
+ MDNode *RootDescriptorNode,
+ RootSignatureElementKind ElementKind) {
+ assert(ElementKind == RootSignatureElementKind::SRV ||
+ ElementKind == RootSignatureElementKind::UAV ||
+ ElementKind == RootSignatureElementKind::CBV &&
+ "parseRootDescriptors should only be called with RootDescriptor "
+ "element kind.");
if (RootDescriptorNode->getNumOperands() != 5)
return reportError(Ctx, "Invalid format for Root Descriptor Element");
- std::optional<StringRef> ElementText =
- extractMdStringValue(RootDescriptorNode, 0);
-
- if (!ElementText.has_value())
- return reportError(Ctx, "Root Descriptor, first element is not a string.");
-
dxbc::RTS0::v1::RootParameterHeader Header;
- // a default scenario is not needed here. Scenarios where ElementText is
- // invalid is previously checked and error handled when this method is called.
- Header.ParameterType =
- StringSwitch<uint32_t>(*ElementText)
- .Case("RootCBV", llvm::to_underlying(dxbc::RootParameterType::CBV))
- .Case("RootSRV", llvm::to_underlying(dxbc::RootParameterType::SRV))
- .Case("RootUAV", llvm::to_underlying(dxbc::RootParameterType::UAV));
+ switch (ElementKind) {
+ case RootSignatureElementKind::SRV:
+ Header.ParameterType = llvm::to_underlying(dxbc::RootParameterType::SRV);
+ break;
+ case RootSignatureElementKind::UAV:
+ Header.ParameterType = llvm::to_underlying(dxbc::RootParameterType::UAV);
+ break;
+ case RootSignatureElementKind::CBV:
+ Header.ParameterType = llvm::to_underlying(dxbc::RootParameterType::CBV);
+ break;
+ default:
+ llvm_unreachable("invalid Root Descriptor kind");
+ break;
+ }
if (std::optional<uint32_t> Val = extractMdIntValue(RootDescriptorNode, 1))
Header.ShaderVisibility = *Val;
@@ -171,17 +178,17 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
static bool parseRootSignatureElement(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *Element) {
- MDString *ElementText = cast<MDString>(Element->getOperand(0));
- if (ElementText == nullptr)
+ std::optional<StringRef> ElementText = extractMdStringValue(Element, 0);
+ if (!ElementText.has_value())
return reportError(Ctx, "Invalid format for Root Element");
RootSignatureElementKind ElementKind =
- StringSwitch<RootSignatureElementKind>(ElementText->getString())
+ StringSwitch<RootSignatureElementKind>(*ElementText)
.Case("RootFlags", RootSignatureElementKind::RootFlags)
.Case("RootConstants", RootSignatureElementKind::RootConstants)
- .Case("RootCBV", RootSignatureElementKind::RootDescriptors)
- .Case("RootSRV", RootSignatureElementKind::RootDescriptors)
- .Case("RootUAV", RootSignatureElementKind::RootDescriptors)
+ .Case("RootCBV", RootSignatureElementKind::CBV)
+ .Case("RootSRV", RootSignatureElementKind::SRV)
+ .Case("RootUAV", RootSignatureElementKind::UAV)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
@@ -190,11 +197,12 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
return parseRootFlags(Ctx, RSD, Element);
case RootSignatureElementKind::RootConstants:
return parseRootConstants(Ctx, RSD, Element);
- case RootSignatureElementKind::RootDescriptors:
- return parseRootDescriptors(Ctx, RSD, Element);
+ case RootSignatureElementKind::CBV:
+ case RootSignatureElementKind::SRV:
+ case RootSignatureElementKind::UAV:
+ return parseRootDescriptors(Ctx, RSD, Element, ElementKind);
case RootSignatureElementKind::Error:
- return reportError(Ctx, "Invalid Root Signature Element: " +
- ElementText->getString());
+ return reportError(Ctx, "Invalid Root Signature Element: " + *ElementText);
}
llvm_unreachable("Unhandled RootSignatureElementKind enum.");
@@ -223,7 +231,7 @@ static bool verifyVersion(uint32_t Version) {
}
static bool verifyRegisterValue(uint32_t RegisterValue) {
- return !(RegisterValue == 0xFFFFFFFF);
+ return RegisterValue != ~0U;
}
static bool verifyRegisterSpace(uint32_t RegisterSpace) {
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index b8742d1b1fdfd..3f25551b2b5ef 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -28,7 +28,9 @@ enum class RootSignatureElementKind {
Error = 0,
RootFlags = 1,
RootConstants = 2,
- RootDescriptors = 3
+ SRV = 3,
+ UAV = 4,
+ CBV = 5,
};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
>From cb0780bf2d1b18c070622bbb761295d2a00c2b40 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:37:06 +0000
Subject: [PATCH 35/69] formating
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 5d3855b22058c..d27d9d40c5ffb 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -420,7 +420,7 @@ 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::CBV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
>From eeffded2ee6bab110124bd5065f8b6cf407e6cf7 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:39:27 +0000
Subject: [PATCH 36/69] addressing PR comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index d27d9d40c5ffb..eb9235f4b61d0 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -234,6 +234,8 @@ static bool verifyRegisterValue(uint32_t RegisterValue) {
return RegisterValue != ~0U;
}
+// This Range is reserverved, therefore invalid, according to the spec
+// https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#all-the-values-should-be-legal
static bool verifyRegisterSpace(uint32_t RegisterSpace) {
return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
}
>From 3cbe0cf278387ab63104650a575cde5dc9d8ef23 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:46:29 +0000
Subject: [PATCH 37/69] formating
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 42 +++++++++----------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index eb9235f4b61d0..ecd9c546025a6 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -260,26 +260,26 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
assert(dxbc::isValidParameterType(Info.Header.ParameterType) &&
"Invalid value for ParameterType");
- switch(Info.Header.ParameterType) {
-
- case llvm::to_underlying(dxbc::RootParameterType::CBV):
- case llvm::to_underlying(dxbc::RootParameterType::UAV):
- case llvm::to_underlying(dxbc::RootParameterType::SRV): {
- const dxbc::RTS0::v2::RootDescriptor &Descriptor = RSD.ParametersContainer.getRootDescriptor(Info.Location);
- if (!verifyRegisterValue(Descriptor.ShaderRegister))
- return reportValueError(Ctx, "ShaderRegister",
- Descriptor.ShaderRegister);
-
- if (!verifyRegisterSpace(Descriptor.RegisterSpace))
- return reportValueError(Ctx, "RegisterSpace",
- Descriptor.RegisterSpace);
-
- if(RSD.Version > 1) {
- if (!verifyDescriptorFlag(Descriptor.Flags))
- return reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags);
- }
- break;
+ switch (Info.Header.ParameterType) {
+
+ case llvm::to_underlying(dxbc::RootParameterType::CBV):
+ case llvm::to_underlying(dxbc::RootParameterType::UAV):
+ case llvm::to_underlying(dxbc::RootParameterType::SRV): {
+ const dxbc::RTS0::v2::RootDescriptor &Descriptor =
+ RSD.ParametersContainer.getRootDescriptor(Info.Location);
+ if (!verifyRegisterValue(Descriptor.ShaderRegister))
+ return reportValueError(Ctx, "ShaderRegister",
+ Descriptor.ShaderRegister);
+
+ if (!verifyRegisterSpace(Descriptor.RegisterSpace))
+ return reportValueError(Ctx, "RegisterSpace", Descriptor.RegisterSpace);
+
+ if (RSD.Version > 1) {
+ if (!verifyDescriptorFlag(Descriptor.Flags))
+ return reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags);
}
+ break;
+ }
}
}
@@ -425,14 +425,14 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
case llvm::to_underlying(dxbc::RootParameterType::CBV):
case llvm::to_underlying(dxbc::RootParameterType::UAV):
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
- const dxbc::RTS0::v2::RootDescriptor &Descriptor =
+ const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RS.ParametersContainer.getRootDescriptor(Loc);
OS << indent(Space + 2)
<< "Register Space: " << Descriptor.RegisterSpace << "\n";
OS << indent(Space + 2)
<< "Shader Register: " << Descriptor.ShaderRegister << "\n";
if(RS.Version > 1)
- OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
+ OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
break;
}
}
>From 92b766b9d52a83636017ce0759b2463c5c2c565c Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 17:51:50 +0000
Subject: [PATCH 38/69] formating
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index ecd9c546025a6..a361a5e95a7de 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -431,7 +431,7 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
<< "Register Space: " << Descriptor.RegisterSpace << "\n";
OS << indent(Space + 2)
<< "Shader Register: " << Descriptor.ShaderRegister << "\n";
- if(RS.Version > 1)
+ if (RS.Version > 1)
OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
break;
}
>From 8732594e4011182dc4a3dd0631bd49bd8831863b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 18:51:35 +0000
Subject: [PATCH 39/69] adding test
---
...Parameters-Invalid-ParameterIsNotString.ll | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll
new file mode 100644
index 0000000000000..04edd00eee643
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+; CHECK: error: Invalid format for Root Element
+; CHECK-NOT: Root Signature Definitions
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+
+define void @main() #0 {
+entry:
+ ret void
+}
+
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+!dx.rootsignatures = !{!0}
+!0 = !{ ptr @main, !1 }
+!1 = !{ !2 }
+!2 = !{ i32 0 }
>From fdb8b98105ba7830c22cef2bcbba5123b1521a9b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 18:52:17 +0000
Subject: [PATCH 40/69] clean up
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a361a5e95a7de..3d195acb19e18 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,7 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
>From 0b3e16b066bbe4e1033e854a6c18684f382cfd0a Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Tue, 3 Jun 2025 19:07:43 +0000
Subject: [PATCH 41/69] format
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 245382897ddab..38bf9e008f1fe 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -450,7 +450,7 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
return reportValueError(Ctx, "RegisterSpace", Range.RegisterSpace);
if (!verifyDescriptorRangeFlag(RSD.Version, Range.RangeType,
- Range.Flags))
+ Range.Flags))
return reportValueError(Ctx, "DescriptorFlag", Range.Flags);
}
break;
>From 72b8dbc3c1c68655ef40e955eeb95d53e69bd0ab Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 6 Jun 2025 19:01:56 +0000
Subject: [PATCH 42/69] addressing comments
---
.../DirectX/ContainerData/RootSignature-DescriptorTable.ll | 6 +++---
.../DirectX/ContainerData/RootSignature-Parameters.ll | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
index af4acfd2736d9..04eff9f872e4c 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
@@ -16,7 +16,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!2 = !{ ptr @main, !3 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
-!6 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!6 = !{ !"SRV", i32 0, i32 1, i32 0, i32 -1, i32 4 }
!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
; DXC: - Name: RTS0
@@ -36,8 +36,8 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: Ranges:
; DXC-NEXT: - RangeType: 0
; DXC-NEXT: NumDescriptors: 0
-; DXC-NEXT: BaseShaderRegister: 0
-; DXC-NEXT: RegisterSpace: 4294967295
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 0
; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
; DXC-NEXT: DATA_VOLATILE: true
; DXC-NEXT: - RangeType: 1
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
index 28768e252d85a..df2bb18c87b2e 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -17,7 +17,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
!6 = !{ !"RootSRV", i32 1, i32 4, i32 5, i32 6 }
!7 = !{ !"DescriptorTable", i32 0, !8, !9 }
-!8 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 4 }
+!8 = !{ !"SRV", i32 0, i32 1, i32 0, i32 -1, i32 4 }
!9 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
;CHECK-LABEL: Definition for 'main':
@@ -39,8 +39,8 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
;CHECK-NEXT: Shader Visibility: 0
;CHECK-NEXT: NumRanges: 2
;CHECK-NEXT: - Range Type: 0
-;CHECK-NEXT: Register Space: 4294967295
-;CHECK-NEXT: Base Shader Register: 0
+;CHECK-NEXT: Register Space: 0
+;CHECK-NEXT: Base Shader Register: 1
;CHECK-NEXT: Num Descriptors: 0
;CHECK-NEXT: Offset In Descriptors From Table Start: 4294967295
;CHECK-NEXT: Flags: 4
>From 8f069c703acc67e91e8bc0248a7d6aee5489dd6d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 6 Jun 2025 20:29:41 +0000
Subject: [PATCH 43/69] fix
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 2 +-
.../include/llvm/BinaryFormat/DXContainerConstants.def | 10 +++++-----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 08949e39716d5..725c405b77e55 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -164,7 +164,7 @@ enum class RootDescriptorFlag : uint32_t {
#include "DXContainerConstants.def"
};
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = 1ull << Num,
+#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = Num,
enum class DescriptorRangeFlag : uint32_t {
#include "DXContainerConstants.def"
};
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 501ef0c31cdd0..c4895ee8ed655 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -90,11 +90,11 @@ ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
#ifdef DESCRIPTOR_RANGE_FLAG
DESCRIPTOR_RANGE_FLAG(0, NONE)
-DESCRIPTOR_RANGE_FLAG(1, DESCRIPTORS_VOLATILE)
-DESCRIPTOR_RANGE_FLAG(2, DATA_VOLATILE)
-DESCRIPTOR_RANGE_FLAG(3, DATA_STATIC_WHILE_SET_AT_EXECUTE)
-DESCRIPTOR_RANGE_FLAG(4, DATA_STATIC)
-DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
+DESCRIPTOR_RANGE_FLAG(0x1, DESCRIPTORS_VOLATILE)
+DESCRIPTOR_RANGE_FLAG(0x2, DATA_VOLATILE)
+DESCRIPTOR_RANGE_FLAG(0x4, DATA_STATIC_WHILE_SET_AT_EXECUTE)
+DESCRIPTOR_RANGE_FLAG(0x8, DATA_STATIC)
+DESCRIPTOR_RANGE_FLAG(0x10000, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
#undef DESCRIPTOR_RANGE_FLAG
#endif // DESCRIPTOR_RANGE_FLAG
>From 440566cf4a4f7531738af532cc6bf8cb7d3e4a71 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 9 Jun 2025 18:33:35 +0000
Subject: [PATCH 44/69] addressing comments
---
diff | 34 +++++++++++++++++++
.../BinaryFormat/DXContainerConstants.def | 10 +++---
2 files changed, 39 insertions(+), 5 deletions(-)
create mode 100644 diff
diff --git a/diff b/diff
new file mode 100644
index 0000000000000..0facb5edaa5fb
--- /dev/null
+++ b/diff
@@ -0,0 +1,34 @@
+diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
+index 08949e39716d..725c405b77e5 100644
+--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
++++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
+@@ -164,7 +164,7 @@ enum class RootDescriptorFlag : uint32_t {
+ #include "DXContainerConstants.def"
+ };
+
+-#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = 1ull << Num,
++#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = Num,
+ enum class DescriptorRangeFlag : uint32_t {
+ #include "DXContainerConstants.def"
+ };
+diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+index 501ef0c31cdd..c4895ee8ed65 100644
+--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
++++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+@@ -90,11 +90,11 @@ ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
+ #ifdef DESCRIPTOR_RANGE_FLAG
+
+ DESCRIPTOR_RANGE_FLAG(0, NONE)
+-DESCRIPTOR_RANGE_FLAG(1, DESCRIPTORS_VOLATILE)
+-DESCRIPTOR_RANGE_FLAG(2, DATA_VOLATILE)
+-DESCRIPTOR_RANGE_FLAG(3, DATA_STATIC_WHILE_SET_AT_EXECUTE)
+-DESCRIPTOR_RANGE_FLAG(4, DATA_STATIC)
+-DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
++DESCRIPTOR_RANGE_FLAG(0x1, DESCRIPTORS_VOLATILE)
++DESCRIPTOR_RANGE_FLAG(0x2, DATA_VOLATILE)
++DESCRIPTOR_RANGE_FLAG(0x4, DATA_STATIC_WHILE_SET_AT_EXECUTE)
++DESCRIPTOR_RANGE_FLAG(0x8, DATA_STATIC)
++DESCRIPTOR_RANGE_FLAG(0x10000, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
+ #undef DESCRIPTOR_RANGE_FLAG
+ #endif // DESCRIPTOR_RANGE_FLAG
+
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index fa66450c563c4..a65453f78d85a 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -100,11 +100,11 @@ DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
// DESCRIPTOR_RANGE(value, name).
#ifdef DESCRIPTOR_RANGE
- DESCRIPTOR_RANGE(4, ERROR)
- DESCRIPTOR_RANGE(0, SRV)
- DESCRIPTOR_RANGE(1, UAV)
- DESCRIPTOR_RANGE(2, CBV)
- DESCRIPTOR_RANGE(3, Sampler)
+DESCRIPTOR_RANGE(4, ERROR)
+DESCRIPTOR_RANGE(0, SRV)
+DESCRIPTOR_RANGE(1, UAV)
+DESCRIPTOR_RANGE(2, CBV)
+DESCRIPTOR_RANGE(3, Sampler)
DESCRIPTOR_RANGE(0, NONE)
#undef DESCRIPTOR_RANGE
#endif // DESCRIPTOR_RANGE
>From 72ca44bc667aa0b8ad4488603d92513806fc4c46 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 9 Jun 2025 18:39:59 +0000
Subject: [PATCH 45/69] address coments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 100 +++++++++---------
...tSignature-DescriptorTable-Invalid-Flag.ll | 2 +-
2 files changed, 50 insertions(+), 52 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 38bf9e008f1fe..b38ab516a3bb5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -323,7 +323,7 @@ static bool verifyRegisterValue(uint32_t RegisterValue) {
// This Range is reserverved, therefore invalid, according to the spec
// https://github.com/llvm/wg-hlsl/blob/main/proposals/0002-root-signature-in-clang.md#all-the-values-should-be-legal
static bool verifyRegisterSpace(uint32_t RegisterSpace) {
- return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace < 0xFFFFFFFF);
+ return !(RegisterSpace >= 0xFFFFFFF0 && RegisterSpace <= 0xFFFFFFFF);
}
static bool verifyDescriptorFlag(uint32_t Flags) { return (Flags & ~0xE) == 0; }
@@ -340,63 +340,61 @@ static bool verifyRangeType(uint32_t Type) {
return false;
}
+template <typename... FlagTypes>
+static bool isFlagSet(uint32_t Flags, FlagTypes... FlagsToCheck) {
+ return ((Flags & llvm::to_underlying(FlagsToCheck)) | ...) == Flags;
+}
+
static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
uint32_t Flags) {
- if (Version == 1 &&
- Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
- return Flags == 0;
-
- if (Version == 2 &&
- Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)) {
- switch (Flags) {
- case 0:
- case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
- case llvm::to_underlying(
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
- return true;
- }
- return false;
- }
+ bool IsSampler =
+ (Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler));
- if (Version == 1 &&
- Type != llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
+ if (Version == 1) {
+ if (IsSampler) {
+ return Flags == 0;
+ }
return Flags ==
llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE);
+ }
- if (Version == 2 &&
- Type != llvm::to_underlying(dxbc::DescriptorRangeType::Sampler)) {
- switch (Flags) {
- case 0:
- case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE):
- case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
- case llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_STATIC):
- case llvm::to_underlying(
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
- case llvm::to_underlying(
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS):
- case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
- llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
- case llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) |
- llvm::to_underlying(
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
- case llvm::to_underlying(
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
- llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_VOLATILE):
- case llvm::to_underlying(
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
- llvm::to_underlying(dxbc::DescriptorRangeFlag::DATA_STATIC):
- case llvm::to_underlying(
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) |
- llvm::to_underlying(
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE):
- return true;
+ if (Version == 2) {
+ if (IsSampler) {
+ return Flags == 0 ||
+ isFlagSet(Flags, dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
+ isFlagSet(Flags,
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS);
}
- return false;
+ // Valid flag combinations for non-sampler Version 2
+ return Flags == 0 ||
+ isFlagSet(Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) ||
+ isFlagSet(Flags, dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
+ isFlagSet(Flags, dxbc::DescriptorRangeFlag::DATA_STATIC) ||
+ isFlagSet(
+ Flags,
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE) ||
+ isFlagSet(Flags,
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) ||
+ isFlagSet(Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE,
+ dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
+ isFlagSet(
+ Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE,
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE) ||
+ isFlagSet(Flags,
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
+ dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
+ isFlagSet(Flags,
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
+ dxbc::DescriptorRangeFlag::DATA_STATIC) ||
+ isFlagSet(
+ Flags,
+ dxbc::DescriptorRangeFlag::
+ DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
+ dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE);
}
return false;
}
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
index 37d87986aa25f..76e1d7f4573b7 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-Flag.ll
@@ -16,5 +16,5 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!2 = !{ ptr @main, !3 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
-!6 = !{ !"SRV", i32 0, i32 0, i32 -1, i32 -1, i32 22 }
+!6 = !{ !"SRV", i32 0, i32 1, i32 0, i32 -1, i32 22 }
!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 2 }
>From 90f74039216a64570eba687068946973ace81702 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 9 Jun 2025 23:40:54 +0000
Subject: [PATCH 46/69] remove diff
---
diff | 34 ----------------------------------
1 file changed, 34 deletions(-)
delete mode 100644 diff
diff --git a/diff b/diff
deleted file mode 100644
index 0facb5edaa5fb..0000000000000
--- a/diff
+++ /dev/null
@@ -1,34 +0,0 @@
-diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
-index 08949e39716d..725c405b77e5 100644
---- a/llvm/include/llvm/BinaryFormat/DXContainer.h
-+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
-@@ -164,7 +164,7 @@ enum class RootDescriptorFlag : uint32_t {
- #include "DXContainerConstants.def"
- };
-
--#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = 1ull << Num,
-+#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = Num,
- enum class DescriptorRangeFlag : uint32_t {
- #include "DXContainerConstants.def"
- };
-diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
-index 501ef0c31cdd..c4895ee8ed65 100644
---- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
-+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
-@@ -90,11 +90,11 @@ ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
- #ifdef DESCRIPTOR_RANGE_FLAG
-
- DESCRIPTOR_RANGE_FLAG(0, NONE)
--DESCRIPTOR_RANGE_FLAG(1, DESCRIPTORS_VOLATILE)
--DESCRIPTOR_RANGE_FLAG(2, DATA_VOLATILE)
--DESCRIPTOR_RANGE_FLAG(3, DATA_STATIC_WHILE_SET_AT_EXECUTE)
--DESCRIPTOR_RANGE_FLAG(4, DATA_STATIC)
--DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
-+DESCRIPTOR_RANGE_FLAG(0x1, DESCRIPTORS_VOLATILE)
-+DESCRIPTOR_RANGE_FLAG(0x2, DATA_VOLATILE)
-+DESCRIPTOR_RANGE_FLAG(0x4, DATA_STATIC_WHILE_SET_AT_EXECUTE)
-+DESCRIPTOR_RANGE_FLAG(0x8, DATA_STATIC)
-+DESCRIPTOR_RANGE_FLAG(0x10000, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
- #undef DESCRIPTOR_RANGE_FLAG
- #endif // DESCRIPTOR_RANGE_FLAG
-
>From 7a4382ec9a268e649a730538ba0c66d99392d830 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 9 Jun 2025 23:44:05 +0000
Subject: [PATCH 47/69] address comments
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 1 +
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index a65453f78d85a..3acbb56e6ee0f 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -100,6 +100,7 @@ DESCRIPTOR_RANGE_FLAG(16, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
// DESCRIPTOR_RANGE(value, name).
#ifdef DESCRIPTOR_RANGE
+
DESCRIPTOR_RANGE(4, ERROR)
DESCRIPTOR_RANGE(0, SRV)
DESCRIPTOR_RANGE(1, UAV)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index b38ab516a3bb5..f0bf71169745c 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -347,7 +347,7 @@ static bool isFlagSet(uint32_t Flags, FlagTypes... FlagsToCheck) {
static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
uint32_t Flags) {
- bool IsSampler =
+ const bool IsSampler =
(Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler));
if (Version == 1) {
>From 1c608f485edf6f6ce5b77d23b46c30e57ee1ee5e Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 11 Jun 2025 18:47:26 +0000
Subject: [PATCH 48/69] address comments
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 5 +
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 141 +++++++-----------
2 files changed, 60 insertions(+), 86 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 08949e39716d5..b39cbb5234a3c 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -13,6 +13,7 @@
#ifndef LLVM_BINARYFORMAT_DXCONTAINER_H
#define LLVM_BINARYFORMAT_DXCONTAINER_H
+#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Error.h"
@@ -40,6 +41,8 @@ template <typename T> struct EnumEntry;
namespace dxbc {
+LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
+
inline Triple::EnvironmentType getShaderStage(uint32_t Kind) {
assert(Kind <= Triple::Amplification - Triple::Pixel &&
"Shader kind out of expected range.");
@@ -167,6 +170,8 @@ enum class RootDescriptorFlag : uint32_t {
#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = 1ull << Num,
enum class DescriptorRangeFlag : uint32_t {
#include "DXContainerConstants.def"
+
+ LLVM_MARK_AS_BITMASK_ENUM(DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
};
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index f0bf71169745c..0de7769caf8ca 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -232,7 +232,8 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
static bool parseDescriptorTable(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *DescriptorTableNode) {
- if (DescriptorTableNode->getNumOperands() < 2)
+ const unsigned int NumOperands = DescriptorTableNode->getNumOperands();
+ if (NumOperands < 2)
return reportError(Ctx, "Invalid format for Descriptor Table");
dxbc::RTS0::v1::RootParameterHeader Header;
@@ -245,7 +246,7 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
Header.ParameterType =
llvm::to_underlying(dxbc::RootParameterType::DescriptorTable);
- for (unsigned int I = 2; I < DescriptorTableNode->getNumOperands(); I++) {
+ for (unsigned int I = 2; I < NumOperands; I++) {
MDNode *Element = dyn_cast<MDNode>(DescriptorTableNode->getOperand(I));
if (Element == nullptr)
return reportError(Ctx, "Missing Root Element Metadata Node.");
@@ -340,63 +341,40 @@ static bool verifyRangeType(uint32_t Type) {
return false;
}
-template <typename... FlagTypes>
-static bool isFlagSet(uint32_t Flags, FlagTypes... FlagsToCheck) {
- return ((Flags & llvm::to_underlying(FlagsToCheck)) | ...) == Flags;
-}
-
static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
- uint32_t Flags) {
+ uint32_t FlagsVal) {
+ using FlagT = dxbc::DescriptorRangeFlag;
+ FlagT Flags = FlagT(FlagsVal);
+
const bool IsSampler =
(Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler));
- if (Version == 1) {
- if (IsSampler) {
- return Flags == 0;
+ // The data-specific flags are mutually exclusive.
+ FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
+ FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+
+ if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
+ return false;
+
+ // For volatile descriptors, DATA_STATIC is never valid.
+ if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
+ FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
+ if (!IsSampler) {
+ Mask |= FlagT::DATA_VOLATILE;
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
}
- return Flags ==
- llvm::to_underlying(dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE);
+ return (Flags & ~Mask) == FlagT::NONE;
}
- if (Version == 2) {
- if (IsSampler) {
- return Flags == 0 ||
- isFlagSet(Flags, dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
- isFlagSet(Flags,
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS);
- }
- // Valid flag combinations for non-sampler Version 2
- return Flags == 0 ||
- isFlagSet(Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE) ||
- isFlagSet(Flags, dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
- isFlagSet(Flags, dxbc::DescriptorRangeFlag::DATA_STATIC) ||
- isFlagSet(
- Flags,
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE) ||
- isFlagSet(Flags,
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) ||
- isFlagSet(Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE,
- dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
- isFlagSet(
- Flags, dxbc::DescriptorRangeFlag::DESCRIPTORS_VOLATILE,
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE) ||
- isFlagSet(Flags,
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
- dxbc::DescriptorRangeFlag::DATA_VOLATILE) ||
- isFlagSet(Flags,
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
- dxbc::DescriptorRangeFlag::DATA_STATIC) ||
- isFlagSet(
- Flags,
- dxbc::DescriptorRangeFlag::
- DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS,
- dxbc::DescriptorRangeFlag::DATA_STATIC_WHILE_SET_AT_EXECUTE);
+ // For default (static) or "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
+ // the other data-specific flags may all be set.
+ FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
+ if (!IsSampler) {
+ Mask |= FlagT::DATA_VOLATILE;
+ Mask |= FlagT::DATA_STATIC;
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
}
- return false;
+ return (Flags & ~Mask) == FlagT::NONE;
}
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
@@ -556,7 +534,6 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << "Root Signature Definitions"
<< "\n";
- uint8_t Space = 0;
for (const Function &F : M) {
auto It = RSDMap.find(&F);
if (It == RSDMap.end())
@@ -565,32 +542,30 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
OS << "Definition for '" << F.getName() << "':\n";
// start root signature header
- OS << indent(Space) << "Flags: " << format_hex(RS.Flags, 8) << "\n";
- OS << indent(Space) << "Version: " << RS.Version << "\n";
- OS << indent(Space) << "RootParametersOffset: " << RS.RootParameterOffset
- << "\n";
- OS << indent(Space) << "NumParameters: " << RS.ParametersContainer.size()
- << "\n";
+ OS << "Flags: " << format_hex(RS.Flags, 8) << "\n";
+ OS << "Version: " << RS.Version << "\n";
+ OS << "RootParametersOffset: " << RS.RootParameterOffset << "\n";
+ OS << "NumParameters: " << RS.ParametersContainer.size() << "\n";
for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
const auto &[Type, Loc] =
RS.ParametersContainer.getTypeAndLocForParameter(I);
const dxbc::RTS0::v1::RootParameterHeader Header =
RS.ParametersContainer.getHeader(I);
- OS << indent(Space) << "- Parameter Type: " << Type << "\n";
- OS << indent(Space + 2)
- << "Shader Visibility: " << Header.ShaderVisibility << "\n";
+ OS << "- Parameter Type: " << Type << "\n";
+ OS << indent(2) << "Shader Visibility: " << Header.ShaderVisibility
+ << "\n";
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
const dxbc::RTS0::v1::RootConstants &Constants =
RS.ParametersContainer.getConstant(Loc);
- OS << indent(Space + 2) << "Register Space: " << Constants.RegisterSpace
+ OS << indent(2) << "Register Space: " << Constants.RegisterSpace
+ << "\n";
+ OS << indent(2) << "Shader Register: " << Constants.ShaderRegister
+ << "\n";
+ OS << indent(2) << "Num 32 Bit Values: " << Constants.Num32BitValues
<< "\n";
- OS << indent(Space + 2)
- << "Shader Register: " << Constants.ShaderRegister << "\n";
- OS << indent(Space + 2)
- << "Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
break;
}
case llvm::to_underlying(dxbc::RootParameterType::CBV):
@@ -598,43 +573,37 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RS.ParametersContainer.getRootDescriptor(Loc);
- OS << indent(Space + 2)
- << "Register Space: " << Descriptor.RegisterSpace << "\n";
- OS << indent(Space + 2)
- << "Shader Register: " << Descriptor.ShaderRegister << "\n";
+ OS << indent(2) << "Register Space: " << Descriptor.RegisterSpace
+ << "\n";
+ OS << indent(2) << "Shader Register: " << Descriptor.ShaderRegister
+ << "\n";
if (RS.Version > 1)
- OS << indent(Space + 2) << "Flags: " << Descriptor.Flags << "\n";
+ OS << indent(2) << "Flags: " << Descriptor.Flags << "\n";
break;
}
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
const mcdxbc::DescriptorTable &Table =
RS.ParametersContainer.getDescriptorTable(Loc);
- OS << indent(Space + 2) << "NumRanges: " << Table.Ranges.size() << "\n";
+ OS << indent(2) << "NumRanges: " << Table.Ranges.size() << "\n";
for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
- OS << indent(Space + 2) << "- Range Type: " << Range.RangeType
- << "\n";
- OS << indent(Space + 4) << "Register Space: " << Range.RegisterSpace
- << "\n";
- OS << indent(Space + 4)
+ OS << indent(2) << "- Range Type: " << Range.RangeType << "\n";
+ OS << indent(4) << "Register Space: " << Range.RegisterSpace << "\n";
+ OS << indent(4)
<< "Base Shader Register: " << Range.BaseShaderRegister << "\n";
- OS << indent(Space + 4) << "Num Descriptors: " << Range.NumDescriptors
+ OS << indent(4) << "Num Descriptors: " << Range.NumDescriptors
<< "\n";
- OS << indent(Space + 4) << "Offset In Descriptors From Table Start: "
+ OS << indent(4) << "Offset In Descriptors From Table Start: "
<< Range.OffsetInDescriptorsFromTableStart << "\n";
if (RS.Version > 1)
- OS << indent(Space + 4) << "Flags: " << Range.Flags << "\n";
+ OS << indent(4) << "Flags: " << Range.Flags << "\n";
}
break;
}
}
}
- OS << indent(Space) << "NumStaticSamplers: " << 0 << "\n";
- OS << indent(Space) << "StaticSamplersOffset: " << RS.StaticSamplersOffset
- << "\n";
-
- Space--;
- // end root signature header
+ OS << "NumStaticSamplers: " << 0 << "\n";
+ OS << "StaticSamplersOffset: " << RS.StaticSamplersOffset << "\n";
}
return PreservedAnalyses::all();
}
>From e0bc5e3f544feae75390093c520a1b68fdf0e796 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 11 Jun 2025 18:59:59 +0000
Subject: [PATCH 49/69] fix
---
.../DirectX/ContainerData/RootSignature-DescriptorTable.ll | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
index 04eff9f872e4c..334ff2774a9b2 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable.ll
@@ -39,10 +39,10 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: BaseShaderRegister: 1
; DXC-NEXT: RegisterSpace: 0
; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
-; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
; DXC-NEXT: - RangeType: 1
; DXC-NEXT: NumDescriptors: 5
; DXC-NEXT: BaseShaderRegister: 1
; DXC-NEXT: RegisterSpace: 10
; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DESCRIPTORS_VOLATILE: true
+; DXC-NEXT: DATA_VOLATILE: true
>From 35a2e0b98c90551b28f2b62c8f84c6c21c750653 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 11 Jun 2025 19:10:22 +0000
Subject: [PATCH 50/69] fix other values
---
llvm/include/llvm/BinaryFormat/DXContainerConstants.def | 1 -
1 file changed, 1 deletion(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index c4895ee8ed655..b3a6e340af049 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -78,7 +78,6 @@ ROOT_ELEMENT_FLAG(11, SamplerHeapDirectlyIndexed)
// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
-ROOT_DESCRIPTOR_FLAG(0, NONE)
ROOT_DESCRIPTOR_FLAG(1, DATA_VOLATILE)
ROOT_DESCRIPTOR_FLAG(2, DATA_STATIC_WHILE_SET_AT_EXECUTE)
ROOT_DESCRIPTOR_FLAG(3, DATA_STATIC)
>From 91346a7b5d739f307cb7aee4c6572238a756fc6f Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 11 Jun 2025 23:21:03 +0000
Subject: [PATCH 51/69] adding more tests
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 3 +
...escriptorTable-AllValidFlagCombinations.ll | 164 ++++++++++++++++++
2 files changed, 167 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 0de7769caf8ca..04805ceebfc2a 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -356,6 +356,9 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
return false;
+ if (popcount(llvm::to_underlying(Flags & DataFlags)) == 1)
+ return true;
+
// For volatile descriptors, DATA_STATIC is never valid.
if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll
new file mode 100644
index 0000000000000..b22086a46ec02
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll
@@ -0,0 +1,164 @@
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20 }
+
+; typedef enum D3D12_DESCRIPTOR_RANGE_FLAGS {
+; NONE = 0,
+; DESCRIPTORS_VOLATILE = 0x1,
+; DATA_VOLATILE = 0x2,
+; DATA_STATIC_WHILE_SET_AT_EXECUTE = 0x4,
+; DATA_STATIC = 0x8,
+; DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS = 0x10000
+; } ;
+
+;0
+!6 = !{ !"Sampler", i32 1, i32 0, i32 1, i32 -1, i32 0 }
+;DATA_VOLATILE
+!7 = !{ !"Sampler", i32 1, i32 0, i32 2, i32 -1, i32 2 }
+;DATA_STATIC_WHILE_SET_AT_EXECUTE
+!8 = !{ !"Sampler", i32 1, i32 0, i32 3, i32 -1, i32 4 }
+;DATA_STATIC
+!9 = !{ !"Sampler", i32 1, i32 0, i32 4, i32 -1, i32 8 }
+;0
+!10 = !{ !"SRV", i32 1, i32 0, i32 5, i32 -1, i32 0 }
+;DESCRIPTORS_VOLATILE
+!11 = !{ !"UAV", i32 5, i32 1, i32 6, i32 5, i32 1 }
+;DATA_VOLATILE
+!12 = !{ !"CBV", i32 5, i32 1, i32 7, i32 5, i32 2 }
+;DATA_STATIC
+!13 = !{ !"SRV", i32 5, i32 1, i32 8, i32 5, i32 8 }
+;DATA_STATIC_WHILE_SET_AT_EXECUTE
+!14 = !{ !"UAV", i32 5, i32 1, i32 9, i32 5, i32 4 }
+;DESCRIPTORS_VOLATILE | DATA_VOLATILE
+!15 = !{ !"CBV", i32 5, i32 1, i32 10, i32 5, i32 3 }
+;DESCRIPTORS_VOLATILE | DATA_STATIC_WHILE_SET_AT_EXECUTE
+!16 = !{ !"SRV", i32 5, i32 1, i32 11, i32 5, i32 5 }
+;DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS
+!17 = !{ !"UAV", i32 5, i32 1, i32 12, i32 5, i32 65536 }
+;DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS | DATA_VOLATILE
+!18 = !{ !"CBV", i32 5, i32 1, i32 13, i32 5, i32 65538 }
+;DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS | DATA_STATIC
+!19 = !{ !"SRV", i32 5, i32 1, i32 14, i32 5, i32 65544 }
+;DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS | DATA_STATIC_WHILE_SET_AT_EXECUTE
+!20 = !{ !"UAV", i32 5, i32 1, i32 15, i32 5, i32 65540 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 404
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumRootParameters: 1
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: 0
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: Table:
+; DXC-NEXT: NumRanges: 15
+; DXC-NEXT: RangesOffset: 44
+; DXC-NEXT: Ranges:
+; DXC-NEXT: - RangeType: 3
+; DXC-NEXT: NumDescriptors: 1
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 1
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: - RangeType: 3
+; DXC-NEXT: NumDescriptors: 1
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 2
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: - RangeType: 3
+; DXC-NEXT: NumDescriptors: 1
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 3
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+; DXC-NEXT: - RangeType: 3
+; DXC-NEXT: NumDescriptors: 1
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 4
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: DATA_STATIC: true
+; DXC-NEXT: - RangeType: 0
+; DXC-NEXT: NumDescriptors: 1
+; DXC-NEXT: BaseShaderRegister: 0
+; DXC-NEXT: RegisterSpace: 5
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 6
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DESCRIPTORS_VOLATILE: true
+; DXC-NEXT: - RangeType: 2
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 7
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: - RangeType: 0
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 8
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DATA_STATIC: true
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 9
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+; DXC-NEXT: - RangeType: 2
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 10
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DESCRIPTORS_VOLATILE: true
+; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: - RangeType: 0
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 11
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DESCRIPTORS_VOLATILE: true
+; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 12
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+; DXC-NEXT: - RangeType: 2
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 13
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DATA_VOLATILE: true
+; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+; DXC-NEXT: - RangeType: 0
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 14
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DATA_STATIC: true
+; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 15
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
>From e8066df9de55e5d2aabb7c2a4720b9d2ab00d755 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 12 Jun 2025 18:03:24 +0000
Subject: [PATCH 52/69] address comments
---
.../BinaryFormat/DXContainerConstants.def | 3 +-
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 34 +++++++++++++------
...ature-DescriptorTable-Invalid-RangeType.ll | 2 +-
3 files changed, 25 insertions(+), 14 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 42863458eefd4..a2b2ea35238ab 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -100,12 +100,11 @@ DESCRIPTOR_RANGE_FLAG(0x10000, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
// DESCRIPTOR_RANGE(value, name).
#ifdef DESCRIPTOR_RANGE
-DESCRIPTOR_RANGE(4, ERROR)
DESCRIPTOR_RANGE(0, SRV)
DESCRIPTOR_RANGE(1, UAV)
DESCRIPTOR_RANGE(2, CBV)
DESCRIPTOR_RANGE(3, Sampler)
-DESCRIPTOR_RANGE(0, NONE)
+DESCRIPTOR_RANGE(4, NONE)
#undef DESCRIPTOR_RANGE
#endif // DESCRIPTOR_RANGE
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 04805ceebfc2a..e51bd6796fb84 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -197,7 +197,10 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
.Case("UAV", llvm::to_underlying(dxbc::DescriptorRangeType::UAV))
.Case("Sampler",
llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
- .Default(llvm::to_underlying(dxbc::DescriptorRangeType::ERROR));
+ .Default(-1u);
+
+ if (Range.RangeType == -1u)
+ return reportError(Ctx, "Invalid Descriptor Range type: " + *ElementText);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
Range.NumDescriptors = *Val;
@@ -349,6 +352,12 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
const bool IsSampler =
(Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler));
+ if (Version == 1) {
+ if (IsSampler)
+ return Flags == FlagT::NONE;
+ return Flags == FlagT::DESCRIPTORS_VOLATILE;
+ }
+
// The data-specific flags are mutually exclusive.
FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
@@ -356,9 +365,6 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
return false;
- if (popcount(llvm::to_underlying(Flags & DataFlags)) == 1)
- return true;
-
// For volatile descriptors, DATA_STATIC is never valid.
if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
@@ -369,15 +375,21 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
return (Flags & ~Mask) == FlagT::NONE;
}
- // For default (static) or "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
+ // For "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
// the other data-specific flags may all be set.
- FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
- if (!IsSampler) {
- Mask |= FlagT::DATA_VOLATILE;
- Mask |= FlagT::DATA_STATIC;
- Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ if ((Flags & FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) ==
+ FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS) {
+ FlagT Mask = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS;
+ if (!IsSampler) {
+ Mask |= FlagT::DATA_VOLATILE;
+ Mask |= FlagT::DATA_STATIC;
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ }
+ return (Flags & ~Mask) == FlagT::NONE;
}
- return (Flags & ~Mask) == FlagT::NONE;
+
+ // When no descriptor flag is set, any data flag is allowed.
+ return (Flags & ~DataFlags) == FlagT::NONE;
}
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
index 1d18c0c7ff882..fc861abdcf0e9 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-Invalid-RangeType.ll
@@ -2,7 +2,7 @@
target triple = "dxil-unknown-shadermodel6.0-compute"
-; CHECK: error: Invalid value for RangeType: 4
+; CHECK: error: Invalid Descriptor Range type: Invalid
; CHECK-NOT: Root Signature Definitions
define void @main() #0 {
>From 9f51858f2050720c50c09ddd18108d3bcde5a68b Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 4 Jun 2025 21:42:20 +0000
Subject: [PATCH 53/69] adding metadata support for static samplers
---
llvm/lib/MC/DXContainerRootSignature.cpp | 42 +++++----
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 89 +++++++++++++++++++
llvm/lib/Target/DirectX/DXILRootSignature.h | 1 +
.../RootSignature-StaticSamplers.ll | 42 +++++++++
4 files changed, 157 insertions(+), 17 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index 6c71823a51f85..d67babf13a432 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -9,6 +9,7 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/EndianStream.h"
+#include <cstdint>
using namespace llvm;
using namespace llvm::mcdxbc;
@@ -71,12 +72,16 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
BOS.reserveExtraSpace(getSize());
const uint32_t NumParameters = ParametersContainer.size();
-
+ const uint32_t NumSamplers = StaticSamplers.size();
support::endian::write(BOS, Version, llvm::endianness::little);
support::endian::write(BOS, NumParameters, llvm::endianness::little);
support::endian::write(BOS, RootParameterOffset, llvm::endianness::little);
- support::endian::write(BOS, NumStaticSamplers, llvm::endianness::little);
- support::endian::write(BOS, StaticSamplersOffset, llvm::endianness::little);
+ support::endian::write(BOS, NumSamplers, llvm::endianness::little);
+ uint32_t SSO = StaticSamplersOffset;
+ if (NumSamplers > 0)
+ SSO = writePlaceholder(BOS);
+ else
+ support::endian::write(BOS, SSO, llvm::endianness::little);
support::endian::write(BOS, Flags, llvm::endianness::little);
SmallVector<uint32_t> ParamsOffsets;
@@ -142,20 +147,23 @@ void RootSignatureDesc::write(raw_ostream &OS) const {
}
}
}
- for (const auto &S : StaticSamplers) {
- support::endian::write(BOS, S.Filter, llvm::endianness::little);
- support::endian::write(BOS, S.AddressU, llvm::endianness::little);
- support::endian::write(BOS, S.AddressV, llvm::endianness::little);
- support::endian::write(BOS, S.AddressW, llvm::endianness::little);
- support::endian::write(BOS, S.MipLODBias, llvm::endianness::little);
- support::endian::write(BOS, S.MaxAnisotropy, llvm::endianness::little);
- support::endian::write(BOS, S.ComparisonFunc, llvm::endianness::little);
- support::endian::write(BOS, S.BorderColor, llvm::endianness::little);
- support::endian::write(BOS, S.MinLOD, llvm::endianness::little);
- support::endian::write(BOS, S.MaxLOD, llvm::endianness::little);
- support::endian::write(BOS, S.ShaderRegister, llvm::endianness::little);
- support::endian::write(BOS, S.RegisterSpace, llvm::endianness::little);
- support::endian::write(BOS, S.ShaderVisibility, llvm::endianness::little);
+ if (NumSamplers > 0) {
+ rewriteOffsetToCurrentByte(BOS, SSO);
+ for (const auto &S : StaticSamplers) {
+ support::endian::write(BOS, S.Filter, llvm::endianness::little);
+ support::endian::write(BOS, S.AddressU, llvm::endianness::little);
+ support::endian::write(BOS, S.AddressV, llvm::endianness::little);
+ support::endian::write(BOS, S.AddressW, llvm::endianness::little);
+ support::endian::write(BOS, S.MipLODBias, llvm::endianness::little);
+ support::endian::write(BOS, S.MaxAnisotropy, llvm::endianness::little);
+ support::endian::write(BOS, S.ComparisonFunc, llvm::endianness::little);
+ support::endian::write(BOS, S.BorderColor, llvm::endianness::little);
+ support::endian::write(BOS, S.MinLOD, llvm::endianness::little);
+ support::endian::write(BOS, S.MaxLOD, llvm::endianness::little);
+ support::endian::write(BOS, S.ShaderRegister, llvm::endianness::little);
+ support::endian::write(BOS, S.RegisterSpace, llvm::endianness::little);
+ support::endian::write(BOS, S.ShaderVisibility, llvm::endianness::little);
+ }
}
assert(Storage.size() == getSize());
OS.write(Storage.data(), Storage.size());
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index e51bd6796fb84..dfe9900b21df2 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
+#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -55,6 +56,13 @@ static std::optional<uint32_t> extractMdIntValue(MDNode *Node,
return std::nullopt;
}
+static std::optional<APFloat> extractMdFloatValue(MDNode *Node,
+ unsigned int OpId) {
+ if (auto *CI = mdconst::dyn_extract<ConstantFP>(Node->getOperand(OpId).get()))
+ return CI->getValue();
+ return std::nullopt;
+}
+
static std::optional<StringRef> extractMdStringValue(MDNode *Node,
unsigned int OpId) {
MDString *NodeText = dyn_cast<MDString>(Node->getOperand(OpId));
@@ -262,6 +270,81 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
return false;
}
+static bool parseStaticSampler(LLVMContext *Ctx, mcdxbc::RootSignatureDesc &RSD,
+ MDNode *StaticSamplerNode) {
+ if (StaticSamplerNode->getNumOperands() != 14)
+ return reportError(Ctx, "Invalid format for Static Sampler");
+
+ dxbc::RTS0::v1::StaticSampler Sampler;
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 1))
+ Sampler.Filter = *Val;
+ else
+ return reportError(Ctx, "Invalid value for Filter");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 2))
+ Sampler.AddressU = *Val;
+ else
+ return reportError(Ctx, "Invalid value for AddressU");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 3))
+ Sampler.AddressV = *Val;
+ else
+ return reportError(Ctx, "Invalid value for AddressV");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 4))
+ Sampler.AddressW = *Val;
+ else
+ return reportError(Ctx, "Invalid value for AddressW");
+
+ if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 5))
+ Sampler.MipLODBias = Val->convertToFloat();
+ else
+ return reportError(Ctx, "Invalid value for MipLODBias");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 6))
+ Sampler.MaxAnisotropy = *Val;
+ else
+ return reportError(Ctx, "Invalid value for MaxAnisotropy");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 7))
+ Sampler.ComparisonFunc = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ComparisonFunc ");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 8))
+ Sampler.BorderColor = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ComparisonFunc ");
+
+ if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 9))
+ Sampler.MinLOD = Val->convertToFloat();
+ else
+ return reportError(Ctx, "Invalid value for MinLOD");
+
+ if (std::optional<APFloat> Val = extractMdFloatValue(StaticSamplerNode, 10))
+ Sampler.MaxLOD = Val->convertToFloat();
+ else
+ return reportError(Ctx, "Invalid value for MaxLOD");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 11))
+ Sampler.ShaderRegister = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ShaderRegister");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 12))
+ Sampler.RegisterSpace = *Val;
+ else
+ return reportError(Ctx, "Invalid value for RegisterSpace");
+
+ if (std::optional<uint32_t> Val = extractMdIntValue(StaticSamplerNode, 13))
+ Sampler.ShaderVisibility = *Val;
+ else
+ return reportError(Ctx, "Invalid value for ShaderVisibility");
+
+ RSD.StaticSamplers.push_back(Sampler);
+ return false;
+}
+
static bool parseRootSignatureElement(LLVMContext *Ctx,
mcdxbc::RootSignatureDesc &RSD,
MDNode *Element) {
@@ -277,6 +360,7 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
.Case("RootSRV", RootSignatureElementKind::SRV)
.Case("RootUAV", RootSignatureElementKind::UAV)
.Case("DescriptorTable", RootSignatureElementKind::DescriptorTable)
+ .Case("StaticSampler", RootSignatureElementKind::StaticSamplers)
.Default(RootSignatureElementKind::Error);
switch (ElementKind) {
@@ -291,6 +375,8 @@ static bool parseRootSignatureElement(LLVMContext *Ctx,
return parseRootDescriptors(Ctx, RSD, Element, ElementKind);
case RootSignatureElementKind::DescriptorTable:
return parseDescriptorTable(Ctx, RSD, Element);
+ case RootSignatureElementKind::StaticSamplers:
+ return parseStaticSampler(Ctx, RSD, Element);
case RootSignatureElementKind::Error:
return reportError(Ctx, "Invalid Root Signature Element: " + *ElementText);
}
@@ -522,6 +608,9 @@ analyzeModule(Module &M) {
// offset will always equal to the header size.
RSD.RootParameterOffset = sizeof(dxbc::RTS0::v1::RootSignatureHeader);
+ // static sampler offset is calculated when writting dxcontainer.
+ RSD.StaticSamplersOffset = 0u;
+
if (parse(Ctx, RSD, RootElementListNode) || validate(Ctx, RSD)) {
return RSDMap;
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.h b/llvm/lib/Target/DirectX/DXILRootSignature.h
index b45cebc15fd39..be5cc78bc6bdf 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.h
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.h
@@ -32,6 +32,7 @@ enum class RootSignatureElementKind {
UAV = 4,
CBV = 5,
DescriptorTable = 6,
+ StaticSamplers = 7
};
class RootSignatureAnalysis : public AnalysisInfoMixin<RootSignatureAnalysis> {
friend AnalysisInfoMixin<RootSignatureAnalysis>;
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
new file mode 100644
index 0000000000000..35a8fb53248f9
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
@@ -0,0 +1,42 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.rts0 = private constant [76 x i8] c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x40403999A0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 76
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 2
+; DXC-NEXT: NumRootParameters: 0
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 1
+; DXC-NEXT: StaticSamplersOffset: 24
+; DXC-NEXT: Parameters: []
+; DXC-NEXT: Samplers:
+; DXC-NEXT: - Filter: 4
+; DXC-NEXT: AddressU: 2
+; DXC-NEXT: AddressV: 3
+; DXC-NEXT: AddressW: 5
+; DXC-NEXT: MipLODBias: 32.45
+; DXC-NEXT: MaxAnisotropy: 9
+; DXC-NEXT: ComparisonFunc: 3
+; DXC-NEXT: BorderColor: 2
+; DXC-NEXT: MinLOD: -128
+; DXC-NEXT: MaxLOD: 128
+; DXC-NEXT: ShaderRegister: 42
+; DXC-NEXT: RegisterSpace: 0
+; DXC-NEXT: ShaderVisibility: 0
>From fb9c7c47e1af70911c7c97233ebb90d16ef29737 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 5 Jun 2025 00:59:42 +0000
Subject: [PATCH 54/69] add validations
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 168 ++++++++++++++++++
.../RootSignature-StaticSamplers.ll | 4 +-
2 files changed, 170 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index dfe9900b21df2..a6d87611a94d0 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -13,6 +13,7 @@
#include "DXILRootSignature.h"
#include "DirectX.h"
#include "llvm/ADT/APFloat.h"
+#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -28,6 +29,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
+#include <cmath>
#include <cstdint>
#include <optional>
#include <utility>
@@ -478,6 +480,127 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
return (Flags & ~DataFlags) == FlagT::NONE;
}
+static bool verifySamplerFilter(uint32_t Filter) {
+ switch (Filter) {
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_MIP_POINT):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MIN_POINT_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_POINT_MAG_MIP_LINEAR):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_LINEAR_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MIN_LINEAR_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_MIP_LINEAR):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::ANISOTROPIC):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_POINT_MAG_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_LINEAR_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_MIP_LINEAR):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::COMPARISON_ANISOTROPIC):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_POINT_MAG_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_LINEAR_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_MIP_LINEAR):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MINIMUM_ANISOTROPIC):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_POINT_MAG_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_LINEAR_MAG_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_LINEAR_MIP_POINT):
+ case llvm::to_underlying(
+ dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_MIP_LINEAR):
+ case llvm::to_underlying(dxbc::StaticSamplerFilter::MAXIMUM_ANISOTROPIC):
+ return true;
+ }
+ return false;
+}
+
+// Values allowed here:
+// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_texture_address_mode#syntax
+static bool verifyAddress(uint32_t Address) {
+ switch (Address) {
+ case llvm::to_underlying(dxbc::TextureAddressMode::Border):
+ case llvm::to_underlying(dxbc::TextureAddressMode::Clamp):
+ case llvm::to_underlying(dxbc::TextureAddressMode::Mirror):
+ case llvm::to_underlying(dxbc::TextureAddressMode::MirrorOnce):
+ case llvm::to_underlying(dxbc::TextureAddressMode::Wrap):
+ return true;
+ }
+
+ return false;
+}
+
+static bool verifyMipLODBias(float MipLODBias) {
+ return MipLODBias >= -16.f && MipLODBias <= 16.f;
+}
+
+static bool verifyMaxAnisotropy(uint32_t MaxAnisotropy) {
+ return MaxAnisotropy <= 16u;
+}
+
+static bool verifyComparisonFunc(uint32_t ComparisonFunc) {
+ switch (ComparisonFunc) {
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::Never):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::Less):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::Equal):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::LessEqual):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::Greater):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::NotEqual):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::GreaterEqual):
+ case llvm::to_underlying(dxbc::SamplersComparisonFunction::Always):
+ return true;
+ }
+ return false;
+}
+
+static bool verifyBorderColor(uint32_t BorderColor) {
+ switch (BorderColor) {
+ case llvm::to_underlying(dxbc::SamplersBorderColor::TransparentBlack):
+ case llvm::to_underlying(dxbc::SamplersBorderColor::OpaqueBlack):
+ case llvm::to_underlying(dxbc::SamplersBorderColor::OpaqueWhite):
+ case llvm::to_underlying(dxbc::SamplersBorderColor::OpaqueBlackUint):
+ case llvm::to_underlying(dxbc::SamplersBorderColor::OpaqueWhiteUint):
+ return true;
+ }
+ return false;
+}
+
+static bool verifyLOD(float LOD) { return !std::isnan(LOD); }
+
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (!verifyVersion(RSD.Version)) {
@@ -535,6 +658,51 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
}
}
+ for (const dxbc::RTS0::v1::StaticSampler &Sampler : RSD.StaticSamplers) {
+ if (!verifySamplerFilter(Sampler.Filter))
+ return reportValueError(Ctx, "Filter", Sampler.Filter);
+
+ if (!verifyAddress(Sampler.AddressU))
+ return reportValueError(Ctx, "AddressU", Sampler.AddressU);
+
+ if (!verifyAddress(Sampler.AddressV))
+ return reportValueError(Ctx, "AddressU", Sampler.AddressV);
+
+ if (!verifyAddress(Sampler.AddressW))
+ return reportValueError(Ctx, "AddressU", Sampler.AddressW);
+
+ if (!verifyMipLODBias(Sampler.MipLODBias))
+ return reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias);
+
+ if (!verifyMaxAnisotropy(Sampler.MaxAnisotropy))
+ return reportValueError(Ctx, "MaxAnisotropy", Sampler.MaxAnisotropy);
+
+ if (!verifyComparisonFunc(Sampler.ComparisonFunc))
+ return reportValueError(Ctx, "ComparisonFunc", Sampler.ComparisonFunc);
+
+ if (!verifyComparisonFunc(Sampler.ComparisonFunc))
+ return reportValueError(Ctx, "ComparisonFunc", Sampler.ComparisonFunc);
+
+ if (!verifyBorderColor(Sampler.BorderColor))
+ return reportValueError(Ctx, "BorderColor ", Sampler.BorderColor);
+
+ if (!verifyLOD(Sampler.MinLOD))
+ return reportValueError(Ctx, "MinLOD ", Sampler.MinLOD);
+
+ if (!verifyLOD(Sampler.MaxLOD))
+ return reportValueError(Ctx, "MaxLOD ", Sampler.MaxLOD);
+
+ if (!verifyRegisterValue(Sampler.ShaderRegister))
+ return reportValueError(Ctx, "ShaderRegister", Sampler.ShaderRegister);
+
+ if (!verifyRegisterSpace(Sampler.RegisterSpace))
+ return reportValueError(Ctx, "RegisterSpace", Sampler.RegisterSpace);
+
+ if (!dxbc::isValidShaderVisibility(Sampler.ShaderVisibility))
+ return reportValueError(Ctx, "ShaderVisibility",
+ Sampler.ShaderVisibility);
+ }
+
return false;
}
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
index 35a8fb53248f9..77965064a4228 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
@@ -15,7 +15,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!2 = !{ ptr @main, !3 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
-!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x40403999A0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
; DXC: - Name: RTS0
; DXC-NEXT: Size: 76
@@ -31,7 +31,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
; DXC-NEXT: AddressU: 2
; DXC-NEXT: AddressV: 3
; DXC-NEXT: AddressW: 5
-; DXC-NEXT: MipLODBias: 32.45
+; DXC-NEXT: MipLODBias: 1.425
; DXC-NEXT: MaxAnisotropy: 9
; DXC-NEXT: ComparisonFunc: 3
; DXC-NEXT: BorderColor: 2
>From 611f0bb69a34960521c1e7288b30b94a3dc7a775 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 6 Jun 2025 06:54:07 +0000
Subject: [PATCH 55/69] adding tests
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 13 +++++--------
...gnature-StaticSamplers-Invalid-AddressU.ll | 19 +++++++++++++++++++
...gnature-StaticSamplers-Invalid-AddressV.ll | 19 +++++++++++++++++++
...gnature-StaticSamplers-Invalid-AddressW.ll | 19 +++++++++++++++++++
...ture-StaticSamplers-Invalid-BorderColor.ll | 19 +++++++++++++++++++
...e-StaticSamplers-Invalid-ComparisonFunc.ll | 19 +++++++++++++++++++
...Signature-StaticSamplers-Invalid-Filter.ll | 19 +++++++++++++++++++
...re-StaticSamplers-Invalid-MaxAnisotropy.ll | 19 +++++++++++++++++++
...Signature-StaticSamplers-Invalid-MaxLod.ll | 19 +++++++++++++++++++
...Signature-StaticSamplers-Invalid-MinLod.ll | 19 +++++++++++++++++++
...ature-StaticSamplers-Invalid-MinLopBias.ll | 19 +++++++++++++++++++
...re-StaticSamplers-Invalid-RegisterSpace.ll | 19 +++++++++++++++++++
...e-StaticSamplers-Invalid-ShaderRegister.ll | 19 +++++++++++++++++++
...StaticSamplers-Invalid-ShaderVisibility.ll | 19 +++++++++++++++++++
14 files changed, 252 insertions(+), 8 deletions(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index a6d87611a94d0..47e4d23532ef5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -666,10 +666,10 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
return reportValueError(Ctx, "AddressU", Sampler.AddressU);
if (!verifyAddress(Sampler.AddressV))
- return reportValueError(Ctx, "AddressU", Sampler.AddressV);
+ return reportValueError(Ctx, "AddressV", Sampler.AddressV);
if (!verifyAddress(Sampler.AddressW))
- return reportValueError(Ctx, "AddressU", Sampler.AddressW);
+ return reportValueError(Ctx, "AddressW", Sampler.AddressW);
if (!verifyMipLODBias(Sampler.MipLODBias))
return reportValueError(Ctx, "MipLODBias", Sampler.MipLODBias);
@@ -680,17 +680,14 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (!verifyComparisonFunc(Sampler.ComparisonFunc))
return reportValueError(Ctx, "ComparisonFunc", Sampler.ComparisonFunc);
- if (!verifyComparisonFunc(Sampler.ComparisonFunc))
- return reportValueError(Ctx, "ComparisonFunc", Sampler.ComparisonFunc);
-
if (!verifyBorderColor(Sampler.BorderColor))
- return reportValueError(Ctx, "BorderColor ", Sampler.BorderColor);
+ return reportValueError(Ctx, "BorderColor", Sampler.BorderColor);
if (!verifyLOD(Sampler.MinLOD))
- return reportValueError(Ctx, "MinLOD ", Sampler.MinLOD);
+ return reportValueError(Ctx, "MinLOD", Sampler.MinLOD);
if (!verifyLOD(Sampler.MaxLOD))
- return reportValueError(Ctx, "MaxLOD ", Sampler.MaxLOD);
+ return reportValueError(Ctx, "MaxLOD", Sampler.MaxLOD);
if (!verifyRegisterValue(Sampler.ShaderRegister))
return reportValueError(Ctx, "ShaderRegister", Sampler.ShaderRegister);
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll
new file mode 100644
index 0000000000000..124803e36a450
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for AddressU: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 666, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll
new file mode 100644
index 0000000000000..e2c5de1c36a0c
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for AddressV: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 666, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll
new file mode 100644
index 0000000000000..08fc8fa9e5093
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for AddressW: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 666, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll
new file mode 100644
index 0000000000000..83b31594b2bec
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for BorderColor: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 666, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll
new file mode 100644
index 0000000000000..b9cd1d9093325
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for ComparisonFunc: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 666, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll
new file mode 100644
index 0000000000000..303dc5defaf52
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for Filter: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 666, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll
new file mode 100644
index 0000000000000..084d6b326a67f
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for MaxAnisotropy: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 666, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll
new file mode 100644
index 0000000000000..b4d33197ca150
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for MaxLOD: 0
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 0x7FF8000000000000, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll
new file mode 100644
index 0000000000000..97fa803f4c165
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for MinLOD: 0
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float 0x7FF8000000000000, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll
new file mode 100644
index 0000000000000..cd4079d8edd74
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for MipLODBias: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 6.660000e+02, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll
new file mode 100644
index 0000000000000..eeea8821afd07
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for RegisterSpace: 4294967280
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 4294967280, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll
new file mode 100644
index 0000000000000..6750cdc1b77fa
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for ShaderRegister: 4294967295
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 4294967295, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll
new file mode 100644
index 0000000000000..4db55cf9c4b89
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll
@@ -0,0 +1,19 @@
+; RUN: not opt -passes='print<dxil-root-signature>' %s -S -o - 2>&1 | FileCheck %s
+
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: error: Invalid value for ShaderVisibility: 666
+; CHECK-NOT: Root Signature Definitions
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 666 }
>From 42beb33b922119d0a6129b8e5816bd596419e5cf Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 6 Jun 2025 18:35:08 +0000
Subject: [PATCH 56/69] addressing comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 47e4d23532ef5..31b77512da407 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -432,6 +432,11 @@ static bool verifyRangeType(uint32_t Type) {
return false;
}
+template <typename... FlagTypes>
+static bool isFlagSet(uint32_t Flags, FlagTypes... FlagsToCheck) {
+ return ((Flags & llvm::to_underlying(FlagsToCheck)) | ...) == Flags;
+}
+
static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
uint32_t FlagsVal) {
using FlagT = dxbc::DescriptorRangeFlag;
>From 0995050ca13db79a6b32ff7495d03fba0ee2ad29 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Mon, 9 Jun 2025 18:44:50 +0000
Subject: [PATCH 57/69] fix
---
llvm/lib/MC/DXContainerRootSignature.cpp | 1 -
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 3 ---
2 files changed, 4 deletions(-)
diff --git a/llvm/lib/MC/DXContainerRootSignature.cpp b/llvm/lib/MC/DXContainerRootSignature.cpp
index d67babf13a432..77d648a739b87 100644
--- a/llvm/lib/MC/DXContainerRootSignature.cpp
+++ b/llvm/lib/MC/DXContainerRootSignature.cpp
@@ -9,7 +9,6 @@
#include "llvm/MC/DXContainerRootSignature.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/EndianStream.h"
-#include <cstdint>
using namespace llvm;
using namespace llvm::mcdxbc;
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 31b77512da407..50a2fe3347dcf 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -12,8 +12,6 @@
//===----------------------------------------------------------------------===//
#include "DXILRootSignature.h"
#include "DirectX.h"
-#include "llvm/ADT/APFloat.h"
-#include "llvm/ADT/STLForwardCompat.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Analysis/DXILMetadataAnalysis.h"
@@ -29,7 +27,6 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
-#include <cmath>
#include <cstdint>
#include <optional>
#include <utility>
>From 24f38bd9506bfff566fd753f1180b581b8f448f9 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 12 Jun 2025 23:50:27 +0000
Subject: [PATCH 58/69] rebase
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 50a2fe3347dcf..3aef7d3eb1e69 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -27,6 +27,7 @@
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
+#include <cmath>
#include <cstdint>
#include <optional>
#include <utility>
>From 638d961a73a06a3b43c93c2b0fef85645517ee9d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 18 Jun 2025 18:31:49 +0000
Subject: [PATCH 59/69] remove empty file
---
llvm/test/CodeGen/DirectX/root-signature-error-accumulation.ll | 0
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 llvm/test/CodeGen/DirectX/root-signature-error-accumulation.ll
diff --git a/llvm/test/CodeGen/DirectX/root-signature-error-accumulation.ll b/llvm/test/CodeGen/DirectX/root-signature-error-accumulation.ll
deleted file mode 100644
index e69de29bb2d1d..0000000000000
>From 8b831f8ee219ea1154c36f89bea6ca9c230674f7 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 18 Jun 2025 19:00:33 +0000
Subject: [PATCH 60/69] adding check for mutually exclusive descriptor flags
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index e51bd6796fb84..477f644d03e62 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -365,6 +365,12 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
if (popcount(llvm::to_underlying(Flags & DataFlags)) > 1)
return false;
+ // The descriptor-specific flags are mutually exclusive.
+ FlagT DescriptorFlags = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS |
+ FlagT::DESCRIPTORS_VOLATILE;
+ if (popcount(llvm::to_underlying(Flags & DescriptorFlags)) > 1)
+ return false;
+
// For volatile descriptors, DATA_STATIC is never valid.
if ((Flags & FlagT::DESCRIPTORS_VOLATILE) == FlagT::DESCRIPTORS_VOLATILE) {
FlagT Mask = FlagT::DESCRIPTORS_VOLATILE;
>From 5c677a549923beaccc7aa0bf30af24a1b76286ee Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 18 Jun 2025 19:04:43 +0000
Subject: [PATCH 61/69] format
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 477f644d03e62..6a6e5b7f4ced5 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -366,8 +366,9 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
return false;
// The descriptor-specific flags are mutually exclusive.
- FlagT DescriptorFlags = FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS |
- FlagT::DESCRIPTORS_VOLATILE;
+ FlagT DescriptorFlags =
+ FlagT::DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS |
+ FlagT::DESCRIPTORS_VOLATILE;
if (popcount(llvm::to_underlying(Flags & DescriptorFlags)) > 1)
return false;
>From bce790c9813934a73630461e1eaa27ca99ff8e05 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 18 Jun 2025 22:15:26 +0000
Subject: [PATCH 62/69] address comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 6a6e5b7f4ced5..1ef7e2fe4f9f3 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -175,7 +175,6 @@ static bool parseRootDescriptors(LLVMContext *Ctx,
}
static bool parseDescriptorRange(LLVMContext *Ctx,
- mcdxbc::RootSignatureDesc &RSD,
mcdxbc::DescriptorTable &Table,
MDNode *RangeDescriptorNode) {
@@ -197,9 +196,9 @@ static bool parseDescriptorRange(LLVMContext *Ctx,
.Case("UAV", llvm::to_underlying(dxbc::DescriptorRangeType::UAV))
.Case("Sampler",
llvm::to_underlying(dxbc::DescriptorRangeType::Sampler))
- .Default(-1u);
+ .Default(~0U);
- if (Range.RangeType == -1u)
+ if (Range.RangeType == ~0U)
return reportError(Ctx, "Invalid Descriptor Range type: " + *ElementText);
if (std::optional<uint32_t> Val = extractMdIntValue(RangeDescriptorNode, 1))
@@ -254,7 +253,7 @@ static bool parseDescriptorTable(LLVMContext *Ctx,
if (Element == nullptr)
return reportError(Ctx, "Missing Root Element Metadata Node.");
- if (parseDescriptorRange(Ctx, RSD, Table, Element))
+ if (parseDescriptorRange(Ctx, Table, Element))
return true;
}
@@ -354,8 +353,8 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
if (Version == 1) {
if (IsSampler)
- return Flags == FlagT::NONE;
- return Flags == FlagT::DESCRIPTORS_VOLATILE;
+ return Flags == FlagT::DESCRIPTORS_VOLATILE;
+ return Flags == (FlagT::DATA_VOLATILE | FlagT::DESCRIPTORS_VOLATILE);
}
// The data-specific flags are mutually exclusive.
@@ -392,7 +391,10 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
Mask |= FlagT::DATA_STATIC;
Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
}
- return (Flags & ~Mask) == FlagT::NONE;
+
+ if (!IsSampler)
+ return (Flags & ~Mask) == FlagT::NONE;
+ return false;
}
// When no descriptor flag is set, any data flag is allowed.
>From fefe8209b4d76fc85da07af4ca9fa4c90a001b91 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Wed, 18 Jun 2025 23:48:09 +0000
Subject: [PATCH 63/69] remove value
---
.../BinaryFormat/DXContainerConstants.def | 1 -
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 47 ++++++++-----------
2 files changed, 19 insertions(+), 29 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 783401df69783..a281256a44ae0 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -106,7 +106,6 @@ DESCRIPTOR_RANGE(0, SRV)
DESCRIPTOR_RANGE(1, UAV)
DESCRIPTOR_RANGE(2, CBV)
DESCRIPTOR_RANGE(3, Sampler)
-DESCRIPTOR_RANGE(4, NONE)
#undef DESCRIPTOR_RANGE
#endif // DESCRIPTOR_RANGE
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 1ef7e2fe4f9f3..afbd9bcbeca0b 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -564,32 +564,27 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
continue;
const auto &RS = It->second;
OS << "Definition for '" << F.getName() << "':\n";
-
// start root signature header
- OS << "Flags: " << format_hex(RS.Flags, 8) << "\n";
- OS << "Version: " << RS.Version << "\n";
- OS << "RootParametersOffset: " << RS.RootParameterOffset << "\n";
- OS << "NumParameters: " << RS.ParametersContainer.size() << "\n";
+ OS << "Flags: " << format_hex(RS.Flags, 8) << "\n"
+ << "Version: " << RS.Version << "\n"
+ << "RootParametersOffset: " << RS.RootParameterOffset << "\n"
+ << "NumParameters: " << RS.ParametersContainer.size() << "\n";
for (size_t I = 0; I < RS.ParametersContainer.size(); I++) {
const auto &[Type, Loc] =
RS.ParametersContainer.getTypeAndLocForParameter(I);
const dxbc::RTS0::v1::RootParameterHeader Header =
RS.ParametersContainer.getHeader(I);
- OS << "- Parameter Type: " << Type << "\n";
- OS << indent(2) << "Shader Visibility: " << Header.ShaderVisibility
- << "\n";
+ OS << "- Parameter Type: " << Type << "\n"
+ << " Shader Visibility: " << Header.ShaderVisibility << "\n";
switch (Type) {
case llvm::to_underlying(dxbc::RootParameterType::Constants32Bit): {
const dxbc::RTS0::v1::RootConstants &Constants =
RS.ParametersContainer.getConstant(Loc);
- OS << indent(2) << "Register Space: " << Constants.RegisterSpace
- << "\n";
- OS << indent(2) << "Shader Register: " << Constants.ShaderRegister
- << "\n";
- OS << indent(2) << "Num 32 Bit Values: " << Constants.Num32BitValues
- << "\n";
+ OS << " Register Space: " << Constants.RegisterSpace << "\n"
+ << " Shader Register: " << Constants.ShaderRegister << "\n"
+ << " Num 32 Bit Values: " << Constants.Num32BitValues << "\n";
break;
}
case llvm::to_underlying(dxbc::RootParameterType::CBV):
@@ -597,30 +592,26 @@ PreservedAnalyses RootSignatureAnalysisPrinter::run(Module &M,
case llvm::to_underlying(dxbc::RootParameterType::SRV): {
const dxbc::RTS0::v2::RootDescriptor &Descriptor =
RS.ParametersContainer.getRootDescriptor(Loc);
- OS << indent(2) << "Register Space: " << Descriptor.RegisterSpace
- << "\n";
- OS << indent(2) << "Shader Register: " << Descriptor.ShaderRegister
- << "\n";
+ OS << " Register Space: " << Descriptor.RegisterSpace << "\n"
+ << " Shader Register: " << Descriptor.ShaderRegister << "\n";
if (RS.Version > 1)
- OS << indent(2) << "Flags: " << Descriptor.Flags << "\n";
+ OS << " Flags: " << Descriptor.Flags << "\n";
break;
}
case llvm::to_underlying(dxbc::RootParameterType::DescriptorTable): {
const mcdxbc::DescriptorTable &Table =
RS.ParametersContainer.getDescriptorTable(Loc);
- OS << indent(2) << "NumRanges: " << Table.Ranges.size() << "\n";
+ OS << " NumRanges: " << Table.Ranges.size() << "\n";
for (const dxbc::RTS0::v2::DescriptorRange Range : Table) {
- OS << indent(2) << "- Range Type: " << Range.RangeType << "\n";
- OS << indent(4) << "Register Space: " << Range.RegisterSpace << "\n";
- OS << indent(4)
- << "Base Shader Register: " << Range.BaseShaderRegister << "\n";
- OS << indent(4) << "Num Descriptors: " << Range.NumDescriptors
- << "\n";
- OS << indent(4) << "Offset In Descriptors From Table Start: "
+ OS << " - Range Type: " << Range.RangeType << "\n"
+ << " Register Space: " << Range.RegisterSpace << "\n"
+ << " Base Shader Register: " << Range.BaseShaderRegister << "\n"
+ << " Num Descriptors: " << Range.NumDescriptors << "\n"
+ << " Offset In Descriptors From Table Start: "
<< Range.OffsetInDescriptorsFromTableStart << "\n";
if (RS.Version > 1)
- OS << indent(4) << "Flags: " << Range.Flags << "\n";
+ OS << " Flags: " << Range.Flags << "\n";
}
break;
}
>From e577503fe99407c1dab9032481ab869b1b0a2ae5 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 19 Jun 2025 18:40:12 +0000
Subject: [PATCH 64/69] adding support to version in metadata
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 10 ++++++++--
.../RootSignature-Error-is-not-function.ll | 4 ++--
.../ContainerData/RootSignature-Error-is-not-value.ll | 4 ++--
.../RootSignature-Error-no-root-element-list.ll | 4 ++--
.../RootSignature-Error-root-element-not-mdnode.ll | 4 ++--
.../DirectX/ContainerData/RootSignature-Flags-Error.ll | 2 +-
.../DirectX/ContainerData/RootSignature-Flags.ll | 2 +-
.../RootSignature-MultipleEntryFunctions.ll | 4 ++--
.../ContainerData/RootSignature-NullFunction-Error.ll | 4 ++--
...ignature-Parameters-Invalid-ParameterIsNotString.ll | 2 +-
.../RootSignature-Parameters-Validation-Error.ll | 2 +-
.../DirectX/ContainerData/RootSignature-Parameters.ll | 2 +-
...otSignature-RootConstants-Invalid-Num32BitValues.ll | 2 +-
...ootSignature-RootConstants-Invalid-RegisterSpace.ll | 2 +-
...otSignature-RootConstants-Invalid-ShaderRegister.ll | 2 +-
.../ContainerData/RootSignature-RootConstants.ll | 2 +-
.../RootSignature-RootDescriptor-Invalid-Flags.ll | 2 +-
...ootSignature-RootDescriptor-Invalid-RegisterKind.ll | 2 +-
...otSignature-RootDescriptor-Invalid-RegisterSpace.ll | 2 +-
...otSignature-RootDescriptor-Invalid-RegisterValue.ll | 2 +-
.../ContainerData/RootSignature-RootDescriptor.ll | 2 +-
.../ContainerData/RootSignature-RootElement-Error.ll | 2 +-
...ootSignature-RootFlags-VisibilityValidationError.ll | 2 +-
23 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 3d195acb19e18..88914a31f46e1 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -309,7 +309,7 @@ analyzeModule(Module &M) {
return RSDMap;
for (const auto &RSDefNode : RootSignatureNode->operands()) {
- if (RSDefNode->getNumOperands() != 2) {
+ if (RSDefNode->getNumOperands() != 3) {
reportError(Ctx, "Invalid format for Root Signature Definition. Pairs "
"of function, root signature expected.");
continue;
@@ -348,8 +348,14 @@ analyzeModule(Module &M) {
reportError(Ctx, "Root Element is not a metadata node.");
continue;
}
-
mcdxbc::RootSignatureDesc RSD;
+ if (std::optional<uint32_t> Version = extractMdIntValue(RSDefNode, 2))
+ RSD.Version = *Version;
+ else {
+ reportError(Ctx, "Invalid RSDefNode value, expected constant int");
+ continue;
+ }
+
// 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.
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-function.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-function.ll
index ad2aa7997eba9..fbda7561cecad 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-function.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-function.ll
@@ -18,9 +18,9 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ i32 -1, !6 } ; function, root signature
+!5 = !{ i32 -1, !6, i32 2 } ; function, root signature
!6 = !{ !7 } ; list of root signature elements
!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-value.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-value.ll
index 4d881f96e4c3b..94ab52e1f29c0 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-value.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-is-not-value.ll
@@ -18,9 +18,9 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ !3, !6 } ; function, root signature
+!5 = !{ !3, !6, i32 2 } ; function, root signature
!6 = !{ !7 } ; list of root signature elements
!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-no-root-element-list.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-no-root-element-list.ll
index b5109022b4b0d..dc7a3fd103207 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-no-root-element-list.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-no-root-element-list.ll
@@ -18,9 +18,9 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, null } ; function, root signature
+!2 = !{ ptr @main, null, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ i32 -1, !6 } ; function, root signature
+!5 = !{ i32 -1, !6, i32 2 } ; function, root signature
!6 = !{ !7 } ; list of root signature elements
!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-root-element-not-mdnode.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-root-element-not-mdnode.ll
index 7e6bcdadd3862..3028ca99e4ef6 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-root-element-not-mdnode.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Error-root-element-not-mdnode.ll
@@ -18,9 +18,9 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, i32 -1 } ; function, root signature
+!2 = !{ ptr @main, i32 -1, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ i32 -1, !6 } ; function, root signature
+!5 = !{ i32 -1, !6, i32 2 } ; function, root signature
!6 = !{ !7 } ; list of root signature elements
!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
index 4921472d253ad..65511160f230d 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags-Error.ll
@@ -15,6 +15,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"NOTRootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
index e81679732a5d8..10235b7d17960 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Flags.ll
@@ -13,7 +13,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
index d23e1c71d2fc0..fec9c226d8bc5 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-MultipleEntryFunctions.ll
@@ -16,10 +16,10 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ ptr @anotherMain, !6 } ; function, root signature
+!5 = !{ ptr @anotherMain, !6, i32 2 } ; function, root signature
!6 = !{ !7 } ; list of root signature elements
!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-NullFunction-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-NullFunction-Error.ll
index f5caa50124788..c6b57ee31c87a 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-NullFunction-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-NullFunction-Error.ll
@@ -13,9 +13,9 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2, !5} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
-!5 = !{ null, !6 } ; function, root signature
+!5 = !{ null, !6, i32 2 } ; function, root signature
!6 = !{ !7 } ; list of root signature elements
!7 = !{ !"RootFlags", i32 2 } ; 1 = allow_input_assembler_input_layout
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll
index 04edd00eee643..b4b616f8fd6ee 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Invalid-ParameterIsNotString.ll
@@ -14,6 +14,6 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!0}
-!0 = !{ ptr @main, !1 }
+!0 = !{ ptr @main, !1, i32 2 }
!1 = !{ !2 }
!2 = !{ i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
index 2b4a075281f80..a61928d0a7fd3 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters-Validation-Error.ll
@@ -15,6 +15,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 255, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
index 714c76213e1b5..80aa757d7e10a 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -11,7 +11,7 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4, !5, !6 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
index 552c128e5ab57..121bc6e932a48 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-Num32BitValues.ll
@@ -11,6 +11,6 @@ entry:
}
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, !"Invalid" }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
index 1087b414942e2..3534e5d1c5a26 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-RegisterSpace.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 0, i32 1, !"Invalid", i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
index 53fd924e8f46e..5c3dce2f419ee 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants-Invalid-ShaderRegister.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 0, !"Invalid", i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
index 71511ff523340..964554fe143ef 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootConstants.ll
@@ -13,7 +13,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
index 4229981240918..6c90bcb09b64b 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll
index 4aed84efbe2bc..579528d8b5e13 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterKind.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"Invalid", i32 0, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll
index 020d117ba45dc..18582090e761d 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterSpace.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootCBV", i32 0, i32 1, i32 4294967280, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll
index edb8b943c6e35..8bbfdf00bea29 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-RegisterValue.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootCBV", i32 0, i32 4294967295, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
index 9217945855cd9..f77bb96840bea 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor.ll
@@ -13,7 +13,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 8 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
index 89e23f6540c5f..aa8d46dccbac4 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootElement-Error.ll
@@ -15,5 +15,5 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !"NOTRootElements" } ; list of root signature elements
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll
index 4b8e6abacd7ad..baeb74c2c3ce7 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootFlags-VisibilityValidationError.ll
@@ -15,6 +15,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 2147487744 } ; 1 = allow_input_assembler_input_layout
>From 746c54a7279bef591571ea8838382c5f35e669cf Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 19 Jun 2025 20:29:48 +0000
Subject: [PATCH 65/69] fix tests
---
...tSignature-RootDescriptor-Invalid-Flags.ll | 2 +-
.../RootSignature-RootDescriptor_V1.ll | 34 +++++++++++++++++++
2 files changed, 35 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
index 6c90bcb09b64b..82171c9627db3 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
@@ -13,6 +13,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 1 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 3 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll
new file mode 100644
index 0000000000000..e05c42a22ea48
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor_V1.ll
@@ -0,0 +1,34 @@
+; RUN: opt %s -dxil-embed -dxil-globals -S -o - | FileCheck %s
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+; CHECK: @dx.rts0 = private constant [44 x i8] c"{{.*}}", section "RTS0", align 4
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3, i32 1 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"RootCBV", i32 0, i32 1, i32 2, i32 8 }
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 44
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 1
+; DXC-NEXT: NumRootParameters: 1
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: 2
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: Descriptor:
+; DXC-NEXT: RegisterSpace: 2
+; DXC-NEXT: ShaderRegister: 1
+; DXC-NOT: DATA_STATIC: true
>From a66e6a330eed085917103d6e1e911eec8ff58640 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Thu, 19 Jun 2025 21:53:58 +0000
Subject: [PATCH 66/69] add test
---
...criptorTable-AllValidFlagCombinationsV1.ll | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll
new file mode 100644
index 0000000000000..9d89dbdd9107b
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinationsV1.ll
@@ -0,0 +1,44 @@
+; RUN: llc %s --filetype=obj -o - | obj2yaml | FileCheck %s --check-prefix=DXC
+
+target triple = "dxil-unknown-shadermodel6.0-compute"
+
+define void @main() #0 {
+entry:
+ ret void
+}
+attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
+
+
+!dx.rootsignatures = !{!2} ; list of function/root signature pairs
+!2 = !{ ptr @main, !3, i32 1 } ; function, root signature
+!3 = !{ !5 } ; list of root signature elements
+!5 = !{ !"DescriptorTable", i32 0, !6, !7 }
+!6 = !{ !"Sampler", i32 0, i32 1, i32 0, i32 -1, i32 1 }
+!7 = !{ !"UAV", i32 5, i32 1, i32 10, i32 5, i32 3 }
+
+
+; DXC: - Name: RTS0
+; DXC-NEXT: Size: 84
+; DXC-NEXT: RootSignature:
+; DXC-NEXT: Version: 1
+; DXC-NEXT: NumRootParameters: 1
+; DXC-NEXT: RootParametersOffset: 24
+; DXC-NEXT: NumStaticSamplers: 0
+; DXC-NEXT: StaticSamplersOffset: 0
+; DXC-NEXT: Parameters:
+; DXC-NEXT: - ParameterType: 0
+; DXC-NEXT: ShaderVisibility: 0
+; DXC-NEXT: Table:
+; DXC-NEXT: NumRanges: 2
+; DXC-NEXT: RangesOffset: 44
+; DXC-NEXT: Ranges:
+; DXC-NEXT: - RangeType: 3
+; DXC-NEXT: NumDescriptors: 0
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 0
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+; DXC-NEXT: - RangeType: 1
+; DXC-NEXT: NumDescriptors: 5
+; DXC-NEXT: BaseShaderRegister: 1
+; DXC-NEXT: RegisterSpace: 10
+; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
>From 4a0a955d901dd88e91d40311c329d0965b13bae0 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 20 Jun 2025 01:44:01 +0000
Subject: [PATCH 67/69] fix merge and test issues
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 9 +-
...escriptorTable-AllValidFlagCombinations.ll | 225 +++++++++---------
.../ContainerData/RootSignature-Parameters.ll | 2 +-
3 files changed, 114 insertions(+), 122 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 1cef21f477a1e..12a1df1150d14 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -391,14 +391,13 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
Mask |= FlagT::DATA_STATIC;
Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
}
-
- if (!IsSampler)
- return (Flags & ~Mask) == FlagT::NONE;
- return false;
+ return (Flags & ~Mask) == FlagT::NONE;
}
// When no descriptor flag is set, any data flag is allowed.
- return (Flags & ~DataFlags) == FlagT::NONE;
+ if (!IsSampler)
+ return (Flags & ~DataFlags) == FlagT::NONE;
+ return (Flags & ~FlagT::NONE) == FlagT::NONE;
}
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll
index decb0781bfd51..8eb7f90c6b757 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-DescriptorTable-AllValidFlagCombinations.ll
@@ -12,7 +12,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
-!5 = !{ !"DescriptorTable", i32 0, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20 }
+!5 = !{ !"DescriptorTable", i32 0, !6, !8, !9, !10, !11, !12, !13, !14, !15, !16, !17, !18, !19, !20 }
; typedef enum D3D12_DESCRIPTOR_RANGE_FLAGS {
; NONE = 0,
@@ -25,14 +25,12 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
;0
!6 = !{ !"Sampler", i32 1, i32 0, i32 1, i32 -1, i32 0 }
-;DATA_VOLATILE
-!7 = !{ !"Sampler", i32 1, i32 0, i32 2, i32 -1, i32 2 }
-;DATA_STATIC_WHILE_SET_AT_EXECUTE
-!8 = !{ !"Sampler", i32 1, i32 0, i32 3, i32 -1, i32 4 }
-;DATA_STATIC
-!9 = !{ !"Sampler", i32 1, i32 0, i32 4, i32 -1, i32 8 }
+;DESCRIPTORS_VOLATILE
+!8 = !{ !"Sampler", i32 1, i32 0, i32 3, i32 -1, i32 1 }
+;DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS
+!9 = !{ !"Sampler", i32 1, i32 0, i32 4, i32 -1, i32 65536 }
;0
-!10 = !{ !"SRV", i32 1, i32 0, i32 5, i32 -1, i32 0 }
+!10 = !{ !"SRV", i32 1, i32 0, i32 5, i32 -1, i32 1 }
;DESCRIPTORS_VOLATILE
!11 = !{ !"UAV", i32 5, i32 1, i32 6, i32 5, i32 1 }
;DATA_VOLATILE
@@ -54,111 +52,106 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
;DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS | DATA_STATIC_WHILE_SET_AT_EXECUTE
!20 = !{ !"UAV", i32 5, i32 1, i32 15, i32 5, i32 65540 }
-; DXC: - Name: RTS0
-; DXC-NEXT: Size: 404
-; DXC-NEXT: RootSignature:
-; DXC-NEXT: Version: 2
-; DXC-NEXT: NumRootParameters: 1
-; DXC-NEXT: RootParametersOffset: 24
-; DXC-NEXT: NumStaticSamplers: 0
-; DXC-NEXT: StaticSamplersOffset: 0
-; DXC-NEXT: Parameters:
-; DXC-NEXT: - ParameterType: 0
-; DXC-NEXT: ShaderVisibility: 0
-; DXC-NEXT: Table:
-; DXC-NEXT: NumRanges: 15
-; DXC-NEXT: RangesOffset: 44
-; DXC-NEXT: Ranges:
-; DXC-NEXT: - RangeType: 3
-; DXC-NEXT: NumDescriptors: 1
-; DXC-NEXT: BaseShaderRegister: 0
-; DXC-NEXT: RegisterSpace: 1
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
-; DXC-NEXT: - RangeType: 3
-; DXC-NEXT: NumDescriptors: 1
-; DXC-NEXT: BaseShaderRegister: 0
-; DXC-NEXT: RegisterSpace: 2
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
-; DXC-NEXT: DATA_VOLATILE: true
-; DXC-NEXT: - RangeType: 3
-; DXC-NEXT: NumDescriptors: 1
-; DXC-NEXT: BaseShaderRegister: 0
-; DXC-NEXT: RegisterSpace: 3
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
-; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
-; DXC-NEXT: - RangeType: 3
-; DXC-NEXT: NumDescriptors: 1
-; DXC-NEXT: BaseShaderRegister: 0
-; DXC-NEXT: RegisterSpace: 4
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
-; DXC-NEXT: DATA_STATIC: true
-; DXC-NEXT: - RangeType: 0
-; DXC-NEXT: NumDescriptors: 1
-; DXC-NEXT: BaseShaderRegister: 0
-; DXC-NEXT: RegisterSpace: 5
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
-; DXC-NEXT: - RangeType: 1
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 6
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DESCRIPTORS_VOLATILE: true
-; DXC-NEXT: - RangeType: 2
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 7
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DATA_VOLATILE: true
-; DXC-NEXT: - RangeType: 0
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 8
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DATA_STATIC: true
-; DXC-NEXT: - RangeType: 1
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 9
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
-; DXC-NEXT: - RangeType: 2
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 10
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DESCRIPTORS_VOLATILE: true
-; DXC-NEXT: DATA_VOLATILE: true
-; DXC-NEXT: - RangeType: 0
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 11
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DESCRIPTORS_VOLATILE: true
-; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
-; DXC-NEXT: - RangeType: 1
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 12
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
-; DXC-NEXT: - RangeType: 2
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 13
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DATA_VOLATILE: true
-; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
-; DXC-NEXT: - RangeType: 0
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 14
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DATA_STATIC: true
-; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
-; DXC-NEXT: - RangeType: 1
-; DXC-NEXT: NumDescriptors: 5
-; DXC-NEXT: BaseShaderRegister: 1
-; DXC-NEXT: RegisterSpace: 15
-; DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
-; DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
-; DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+;DXC:- Name: RTS0
+;DXC-NEXT: Size: 380
+;DXC-NEXT: RootSignature:
+;DXC-NEXT: Version: 2
+;DXC-NEXT: NumRootParameters: 1
+;DXC-NEXT: RootParametersOffset: 24
+;DXC-NEXT: NumStaticSamplers: 0
+;DXC-NEXT: StaticSamplersOffset: 0
+;DXC-NEXT: Parameters:
+;DXC-NEXT: - ParameterType: 0
+;DXC-NEXT: ShaderVisibility: 0
+;DXC-NEXT: Table:
+;DXC-NEXT: NumRanges: 14
+;DXC-NEXT: RangesOffset: 44
+;DXC-NEXT: Ranges:
+;DXC-NEXT: - RangeType: 3
+;DXC-NEXT: NumDescriptors: 1
+;DXC-NEXT: BaseShaderRegister: 0
+;DXC-NEXT: RegisterSpace: 1
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+;DXC-NEXT: - RangeType: 3
+;DXC-NEXT: NumDescriptors: 1
+;DXC-NEXT: BaseShaderRegister: 0
+;DXC-NEXT: RegisterSpace: 3
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+;DXC-NEXT: DESCRIPTORS_VOLATILE: true
+;DXC-NEXT: - RangeType: 3
+;DXC-NEXT: NumDescriptors: 1
+;DXC-NEXT: BaseShaderRegister: 0
+;DXC-NEXT: RegisterSpace: 4
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+;DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+;DXC-NEXT: - RangeType: 0
+;DXC-NEXT: NumDescriptors: 1
+;DXC-NEXT: BaseShaderRegister: 0
+;DXC-NEXT: RegisterSpace: 5
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 4294967295
+;DXC-NEXT: DESCRIPTORS_VOLATILE: true
+;DXC-NEXT: - RangeType: 1
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 6
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DESCRIPTORS_VOLATILE: true
+;DXC-NEXT: - RangeType: 2
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 7
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DATA_VOLATILE: true
+;DXC-NEXT: - RangeType: 0
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 8
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DATA_STATIC: true
+;DXC-NEXT: - RangeType: 1
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 9
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+;DXC-NEXT: - RangeType: 2
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 10
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DESCRIPTORS_VOLATILE: true
+;DXC-NEXT: DATA_VOLATILE: true
+;DXC-NEXT: - RangeType: 0
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 11
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DESCRIPTORS_VOLATILE: true
+;DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+;DXC-NEXT: - RangeType: 1
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 12
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+;DXC-NEXT: - RangeType: 2
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 13
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DATA_VOLATILE: true
+;DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+;DXC-NEXT: - RangeType: 0
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 14
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DATA_STATIC: true
+;DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
+;DXC-NEXT: - RangeType: 1
+;DXC-NEXT: NumDescriptors: 5
+;DXC-NEXT: BaseShaderRegister: 1
+;DXC-NEXT: RegisterSpace: 15
+;DXC-NEXT: OffsetInDescriptorsFromTableStart: 5
+;DXC-NEXT: DATA_STATIC_WHILE_SET_AT_EXECUTE: true
+;DXC-NEXT: DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS: true
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
index 7e044c1250b6d..d0a58bc34ffa4 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-Parameters.ll
@@ -11,7 +11,7 @@ entry:
attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3, i32 2, i32 2 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !4, !5, !6, !7 } ; list of root signature elements
!4 = !{ !"RootFlags", i32 1 } ; 1 = allow_input_assembler_input_layout
!5 = !{ !"RootConstants", i32 0, i32 1, i32 2, i32 3 }
>From 4e655da19b4935db06a9673d497c8b295852e5b6 Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 20 Jun 2025 17:24:05 +0000
Subject: [PATCH 68/69] addressing comments
---
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 14 ++++++++++----
.../RootSignature-RootDescriptor-Invalid-Flags.ll | 2 +-
2 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 12a1df1150d14..1f175fd4ecd99 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -352,6 +352,8 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
(Type == llvm::to_underlying(dxbc::DescriptorRangeType::Sampler));
if (Version == 1) {
+ // Since the metadata is unversioned, we expect to explicitly see the values
+ // that map to the version 1 behaviour here.
if (IsSampler)
return Flags == FlagT::DESCRIPTORS_VOLATILE;
return Flags == (FlagT::DATA_VOLATILE | FlagT::DESCRIPTORS_VOLATILE);
@@ -395,9 +397,13 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
}
// When no descriptor flag is set, any data flag is allowed.
- if (!IsSampler)
- return (Flags & ~DataFlags) == FlagT::NONE;
- return (Flags & ~FlagT::NONE) == FlagT::NONE;
+ FlagT Mask = FlagT::NONE;
+ if (!IsSampler) {
+ Mask |= FlagT::DATA_VOLATILE;
+ Mask |= FlagT::DATA_STATIC;
+ Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ }
+ return (Flags & ~Mask) == FlagT::NONE;
}
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
@@ -434,7 +440,7 @@ static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
if (RSD.Version > 1) {
if (!verifyDescriptorFlag(Descriptor.Flags))
- return reportValueError(Ctx, "DescriptorFlag", Descriptor.Flags);
+ return reportValueError(Ctx, "DescriptorRangeFlag", Descriptor.Flags);
}
break;
}
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
index 6c90bcb09b64b..7ee04710be0ae 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-RootDescriptor-Invalid-Flags.ll
@@ -3,7 +3,7 @@
target triple = "dxil-unknown-shadermodel6.0-compute"
-; CHECK: error: Invalid value for DescriptorFlag: 3
+; CHECK: error: Invalid value for DescriptorRangeFlag: 3
; CHECK-NOT: Root Signature Definitions
define void @main() #0 {
entry:
>From 2507ea3c9d2effcdf33820d237ac73262731c35d Mon Sep 17 00:00:00 2001
From: joaosaffran <joao.saffran at microsoft.com>
Date: Fri, 20 Jun 2025 18:25:35 +0000
Subject: [PATCH 69/69] address comment
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 2 +
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 76 +++----------------
...gnature-StaticSamplers-Invalid-AddressU.ll | 2 +-
...gnature-StaticSamplers-Invalid-AddressV.ll | 2 +-
...gnature-StaticSamplers-Invalid-AddressW.ll | 2 +-
...ture-StaticSamplers-Invalid-BorderColor.ll | 2 +-
...e-StaticSamplers-Invalid-ComparisonFunc.ll | 2 +-
...Signature-StaticSamplers-Invalid-Filter.ll | 6 +-
...re-StaticSamplers-Invalid-MaxAnisotropy.ll | 2 +-
...Signature-StaticSamplers-Invalid-MaxLod.ll | 2 +-
...Signature-StaticSamplers-Invalid-MinLod.ll | 2 +-
...ature-StaticSamplers-Invalid-MinLopBias.ll | 2 +-
...re-StaticSamplers-Invalid-RegisterSpace.ll | 2 +-
...e-StaticSamplers-Invalid-ShaderRegister.ll | 2 +-
...StaticSamplers-Invalid-ShaderVisibility.ll | 2 +-
.../RootSignature-StaticSamplers.ll | 2 +-
16 files changed, 27 insertions(+), 83 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 56c9e53308674..d78455d01d806 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -218,6 +218,8 @@ inline bool isValidShaderVisibility(uint32_t V) {
#define STATIC_SAMPLER_FILTER(Val, Enum) Enum = Val,
enum class StaticSamplerFilter : uint32_t {
#include "DXContainerConstants.def"
+
+ LLVM_MARK_AS_BITMASK_ENUM(MAXIMUM_ANISOTROPIC)
};
#define TEXTURE_ADDRESS_MODE(Val, Enum) Enum = Val,
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 3d07e977ca51e..8d1288be2fbee 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -497,73 +497,15 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
return (Flags & ~Mask) == FlagT::NONE;
}
-static bool verifySamplerFilter(uint32_t Filter) {
- switch (Filter) {
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_MIP_POINT):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MIN_POINT_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_POINT_MAG_MIP_LINEAR):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_LINEAR_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MIN_LINEAR_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MIN_MAG_MIP_LINEAR):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::ANISOTROPIC):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_POINT_MAG_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_LINEAR_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::COMPARISON_MIN_MAG_MIP_LINEAR):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::COMPARISON_ANISOTROPIC):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_POINT_MAG_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_LINEAR_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MINIMUM_MIN_MAG_MIP_LINEAR):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MINIMUM_ANISOTROPIC):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_POINT_MAG_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_LINEAR_MAG_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_LINEAR_MIP_POINT):
- case llvm::to_underlying(
- dxbc::StaticSamplerFilter::MAXIMUM_MIN_MAG_MIP_LINEAR):
- case llvm::to_underlying(dxbc::StaticSamplerFilter::MAXIMUM_ANISOTROPIC):
- return true;
- }
- return false;
+static bool verifySamplerFilter(uint32_t Value) {
+ dxbc::StaticSamplerFilter Filter = dxbc::StaticSamplerFilter(Value);
+
+ dxbc::StaticSamplerFilter Mask = dxbc::StaticSamplerFilter::MIN_MAG_MIP_POINT;
+
+#define STATIC_SAMPLER_FILTER(Num, Val) Mask |= dxbc::StaticSamplerFilter::Val;
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+
+ return popcount(llvm::to_underlying(Filter & Mask)) == 1;
}
// Values allowed here:
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll
index 124803e36a450..288dea00b6e55 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressU.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 666, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll
index e2c5de1c36a0c..e9abcf9669999 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressV.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 666, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll
index 08fc8fa9e5093..238f488ee78d6 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-AddressW.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 666, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll
index 83b31594b2bec..8dc69eb1f9d7c 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-BorderColor.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 666, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll
index b9cd1d9093325..b2c8faf8d4a0a 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ComparisonFunc.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 666, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll
index 303dc5defaf52..758d2629ed78e 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-Filter.ll
@@ -3,7 +3,7 @@
target triple = "dxil-unknown-shadermodel6.0-compute"
-; CHECK: error: Invalid value for Filter: 666
+; CHECK: error: Invalid value for Filter: 45
; CHECK-NOT: Root Signature Definitions
define void @main() #0 {
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
-!5 = !{ !"StaticSampler", i32 666, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
+!5 = !{ !"StaticSampler", i32 45, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll
index 084d6b326a67f..47d4b52d72e8e 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxAnisotropy.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 666, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll
index b4d33197ca150..7e7d56eff309c 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MaxLod.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 0x7FF8000000000000, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll
index 97fa803f4c165..d958f10d3c1af 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLod.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float 0x7FF8000000000000, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll
index cd4079d8edd74..34b27eb40f5fb 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-MinLopBias.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 6.660000e+02, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll
index eeea8821afd07..dc6ee4290b532 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-RegisterSpace.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 4294967280, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll
index 6750cdc1b77fa..6cee1dd95fd81 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderRegister.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 4294967295, i32 0, i32 0 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll
index 4db55cf9c4b89..fa5bf12e2b8cd 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers-Invalid-ShaderVisibility.ll
@@ -14,6 +14,6 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 666 }
diff --git a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
index 77965064a4228..d9ee39dbb7287 100644
--- a/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
+++ b/llvm/test/CodeGen/DirectX/ContainerData/RootSignature-StaticSamplers.ll
@@ -13,7 +13,7 @@ attributes #0 = { "hlsl.numthreads"="1,1,1" "hlsl.shader"="compute" }
!dx.rootsignatures = !{!2} ; list of function/root signature pairs
-!2 = !{ ptr @main, !3 } ; function, root signature
+!2 = !{ ptr @main, !3, i32 2 } ; function, root signature
!3 = !{ !5 } ; list of root signature elements
!5 = !{ !"StaticSampler", i32 4, i32 2, i32 3, i32 5, float 0x3FF6CCCCC0000000, i32 9, i32 3, i32 2, float -1.280000e+02, float 1.280000e+02, i32 42, i32 0, i32 0 }
More information about the llvm-commits
mailing list