Skip to content

Commit 2f8222e

Browse files
committed
[HLSL][RootSignature] Add parsing for empty RootFlags
- defines the `RootFlags` in-memory enum - defines a template of `parseRootFlags` that will allow handling of parsing root flags
1 parent 85e92c4 commit 2f8222e

File tree

4 files changed

+71
-1
lines changed

4 files changed

+71
-1
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class RootSignatureParser {
7171
// expected, or, there is a lexing error
7272

7373
/// Root Element parse methods:
74+
std::optional<llvm::hlsl::rootsig::RootFlags> parseRootFlags();
7475
std::optional<llvm::hlsl::rootsig::RootConstants> parseRootConstants();
7576
std::optional<llvm::hlsl::rootsig::DescriptorTable> parseDescriptorTable();
7677
std::optional<llvm::hlsl::rootsig::DescriptorTableClause>

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ RootSignatureParser::RootSignatureParser(SmallVector<RootElement> &Elements,
2727
bool RootSignatureParser::parse() {
2828
// Iterate as many RootElements as possible
2929
do {
30+
if (tryConsumeExpectedToken(TokenKind::kw_RootFlags)) {
31+
auto Flags = parseRootFlags();
32+
if (!Flags.has_value())
33+
return true;
34+
Elements.push_back(*Flags);
35+
}
36+
3037
if (tryConsumeExpectedToken(TokenKind::kw_RootConstants)) {
3138
auto Constants = parseRootConstants();
3239
if (!Constants.has_value())
@@ -47,6 +54,24 @@ bool RootSignatureParser::parse() {
4754
/*param of=*/TokenKind::kw_RootSignature);
4855
}
4956

57+
std::optional<RootFlags> RootSignatureParser::parseRootFlags() {
58+
assert(CurToken.TokKind == TokenKind::kw_RootFlags &&
59+
"Expects to only be invoked starting at given keyword");
60+
61+
if (consumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after,
62+
CurToken.TokKind))
63+
return std::nullopt;
64+
65+
RootFlags Flags = RootFlags::None;
66+
67+
if (consumeExpectedToken(TokenKind::pu_r_paren,
68+
diag::err_hlsl_unexpected_end_of_params,
69+
/*param of=*/TokenKind::kw_RootFlags))
70+
return std::nullopt;
71+
72+
return Flags;
73+
}
74+
5075
std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
5176
assert(CurToken.TokKind == TokenKind::kw_RootConstants &&
5277
"Expects to only be invoked starting at given keyword");

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,33 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootConsantsTest) {
294294
ASSERT_TRUE(Consumer->isSatisfied());
295295
}
296296

297+
TEST_F(ParseHLSLRootSignatureTest, ValidParseRootFlagsTest) {
298+
const llvm::StringLiteral Source = R"cc(
299+
RootFlags()
300+
)cc";
301+
302+
TrivialModuleLoader ModLoader;
303+
auto PP = createPP(Source, ModLoader);
304+
auto TokLoc = SourceLocation();
305+
306+
hlsl::RootSignatureLexer Lexer(Source, TokLoc);
307+
SmallVector<RootElement> Elements;
308+
hlsl::RootSignatureParser Parser(Elements, Lexer, *PP);
309+
310+
// Test no diagnostics produced
311+
Consumer->setNoDiag();
312+
313+
ASSERT_FALSE(Parser.parse());
314+
315+
ASSERT_EQ(Elements.size(), 1u);
316+
317+
RootElement Elem = Elements[0];
318+
ASSERT_TRUE(std::holds_alternative<RootFlags>(Elem));
319+
ASSERT_EQ(std::get<RootFlags>(Elem), RootFlags::None);
320+
321+
ASSERT_TRUE(Consumer->isSatisfied());
322+
}
323+
297324
TEST_F(ParseHLSLRootSignatureTest, ValidTrailingCommaTest) {
298325
// This test will checks we can handling trailing commas ','
299326
const llvm::StringLiteral Source = R"cc(

llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@ namespace rootsig {
2323

2424
// Definition of the various enumerations and flags
2525

26+
enum class RootFlags : uint32_t {
27+
None = 0,
28+
AllowInputAssemblerInputLayout = 0x1,
29+
DenyVertexShaderRootAccess = 0x2,
30+
DenyHullShaderRootAccess = 0x4,
31+
DenyDomainShaderRootAccess = 0x8,
32+
DenyGeometryShaderRootAccess = 0x10,
33+
DenyPixelShaderRootAccess = 0x20,
34+
AllowStreamOutput = 0x40,
35+
LocalRootSignature = 0x80,
36+
DenyAmplificationShaderRootAccess = 0x100,
37+
DenyMeshShaderRootAccess = 0x200,
38+
CBVSRVUAVHeapDirectlyIndexed = 0x400,
39+
SamplerHeapDirectlyIndexed = 0x800,
40+
ValidFlags = 0x00000fff
41+
};
42+
2643
enum class DescriptorRangeFlags : unsigned {
2744
None = 0,
2845
DescriptorsVolatile = 0x1,
@@ -98,7 +115,7 @@ struct DescriptorTableClause {
98115

99116
// Models RootElement : RootConstants | DescriptorTable | DescriptorTableClause
100117
using RootElement =
101-
std::variant<RootConstants, DescriptorTable, DescriptorTableClause>;
118+
std::variant<RootFlags, RootConstants, DescriptorTable, DescriptorTableClause>;
102119

103120
} // namespace rootsig
104121
} // namespace hlsl

0 commit comments

Comments
 (0)