[clang] [llvm] [NFC][HLSL][DirectX] Let `HLSLRootSignature` reuse the `dxbc` defined enums (PR #145986)
Finn Plummer via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 27 15:58:29 PDT 2025
https://github.com/inbelic updated https://github.com/llvm/llvm-project/pull/145986
>From cc71ffc2efcb929f9c56ab3485b20a97fb4b1c54 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 20:13:01 +0000
Subject: [PATCH 01/16] nfc: prepare dxbc::RootFlags
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 6 ++-
.../BinaryFormat/DXContainerConstants.def | 44 ++++++++++---------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/BinaryFormat/DXContainer.cpp | 9 ++++
llvm/lib/Frontend/HLSL/CMakeLists.txt | 1 +
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 11 +++--
6 files changed, 44 insertions(+), 29 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 45170f550faf1..f3a9c8ac20b06 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -157,11 +157,13 @@ enum class FeatureFlags : uint64_t {
static_assert((uint64_t)FeatureFlags::NextUnusedBit <= 1ull << 63,
"Shader flag bits exceed enum size.");
-#define ROOT_ELEMENT_FLAG(Num, Val) Val = Num,
-enum class RootElementFlag : uint32_t {
+#define ROOT_SIGNATURE_FLAG(Num, Val) Val = Num,
+enum class RootFlags : uint32_t {
#include "DXContainerConstants.def"
};
+LLVM_ABI ArrayRef<EnumEntry<RootFlags>> getRootFlags();
+
#define ROOT_DESCRIPTOR_FLAG(Num, Val) Val = Num,
enum class RootDescriptorFlag : uint32_t {
#include "DXContainerConstants.def"
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index a281256a44ae0..24df2c9f9ba73 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -55,26 +55,30 @@ SHADER_FEATURE_FLAG(33, 39, NextUnusedBit, "Next reserved shader flag bit (not a
#undef SHADER_FEATURE_FLAG
#endif // SHADER_FEATURE_FLAG
-
-// ROOT_ELEMENT_FLAG(bit offset for the flag, name).
-#ifdef ROOT_ELEMENT_FLAG
-
-ROOT_ELEMENT_FLAG(0, NONE)
-ROOT_ELEMENT_FLAG(0x1, AllowInputAssemblerInputLayout)
-ROOT_ELEMENT_FLAG(0x2, DenyVertexShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x4, DenyHullShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x8, DenyDomainShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x10, DenyGeometryShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x20, DenyPixelShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x40, AllowStreamOutput)
-ROOT_ELEMENT_FLAG(0x80, LocalRootSignature)
-ROOT_ELEMENT_FLAG(0x100, DenyAmplificationShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x200, DenyMeshShaderRootAccess)
-ROOT_ELEMENT_FLAG(0x400, CBVSRVUAVHeapDirectlyIndexed)
-ROOT_ELEMENT_FLAG(0x800, SamplerHeapDirectlyIndexed)
-#undef ROOT_ELEMENT_FLAG
-#endif // ROOT_ELEMENT_FLAG
-
+// Below is the definition of root signature enumerations and flags. The
+// definitions of all values here correspond to their description in the
+// d3d12.h header and are carried over from their values in DXC. For reference:
+// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
+
+// ROOT_SIGNATURE_FLAG(flag value, name).
+#ifdef ROOT_SIGNATURE_FLAG
+
+ROOT_SIGNATURE_FLAG(0, None)
+ROOT_SIGNATURE_FLAG(0x1, AllowInputAssemblerInputLayout)
+ROOT_SIGNATURE_FLAG(0x2, DenyVertexShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x4, DenyHullShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x8, DenyDomainShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x10, DenyGeometryShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x20, DenyPixelShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x40, AllowStreamOutput)
+ROOT_SIGNATURE_FLAG(0x80, LocalRootSignature)
+ROOT_SIGNATURE_FLAG(0x100, DenyAmplificationShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x200, DenyMeshShaderRootAccess)
+ROOT_SIGNATURE_FLAG(0x400, CBVSRVUAVHeapDirectlyIndexed)
+ROOT_SIGNATURE_FLAG(0x800, SamplerHeapDirectlyIndexed)
+
+#undef ROOT_SIGNATURE_FLAG
+#endif // ROOT_SIGNATURE_FLAG
// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
#ifdef ROOT_DESCRIPTOR_FLAG
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index c235112dacf7c..dfe0de07098c5 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -203,7 +203,7 @@ struct RootSignatureYamlDesc {
LLVM_ABI static llvm::Expected<DXContainerYAML::RootSignatureYamlDesc>
create(const object::DirectX::RootSignature &Data);
-#define ROOT_ELEMENT_FLAG(Num, Val) bool Val = false;
+#define ROOT_SIGNATURE_FLAG(Num, Val) bool Val = false;
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index 8e7b7d313706a..7c08baf46eb9e 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -60,6 +60,15 @@ ArrayRef<EnumEntry<SigComponentType>> dxbc::getSigComponentTypes() {
return ArrayRef(SigComponentTypes);
}
+static const EnumEntry<RootFlags> RootFlagNames[] = {
+#define ROOT_SIGNATURE_FLAG(Val, Enum) {#Enum, RootFlags::Enum},
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<RootFlags>> dxbc::getRootFlags() {
+ return ArrayRef(RootFlagNames);
+}
+
#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibility::Enum},
static const EnumEntry<ShaderVisibility> ShaderVisibilityValues[] = {
diff --git a/llvm/lib/Frontend/HLSL/CMakeLists.txt b/llvm/lib/Frontend/HLSL/CMakeLists.txt
index dfebe354807bf..8928144730477 100644
--- a/llvm/lib/Frontend/HLSL/CMakeLists.txt
+++ b/llvm/lib/Frontend/HLSL/CMakeLists.txt
@@ -11,6 +11,7 @@ add_llvm_component_library(LLVMFrontendHLSL
intrinsics_gen
LINK_COMPONENTS
+ BinaryFormat
Core
Support
)
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index f6d0e5227e64a..7f85873ddee83 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -180,9 +180,8 @@ DXContainerYAML::RootSignatureYamlDesc::create(
RootSigDesc.StaticSamplers.push_back(NewS);
}
-#define ROOT_ELEMENT_FLAG(Num, Val) \
- RootSigDesc.Val = \
- (Flags & llvm::to_underlying(dxbc::RootElementFlag::Val)) > 0;
+#define ROOT_SIGNATURE_FLAG(Num, Val) \
+ RootSigDesc.Val = (Flags & llvm::to_underlying(dxbc::RootFlags::Val)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return RootSigDesc;
}
@@ -198,9 +197,9 @@ uint32_t DXContainerYAML::RootDescriptorYaml::getEncodedFlags() const {
uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
uint64_t Flag = 0;
-#define ROOT_ELEMENT_FLAG(Num, Val) \
+#define ROOT_SIGNATURE_FLAG(Num, Val) \
if (Val) \
- Flag |= (uint32_t)dxbc::RootElementFlag::Val;
+ Flag |= (uint32_t)dxbc::RootFlags::Val;
#include "llvm/BinaryFormat/DXContainerConstants.def"
return Flag;
}
@@ -382,7 +381,7 @@ void MappingTraits<DXContainerYAML::RootSignatureYamlDesc>::mapping(
IO.mapRequired("StaticSamplersOffset", S.StaticSamplersOffset);
IO.mapRequired("Parameters", S.Parameters.Locations, S);
IO.mapOptional("Samplers", S.StaticSamplers);
-#define ROOT_ELEMENT_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
+#define ROOT_SIGNATURE_FLAG(Num, Val) IO.mapOptional(#Val, S.Val, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
>From b97cec4fcb49cbe2a0da138d76a09b9df09350da Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 20:13:37 +0000
Subject: [PATCH 02/16] nfc: move root flags
---
.../clang/Parse/ParseHLSLRootSignature.h | 2 +-
clang/lib/Parse/ParseHLSLRootSignature.cpp | 7 ++---
.../Parse/ParseHLSLRootSignatureTest.cpp | 13 ++++-----
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 22 +++------------
.../Frontend/HLSL/HLSLRootSignatureUtils.h | 4 +--
.../Frontend/HLSL/HLSLRootSignatureUtils.cpp | 27 ++++---------------
.../Frontend/HLSLRootSignatureDumpTest.cpp | 4 +--
7 files changed, 24 insertions(+), 55 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index afa2c4d8cfe50..1560bc071ca9d 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -71,7 +71,7 @@ class RootSignatureParser {
// expected, or, there is a lexing error
/// Root Element parse methods:
- std::optional<llvm::hlsl::rootsig::RootFlags> parseRootFlags();
+ std::optional<llvm::dxbc::RootFlags> parseRootFlags();
std::optional<llvm::hlsl::rootsig::RootConstants> parseRootConstants();
std::optional<llvm::hlsl::rootsig::RootDescriptor> parseRootDescriptor();
std::optional<llvm::hlsl::rootsig::DescriptorTable> parseDescriptorTable();
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index e510302c3aae0..3711fdc194c9f 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -76,7 +76,7 @@ static FlagType maybeOrFlag(std::optional<FlagType> Flags, FlagType Flag) {
llvm::to_underlying(Flag));
}
-std::optional<RootFlags> RootSignatureParser::parseRootFlags() {
+std::optional<llvm::dxbc::RootFlags> RootSignatureParser::parseRootFlags() {
assert(CurToken.TokKind == TokenKind::kw_RootFlags &&
"Expects to only be invoked starting at given keyword");
@@ -84,7 +84,7 @@ std::optional<RootFlags> RootSignatureParser::parseRootFlags() {
CurToken.TokKind))
return std::nullopt;
- std::optional<RootFlags> Flags = RootFlags::None;
+ std::optional<llvm::dxbc::RootFlags> Flags = llvm::dxbc::RootFlags::None;
// Handle the edge-case of '0' to specify no flags set
if (tryConsumeExpectedToken(TokenKind::int_literal)) {
@@ -104,7 +104,8 @@ std::optional<RootFlags> RootSignatureParser::parseRootFlags() {
switch (CurToken.TokKind) {
#define ROOT_FLAG_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- Flags = maybeOrFlag<RootFlags>(Flags, RootFlags::NAME); \
+ Flags = maybeOrFlag<llvm::dxbc::RootFlags>(Flags, \
+ llvm::dxbc::RootFlags::NAME); \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 1e46ee35d5d49..a12b02c8cff74 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -487,16 +487,17 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootFlagsTest) {
ASSERT_EQ(Elements.size(), 3u);
RootElement Elem = Elements[0];
- ASSERT_TRUE(std::holds_alternative<RootFlags>(Elem));
- ASSERT_EQ(std::get<RootFlags>(Elem), RootFlags::None);
+ ASSERT_TRUE(std::holds_alternative<llvm::dxbc::RootFlags>(Elem));
+ ASSERT_EQ(std::get<llvm::dxbc::RootFlags>(Elem), llvm::dxbc::RootFlags::None);
Elem = Elements[1];
- ASSERT_TRUE(std::holds_alternative<RootFlags>(Elem));
- ASSERT_EQ(std::get<RootFlags>(Elem), RootFlags::None);
+ ASSERT_TRUE(std::holds_alternative<llvm::dxbc::RootFlags>(Elem));
+ ASSERT_EQ(std::get<llvm::dxbc::RootFlags>(Elem), llvm::dxbc::RootFlags::None);
Elem = Elements[2];
- ASSERT_TRUE(std::holds_alternative<RootFlags>(Elem));
- ASSERT_EQ(std::get<RootFlags>(Elem), RootFlags::ValidFlags);
+ ASSERT_TRUE(std::holds_alternative<llvm::dxbc::RootFlags>(Elem));
+ auto ValidRootFlags = llvm::dxbc::RootFlags(0xfff);
+ ASSERT_EQ(std::get<llvm::dxbc::RootFlags>(Elem), ValidRootFlags);
ASSERT_TRUE(Consumer->isSatisfied());
}
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 9dfbd3cb68928..c71bc640376dd 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -14,6 +14,7 @@
#ifndef LLVM_FRONTEND_HLSL_HLSLROOTSIGNATURE_H
#define LLVM_FRONTEND_HLSL_HLSLROOTSIGNATURE_H
+#include "llvm/BinaryFormat/DXContainer.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/DXILABI.h"
#include <limits>
@@ -28,23 +29,6 @@ namespace rootsig {
// carried over from their values in DXC. For reference:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
-enum class RootFlags : uint32_t {
- None = 0,
- AllowInputAssemblerInputLayout = 0x1,
- DenyVertexShaderRootAccess = 0x2,
- DenyHullShaderRootAccess = 0x4,
- DenyDomainShaderRootAccess = 0x8,
- DenyGeometryShaderRootAccess = 0x10,
- DenyPixelShaderRootAccess = 0x20,
- AllowStreamOutput = 0x40,
- LocalRootSignature = 0x80,
- DenyAmplificationShaderRootAccess = 0x100,
- DenyMeshShaderRootAccess = 0x200,
- CBVSRVUAVHeapDirectlyIndexed = 0x400,
- SamplerHeapDirectlyIndexed = 0x800,
- ValidFlags = 0x00000fff
-};
-
enum class RootDescriptorFlags : unsigned {
None = 0,
DataVolatile = 0x2,
@@ -251,8 +235,8 @@ struct StaticSampler {
/// RootElements in the array, and it holds a data member for the Visibility
/// parameter.
using RootElement =
- std::variant<RootFlags, RootConstants, RootDescriptor, DescriptorTable,
- DescriptorTableClause, StaticSampler>;
+ std::variant<dxbc::RootFlags, RootConstants, RootDescriptor,
+ DescriptorTable, DescriptorTableClause, StaticSampler>;
} // namespace rootsig
} // namespace hlsl
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
index b871d3839fe03..1bb4933a341b8 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
@@ -28,7 +28,7 @@ class Metadata;
namespace hlsl {
namespace rootsig {
-LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags);
+LLVM_ABI raw_ostream &operator<<(raw_ostream &OS, const dxbc::RootFlags &Flags);
LLVM_ABI raw_ostream &operator<<(raw_ostream &OS,
const RootConstants &Constants);
@@ -61,7 +61,7 @@ class MetadataBuilder {
private:
/// Define the various builders for the different metadata types
- MDNode *BuildRootFlags(const RootFlags &Flags);
+ MDNode *BuildRootFlags(const dxbc::RootFlags &Flags);
MDNode *BuildRootConstants(const RootConstants &Constants);
MDNode *BuildRootDescriptor(const RootDescriptor &Descriptor);
MDNode *BuildDescriptorTable(const DescriptorTable &Table);
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index 22a761ba3b135..6c202d46a9d0b 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -246,26 +246,9 @@ static raw_ostream &operator<<(raw_ostream &OS,
return OS;
}
-static const EnumEntry<RootFlags> RootFlagNames[] = {
- {"AllowInputAssemblerInputLayout",
- RootFlags::AllowInputAssemblerInputLayout},
- {"DenyVertexShaderRootAccess", RootFlags::DenyVertexShaderRootAccess},
- {"DenyHullShaderRootAccess", RootFlags::DenyHullShaderRootAccess},
- {"DenyDomainShaderRootAccess", RootFlags::DenyDomainShaderRootAccess},
- {"DenyGeometryShaderRootAccess", RootFlags::DenyGeometryShaderRootAccess},
- {"DenyPixelShaderRootAccess", RootFlags::DenyPixelShaderRootAccess},
- {"AllowStreamOutput", RootFlags::AllowStreamOutput},
- {"LocalRootSignature", RootFlags::LocalRootSignature},
- {"DenyAmplificationShaderRootAccess",
- RootFlags::DenyAmplificationShaderRootAccess},
- {"DenyMeshShaderRootAccess", RootFlags::DenyMeshShaderRootAccess},
- {"CBVSRVUAVHeapDirectlyIndexed", RootFlags::CBVSRVUAVHeapDirectlyIndexed},
- {"SamplerHeapDirectlyIndexed", RootFlags::SamplerHeapDirectlyIndexed},
-};
-
-raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags) {
+raw_ostream &operator<<(raw_ostream &OS, const dxbc::RootFlags &Flags) {
OS << "RootFlags(";
- printFlags(OS, Flags, ArrayRef(RootFlagNames));
+ printFlags(OS, Flags, dxbc::getRootFlags());
OS << ")";
return OS;
@@ -341,7 +324,7 @@ template <class... Ts> OverloadedVisit(Ts...) -> OverloadedVisit<Ts...>;
raw_ostream &operator<<(raw_ostream &OS, const RootElement &Element) {
const auto Visitor = OverloadedVisit{
- [&OS](const RootFlags &Flags) { OS << Flags; },
+ [&OS](const dxbc::RootFlags &Flags) { OS << Flags; },
[&OS](const RootConstants &Constants) { OS << Constants; },
[&OS](const RootDescriptor &Descriptor) { OS << Descriptor; },
[&OS](const DescriptorTableClause &Clause) { OS << Clause; },
@@ -366,7 +349,7 @@ void dumpRootElements(raw_ostream &OS, ArrayRef<RootElement> Elements) {
MDNode *MetadataBuilder::BuildRootSignature() {
const auto Visitor = OverloadedVisit{
- [this](const RootFlags &Flags) -> MDNode * {
+ [this](const dxbc::RootFlags &Flags) -> MDNode * {
return BuildRootFlags(Flags);
},
[this](const RootConstants &Constants) -> MDNode * {
@@ -396,7 +379,7 @@ MDNode *MetadataBuilder::BuildRootSignature() {
return MDNode::get(Ctx, GeneratedMetadata);
}
-MDNode *MetadataBuilder::BuildRootFlags(const RootFlags &Flags) {
+MDNode *MetadataBuilder::BuildRootFlags(const dxbc::RootFlags &Flags) {
IRBuilder<> Builder(Ctx);
Metadata *Operands[] = {
MDString::get(Ctx, "RootFlags"),
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index dde82ac34ea28..2961ad49c99a7 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -262,7 +262,7 @@ TEST(HLSLRootSignatureTest, SetRootConstantsDump) {
}
TEST(HLSLRootSignatureTest, NoneRootFlagsDump) {
- RootFlags Flags = RootFlags::None;
+ llvm::dxbc::RootFlags Flags = llvm::dxbc::RootFlags::None;
std::string Out;
llvm::raw_string_ostream OS(Out);
@@ -274,7 +274,7 @@ TEST(HLSLRootSignatureTest, NoneRootFlagsDump) {
}
TEST(HLSLRootSignatureTest, AllRootFlagsDump) {
- RootFlags Flags = RootFlags::ValidFlags;
+ llvm::dxbc::RootFlags Flags = llvm::dxbc::RootFlags(0xfff);
std::string Out;
llvm::raw_string_ostream OS(Out);
>From 56b7fb93c41dd4b6f5c2b6b0a126293238680999 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 19:40:27 +0000
Subject: [PATCH 03/16] nfc: prep dxbc::RootDescriptorFlags
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 6 ++++--
.../BinaryFormat/DXContainerConstants.def | 12 ++++++------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/BinaryFormat/DXContainer.cpp | 10 ++++++++++
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 19 ++++++++++---------
5 files changed, 31 insertions(+), 18 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index f3a9c8ac20b06..7c5d3fd60d655 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -164,11 +164,13 @@ enum class RootFlags : uint32_t {
LLVM_ABI ArrayRef<EnumEntry<RootFlags>> getRootFlags();
-#define ROOT_DESCRIPTOR_FLAG(Num, Val) Val = Num,
-enum class RootDescriptorFlag : uint32_t {
+#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) Enum = Num,
+enum class RootDescriptorFlags : uint32_t {
#include "DXContainerConstants.def"
};
+LLVM_ABI ArrayRef<EnumEntry<RootDescriptorFlags>> getRootDescriptorFlags();
+
#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 24df2c9f9ba73..71a406a1b4c1f 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -80,17 +80,17 @@ ROOT_SIGNATURE_FLAG(0x800, SamplerHeapDirectlyIndexed)
#undef ROOT_SIGNATURE_FLAG
#endif // ROOT_SIGNATURE_FLAG
-// ROOT_DESCRIPTOR_FLAG(bit offset for the flag, name).
+// ROOT_DESCRIPTOR_FLAG(flag value, name, flag).
#ifdef ROOT_DESCRIPTOR_FLAG
-ROOT_DESCRIPTOR_FLAG(0, NONE)
-ROOT_DESCRIPTOR_FLAG(0x2, DATA_VOLATILE)
-ROOT_DESCRIPTOR_FLAG(0x4, DATA_STATIC_WHILE_SET_AT_EXECUTE)
-ROOT_DESCRIPTOR_FLAG(0x8, DATA_STATIC)
+ROOT_DESCRIPTOR_FLAG(0, None, NONE)
+ROOT_DESCRIPTOR_FLAG(0x2, DataVolatile, DATA_VOLATILE)
+ROOT_DESCRIPTOR_FLAG(0x4, DataStaticWhileSetAtExecute, DATA_STATIC_WHILE_SET_AT_EXECUTE)
+ROOT_DESCRIPTOR_FLAG(0x8, DataStatic, DATA_STATIC)
+
#undef ROOT_DESCRIPTOR_FLAG
#endif // ROOT_DESCRIPTOR_FLAG
-
// DESCRIPTOR_RANGE_FLAG(bit offset for the flag, name).
#ifdef DESCRIPTOR_RANGE_FLAG
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index dfe0de07098c5..43812f63c531d 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -87,7 +87,7 @@ struct RootDescriptorYaml {
LLVM_ABI uint32_t getEncodedFlags() const;
-#define ROOT_DESCRIPTOR_FLAG(Num, Val) bool Val = false;
+#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) bool Enum = false;
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index 7c08baf46eb9e..ea9aad573cdd9 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -69,6 +69,16 @@ ArrayRef<EnumEntry<RootFlags>> dxbc::getRootFlags() {
return ArrayRef(RootFlagNames);
}
+static const EnumEntry<RootDescriptorFlags> RootDescriptorFlagNames[] = {
+#define ROOT_DESCRIPTOR_FLAG(Val, Enum, Flag) \
+ {#Enum, RootDescriptorFlags::Enum},
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<RootDescriptorFlags>> dxbc::getRootDescriptorFlags() {
+ return ArrayRef(RootDescriptorFlagNames);
+}
+
#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibility::Enum},
static const EnumEntry<ShaderVisibility> ShaderVisibilityValues[] = {
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index 7f85873ddee83..beaca3b87206d 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -140,10 +140,10 @@ DXContainerYAML::RootSignatureYamlDesc::create(
YamlDescriptor.ShaderRegister = Descriptor.ShaderRegister;
YamlDescriptor.RegisterSpace = Descriptor.RegisterSpace;
if (Version > 1) {
-#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
- YamlDescriptor.Val = \
+#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
+ YamlDescriptor.Enum = \
(Descriptor.Flags & \
- llvm::to_underlying(dxbc::RootDescriptorFlag::Val)) > 0;
+ llvm::to_underlying(dxbc::RootDescriptorFlags::Enum)) > 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
} else if (auto *DTV =
@@ -187,12 +187,12 @@ DXContainerYAML::RootSignatureYamlDesc::create(
}
uint32_t DXContainerYAML::RootDescriptorYaml::getEncodedFlags() const {
- uint64_t Flag = 0;
-#define ROOT_DESCRIPTOR_FLAG(Num, Val) \
- if (Val) \
- Flag |= (uint32_t)dxbc::RootDescriptorFlag::Val;
+ uint64_t Flags = 0;
+#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
+ if (Enum) \
+ Flags |= (uint32_t)dxbc::RootDescriptorFlags::Enum;
#include "llvm/BinaryFormat/DXContainerConstants.def"
- return Flag;
+ return Flags;
}
uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
@@ -458,7 +458,8 @@ 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);
+#define ROOT_DESCRIPTOR_FLAG(Num, Enum, Flag) \
+ IO.mapOptional(#Flag, D.Enum, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
>From c4aaa3cbf909a1775efd42c2361c2b721bdf2584 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 19:53:43 +0000
Subject: [PATCH 04/16] nfc: move RootDescriptorFlags
---
clang/include/clang/Parse/ParseHLSLRootSignature.h | 5 ++---
clang/lib/Parse/ParseHLSLRootSignature.cpp | 10 +++++-----
.../unittests/Parse/ParseHLSLRootSignatureTest.cpp | 13 +++++++------
.../include/llvm/Frontend/HLSL/HLSLRootSignature.h | 14 +++-----------
llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp | 11 ++---------
.../Frontend/HLSLRootSignatureDumpTest.cpp | 4 ++--
6 files changed, 21 insertions(+), 36 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index 1560bc071ca9d..fa2000e996058 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -94,7 +94,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<uint32_t> Space;
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
- std::optional<llvm::hlsl::rootsig::RootDescriptorFlags> Flags;
+ std::optional<llvm::dxbc::RootDescriptorFlags> Flags;
};
std::optional<ParsedRootDescriptorParams>
parseRootDescriptorParams(RootSignatureToken::Kind RegType);
@@ -139,8 +139,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
parseStaticBorderColor();
- std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
- parseRootDescriptorFlags();
+ std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
parseDescriptorRangeFlags();
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 3711fdc194c9f..0b08086be6668 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -1114,7 +1114,7 @@ RootSignatureParser::parseStaticBorderColor() {
return std::nullopt;
}
-std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
+std::optional<llvm::dxbc::RootDescriptorFlags>
RootSignatureParser::parseRootDescriptorFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1125,7 +1125,7 @@ RootSignatureParser::parseRootDescriptorFlags() {
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_non_zero_flag);
return std::nullopt;
}
- return RootDescriptorFlags::None;
+ return llvm::dxbc::RootDescriptorFlags::None;
}
TokenKind Expected[] = {
@@ -1133,15 +1133,15 @@ RootSignatureParser::parseRootDescriptorFlags() {
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
};
- std::optional<RootDescriptorFlags> Flags;
+ std::optional<llvm::dxbc::RootDescriptorFlags> Flags;
do {
if (tryConsumeExpectedToken(Expected)) {
switch (CurToken.TokKind) {
#define ROOT_DESCRIPTOR_FLAG_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- Flags = \
- maybeOrFlag<RootDescriptorFlags>(Flags, RootDescriptorFlags::NAME); \
+ Flags = maybeOrFlag<llvm::dxbc::RootDescriptorFlags>( \
+ Flags, llvm::dxbc::RootDescriptorFlags::NAME); \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index a12b02c8cff74..5775df7804044 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -535,7 +535,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 0u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility, ShaderVisibility::All);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
- RootDescriptorFlags::DataStaticWhileSetAtExecute);
+ llvm::dxbc::RootDescriptorFlags::DataStaticWhileSetAtExecute);
Elem = Elements[1];
ASSERT_TRUE(std::holds_alternative<RootDescriptor>(Elem));
@@ -545,8 +545,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 4u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility,
ShaderVisibility::Geometry);
- ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
- RootDescriptorFlags::ValidFlags);
+ auto ValidRootDescriptorFlags = llvm::dxbc::RootDescriptorFlags(0xe);
+ ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags, ValidRootDescriptorFlags);
Elem = Elements[2];
ASSERT_TRUE(std::holds_alternative<RootDescriptor>(Elem));
@@ -556,9 +556,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 0u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility, ShaderVisibility::Hull);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
- RootDescriptorFlags::DataVolatile);
+ llvm::dxbc::RootDescriptorFlags::DataVolatile);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
- RootDescriptorFlags::DataVolatile);
+ llvm::dxbc::RootDescriptorFlags::DataVolatile);
Elem = Elements[3];
ASSERT_EQ(std::get<RootDescriptor>(Elem).Type, DescriptorType::CBuffer);
@@ -566,7 +566,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 0u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility, ShaderVisibility::All);
- ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags, RootDescriptorFlags::None);
+ ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
+ llvm::dxbc::RootDescriptorFlags::None);
ASSERT_TRUE(Consumer->isSatisfied());
}
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index c71bc640376dd..262bb0df528b7 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -29,14 +29,6 @@ namespace rootsig {
// carried over from their values in DXC. For reference:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
-enum class RootDescriptorFlags : unsigned {
- None = 0,
- DataVolatile = 0x2,
- DataStaticWhileSetAtExecute = 0x4,
- DataStatic = 0x8,
- ValidFlags = 0xe,
-};
-
enum class DescriptorRangeFlags : unsigned {
None = 0,
DescriptorsVolatile = 0x1,
@@ -151,16 +143,16 @@ struct RootDescriptor {
Register Reg;
uint32_t Space = 0;
ShaderVisibility Visibility = ShaderVisibility::All;
- RootDescriptorFlags Flags;
+ dxbc::RootDescriptorFlags Flags;
void setDefaultFlags() {
switch (Type) {
case DescriptorType::CBuffer:
case DescriptorType::SRV:
- Flags = RootDescriptorFlags::DataStaticWhileSetAtExecute;
+ Flags = dxbc::RootDescriptorFlags::DataStaticWhileSetAtExecute;
break;
case DescriptorType::UAV:
- Flags = RootDescriptorFlags::DataVolatile;
+ Flags = dxbc::RootDescriptorFlags::DataVolatile;
break;
}
}
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index 6c202d46a9d0b..040ae730f97c3 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -215,16 +215,9 @@ static raw_ostream &operator<<(raw_ostream &OS, const ClauseType &Type) {
return OS;
}
-static const EnumEntry<RootDescriptorFlags> RootDescriptorFlagNames[] = {
- {"DataVolatile", RootDescriptorFlags::DataVolatile},
- {"DataStaticWhileSetAtExecute",
- RootDescriptorFlags::DataStaticWhileSetAtExecute},
- {"DataStatic", RootDescriptorFlags::DataStatic},
-};
-
static raw_ostream &operator<<(raw_ostream &OS,
- const RootDescriptorFlags &Flags) {
- printFlags(OS, Flags, ArrayRef(RootDescriptorFlagNames));
+ const dxbc::RootDescriptorFlags &Flags) {
+ printFlags(OS, Flags, dxbc::getRootDescriptorFlags());
return OS;
}
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 2961ad49c99a7..c86e0408dc6c4 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -131,7 +131,7 @@ TEST(HLSLRootSignatureTest, RootSRVDump) {
Descriptor.Reg = {RegisterType::TReg, 0};
Descriptor.Space = 42;
Descriptor.Visibility = ShaderVisibility::Geometry;
- Descriptor.Flags = RootDescriptorFlags::None;
+ Descriptor.Flags = llvm::dxbc::RootDescriptorFlags::None;
std::string Out;
llvm::raw_string_ostream OS(Out);
@@ -149,7 +149,7 @@ TEST(HLSLRootSignatureTest, RootUAVDump) {
Descriptor.Reg = {RegisterType::UReg, 92374};
Descriptor.Space = 932847;
Descriptor.Visibility = ShaderVisibility::Hull;
- Descriptor.Flags = RootDescriptorFlags::ValidFlags;
+ Descriptor.Flags = llvm::dxbc::RootDescriptorFlags(0xe);
std::string Out;
llvm::raw_string_ostream OS(Out);
>From 410849829abed98d813671d3c63463483006c479 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 20:30:21 +0000
Subject: [PATCH 05/16] nfc: prep dxbc::DescriptorRangeFlags
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 8 +--
.../BinaryFormat/DXContainerConstants.def | 15 +++---
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/BinaryFormat/DXContainer.cpp | 10 ++++
llvm/lib/ObjectYAML/DXContainerYAML.cpp | 19 +++----
llvm/lib/Target/DirectX/DXILRootSignature.cpp | 49 +++++++++----------
6 files changed, 58 insertions(+), 45 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 7c5d3fd60d655..42e3fe7cf6644 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -171,13 +171,15 @@ enum class RootDescriptorFlags : uint32_t {
LLVM_ABI ArrayRef<EnumEntry<RootDescriptorFlags>> getRootDescriptorFlags();
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) Val = Num,
-enum class DescriptorRangeFlag : uint32_t {
+#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) Enum = Num,
+enum class DescriptorRangeFlags : uint32_t {
#include "DXContainerConstants.def"
- LLVM_MARK_AS_BITMASK_ENUM(DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
+ LLVM_MARK_AS_BITMASK_ENUM(DescriptorsStaticKeepingBufferBoundsChecks)
};
+LLVM_ABI ArrayRef<EnumEntry<DescriptorRangeFlags>> getDescriptorRangeFlags();
+
#define ROOT_PARAMETER(Val, Enum) Enum = Val,
enum class RootParameterType : uint32_t {
#include "DXContainerConstants.def"
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 71a406a1b4c1f..82158a97dff6d 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -91,15 +91,16 @@ ROOT_DESCRIPTOR_FLAG(0x8, DataStatic, DATA_STATIC)
#undef ROOT_DESCRIPTOR_FLAG
#endif // ROOT_DESCRIPTOR_FLAG
-// DESCRIPTOR_RANGE_FLAG(bit offset for the flag, name).
+// DESCRIPTOR_RANGE_FLAG(flag value, name, flag).
#ifdef DESCRIPTOR_RANGE_FLAG
-DESCRIPTOR_RANGE_FLAG(0, NONE)
-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)
+DESCRIPTOR_RANGE_FLAG(0, None, NONE)
+DESCRIPTOR_RANGE_FLAG(0x1, DescriptorsVolatile, DESCRIPTORS_VOLATILE)
+DESCRIPTOR_RANGE_FLAG(0x2, DataVolatile, DATA_VOLATILE)
+DESCRIPTOR_RANGE_FLAG(0x4, DataStaticWhileSetAtExecute, DATA_STATIC_WHILE_SET_AT_EXECUTE)
+DESCRIPTOR_RANGE_FLAG(0x8, DataStatic, DATA_STATIC)
+DESCRIPTOR_RANGE_FLAG(0x10000, DescriptorsStaticKeepingBufferBoundsChecks, DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS)
+
#undef DESCRIPTOR_RANGE_FLAG
#endif // DESCRIPTOR_RANGE_FLAG
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 43812f63c531d..acb65cf02d96f 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -100,7 +100,7 @@ struct DescriptorRangeYaml {
LLVM_ABI uint32_t getEncodedFlags() const;
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) bool Val = false;
+#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) bool Enum = false;
#include "llvm/BinaryFormat/DXContainerConstants.def"
};
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index ea9aad573cdd9..a112c3a90f1b7 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -79,6 +79,16 @@ ArrayRef<EnumEntry<RootDescriptorFlags>> dxbc::getRootDescriptorFlags() {
return ArrayRef(RootDescriptorFlagNames);
}
+static const EnumEntry<DescriptorRangeFlags> DescriptorRangeFlagNames[] = {
+#define DESCRIPTOR_RANGE_FLAG(Val, Enum, Flag) \
+ {#Enum, DescriptorRangeFlags::Enum},
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<DescriptorRangeFlags>> dxbc::getDescriptorRangeFlags() {
+ return ArrayRef(DescriptorRangeFlagNames);
+}
+
#define SHADER_VISIBILITY(Val, Enum) {#Enum, ShaderVisibility::Enum},
static const EnumEntry<ShaderVisibility> ShaderVisibilityValues[] = {
diff --git a/llvm/lib/ObjectYAML/DXContainerYAML.cpp b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
index beaca3b87206d..263f7bdf37bca 100644
--- a/llvm/lib/ObjectYAML/DXContainerYAML.cpp
+++ b/llvm/lib/ObjectYAML/DXContainerYAML.cpp
@@ -63,9 +63,9 @@ readDescriptorRanges(DXContainerYAML::RootParameterHeaderYaml &Header,
NewR.RangeType = R.RangeType;
if constexpr (std::is_same_v<T, dxbc::RTS0::v2::DescriptorRange>) {
// Set all flag fields for v2
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) \
- NewR.Val = \
- (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlag::Val)) != 0;
+#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
+ NewR.Enum = \
+ (R.Flags & llvm::to_underlying(dxbc::DescriptorRangeFlags::Enum)) != 0;
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
TableYaml.Ranges.push_back(NewR);
@@ -205,12 +205,12 @@ uint32_t DXContainerYAML::RootSignatureYamlDesc::getEncodedFlags() {
}
uint32_t DXContainerYAML::DescriptorRangeYaml::getEncodedFlags() const {
- uint64_t Flag = 0;
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) \
- if (Val) \
- Flag |= (uint32_t)dxbc::DescriptorRangeFlag::Val;
+ uint64_t Flags = 0;
+#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
+ if (Enum) \
+ Flags |= (uint32_t)dxbc::DescriptorRangeFlags::Enum;
#include "llvm/BinaryFormat/DXContainerConstants.def"
- return Flag;
+ return Flags;
}
uint64_t DXContainerYAML::ShaderFeatureFlags::getEncodedFlags() {
@@ -405,7 +405,8 @@ void MappingTraits<llvm::DXContainerYAML::DescriptorRangeYaml>::mapping(
IO.mapRequired("RegisterSpace", R.RegisterSpace);
IO.mapRequired("OffsetInDescriptorsFromTableStart",
R.OffsetInDescriptorsFromTableStart);
-#define DESCRIPTOR_RANGE_FLAG(Num, Val) IO.mapOptional(#Val, R.Val, false);
+#define DESCRIPTOR_RANGE_FLAG(Num, Enum, Flag) \
+ IO.mapOptional(#Flag, R.Enum, false);
#include "llvm/BinaryFormat/DXContainerConstants.def"
}
diff --git a/llvm/lib/Target/DirectX/DXILRootSignature.cpp b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
index 29e78fcce5262..2eff7a1900e5d 100644
--- a/llvm/lib/Target/DirectX/DXILRootSignature.cpp
+++ b/llvm/lib/Target/DirectX/DXILRootSignature.cpp
@@ -345,7 +345,7 @@ static bool verifyRangeType(uint32_t Type) {
static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
uint32_t FlagsVal) {
- using FlagT = dxbc::DescriptorRangeFlag;
+ using FlagT = dxbc::DescriptorRangeFlags;
FlagT Flags = FlagT(FlagsVal);
const bool IsSampler =
@@ -355,55 +355,54 @@ static bool verifyDescriptorRangeFlag(uint32_t Version, uint32_t Type,
// 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);
+ return Flags == FlagT::DescriptorsVolatile;
+ return Flags == (FlagT::DataVolatile | FlagT::DescriptorsVolatile);
}
// The data-specific flags are mutually exclusive.
- FlagT DataFlags = FlagT::DATA_VOLATILE | FlagT::DATA_STATIC |
- FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ FlagT DataFlags = FlagT::DataVolatile | FlagT::DataStatic |
+ FlagT::DataStaticWhileSetAtExecute;
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;
+ FlagT DescriptorFlags = FlagT::DescriptorsStaticKeepingBufferBoundsChecks |
+ FlagT::DescriptorsVolatile;
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;
+ if ((Flags & FlagT::DescriptorsVolatile) == FlagT::DescriptorsVolatile) {
+ FlagT Mask = FlagT::DescriptorsVolatile;
if (!IsSampler) {
- Mask |= FlagT::DATA_VOLATILE;
- Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ Mask |= FlagT::DataVolatile;
+ Mask |= FlagT::DataStaticWhileSetAtExecute;
}
- return (Flags & ~Mask) == FlagT::NONE;
+ return (Flags & ~Mask) == FlagT::None;
}
// For "STATIC_KEEPING_BUFFER_BOUNDS_CHECKS" descriptors,
// the other data-specific flags may all be set.
- 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 ((Flags & FlagT::DescriptorsStaticKeepingBufferBoundsChecks) ==
+ FlagT::DescriptorsStaticKeepingBufferBoundsChecks) {
+ FlagT Mask = FlagT::DescriptorsStaticKeepingBufferBoundsChecks;
if (!IsSampler) {
- Mask |= FlagT::DATA_VOLATILE;
- Mask |= FlagT::DATA_STATIC;
- Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ Mask |= FlagT::DataVolatile;
+ Mask |= FlagT::DataStatic;
+ Mask |= FlagT::DataStaticWhileSetAtExecute;
}
- return (Flags & ~Mask) == FlagT::NONE;
+ return (Flags & ~Mask) == FlagT::None;
}
// When no descriptor flag is set, any data flag is allowed.
- FlagT Mask = FlagT::NONE;
+ FlagT Mask = FlagT::None;
if (!IsSampler) {
- Mask |= FlagT::DATA_VOLATILE;
- Mask |= FlagT::DATA_STATIC;
- Mask |= FlagT::DATA_STATIC_WHILE_SET_AT_EXECUTE;
+ Mask |= FlagT::DataVolatile;
+ Mask |= FlagT::DataStaticWhileSetAtExecute;
+ Mask |= FlagT::DataStatic;
}
- return (Flags & ~Mask) == FlagT::NONE;
+ return (Flags & ~Mask) == FlagT::None;
}
static bool validate(LLVMContext *Ctx, const mcdxbc::RootSignatureDesc &RSD) {
>From feacb11bfa8d7fbb60711b38dd158f00f8b0eacc Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 20:58:28 +0000
Subject: [PATCH 06/16] nfc: move DescriptorRangeFlags
---
.../clang/Parse/ParseHLSLRootSignature.h | 5 ++---
clang/lib/Parse/ParseHLSLRootSignature.cpp | 10 +++++-----
.../Parse/ParseHLSLRootSignatureTest.cpp | 11 ++++++-----
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 19 ++++---------------
.../Frontend/HLSL/HLSLRootSignatureUtils.cpp | 14 ++------------
.../Frontend/HLSLRootSignatureDumpTest.cpp | 6 +++---
6 files changed, 22 insertions(+), 43 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index fa2000e996058..bc7fa2bc9481e 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -104,7 +104,7 @@ class RootSignatureParser {
std::optional<uint32_t> NumDescriptors;
std::optional<uint32_t> Space;
std::optional<uint32_t> Offset;
- std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags> Flags;
+ std::optional<llvm::dxbc::DescriptorRangeFlags> Flags;
};
std::optional<ParsedClauseParams>
parseDescriptorTableClauseParams(RootSignatureToken::Kind RegType);
@@ -140,8 +140,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
parseStaticBorderColor();
std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
- std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
- parseDescriptorRangeFlags();
+ std::optional<llvm::dxbc::DescriptorRangeFlags> parseDescriptorRangeFlags();
/// Use NumericLiteralParser to convert CurToken.NumSpelling into a unsigned
/// 32-bit integer
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 0b08086be6668..4d523dcd545e3 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -1153,7 +1153,7 @@ RootSignatureParser::parseRootDescriptorFlags() {
return Flags;
}
-std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
+std::optional<llvm::dxbc::DescriptorRangeFlags>
RootSignatureParser::parseDescriptorRangeFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1164,7 +1164,7 @@ RootSignatureParser::parseDescriptorRangeFlags() {
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_non_zero_flag);
return std::nullopt;
}
- return DescriptorRangeFlags::None;
+ return llvm::dxbc::DescriptorRangeFlags::None;
}
TokenKind Expected[] = {
@@ -1172,15 +1172,15 @@ RootSignatureParser::parseDescriptorRangeFlags() {
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
};
- std::optional<DescriptorRangeFlags> Flags;
+ std::optional<llvm::dxbc::DescriptorRangeFlags> Flags;
do {
if (tryConsumeExpectedToken(Expected)) {
switch (CurToken.TokKind) {
#define DESCRIPTOR_RANGE_FLAG_ENUM(NAME, LIT, ON) \
case TokenKind::en_##NAME: \
- Flags = \
- maybeOrFlag<DescriptorRangeFlags>(Flags, DescriptorRangeFlags::NAME); \
+ Flags = maybeOrFlag<llvm::dxbc::DescriptorRangeFlags>( \
+ Flags, llvm::dxbc::DescriptorRangeFlags::NAME); \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 5775df7804044..6f80c1bd80bd3 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -167,7 +167,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
DescriptorTableOffsetAppend);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Flags,
- DescriptorRangeFlags::DataStaticWhileSetAtExecute);
+ llvm::dxbc::DescriptorRangeFlags::DataStaticWhileSetAtExecute);
Elem = Elements[1];
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
@@ -179,7 +179,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Space, 3u);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset, 32u);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Flags,
- DescriptorRangeFlags::None);
+ llvm::dxbc::DescriptorRangeFlags::None);
Elem = Elements[2];
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
@@ -192,7 +192,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
DescriptorTableOffsetAppend);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Flags,
- DescriptorRangeFlags::None);
+ llvm::dxbc::DescriptorRangeFlags::None);
Elem = Elements[3];
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
@@ -205,8 +205,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Space, 0u);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Offset,
DescriptorTableOffsetAppend);
+ auto ValidDescriptorRangeFlags = llvm::dxbc::DescriptorRangeFlags(0x1000f);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Flags,
- DescriptorRangeFlags::ValidFlags);
+ ValidDescriptorRangeFlags);
Elem = Elements[4];
ASSERT_TRUE(std::holds_alternative<DescriptorTable>(Elem));
@@ -404,7 +405,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidSamplerFlagsTest) {
ASSERT_TRUE(std::holds_alternative<DescriptorTableClause>(Elem));
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Type, ClauseType::Sampler);
ASSERT_EQ(std::get<DescriptorTableClause>(Elem).Flags,
- DescriptorRangeFlags::ValidSamplerFlags);
+ llvm::dxbc::DescriptorRangeFlags::DescriptorsVolatile);
ASSERT_TRUE(Consumer->isSatisfied());
}
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 262bb0df528b7..afd76180cb972 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -29,17 +29,6 @@ namespace rootsig {
// carried over from their values in DXC. For reference:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
-enum class DescriptorRangeFlags : unsigned {
- None = 0,
- DescriptorsVolatile = 0x1,
- DataVolatile = 0x2,
- DataStaticWhileSetAtExecute = 0x4,
- DataStatic = 0x8,
- DescriptorsStaticKeepingBufferBoundsChecks = 0x10000,
- ValidFlags = 0x1000f,
- ValidSamplerFlags = DescriptorsVolatile,
-};
-
enum class ShaderVisibility {
All = 0,
Vertex = 1,
@@ -176,19 +165,19 @@ struct DescriptorTableClause {
uint32_t NumDescriptors = 1;
uint32_t Space = 0;
uint32_t Offset = DescriptorTableOffsetAppend;
- DescriptorRangeFlags Flags;
+ dxbc::DescriptorRangeFlags Flags;
void setDefaultFlags() {
switch (Type) {
case ClauseType::CBuffer:
case ClauseType::SRV:
- Flags = DescriptorRangeFlags::DataStaticWhileSetAtExecute;
+ Flags = dxbc::DescriptorRangeFlags::DataStaticWhileSetAtExecute;
break;
case ClauseType::UAV:
- Flags = DescriptorRangeFlags::DataVolatile;
+ Flags = dxbc::DescriptorRangeFlags::DataVolatile;
break;
case ClauseType::Sampler:
- Flags = DescriptorRangeFlags::None;
+ Flags = dxbc::DescriptorRangeFlags::None;
break;
}
}
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index 040ae730f97c3..96b80eb4a586e 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -222,19 +222,9 @@ static raw_ostream &operator<<(raw_ostream &OS,
return OS;
}
-static const EnumEntry<DescriptorRangeFlags> DescriptorRangeFlagNames[] = {
- {"DescriptorsVolatile", DescriptorRangeFlags::DescriptorsVolatile},
- {"DataVolatile", DescriptorRangeFlags::DataVolatile},
- {"DataStaticWhileSetAtExecute",
- DescriptorRangeFlags::DataStaticWhileSetAtExecute},
- {"DataStatic", DescriptorRangeFlags::DataStatic},
- {"DescriptorsStaticKeepingBufferBoundsChecks",
- DescriptorRangeFlags::DescriptorsStaticKeepingBufferBoundsChecks},
-};
-
static raw_ostream &operator<<(raw_ostream &OS,
- const DescriptorRangeFlags &Flags) {
- printFlags(OS, Flags, ArrayRef(DescriptorRangeFlagNames));
+ const llvm::dxbc::DescriptorRangeFlags &Flags) {
+ printFlags(OS, Flags, dxbc::getDescriptorRangeFlags());
return OS;
}
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index c86e0408dc6c4..e6b8f446090d9 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -37,7 +37,7 @@ TEST(HLSLRootSignatureTest, DescriptorSRVClauseDump) {
Clause.NumDescriptors = NumDescriptorsUnbounded;
Clause.Space = 42;
Clause.Offset = 3;
- Clause.Flags = DescriptorRangeFlags::None;
+ Clause.Flags = llvm::dxbc::DescriptorRangeFlags::None;
std::string Out;
llvm::raw_string_ostream OS(Out);
@@ -56,7 +56,7 @@ TEST(HLSLRootSignatureTest, DescriptorUAVClauseDump) {
Clause.NumDescriptors = 3298;
Clause.Space = 932847;
Clause.Offset = 1;
- Clause.Flags = DescriptorRangeFlags::ValidFlags;
+ Clause.Flags = llvm::dxbc::DescriptorRangeFlags(0x1000f);
std::string Out;
llvm::raw_string_ostream OS(Out);
@@ -80,7 +80,7 @@ TEST(HLSLRootSignatureTest, DescriptorSamplerClauseDump) {
Clause.NumDescriptors = 2;
Clause.Space = 42;
Clause.Offset = DescriptorTableOffsetAppend;
- Clause.Flags = DescriptorRangeFlags::ValidSamplerFlags;
+ Clause.Flags = llvm::dxbc::DescriptorRangeFlags::DescriptorsVolatile;
std::string Out;
llvm::raw_string_ostream OS(Out);
>From 260123c2a97ccbbe468d4820baa88aba46220d83 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 21:16:45 +0000
Subject: [PATCH 07/16] nfc: move ShaderVisibility
---
.../clang/Parse/ParseHLSLRootSignature.h | 8 +++---
clang/lib/Parse/ParseHLSLRootSignature.cpp | 6 ++--
clang/lib/Sema/SemaHLSL.cpp | 4 +--
.../Parse/ParseHLSLRootSignatureTest.cpp | 28 ++++++++++++-------
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 19 +++----------
.../Frontend/HLSL/HLSLRootSignatureUtils.h | 2 +-
.../Frontend/HLSL/HLSLRootSignatureUtils.cpp | 15 ++--------
.../Frontend/HLSLRootSignatureDumpTest.cpp | 10 +++----
8 files changed, 39 insertions(+), 53 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index bc7fa2bc9481e..cff8a38e051c0 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -86,14 +86,14 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<uint32_t> Num32BitConstants;
std::optional<uint32_t> Space;
- std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
+ std::optional<llvm::dxbc::ShaderVisibility> Visibility;
};
std::optional<ParsedConstantParams> parseRootConstantParams();
struct ParsedRootDescriptorParams {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<uint32_t> Space;
- std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
+ std::optional<llvm::dxbc::ShaderVisibility> Visibility;
std::optional<llvm::dxbc::RootDescriptorFlags> Flags;
};
std::optional<ParsedRootDescriptorParams>
@@ -122,7 +122,7 @@ class RootSignatureParser {
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
std::optional<uint32_t> Space;
- std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
+ std::optional<llvm::dxbc::ShaderVisibility> Visibility;
};
std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams();
@@ -132,7 +132,7 @@ class RootSignatureParser {
std::optional<float> parseFloatParam();
/// Parsing methods of various enums
- std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
+ std::optional<llvm::dxbc::ShaderVisibility> parseShaderVisibility();
std::optional<llvm::hlsl::rootsig::SamplerFilter> parseSamplerFilter();
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
parseTextureAddressMode();
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 4d523dcd545e3..28a25de25d26f 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -241,7 +241,7 @@ std::optional<DescriptorTable> RootSignatureParser::parseDescriptorTable() {
return std::nullopt;
DescriptorTable Table;
- std::optional<ShaderVisibility> Visibility;
+ std::optional<llvm::dxbc::ShaderVisibility> Visibility;
// Iterate as many Clauses as possible
do {
@@ -984,7 +984,7 @@ std::optional<float> RootSignatureParser::parseFloatParam() {
return std::nullopt;
}
-std::optional<llvm::hlsl::rootsig::ShaderVisibility>
+std::optional<llvm::dxbc::ShaderVisibility>
RootSignatureParser::parseShaderVisibility() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1000,7 +1000,7 @@ RootSignatureParser::parseShaderVisibility() {
switch (CurToken.TokKind) {
#define SHADER_VISIBILITY_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return ShaderVisibility::NAME; \
+ return llvm::dxbc::ShaderVisibility::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 0974ccbf9267c..9d174658c146e 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -1200,7 +1200,7 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
const RangeInfo *OInfo) {
HadOverlap = true;
auto CommonVis =
- Info->Visibility == llvm::hlsl::rootsig::ShaderVisibility::All
+ Info->Visibility == llvm::dxbc::ShaderVisibility::All
? OInfo->Visibility
: Info->Visibility;
this->Diag(Loc, diag::err_hlsl_resource_range_overlap)
@@ -1237,7 +1237,7 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
// ResourceRanges in the former case and it will be an ArrayRef to just the
// all visiblity ResourceRange in the latter case.
ArrayRef<ResourceRange> OverlapRanges =
- Info.Visibility == llvm::hlsl::rootsig::ShaderVisibility::All
+ Info.Visibility == llvm::dxbc::ShaderVisibility::All
? ArrayRef<ResourceRange>{Ranges}.drop_front()
: ArrayRef<ResourceRange>{Ranges}.take_front();
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 6f80c1bd80bd3..c275547e8713e 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -213,13 +213,14 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseDTClausesTest) {
ASSERT_TRUE(std::holds_alternative<DescriptorTable>(Elem));
ASSERT_EQ(std::get<DescriptorTable>(Elem).NumClauses, (uint32_t)4);
ASSERT_EQ(std::get<DescriptorTable>(Elem).Visibility,
- ShaderVisibility::Pixel);
+ llvm::dxbc::ShaderVisibility::Pixel);
// Empty Descriptor Table
Elem = Elements[5];
ASSERT_TRUE(std::holds_alternative<DescriptorTable>(Elem));
ASSERT_EQ(std::get<DescriptorTable>(Elem).NumClauses, 0u);
- ASSERT_EQ(std::get<DescriptorTable>(Elem).Visibility, ShaderVisibility::All);
+ ASSERT_EQ(std::get<DescriptorTable>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::All);
ASSERT_TRUE(Consumer->isSatisfied());
}
@@ -271,7 +272,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
ASSERT_EQ(std::get<StaticSampler>(Elem).Space, 0u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).Visibility, ShaderVisibility::All);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::All);
// Check values can be set as expected
Elem = Elements[1];
@@ -291,7 +293,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).Space, 4u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).Visibility, ShaderVisibility::Domain);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::Domain);
ASSERT_TRUE(Consumer->isSatisfied());
}
@@ -439,7 +442,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootConsantsTest) {
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.ViewType, RegisterType::BReg);
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<RootConstants>(Elem).Space, 0u);
- ASSERT_EQ(std::get<RootConstants>(Elem).Visibility, ShaderVisibility::All);
+ ASSERT_EQ(std::get<RootConstants>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::All);
Elem = Elements[1];
ASSERT_TRUE(std::holds_alternative<RootConstants>(Elem));
@@ -447,7 +451,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootConsantsTest) {
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.ViewType, RegisterType::BReg);
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.Number, 42u);
ASSERT_EQ(std::get<RootConstants>(Elem).Space, 3u);
- ASSERT_EQ(std::get<RootConstants>(Elem).Visibility, ShaderVisibility::Hull);
+ ASSERT_EQ(std::get<RootConstants>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::Hull);
ASSERT_TRUE(Consumer->isSatisfied());
}
@@ -534,7 +539,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.ViewType, RegisterType::BReg);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 0u);
- ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility, ShaderVisibility::All);
+ ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::All);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
llvm::dxbc::RootDescriptorFlags::DataStaticWhileSetAtExecute);
@@ -545,7 +551,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.Number, 42u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 4u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility,
- ShaderVisibility::Geometry);
+ llvm::dxbc::ShaderVisibility::Geometry);
auto ValidRootDescriptorFlags = llvm::dxbc::RootDescriptorFlags(0xe);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags, ValidRootDescriptorFlags);
@@ -555,7 +561,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.ViewType, RegisterType::UReg);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.Number, 34893247u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 0u);
- ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility, ShaderVisibility::Hull);
+ ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::Hull);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
llvm::dxbc::RootDescriptorFlags::DataVolatile);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
@@ -566,7 +573,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootDescriptorsTest) {
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.ViewType, RegisterType::BReg);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Space, 0u);
- ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility, ShaderVisibility::All);
+ ASSERT_EQ(std::get<RootDescriptor>(Elem).Visibility,
+ llvm::dxbc::ShaderVisibility::All);
ASSERT_EQ(std::get<RootDescriptor>(Elem).Flags,
llvm::dxbc::RootDescriptorFlags::None);
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index afd76180cb972..052359f834245 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -29,17 +29,6 @@ namespace rootsig {
// carried over from their values in DXC. For reference:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
-enum class ShaderVisibility {
- All = 0,
- Vertex = 1,
- Hull = 2,
- Domain = 3,
- Geometry = 4,
- Pixel = 5,
- Amplification = 6,
- Mesh = 7,
-};
-
// D3D12_FILTER enumeration:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter
enum class SamplerFilter {
@@ -122,7 +111,7 @@ struct RootConstants {
uint32_t Num32BitConstants;
Register Reg;
uint32_t Space = 0;
- ShaderVisibility Visibility = ShaderVisibility::All;
+ dxbc::ShaderVisibility Visibility = dxbc::ShaderVisibility::All;
};
enum class DescriptorType : uint8_t { SRV = 0, UAV, CBuffer };
@@ -131,7 +120,7 @@ struct RootDescriptor {
DescriptorType Type;
Register Reg;
uint32_t Space = 0;
- ShaderVisibility Visibility = ShaderVisibility::All;
+ dxbc::ShaderVisibility Visibility = dxbc::ShaderVisibility::All;
dxbc::RootDescriptorFlags Flags;
void setDefaultFlags() {
@@ -149,7 +138,7 @@ struct RootDescriptor {
// Models the end of a descriptor table and stores its visibility
struct DescriptorTable {
- ShaderVisibility Visibility = ShaderVisibility::All;
+ dxbc::ShaderVisibility Visibility = dxbc::ShaderVisibility::All;
// Denotes that the previous NumClauses in the RootElement array
// are the clauses in the table.
uint32_t NumClauses = 0;
@@ -196,7 +185,7 @@ struct StaticSampler {
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
uint32_t Space = 0;
- ShaderVisibility Visibility = ShaderVisibility::All;
+ dxbc::ShaderVisibility Visibility = dxbc::ShaderVisibility::All;
};
/// Models RootElement : RootFlags | RootConstants | RootParam
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
index 1bb4933a341b8..4fa080e949d54 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
@@ -83,7 +83,7 @@ struct RangeInfo {
// Information retained for diagnostics
llvm::dxil::ResourceClass Class;
uint32_t Space;
- ShaderVisibility Visibility;
+ llvm::dxbc::ShaderVisibility Visibility;
};
class ResourceRange {
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index 96b80eb4a586e..e6735faa5fc0b 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -80,20 +80,9 @@ static raw_ostream &operator<<(raw_ostream &OS, const Register &Reg) {
return OS;
}
-static const EnumEntry<ShaderVisibility> VisibilityNames[] = {
- {"All", ShaderVisibility::All},
- {"Vertex", ShaderVisibility::Vertex},
- {"Hull", ShaderVisibility::Hull},
- {"Domain", ShaderVisibility::Domain},
- {"Geometry", ShaderVisibility::Geometry},
- {"Pixel", ShaderVisibility::Pixel},
- {"Amplification", ShaderVisibility::Amplification},
- {"Mesh", ShaderVisibility::Mesh},
-};
-
static raw_ostream &operator<<(raw_ostream &OS,
- const ShaderVisibility &Visibility) {
- printEnum(OS, Visibility, ArrayRef(VisibilityNames));
+ const llvm::dxbc::ShaderVisibility &Visibility) {
+ printEnum(OS, Visibility, dxbc::getShaderVisibility());
return OS;
}
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index e6b8f446090d9..841c7de6f6bb8 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -96,7 +96,7 @@ TEST(HLSLRootSignatureTest, DescriptorSamplerClauseDump) {
TEST(HLSLRootSignatureTest, DescriptorTableDump) {
DescriptorTable Table;
Table.NumClauses = 4;
- Table.Visibility = ShaderVisibility::Geometry;
+ Table.Visibility = llvm::dxbc::ShaderVisibility::Geometry;
std::string Out;
llvm::raw_string_ostream OS(Out);
@@ -130,7 +130,7 @@ TEST(HLSLRootSignatureTest, RootSRVDump) {
Descriptor.Type = DescriptorType::SRV;
Descriptor.Reg = {RegisterType::TReg, 0};
Descriptor.Space = 42;
- Descriptor.Visibility = ShaderVisibility::Geometry;
+ Descriptor.Visibility = llvm::dxbc::ShaderVisibility::Geometry;
Descriptor.Flags = llvm::dxbc::RootDescriptorFlags::None;
std::string Out;
@@ -148,7 +148,7 @@ TEST(HLSLRootSignatureTest, RootUAVDump) {
Descriptor.Type = DescriptorType::UAV;
Descriptor.Reg = {RegisterType::UReg, 92374};
Descriptor.Space = 932847;
- Descriptor.Visibility = ShaderVisibility::Hull;
+ Descriptor.Visibility = llvm::dxbc::ShaderVisibility::Hull;
Descriptor.Flags = llvm::dxbc::RootDescriptorFlags(0xe);
std::string Out;
@@ -205,7 +205,7 @@ TEST(HLSLRootSignatureTest, DefinedStaticSamplerDump) {
Sampler.MinLOD = 1.0f;
Sampler.MaxLOD = 32.0f;
Sampler.Space = 7;
- Sampler.Visibility = ShaderVisibility::Domain;
+ Sampler.Visibility = llvm::dxbc::ShaderVisibility::Domain;
std::string Out;
llvm::raw_string_ostream OS(Out);
@@ -249,7 +249,7 @@ TEST(HLSLRootSignatureTest, SetRootConstantsDump) {
Constants.Num32BitConstants = 983;
Constants.Reg = {RegisterType::BReg, 34593};
Constants.Space = 7;
- Constants.Visibility = ShaderVisibility::Pixel;
+ Constants.Visibility = llvm::dxbc::ShaderVisibility::Pixel;
std::string Out;
llvm::raw_string_ostream OS(Out);
>From 7a0a9f79e01b1ca35dcb98c749406c6a6c722c66 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 21:23:32 +0000
Subject: [PATCH 08/16] nfc: prep dxbc::StaticBorderColor
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 4 +++-
llvm/include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/BinaryFormat/DXContainer.cpp | 10 ++++++++++
3 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 42e3fe7cf6644..98badf717f0a7 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -237,10 +237,12 @@ enum class SamplersComparisonFunction : uint32_t {
};
#define STATIC_BORDER_COLOR(Val, Enum) Enum = Val,
-enum class SamplersBorderColor : uint32_t {
+enum class StaticBorderColor : uint32_t {
#include "DXContainerConstants.def"
};
+LLVM_ABI ArrayRef<EnumEntry<StaticBorderColor>> getStaticBorderColors();
+
LLVM_ABI PartType parsePartType(StringRef S);
struct VertexPSVInfo {
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index acb65cf02d96f..635217629418c 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -174,7 +174,7 @@ struct StaticSamplerYamlDesc {
uint32_t ComparisonFunc =
llvm::to_underlying(dxbc::SamplersComparisonFunction::LessEqual);
uint32_t BorderColor =
- llvm::to_underlying(dxbc::SamplersBorderColor::OpaqueWhite);
+ llvm::to_underlying(dxbc::StaticBorderColor::OpaqueWhite);
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
uint32_t ShaderRegister;
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index a112c3a90f1b7..db041d7cb914f 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -99,6 +99,16 @@ ArrayRef<EnumEntry<ShaderVisibility>> dxbc::getShaderVisibility() {
return ArrayRef(ShaderVisibilityValues);
}
+#define STATIC_BORDER_COLOR(Val, Enum) {#Enum, StaticBorderColor::Enum},
+
+static const EnumEntry<StaticBorderColor> StaticBorderColorValues[] = {
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<StaticBorderColor>> dxbc::getStaticBorderColors() {
+ return ArrayRef(StaticBorderColorValues);
+}
+
#define ROOT_PARAMETER(Val, Enum) {#Enum, RootParameterType::Enum},
static const EnumEntry<RootParameterType> RootParameterTypes[] = {
>From 55111b98e596069a04a826b47014d58ccc52d99a Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 21:28:25 +0000
Subject: [PATCH 09/16] nfc: move StaticBorderColor
---
clang/include/clang/Parse/ParseHLSLRootSignature.h | 5 ++---
clang/lib/Parse/ParseHLSLRootSignature.cpp | 4 ++--
clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp | 4 ++--
llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h | 10 +---------
llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp | 12 ++----------
.../unittests/Frontend/HLSLRootSignatureDumpTest.cpp | 2 +-
6 files changed, 10 insertions(+), 27 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index cff8a38e051c0..6e610647049d2 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -118,7 +118,7 @@ class RootSignatureParser {
std::optional<float> MipLODBias;
std::optional<uint32_t> MaxAnisotropy;
std::optional<llvm::hlsl::rootsig::ComparisonFunc> CompFunc;
- std::optional<llvm::hlsl::rootsig::StaticBorderColor> BorderColor;
+ std::optional<llvm::dxbc::StaticBorderColor> BorderColor;
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
std::optional<uint32_t> Space;
@@ -137,8 +137,7 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
parseTextureAddressMode();
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
- std::optional<llvm::hlsl::rootsig::StaticBorderColor>
- parseStaticBorderColor();
+ std::optional<llvm::dxbc::StaticBorderColor> parseStaticBorderColor();
std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
std::optional<llvm::dxbc::DescriptorRangeFlags> parseDescriptorRangeFlags();
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 28a25de25d26f..f3d0d33306375 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -1088,7 +1088,7 @@ RootSignatureParser::parseComparisonFunc() {
return std::nullopt;
}
-std::optional<llvm::hlsl::rootsig::StaticBorderColor>
+std::optional<llvm::dxbc::StaticBorderColor>
RootSignatureParser::parseStaticBorderColor() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1104,7 +1104,7 @@ RootSignatureParser::parseStaticBorderColor() {
switch (CurToken.TokKind) {
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return StaticBorderColor::NAME; \
+ return llvm::dxbc::StaticBorderColor::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index c275547e8713e..943f5e133e540 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -268,7 +268,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::LessEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
- StaticBorderColor::OpaqueWhite);
+ llvm::dxbc::StaticBorderColor::OpaqueWhite);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 3.402823466e+38f);
ASSERT_EQ(std::get<StaticSampler>(Elem).Space, 0u);
@@ -289,7 +289,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::NotEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
- StaticBorderColor::OpaqueBlackUint);
+ llvm::dxbc::StaticBorderColor::OpaqueBlackUint);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MaxLOD, 9000.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).Space, 4u);
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 052359f834245..70063da815775 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -89,14 +89,6 @@ enum class ComparisonFunc : unsigned {
Always = 8
};
-enum class StaticBorderColor {
- TransparentBlack = 0,
- OpaqueBlack = 1,
- OpaqueWhite = 2,
- OpaqueBlackUint = 3,
- OpaqueWhiteUint = 4
-};
-
// Definitions of the in-memory data layout structures
// Models the different registers: bReg | tReg | uReg | sReg
@@ -181,7 +173,7 @@ struct StaticSampler {
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
ComparisonFunc CompFunc = ComparisonFunc::LessEqual;
- StaticBorderColor BorderColor = StaticBorderColor::OpaqueWhite;
+ dxbc::StaticBorderColor BorderColor = dxbc::StaticBorderColor::OpaqueWhite;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
uint32_t Space = 0;
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index e6735faa5fc0b..ccecd1976cd6f 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -175,17 +175,9 @@ static raw_ostream &operator<<(raw_ostream &OS,
return OS;
}
-static const EnumEntry<StaticBorderColor> StaticBorderColorNames[] = {
- {"TransparentBlack", StaticBorderColor::TransparentBlack},
- {"OpaqueBlack", StaticBorderColor::OpaqueBlack},
- {"OpaqueWhite", StaticBorderColor::OpaqueWhite},
- {"OpaqueBlackUint", StaticBorderColor::OpaqueBlackUint},
- {"OpaqueWhiteUint", StaticBorderColor::OpaqueWhiteUint},
-};
-
static raw_ostream &operator<<(raw_ostream &OS,
- const StaticBorderColor &BorderColor) {
- printEnum(OS, BorderColor, ArrayRef(StaticBorderColorNames));
+ const dxbc::StaticBorderColor &BorderColor) {
+ printEnum(OS, BorderColor, dxbc::getStaticBorderColors());
return OS;
}
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 841c7de6f6bb8..4f9d5d1ed058d 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -201,7 +201,7 @@ TEST(HLSLRootSignatureTest, DefinedStaticSamplerDump) {
Sampler.MipLODBias = 4.8f;
Sampler.MaxAnisotropy = 32;
Sampler.CompFunc = ComparisonFunc::NotEqual;
- Sampler.BorderColor = StaticBorderColor::OpaqueBlack;
+ Sampler.BorderColor = llvm::dxbc::StaticBorderColor::OpaqueBlack;
Sampler.MinLOD = 1.0f;
Sampler.MaxLOD = 32.0f;
Sampler.Space = 7;
>From 35a4f5c517b80b1eac36172902fb852f441e0b5c Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 21:42:06 +0000
Subject: [PATCH 10/16] nfc: prep dxbc::ComparisonFunc and
dxbc::TextureAddressMode
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 8 +++++--
.../BinaryFormat/DXContainerConstants.def | 24 +++++++++----------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/BinaryFormat/DXContainer.cpp | 20 ++++++++++++++++
4 files changed, 39 insertions(+), 15 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 98badf717f0a7..047348bd2720b 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -231,11 +231,15 @@ enum class TextureAddressMode : uint32_t {
#include "DXContainerConstants.def"
};
-#define COMPARISON_FUNCTION(Val, Enum) Enum = Val,
-enum class SamplersComparisonFunction : uint32_t {
+LLVM_ABI ArrayRef<EnumEntry<TextureAddressMode>> getTextureAddressModes();
+
+#define COMPARISON_FUNC(Val, Enum) Enum = Val,
+enum class ComparisonFunc : uint32_t {
#include "DXContainerConstants.def"
};
+LLVM_ABI ArrayRef<EnumEntry<ComparisonFunc>> getComparisonFuncs();
+
#define STATIC_BORDER_COLOR(Val, Enum) Enum = Val,
enum class StaticBorderColor : uint32_t {
#include "DXContainerConstants.def"
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 82158a97dff6d..da6976d5ac2ec 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -188,18 +188,18 @@ TEXTURE_ADDRESS_MODE( 5, MirrorOnce)
#undef TEXTURE_ADDRESS_MODE
#endif // TEXTURE_ADDRESS_MODE
-#ifdef COMPARISON_FUNCTION
-
-COMPARISON_FUNCTION( 1, Never)
-COMPARISON_FUNCTION( 2, Less)
-COMPARISON_FUNCTION( 3, Equal)
-COMPARISON_FUNCTION( 4, LessEqual)
-COMPARISON_FUNCTION( 5, Greater)
-COMPARISON_FUNCTION( 6, NotEqual)
-COMPARISON_FUNCTION( 7, GreaterEqual)
-COMPARISON_FUNCTION( 8, Always)
-#undef COMPARISON_FUNCTION
-#endif // COMPARISON_FUNCTION
+#ifdef COMPARISON_FUNC
+
+COMPARISON_FUNC( 1, Never)
+COMPARISON_FUNC( 2, Less)
+COMPARISON_FUNC( 3, Equal)
+COMPARISON_FUNC( 4, LessEqual)
+COMPARISON_FUNC( 5, Greater)
+COMPARISON_FUNC( 6, NotEqual)
+COMPARISON_FUNC( 7, GreaterEqual)
+COMPARISON_FUNC( 8, Always)
+#undef COMPARISON_FUNC
+#endif // COMPARISON_FUNC
#ifdef STATIC_BORDER_COLOR
STATIC_BORDER_COLOR( 0, TransparentBlack)
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 635217629418c..3a09520a59c6f 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -172,7 +172,7 @@ struct StaticSamplerYamlDesc {
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16u;
uint32_t ComparisonFunc =
- llvm::to_underlying(dxbc::SamplersComparisonFunction::LessEqual);
+ llvm::to_underlying(dxbc::ComparisonFunc::LessEqual);
uint32_t BorderColor =
llvm::to_underlying(dxbc::StaticBorderColor::OpaqueWhite);
float MinLOD = 0.f;
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index db041d7cb914f..b2fdb914303fc 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -99,6 +99,26 @@ ArrayRef<EnumEntry<ShaderVisibility>> dxbc::getShaderVisibility() {
return ArrayRef(ShaderVisibilityValues);
}
+#define TEXTURE_ADDRESS_MODE(Val, Enum) {#Enum, TextureAddressMode::Enum},
+
+static const EnumEntry<TextureAddressMode> TextureAddressModeNames[] = {
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<TextureAddressMode>> dxbc::getTextureAddressModes() {
+ return ArrayRef(TextureAddressModeNames);
+}
+
+#define COMPARISON_FUNC(Val, Enum) {#Enum, ComparisonFunc::Enum},
+
+static const EnumEntry<ComparisonFunc> ComparisonFuncNames[] = {
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<ComparisonFunc>> dxbc::getComparisonFuncs() {
+ return ArrayRef(ComparisonFuncNames);
+}
+
#define STATIC_BORDER_COLOR(Val, Enum) {#Enum, StaticBorderColor::Enum},
static const EnumEntry<StaticBorderColor> StaticBorderColorValues[] = {
>From e1de7efaeb3d02232c08e5e8d846e11d82aa0a09 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 21:52:38 +0000
Subject: [PATCH 11/16] nfc: move ComparisonFunc and TextureAddressMode
---
.../clang/Parse/ParseHLSLRootSignature.h | 13 +++++----
clang/lib/Parse/ParseHLSLRootSignature.cpp | 8 +++---
.../Parse/ParseHLSLRootSignatureTest.cpp | 24 +++++++++++------
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 27 +++----------------
.../Frontend/HLSL/HLSLRootSignatureUtils.cpp | 27 +++----------------
.../Frontend/HLSLRootSignatureDumpTest.cpp | 8 +++---
6 files changed, 38 insertions(+), 69 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index 6e610647049d2..d7b9959e26efa 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -112,12 +112,12 @@ class RootSignatureParser {
struct ParsedStaticSamplerParams {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<llvm::hlsl::rootsig::SamplerFilter> Filter;
- std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU;
- std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
- std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
+ std::optional<llvm::dxbc::TextureAddressMode> AddressU;
+ std::optional<llvm::dxbc::TextureAddressMode> AddressV;
+ std::optional<llvm::dxbc::TextureAddressMode> AddressW;
std::optional<float> MipLODBias;
std::optional<uint32_t> MaxAnisotropy;
- std::optional<llvm::hlsl::rootsig::ComparisonFunc> CompFunc;
+ std::optional<llvm::dxbc::ComparisonFunc> CompFunc;
std::optional<llvm::dxbc::StaticBorderColor> BorderColor;
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
@@ -134,9 +134,8 @@ class RootSignatureParser {
/// Parsing methods of various enums
std::optional<llvm::dxbc::ShaderVisibility> parseShaderVisibility();
std::optional<llvm::hlsl::rootsig::SamplerFilter> parseSamplerFilter();
- std::optional<llvm::hlsl::rootsig::TextureAddressMode>
- parseTextureAddressMode();
- std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
+ std::optional<llvm::dxbc::TextureAddressMode> parseTextureAddressMode();
+ std::optional<llvm::dxbc::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::dxbc::StaticBorderColor> parseStaticBorderColor();
std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
std::optional<llvm::dxbc::DescriptorRangeFlags> parseDescriptorRangeFlags();
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index f3d0d33306375..8f3c70f04a972 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -1036,7 +1036,7 @@ RootSignatureParser::parseSamplerFilter() {
return std::nullopt;
}
-std::optional<llvm::hlsl::rootsig::TextureAddressMode>
+std::optional<llvm::dxbc::TextureAddressMode>
RootSignatureParser::parseTextureAddressMode() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1052,7 +1052,7 @@ RootSignatureParser::parseTextureAddressMode() {
switch (CurToken.TokKind) {
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return TextureAddressMode::NAME; \
+ return llvm::dxbc::TextureAddressMode::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
@@ -1062,7 +1062,7 @@ RootSignatureParser::parseTextureAddressMode() {
return std::nullopt;
}
-std::optional<llvm::hlsl::rootsig::ComparisonFunc>
+std::optional<llvm::dxbc::ComparisonFunc>
RootSignatureParser::parseComparisonFunc() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1078,7 +1078,7 @@ RootSignatureParser::parseComparisonFunc() {
switch (CurToken.TokKind) {
#define COMPARISON_FUNC_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return ComparisonFunc::NAME; \
+ return llvm::dxbc::ComparisonFunc::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 943f5e133e540..57d5f3180c266 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -261,12 +261,16 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<StaticSampler>(Elem).Filter, SamplerFilter::Anisotropic);
- ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Wrap);
- ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Wrap);
- ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Wrap);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU,
+ llvm::dxbc::TextureAddressMode::Wrap);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV,
+ llvm::dxbc::TextureAddressMode::Wrap);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW,
+ llvm::dxbc::TextureAddressMode::Wrap);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 0.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 16u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::LessEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc,
+ llvm::dxbc::ComparisonFunc::LessEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
llvm::dxbc::StaticBorderColor::OpaqueWhite);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 0.f);
@@ -282,12 +286,16 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<StaticSampler>(Elem).Filter,
SamplerFilter::MaximumMinPointMagLinearMipPoint);
- ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU, TextureAddressMode::Mirror);
- ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV, TextureAddressMode::Border);
- ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW, TextureAddressMode::Clamp);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU,
+ llvm::dxbc::TextureAddressMode::Mirror);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV,
+ llvm::dxbc::TextureAddressMode::Border);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).AddressW,
+ llvm::dxbc::TextureAddressMode::Clamp);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MipLODBias, 230.f);
ASSERT_EQ(std::get<StaticSampler>(Elem).MaxAnisotropy, 3u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc, ComparisonFunc::NotEqual);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).CompFunc,
+ llvm::dxbc::ComparisonFunc::NotEqual);
ASSERT_EQ(std::get<StaticSampler>(Elem).BorderColor,
llvm::dxbc::StaticBorderColor::OpaqueBlackUint);
ASSERT_FLOAT_EQ(std::get<StaticSampler>(Elem).MinLOD, 4.2f);
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 70063da815775..c1c21fc557668 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -70,25 +70,6 @@ enum class SamplerFilter {
MaximumAnisotropic = 0x1d5
};
-enum class TextureAddressMode {
- Wrap = 1,
- Mirror = 2,
- Clamp = 3,
- Border = 4,
- MirrorOnce = 5
-};
-
-enum class ComparisonFunc : unsigned {
- Never = 1,
- Less = 2,
- Equal = 3,
- LessEqual = 4,
- Greater = 5,
- NotEqual = 6,
- GreaterEqual = 7,
- Always = 8
-};
-
// Definitions of the in-memory data layout structures
// Models the different registers: bReg | tReg | uReg | sReg
@@ -167,12 +148,12 @@ struct DescriptorTableClause {
struct StaticSampler {
Register Reg;
SamplerFilter Filter = SamplerFilter::Anisotropic;
- TextureAddressMode AddressU = TextureAddressMode::Wrap;
- TextureAddressMode AddressV = TextureAddressMode::Wrap;
- TextureAddressMode AddressW = TextureAddressMode::Wrap;
+ dxbc::TextureAddressMode AddressU = dxbc::TextureAddressMode::Wrap;
+ dxbc::TextureAddressMode AddressV = dxbc::TextureAddressMode::Wrap;
+ dxbc::TextureAddressMode AddressW = dxbc::TextureAddressMode::Wrap;
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
- ComparisonFunc CompFunc = ComparisonFunc::LessEqual;
+ llvm::dxbc::ComparisonFunc CompFunc = llvm::dxbc::ComparisonFunc::LessEqual;
dxbc::StaticBorderColor BorderColor = dxbc::StaticBorderColor::OpaqueWhite;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index ccecd1976cd6f..5c7dcc549b6cf 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -142,35 +142,16 @@ static raw_ostream &operator<<(raw_ostream &OS, const SamplerFilter &Filter) {
return OS;
}
-static const EnumEntry<TextureAddressMode> TextureAddressModeNames[] = {
- {"Wrap", TextureAddressMode::Wrap},
- {"Mirror", TextureAddressMode::Mirror},
- {"Clamp", TextureAddressMode::Clamp},
- {"Border", TextureAddressMode::Border},
- {"MirrorOnce", TextureAddressMode::MirrorOnce},
-};
-
static raw_ostream &operator<<(raw_ostream &OS,
- const TextureAddressMode &Address) {
- printEnum(OS, Address, ArrayRef(TextureAddressModeNames));
+ const dxbc::TextureAddressMode &Address) {
+ printEnum(OS, Address, dxbc::getTextureAddressModes());
return OS;
}
-static const EnumEntry<ComparisonFunc> ComparisonFuncNames[] = {
- {"Never", ComparisonFunc::Never},
- {"Less", ComparisonFunc::Less},
- {"Equal", ComparisonFunc::Equal},
- {"LessEqual", ComparisonFunc::LessEqual},
- {"Greater", ComparisonFunc::Greater},
- {"NotEqual", ComparisonFunc::NotEqual},
- {"GreaterEqual", ComparisonFunc::GreaterEqual},
- {"Always", ComparisonFunc::Always},
-};
-
static raw_ostream &operator<<(raw_ostream &OS,
- const ComparisonFunc &CompFunc) {
- printEnum(OS, CompFunc, ArrayRef(ComparisonFuncNames));
+ const dxbc::ComparisonFunc &CompFunc) {
+ printEnum(OS, CompFunc, dxbc::getComparisonFuncs());
return OS;
}
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 4f9d5d1ed058d..29f872df2d809 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -195,12 +195,12 @@ TEST(HLSLRootSignatureTest, DefinedStaticSamplerDump) {
Sampler.Reg = {RegisterType::SReg, 0};
Sampler.Filter = SamplerFilter::ComparisonMinMagLinearMipPoint;
- Sampler.AddressU = TextureAddressMode::Mirror;
- Sampler.AddressV = TextureAddressMode::Border;
- Sampler.AddressW = TextureAddressMode::Clamp;
+ Sampler.AddressU = llvm::dxbc::TextureAddressMode::Mirror;
+ Sampler.AddressV = llvm::dxbc::TextureAddressMode::Border;
+ Sampler.AddressW = llvm::dxbc::TextureAddressMode::Clamp;
Sampler.MipLODBias = 4.8f;
Sampler.MaxAnisotropy = 32;
- Sampler.CompFunc = ComparisonFunc::NotEqual;
+ Sampler.CompFunc = llvm::dxbc::ComparisonFunc::NotEqual;
Sampler.BorderColor = llvm::dxbc::StaticBorderColor::OpaqueBlack;
Sampler.MinLOD = 1.0f;
Sampler.MaxLOD = 32.0f;
>From 8313c0e9b4e40b8468ceee4d133df253b2eec3be Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 22:18:13 +0000
Subject: [PATCH 12/16] nfc: prep dxbc::SamplerFilter
---
llvm/include/llvm/BinaryFormat/DXContainer.h | 6 +-
.../BinaryFormat/DXContainerConstants.def | 81 ++++++++++---------
.../include/llvm/ObjectYAML/DXContainerYAML.h | 2 +-
llvm/lib/BinaryFormat/DXContainer.cpp | 10 +++
4 files changed, 56 insertions(+), 43 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainer.h b/llvm/include/llvm/BinaryFormat/DXContainer.h
index 047348bd2720b..54dc4c7db5ee0 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainer.h
+++ b/llvm/include/llvm/BinaryFormat/DXContainer.h
@@ -221,11 +221,13 @@ inline bool isValidShaderVisibility(uint32_t V) {
return false;
}
-#define STATIC_SAMPLER_FILTER(Val, Enum) Enum = Val,
-enum class StaticSamplerFilter : uint32_t {
+#define FILTER(Val, Enum) Enum = Val,
+enum class SamplerFilter : uint32_t {
#include "DXContainerConstants.def"
};
+LLVM_ABI ArrayRef<EnumEntry<SamplerFilter>> getSamplerFilters();
+
#define TEXTURE_ADDRESS_MODE(Val, Enum) Enum = Val,
enum class TextureAddressMode : uint32_t {
#include "DXContainerConstants.def"
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index da6976d5ac2ec..34b2f733be422 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -137,46 +137,47 @@ SHADER_VISIBILITY(7, Mesh)
#undef SHADER_VISIBILITY
#endif // SHADER_VISIBILITY
-#ifdef STATIC_SAMPLER_FILTER
-
-STATIC_SAMPLER_FILTER(0, MIN_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x1, MIN_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x4, MIN_POINT_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x5, MIN_POINT_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x10, MIN_LINEAR_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x11, MIN_LINEAR_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x14, MIN_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x15, MIN_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x55, ANISOTROPIC)
-STATIC_SAMPLER_FILTER(0x80, COMPARISON_MIN_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x81, COMPARISON_MIN_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x84, COMPARISON_MIN_POINT_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x85, COMPARISON_MIN_POINT_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x90, COMPARISON_MIN_LINEAR_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x91, COMPARISON_MIN_LINEAR_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x94, COMPARISON_MIN_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x95, COMPARISON_MIN_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0xd5, COMPARISON_ANISOTROPIC)
-STATIC_SAMPLER_FILTER(0x100, MINIMUM_MIN_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x101, MINIMUM_MIN_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x104, MINIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x105, MINIMUM_MIN_POINT_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x110, MINIMUM_MIN_LINEAR_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x111, MINIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x114, MINIMUM_MIN_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x115, MINIMUM_MIN_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x155, MINIMUM_ANISOTROPIC)
-STATIC_SAMPLER_FILTER(0x180, MAXIMUM_MIN_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x181, MAXIMUM_MIN_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x184, MAXIMUM_MIN_POINT_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x185, MAXIMUM_MIN_POINT_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x190, MAXIMUM_MIN_LINEAR_MAG_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x191, MAXIMUM_MIN_LINEAR_MAG_POINT_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x194, MAXIMUM_MIN_MAG_LINEAR_MIP_POINT)
-STATIC_SAMPLER_FILTER(0x195, MAXIMUM_MIN_MAG_MIP_LINEAR)
-STATIC_SAMPLER_FILTER(0x1d5, MAXIMUM_ANISOTROPIC)
-#undef STATIC_SAMPLER_FILTER
-#endif // STATIC_SAMPLER_FILTER
+// #FILTER(value, enum).
+#ifdef FILTER
+
+FILTER(0, MinMagMipPoint)
+FILTER(0x1, MinMagPointMipLinear)
+FILTER(0x4, MinPointMagLinearMipPoint)
+FILTER(0x5, MinPointMagMipLinear)
+FILTER(0x10, MinLinearMagMipPoint)
+FILTER(0x11, MinLinearMagPointMipLinear)
+FILTER(0x14, MinMagLinearMipPoint)
+FILTER(0x15, MinMagMipLinear)
+FILTER(0x55, Anisotropic)
+FILTER(0x80, ComparisonMinMagMipPoint)
+FILTER(0x81, ComparisonMinMagPointMipLinear)
+FILTER(0x84, ComparisonMinPointMagLinearMipPoint)
+FILTER(0x85, ComparisonMinPointMagMipLinear)
+FILTER(0x90, ComparisonMinLinearMagMipPoint)
+FILTER(0x91, ComparisonMinLinearMagPointMipLinear)
+FILTER(0x94, ComparisonMinMagLinearMipPoint)
+FILTER(0x95, ComparisonMinMagMipLinear)
+FILTER(0xd5, ComparisonAnisotropic)
+FILTER(0x100, MinimumMinMagMipPoint)
+FILTER(0x101, MinimumMinMagPointMipLinear)
+FILTER(0x104, MinimumMinPointMagLinearMipPoint)
+FILTER(0x105, MinimumMinPointMagMipLinear)
+FILTER(0x110, MinimumMinLinearMagMipPoint)
+FILTER(0x111, MinimumMinLinearMagPointMipLinear)
+FILTER(0x114, MinimumMinMagLinearMipPoint)
+FILTER(0x115, MinimumMinMagMipLinear)
+FILTER(0x155, MinimumAnisotropic)
+FILTER(0x180, MaximumMinMagMipPoint)
+FILTER(0x181, MaximumMinMagPointMipLinear)
+FILTER(0x184, MaximumMinPointMagLinearMipPoint)
+FILTER(0x185, MaximumMinPointMagMipLinear)
+FILTER(0x190, MaximumMinLinearMagMipPoint)
+FILTER(0x191, MaximumMinLinearMagPointMipLinear)
+FILTER(0x194, MaximumMinMagLinearMipPoint)
+FILTER(0x195, MaximumMinMagMipLinear)
+FILTER(0x1d5, MaximumAnisotropic)
+#undef FILTER
+#endif // FILTER
#ifdef TEXTURE_ADDRESS_MODE
diff --git a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
index 3a09520a59c6f..7e0a4c6b07039 100644
--- a/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
+++ b/llvm/include/llvm/ObjectYAML/DXContainerYAML.h
@@ -165,7 +165,7 @@ struct RootParameterYamlDesc {
};
struct StaticSamplerYamlDesc {
- uint32_t Filter = llvm::to_underlying(dxbc::StaticSamplerFilter::ANISOTROPIC);
+ uint32_t Filter = llvm::to_underlying(dxbc::SamplerFilter::Anisotropic);
uint32_t AddressU = llvm::to_underlying(dxbc::TextureAddressMode::Wrap);
uint32_t AddressV = llvm::to_underlying(dxbc::TextureAddressMode::Wrap);
uint32_t AddressW = llvm::to_underlying(dxbc::TextureAddressMode::Wrap);
diff --git a/llvm/lib/BinaryFormat/DXContainer.cpp b/llvm/lib/BinaryFormat/DXContainer.cpp
index b2fdb914303fc..36d10d0b63078 100644
--- a/llvm/lib/BinaryFormat/DXContainer.cpp
+++ b/llvm/lib/BinaryFormat/DXContainer.cpp
@@ -99,6 +99,16 @@ ArrayRef<EnumEntry<ShaderVisibility>> dxbc::getShaderVisibility() {
return ArrayRef(ShaderVisibilityValues);
}
+#define FILTER(Val, Enum) {#Enum, SamplerFilter::Enum},
+
+static const EnumEntry<SamplerFilter> SamplerFilterNames[] = {
+#include "llvm/BinaryFormat/DXContainerConstants.def"
+};
+
+ArrayRef<EnumEntry<SamplerFilter>> dxbc::getSamplerFilters() {
+ return ArrayRef(SamplerFilterNames);
+}
+
#define TEXTURE_ADDRESS_MODE(Val, Enum) {#Enum, TextureAddressMode::Enum},
static const EnumEntry<TextureAddressMode> TextureAddressModeNames[] = {
>From 3fb4908dd44ed727523f7c4fdb0c689b3c5b758c Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 22:22:27 +0000
Subject: [PATCH 13/16] nfc:: move SamplerFilter
---
.../clang/Parse/ParseHLSLRootSignature.h | 4 +-
clang/lib/Parse/ParseHLSLRootSignature.cpp | 4 +-
.../Parse/ParseHLSLRootSignatureTest.cpp | 5 +-
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 43 +--------------
.../Frontend/HLSL/HLSLRootSignatureUtils.cpp | 54 ++-----------------
.../Frontend/HLSLRootSignatureDumpTest.cpp | 2 +-
6 files changed, 12 insertions(+), 100 deletions(-)
diff --git a/clang/include/clang/Parse/ParseHLSLRootSignature.h b/clang/include/clang/Parse/ParseHLSLRootSignature.h
index d7b9959e26efa..18cd1f379e62c 100644
--- a/clang/include/clang/Parse/ParseHLSLRootSignature.h
+++ b/clang/include/clang/Parse/ParseHLSLRootSignature.h
@@ -111,7 +111,7 @@ class RootSignatureParser {
struct ParsedStaticSamplerParams {
std::optional<llvm::hlsl::rootsig::Register> Reg;
- std::optional<llvm::hlsl::rootsig::SamplerFilter> Filter;
+ std::optional<llvm::dxbc::SamplerFilter> Filter;
std::optional<llvm::dxbc::TextureAddressMode> AddressU;
std::optional<llvm::dxbc::TextureAddressMode> AddressV;
std::optional<llvm::dxbc::TextureAddressMode> AddressW;
@@ -133,7 +133,7 @@ class RootSignatureParser {
/// Parsing methods of various enums
std::optional<llvm::dxbc::ShaderVisibility> parseShaderVisibility();
- std::optional<llvm::hlsl::rootsig::SamplerFilter> parseSamplerFilter();
+ std::optional<llvm::dxbc::SamplerFilter> parseSamplerFilter();
std::optional<llvm::dxbc::TextureAddressMode> parseTextureAddressMode();
std::optional<llvm::dxbc::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::dxbc::StaticBorderColor> parseStaticBorderColor();
diff --git a/clang/lib/Parse/ParseHLSLRootSignature.cpp b/clang/lib/Parse/ParseHLSLRootSignature.cpp
index 8f3c70f04a972..18d3644114eef 100644
--- a/clang/lib/Parse/ParseHLSLRootSignature.cpp
+++ b/clang/lib/Parse/ParseHLSLRootSignature.cpp
@@ -1010,7 +1010,7 @@ RootSignatureParser::parseShaderVisibility() {
return std::nullopt;
}
-std::optional<llvm::hlsl::rootsig::SamplerFilter>
+std::optional<llvm::dxbc::SamplerFilter>
RootSignatureParser::parseSamplerFilter() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
@@ -1026,7 +1026,7 @@ RootSignatureParser::parseSamplerFilter() {
switch (CurToken.TokKind) {
#define FILTER_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
- return SamplerFilter::NAME; \
+ return llvm::dxbc::SamplerFilter::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
diff --git a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
index 57d5f3180c266..ba42895afce6c 100644
--- a/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
+++ b/clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
@@ -260,7 +260,8 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_TRUE(std::holds_alternative<StaticSampler>(Elem));
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
- ASSERT_EQ(std::get<StaticSampler>(Elem).Filter, SamplerFilter::Anisotropic);
+ ASSERT_EQ(std::get<StaticSampler>(Elem).Filter,
+ llvm::dxbc::SamplerFilter::Anisotropic);
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU,
llvm::dxbc::TextureAddressMode::Wrap);
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV,
@@ -285,7 +286,7 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseStaticSamplerTest) {
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.ViewType, RegisterType::SReg);
ASSERT_EQ(std::get<StaticSampler>(Elem).Reg.Number, 0u);
ASSERT_EQ(std::get<StaticSampler>(Elem).Filter,
- SamplerFilter::MaximumMinPointMagLinearMipPoint);
+ llvm::dxbc::SamplerFilter::MaximumMinPointMagLinearMipPoint);
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressU,
llvm::dxbc::TextureAddressMode::Mirror);
ASSERT_EQ(std::get<StaticSampler>(Elem).AddressV,
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index c1c21fc557668..945abc4ff7491 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -29,47 +29,6 @@ namespace rootsig {
// carried over from their values in DXC. For reference:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
-// D3D12_FILTER enumeration:
-// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter
-enum class SamplerFilter {
- MinMagMipPoint = 0,
- MinMagPointMipLinear = 0x1,
- MinPointMagLinearMipPoint = 0x4,
- MinPointMagMipLinear = 0x5,
- MinLinearMagMipPoint = 0x10,
- MinLinearMagPointMipLinear = 0x11,
- MinMagLinearMipPoint = 0x14,
- MinMagMipLinear = 0x15,
- Anisotropic = 0x55,
- ComparisonMinMagMipPoint = 0x80,
- ComparisonMinMagPointMipLinear = 0x81,
- ComparisonMinPointMagLinearMipPoint = 0x84,
- ComparisonMinPointMagMipLinear = 0x85,
- ComparisonMinLinearMagMipPoint = 0x90,
- ComparisonMinLinearMagPointMipLinear = 0x91,
- ComparisonMinMagLinearMipPoint = 0x94,
- ComparisonMinMagMipLinear = 0x95,
- ComparisonAnisotropic = 0xd5,
- MinimumMinMagMipPoint = 0x100,
- MinimumMinMagPointMipLinear = 0x101,
- MinimumMinPointMagLinearMipPoint = 0x104,
- MinimumMinPointMagMipLinear = 0x105,
- MinimumMinLinearMagMipPoint = 0x110,
- MinimumMinLinearMagPointMipLinear = 0x111,
- MinimumMinMagLinearMipPoint = 0x114,
- MinimumMinMagMipLinear = 0x115,
- MinimumAnisotropic = 0x155,
- MaximumMinMagMipPoint = 0x180,
- MaximumMinMagPointMipLinear = 0x181,
- MaximumMinPointMagLinearMipPoint = 0x184,
- MaximumMinPointMagMipLinear = 0x185,
- MaximumMinLinearMagMipPoint = 0x190,
- MaximumMinLinearMagPointMipLinear = 0x191,
- MaximumMinMagLinearMipPoint = 0x194,
- MaximumMinMagMipLinear = 0x195,
- MaximumAnisotropic = 0x1d5
-};
-
// Definitions of the in-memory data layout structures
// Models the different registers: bReg | tReg | uReg | sReg
@@ -147,7 +106,7 @@ struct DescriptorTableClause {
struct StaticSampler {
Register Reg;
- SamplerFilter Filter = SamplerFilter::Anisotropic;
+ dxbc::SamplerFilter Filter = dxbc::SamplerFilter::Anisotropic;
dxbc::TextureAddressMode AddressU = dxbc::TextureAddressMode::Wrap;
dxbc::TextureAddressMode AddressV = dxbc::TextureAddressMode::Wrap;
dxbc::TextureAddressMode AddressW = dxbc::TextureAddressMode::Wrap;
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index 5c7dcc549b6cf..67f512008b069 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -87,57 +87,9 @@ static raw_ostream &operator<<(raw_ostream &OS,
return OS;
}
-static const EnumEntry<SamplerFilter> SamplerFilterNames[] = {
- {"MinMagMipPoint", SamplerFilter::MinMagMipPoint},
- {"MinMagPointMipLinear", SamplerFilter::MinMagPointMipLinear},
- {"MinPointMagLinearMipPoint", SamplerFilter::MinPointMagLinearMipPoint},
- {"MinPointMagMipLinear", SamplerFilter::MinPointMagMipLinear},
- {"MinLinearMagMipPoint", SamplerFilter::MinLinearMagMipPoint},
- {"MinLinearMagPointMipLinear", SamplerFilter::MinLinearMagPointMipLinear},
- {"MinMagLinearMipPoint", SamplerFilter::MinMagLinearMipPoint},
- {"MinMagMipLinear", SamplerFilter::MinMagMipLinear},
- {"Anisotropic", SamplerFilter::Anisotropic},
- {"ComparisonMinMagMipPoint", SamplerFilter::ComparisonMinMagMipPoint},
- {"ComparisonMinMagPointMipLinear",
- SamplerFilter::ComparisonMinMagPointMipLinear},
- {"ComparisonMinPointMagLinearMipPoint",
- SamplerFilter::ComparisonMinPointMagLinearMipPoint},
- {"ComparisonMinPointMagMipLinear",
- SamplerFilter::ComparisonMinPointMagMipLinear},
- {"ComparisonMinLinearMagMipPoint",
- SamplerFilter::ComparisonMinLinearMagMipPoint},
- {"ComparisonMinLinearMagPointMipLinear",
- SamplerFilter::ComparisonMinLinearMagPointMipLinear},
- {"ComparisonMinMagLinearMipPoint",
- SamplerFilter::ComparisonMinMagLinearMipPoint},
- {"ComparisonMinMagMipLinear", SamplerFilter::ComparisonMinMagMipLinear},
- {"ComparisonAnisotropic", SamplerFilter::ComparisonAnisotropic},
- {"MinimumMinMagMipPoint", SamplerFilter::MinimumMinMagMipPoint},
- {"MinimumMinMagPointMipLinear", SamplerFilter::MinimumMinMagPointMipLinear},
- {"MinimumMinPointMagLinearMipPoint",
- SamplerFilter::MinimumMinPointMagLinearMipPoint},
- {"MinimumMinPointMagMipLinear", SamplerFilter::MinimumMinPointMagMipLinear},
- {"MinimumMinLinearMagMipPoint", SamplerFilter::MinimumMinLinearMagMipPoint},
- {"MinimumMinLinearMagPointMipLinear",
- SamplerFilter::MinimumMinLinearMagPointMipLinear},
- {"MinimumMinMagLinearMipPoint", SamplerFilter::MinimumMinMagLinearMipPoint},
- {"MinimumMinMagMipLinear", SamplerFilter::MinimumMinMagMipLinear},
- {"MinimumAnisotropic", SamplerFilter::MinimumAnisotropic},
- {"MaximumMinMagMipPoint", SamplerFilter::MaximumMinMagMipPoint},
- {"MaximumMinMagPointMipLinear", SamplerFilter::MaximumMinMagPointMipLinear},
- {"MaximumMinPointMagLinearMipPoint",
- SamplerFilter::MaximumMinPointMagLinearMipPoint},
- {"MaximumMinPointMagMipLinear", SamplerFilter::MaximumMinPointMagMipLinear},
- {"MaximumMinLinearMagMipPoint", SamplerFilter::MaximumMinLinearMagMipPoint},
- {"MaximumMinLinearMagPointMipLinear",
- SamplerFilter::MaximumMinLinearMagPointMipLinear},
- {"MaximumMinMagLinearMipPoint", SamplerFilter::MaximumMinMagLinearMipPoint},
- {"MaximumMinMagMipLinear", SamplerFilter::MaximumMinMagMipLinear},
- {"MaximumAnisotropic", SamplerFilter::MaximumAnisotropic},
-};
-
-static raw_ostream &operator<<(raw_ostream &OS, const SamplerFilter &Filter) {
- printEnum(OS, Filter, ArrayRef(SamplerFilterNames));
+static raw_ostream &operator<<(raw_ostream &OS,
+ const llvm::dxbc::SamplerFilter &Filter) {
+ printEnum(OS, Filter, dxbc::getSamplerFilters());
return OS;
}
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 29f872df2d809..e090f6bae470f 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -194,7 +194,7 @@ TEST(HLSLRootSignatureTest, DefinedStaticSamplerDump) {
StaticSampler Sampler;
Sampler.Reg = {RegisterType::SReg, 0};
- Sampler.Filter = SamplerFilter::ComparisonMinMagLinearMipPoint;
+ Sampler.Filter = llvm::dxbc::SamplerFilter::ComparisonMinMagLinearMipPoint;
Sampler.AddressU = llvm::dxbc::TextureAddressMode::Mirror;
Sampler.AddressV = llvm::dxbc::TextureAddressMode::Border;
Sampler.AddressW = llvm::dxbc::TextureAddressMode::Clamp;
>From 168dc0938f47368953ea877f52743e69d904552a Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 22:26:16 +0000
Subject: [PATCH 14/16] nfc: misc clean to make it consistent
---
.../BinaryFormat/DXContainerConstants.def | 48 +++++++++++--------
.../llvm/Frontend/HLSL/HLSLRootSignature.h | 5 --
2 files changed, 29 insertions(+), 24 deletions(-)
diff --git a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
index 34b2f733be422..8730820dd8b06 100644
--- a/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
+++ b/llvm/include/llvm/BinaryFormat/DXContainerConstants.def
@@ -124,6 +124,7 @@ ROOT_PARAMETER(4, UAV)
#undef ROOT_PARAMETER
#endif // ROOT_PARAMETER
+// SHADER_VISIBILITY(value, enum).
#ifdef SHADER_VISIBILITY
SHADER_VISIBILITY(0, All)
@@ -134,10 +135,11 @@ SHADER_VISIBILITY(4, Geometry)
SHADER_VISIBILITY(5, Pixel)
SHADER_VISIBILITY(6, Amplification)
SHADER_VISIBILITY(7, Mesh)
+
#undef SHADER_VISIBILITY
#endif // SHADER_VISIBILITY
-// #FILTER(value, enum).
+// FILTER(value, enum).
#ifdef FILTER
FILTER(0, MinMagMipPoint)
@@ -176,38 +178,46 @@ FILTER(0x191, MaximumMinLinearMagPointMipLinear)
FILTER(0x194, MaximumMinMagLinearMipPoint)
FILTER(0x195, MaximumMinMagMipLinear)
FILTER(0x1d5, MaximumAnisotropic)
+
#undef FILTER
#endif // FILTER
+// TEXTURE_ADDRESS_MODE(value, enum).
#ifdef TEXTURE_ADDRESS_MODE
-TEXTURE_ADDRESS_MODE( 1, Wrap)
-TEXTURE_ADDRESS_MODE( 2, Mirror)
-TEXTURE_ADDRESS_MODE( 3, Clamp)
-TEXTURE_ADDRESS_MODE( 4, Border)
-TEXTURE_ADDRESS_MODE( 5, MirrorOnce)
+TEXTURE_ADDRESS_MODE(1, Wrap)
+TEXTURE_ADDRESS_MODE(2, Mirror)
+TEXTURE_ADDRESS_MODE(3, Clamp)
+TEXTURE_ADDRESS_MODE(4, Border)
+TEXTURE_ADDRESS_MODE(5, MirrorOnce)
+
#undef TEXTURE_ADDRESS_MODE
#endif // TEXTURE_ADDRESS_MODE
+// COMPARISON_FUNC(value, enum).
#ifdef COMPARISON_FUNC
-COMPARISON_FUNC( 1, Never)
-COMPARISON_FUNC( 2, Less)
-COMPARISON_FUNC( 3, Equal)
-COMPARISON_FUNC( 4, LessEqual)
-COMPARISON_FUNC( 5, Greater)
-COMPARISON_FUNC( 6, NotEqual)
-COMPARISON_FUNC( 7, GreaterEqual)
-COMPARISON_FUNC( 8, Always)
+COMPARISON_FUNC(1, Never)
+COMPARISON_FUNC(2, Less)
+COMPARISON_FUNC(3, Equal)
+COMPARISON_FUNC(4, LessEqual)
+COMPARISON_FUNC(5, Greater)
+COMPARISON_FUNC(6, NotEqual)
+COMPARISON_FUNC(7, GreaterEqual)
+COMPARISON_FUNC(8, Always)
+
#undef COMPARISON_FUNC
#endif // COMPARISON_FUNC
+// STATIC_BORDER_COLOR(value, enum).
#ifdef STATIC_BORDER_COLOR
-STATIC_BORDER_COLOR( 0, TransparentBlack)
-STATIC_BORDER_COLOR( 1, OpaqueBlack)
-STATIC_BORDER_COLOR( 2, OpaqueWhite)
-STATIC_BORDER_COLOR( 3, OpaqueBlackUint)
-STATIC_BORDER_COLOR( 4, OpaqueWhiteUint)
+
+STATIC_BORDER_COLOR(0, TransparentBlack)
+STATIC_BORDER_COLOR(1, OpaqueBlack)
+STATIC_BORDER_COLOR(2, OpaqueWhite)
+STATIC_BORDER_COLOR(3, OpaqueBlackUint)
+STATIC_BORDER_COLOR(4, OpaqueWhiteUint)
+
#undef STATIC_BORDER_COLOR
#endif // STATIC_BORDER_COLOR
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 945abc4ff7491..f552040ab31cc 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -24,11 +24,6 @@ namespace llvm {
namespace hlsl {
namespace rootsig {
-// Definition of the various enumerations and flags. The definitions of all
-// values here correspond to their description in the d3d12.h header and are
-// carried over from their values in DXC. For reference:
-// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/
-
// Definitions of the in-memory data layout structures
// Models the different registers: bReg | tReg | uReg | sReg
>From f1b8edaea544c179d8407c8cadaf3ad371c6d73c Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Thu, 26 Jun 2025 22:27:04 +0000
Subject: [PATCH 15/16] clang format
---
clang/lib/Sema/SemaHLSL.cpp | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp
index 9d174658c146e..3bab0da5edea8 100644
--- a/clang/lib/Sema/SemaHLSL.cpp
+++ b/clang/lib/Sema/SemaHLSL.cpp
@@ -1199,10 +1199,9 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
auto ReportOverlap = [this, Loc, &HadOverlap](const RangeInfo *Info,
const RangeInfo *OInfo) {
HadOverlap = true;
- auto CommonVis =
- Info->Visibility == llvm::dxbc::ShaderVisibility::All
- ? OInfo->Visibility
- : Info->Visibility;
+ auto CommonVis = Info->Visibility == llvm::dxbc::ShaderVisibility::All
+ ? OInfo->Visibility
+ : Info->Visibility;
this->Diag(Loc, diag::err_hlsl_resource_range_overlap)
<< llvm::to_underlying(Info->Class) << Info->LowerBound
<< /*unbounded=*/(Info->UpperBound == RangeInfo::Unbounded)
>From cf54c0896ebefa28c8b56af21df8feaeb6976c23 Mon Sep 17 00:00:00 2001
From: Finn Plummer <canadienfinn at gmail.com>
Date: Fri, 27 Jun 2025 22:57:53 +0000
Subject: [PATCH 16/16] review: remove redundant namespacing to be consistent
---
llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h | 2 +-
llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index f552040ab31cc..3e959829a20bf 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -107,7 +107,7 @@ struct StaticSampler {
dxbc::TextureAddressMode AddressW = dxbc::TextureAddressMode::Wrap;
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
- llvm::dxbc::ComparisonFunc CompFunc = llvm::dxbc::ComparisonFunc::LessEqual;
+ dxbc::ComparisonFunc CompFunc = dxbc::ComparisonFunc::LessEqual;
dxbc::StaticBorderColor BorderColor = dxbc::StaticBorderColor::OpaqueWhite;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
index 4fa080e949d54..1fee0e900d8af 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignatureUtils.h
@@ -83,7 +83,7 @@ struct RangeInfo {
// Information retained for diagnostics
llvm::dxil::ResourceClass Class;
uint32_t Space;
- llvm::dxbc::ShaderVisibility Visibility;
+ dxbc::ShaderVisibility Visibility;
};
class ResourceRange {
More information about the llvm-commits
mailing list