-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Reland "[HLSL][RootSignature] Implement serialization of RootConstants and RootFlags" #143019
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang @llvm/pr-subscribers-hlsl Author: Finn Plummer (inbelic) ChangesThis relands #141130. The initial commit uncovered that we are missing the correct linking of FrontendHLSL into clang/lib/Parse and clang/lib/unittests/Parse. This change addreses this by linking them accordingly. It was also checked and ensured that the LexHLSLRootSignature libraries do not depend on FrontendHLSL and so we are not required to link there. Resolves: #138190 and #138192 Full diff: https://github.com/llvm/llvm-project/pull/143019.diff 5 Files Affected:
diff --git a/clang/lib/Parse/CMakeLists.txt b/clang/lib/Parse/CMakeLists.txt
index 00fde537bb9c6..e6cbf3b868b7d 100644
--- a/clang/lib/Parse/CMakeLists.txt
+++ b/clang/lib/Parse/CMakeLists.txt
@@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
+ FrontendHLSL
FrontendOpenMP
MC
MCParser
diff --git a/clang/unittests/Parse/CMakeLists.txt b/clang/unittests/Parse/CMakeLists.txt
index 6859efed294c8..2ed43a83b8782 100644
--- a/clang/unittests/Parse/CMakeLists.txt
+++ b/clang/unittests/Parse/CMakeLists.txt
@@ -11,5 +11,6 @@ add_clang_unittest(ParseTests
LLVMTestingSupport
clangTesting
LLVM_COMPONENTS
+ FrontendHLSL
Support
)
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 2f028817b45b6..c70ef508ea73e 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -44,6 +44,8 @@ enum class RootFlags : uint32_t {
ValidFlags = 0x00000fff
};
+raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags);
+
enum class RootDescriptorFlags : unsigned {
None = 0,
DataVolatile = 0x2,
@@ -159,6 +161,8 @@ struct RootConstants {
ShaderVisibility Visibility = ShaderVisibility::All;
};
+raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants);
+
enum class DescriptorType : uint8_t { SRV = 0, UAV, CBuffer };
// Models RootDescriptor : CBV | SRV | UAV, by collecting like parameters
struct RootDescriptor {
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
index 765a3bcbed7e2..24486a55ecf6a 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignatureUtils.cpp
@@ -132,6 +132,79 @@ static raw_ostream &operator<<(raw_ostream &OS,
return OS;
}
+raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags) {
+ OS << "RootFlags(";
+ bool FlagSet = false;
+ unsigned Remaining = llvm::to_underlying(Flags);
+ while (Remaining) {
+ unsigned Bit = 1u << llvm::countr_zero(Remaining);
+ if (Remaining & Bit) {
+ if (FlagSet)
+ OS << " | ";
+
+ switch (static_cast<RootFlags>(Bit)) {
+ case RootFlags::AllowInputAssemblerInputLayout:
+ OS << "AllowInputAssemblerInputLayout";
+ break;
+ case RootFlags::DenyVertexShaderRootAccess:
+ OS << "DenyVertexShaderRootAccess";
+ break;
+ case RootFlags::DenyHullShaderRootAccess:
+ OS << "DenyHullShaderRootAccess";
+ break;
+ case RootFlags::DenyDomainShaderRootAccess:
+ OS << "DenyDomainShaderRootAccess";
+ break;
+ case RootFlags::DenyGeometryShaderRootAccess:
+ OS << "DenyGeometryShaderRootAccess";
+ break;
+ case RootFlags::DenyPixelShaderRootAccess:
+ OS << "DenyPixelShaderRootAccess";
+ break;
+ case RootFlags::AllowStreamOutput:
+ OS << "AllowStreamOutput";
+ break;
+ case RootFlags::LocalRootSignature:
+ OS << "LocalRootSignature";
+ break;
+ case RootFlags::DenyAmplificationShaderRootAccess:
+ OS << "DenyAmplificationShaderRootAccess";
+ break;
+ case RootFlags::DenyMeshShaderRootAccess:
+ OS << "DenyMeshShaderRootAccess";
+ break;
+ case RootFlags::CBVSRVUAVHeapDirectlyIndexed:
+ OS << "CBVSRVUAVHeapDirectlyIndexed";
+ break;
+ case RootFlags::SamplerHeapDirectlyIndexed:
+ OS << "SamplerHeapDirectlyIndexed";
+ break;
+ default:
+ OS << "invalid: " << Bit;
+ break;
+ }
+
+ FlagSet = true;
+ }
+ Remaining &= ~Bit;
+ }
+
+ if (!FlagSet)
+ OS << "None";
+
+ OS << ")";
+
+ return OS;
+}
+
+raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants) {
+ OS << "RootConstants(num32BitConstants = " << Constants.Num32BitConstants
+ << ", " << Constants.Reg << ", space = " << Constants.Space
+ << ", visibility = " << Constants.Visibility << ")";
+
+ return OS;
+}
+
raw_ostream &operator<<(raw_ostream &OS, const DescriptorTable &Table) {
OS << "DescriptorTable(numClauses = " << Table.NumClauses
<< ", visibility = " << Table.Visibility << ")";
diff --git a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
index 90e6cd0a80d6b..1a0c8e2a16396 100644
--- a/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
+++ b/llvm/unittests/Frontend/HLSLRootSignatureDumpTest.cpp
@@ -108,4 +108,73 @@ TEST(HLSLRootSignatureTest, DescriptorTableDump) {
EXPECT_EQ(Out, Expected);
}
+TEST(HLSLRootSignatureTest, DefaultRootConstantsDump) {
+ RootConstants Constants;
+ Constants.Num32BitConstants = 1;
+ Constants.Reg = {RegisterType::BReg, 3};
+
+ std::string Out;
+ llvm::raw_string_ostream OS(Out);
+ OS << Constants;
+ OS.flush();
+
+ std::string Expected = "RootConstants(num32BitConstants = 1, b3, space = 0, "
+ "visibility = All)";
+ EXPECT_EQ(Out, Expected);
+}
+
+TEST(HLSLRootSignatureTest, SetRootConstantsDump) {
+ RootConstants Constants;
+ Constants.Num32BitConstants = 983;
+ Constants.Reg = {RegisterType::BReg, 34593};
+ Constants.Space = 7;
+ Constants.Visibility = ShaderVisibility::Pixel;
+
+ std::string Out;
+ llvm::raw_string_ostream OS(Out);
+ OS << Constants;
+ OS.flush();
+
+ std::string Expected = "RootConstants(num32BitConstants = 983, b34593, "
+ "space = 7, visibility = Pixel)";
+ EXPECT_EQ(Out, Expected);
+}
+
+TEST(HLSLRootSignatureTest, NoneRootFlagsDump) {
+ RootFlags Flags = RootFlags::None;
+
+ std::string Out;
+ llvm::raw_string_ostream OS(Out);
+ OS << Flags;
+ OS.flush();
+
+ std::string Expected = "RootFlags(None)";
+ EXPECT_EQ(Out, Expected);
+}
+
+TEST(HLSLRootSignatureTest, AllRootFlagsDump) {
+ RootFlags Flags = RootFlags::ValidFlags;
+
+ std::string Out;
+ llvm::raw_string_ostream OS(Out);
+ OS << Flags;
+ OS.flush();
+
+ std::string Expected = "RootFlags("
+ "AllowInputAssemblerInputLayout | "
+ "DenyVertexShaderRootAccess | "
+ "DenyHullShaderRootAccess | "
+ "DenyDomainShaderRootAccess | "
+ "DenyGeometryShaderRootAccess | "
+ "DenyPixelShaderRootAccess | "
+ "AllowStreamOutput | "
+ "LocalRootSignature | "
+ "DenyAmplificationShaderRootAccess | "
+ "DenyMeshShaderRootAccess | "
+ "CBVSRVUAVHeapDirectlyIndexed | "
+ "SamplerHeapDirectlyIndexed)";
+
+ EXPECT_EQ(Out, Expected);
+}
+
} // namespace
|
Based on feedback here: #143198. I will address this feedback before this can be merged. |
…`RootFlags` (llvm#141130) - Implements serialization of the currently completely defined `RootElement`s, namely `RootConstants` and `RootFlags` - Adds unit testing for the serialization methods Resolves: llvm#138190 and llvm#138192
This relands llvm#141130. The initial commit uncovered that we are missing the correct linking of FrontendHLSL into clang/lib/Parse and clang/lib/unittests/Parse. This change addreses this my linking them accordingly. It was also checked and ensured that the LexHLSLRootSignature libraries do not depend on FrontendHLSL and so we are not required to link there. Resolves: llvm#138190 and llvm#138192
21d74cc
to
e194351
Compare
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/27/builds/11658 Here is the relevant piece of the build log for the reference
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/53/builds/16982 Here is the relevant piece of the build log for the reference
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/143/builds/8511 Here is the relevant piece of the build log for the reference
|
…s and RootFlags" (llvm#143019) This relands llvm#141130. The initial commit uncovered that we are missing the correct linking of FrontendHLSL into clang/lib/Parse and clang/lib/unittests/Parse. This change addreses this by linking them accordingly. It was also checked and ensured that the LexHLSLRootSignature libraries do not depend on FrontendHLSL and so we are not required to link there. Resolves: llvm#138190 and llvm#138192
This relands #141130.
The initial commit uncovered that we are missing the correct linking of FrontendHLSL into clang/lib/Parse and clang/lib/unittests/Parse.
This change addreses this by linking them accordingly.
It was also checked and ensured that the LexHLSLRootSignature libraries do not depend on FrontendHLSL and so we are not required to link there.
Resolves: #138190 and #138192