-
Notifications
You must be signed in to change notification settings - Fork 13.6k
[HLSL][RootSignature] Implement serialization of RootConstants
and RootFlags
#141130
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-hlsl Author: Finn Plummer (inbelic) Changes
Full diff: https://github.com/llvm/llvm-project/pull/141130.diff 3 Files Affected:
diff --git a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
index 7e7eeec0deb52..dbf7adf660012 100644
--- a/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
+++ b/llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
@@ -46,6 +46,8 @@ enum class RootFlags : uint32_t {
ValidFlags = 0x00000fff
};
+raw_ostream &operator<<(raw_ostream &OS, const RootFlags &Flags);
+
enum class DescriptorRangeFlags : unsigned {
None = 0,
DescriptorsVolatile = 0x1,
@@ -85,6 +87,8 @@ struct RootConstants {
ShaderVisibility Visibility = ShaderVisibility::All;
};
+raw_ostream &operator<<(raw_ostream &OS, const RootConstants &Constants);
+
using DescriptorType = llvm::dxil::ResourceClass;
// Models RootDescriptor : CBV | SRV | UAV, by collecting like parameters
struct RootDescriptor {
diff --git a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp b/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
index ec0d130a6767c..6e0e0cdcd5946 100644
--- a/llvm/lib/Frontend/HLSL/HLSLRootSignature.cpp
+++ b/llvm/lib/Frontend/HLSL/HLSLRootSignature.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 3f92fa0f05794..8597ed78b4fbb 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
|
c1f6319
to
30388bf
Compare
Ugh, sorry. Day 0 since last push before changing target branch... |
I think this patch caused some issues on our buildbot: https://lab.llvm.org/buildbot/#/builders/10/builds/6308
|
@jplehr Thanks for letting me know. This commit is responsible. I will revert and reland with the required linking change to: |
Thank you. If it's just missing linker flags, I'm good if you just fix forward. |
…ts` and `RootFlags`" (#142005) The commit caused build failures, [here](https://lab.llvm.org/buildbot/#/builders/10/builds/6308), due to a missing linked llvm library (HLSLFrontend) into `clang/unittests/Parse/CMakeLists.txt`. While it seems like the fix is straightforwardly to just add this library, I will revert now to build and verify locally it correctly fixes it. Reverts #141130
…RootConstants` and `RootFlags`" (#142005) The commit caused build failures, [here](https://lab.llvm.org/buildbot/#/builders/10/builds/6308), due to a missing linked llvm library (HLSLFrontend) into `clang/unittests/Parse/CMakeLists.txt`. While it seems like the fix is straightforwardly to just add this library, I will revert now to build and verify locally it correctly fixes it. Reverts llvm/llvm-project#141130
…ts` and `RootFlags`" (#142005) The commit caused build failures, [here](https://lab.llvm.org/buildbot/#/builders/10/builds/6308), due to a missing linked llvm library (HLSLFrontend) into `clang/unittests/Parse/CMakeLists.txt`. While it seems like the fix is straightforwardly to just add this library, I will revert now to build and verify locally it correctly fixes it. Reverts #141130
…`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
…ts` and `RootFlags`" (llvm#142005) The commit caused build failures, [here](https://lab.llvm.org/buildbot/#/builders/10/builds/6308), due to a missing linked llvm library (HLSLFrontend) into `clang/unittests/Parse/CMakeLists.txt`. While it seems like the fix is straightforwardly to just add this library, I will revert now to build and verify locally it correctly fixes it. Reverts llvm#141130
…`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
…ts` and `RootFlags`" (llvm#142005) The commit caused build failures, [here](https://lab.llvm.org/buildbot/#/builders/10/builds/6308), due to a missing linked llvm library (HLSLFrontend) into `clang/unittests/Parse/CMakeLists.txt`. While it seems like the fix is straightforwardly to just add this library, I will revert now to build and verify locally it correctly fixes it. Reverts llvm#141130
…`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
RootElement
s, namelyRootConstants
andRootFlags
Resolves: #138190 and #138192