Reland "[HLSL][RootSignature] Implement serialization of RootConstants and RootFlags" (#143019)

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
This commit is contained in:
Finn Plummer 2025-06-16 14:52:59 -07:00 committed by GitHub
parent 6cbb67f84c
commit a383b1a95b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 109 additions and 0 deletions

View File

@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
FrontendHLSL
FrontendOpenMP
MC
MCParser

View File

@ -11,5 +11,6 @@ add_clang_unittest(ParseTests
LLVMTestingSupport
clangTesting
LLVM_COMPONENTS
FrontendHLSL
Support
)

View File

@ -27,6 +27,11 @@ 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 RootConstants &Constants);
LLVM_ABI raw_ostream &operator<<(raw_ostream &OS,
const DescriptorTableClause &Clause);

View File

@ -129,6 +129,39 @@ 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) {
OS << "RootFlags(";
printFlags(OS, Flags, ArrayRef(RootFlagNames));
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 << ")";

View File

@ -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