Skip to content

Commit f801180

Browse files
committed
[HLSL][RootSignature] Add optional parameter for RootConstants
- extends `parseRootConstantParams` and the struct to include the optional parameters of a RootConstant - adds corresponding unit tests
1 parent 15857bf commit f801180

File tree

4 files changed

+52
-1
lines changed

4 files changed

+52
-1
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ class RootSignatureParser {
8282
struct ParsedConstantParams {
8383
std::optional<llvm::hlsl::rootsig::Register> Reg;
8484
std::optional<uint32_t> Num32BitConstants;
85+
std::optional<uint32_t> Space;
86+
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
8587
};
8688
std::optional<ParsedConstantParams> parseRootConstantParams();
8789

clang/lib/Parse/ParseHLSLRootSignature.cpp

+41
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ std::optional<RootConstants> RootSignatureParser::parseRootConstants() {
7878

7979
Constants.Reg = Params->Reg.value();
8080

81+
// Fill in optional parameters
82+
if (Params->Visibility.has_value())
83+
Constants.Visibility = Params->Visibility.value();
84+
85+
if (Params->Space.has_value())
86+
Constants.Space = Params->Space.value();
87+
8188
if (consumeExpectedToken(TokenKind::pu_r_paren,
8289
diag::err_hlsl_unexpected_end_of_params,
8390
/*param of=*/TokenKind::kw_RootConstants))
@@ -247,6 +254,40 @@ RootSignatureParser::parseRootConstantParams() {
247254
return std::nullopt;
248255
Params.Reg = Reg;
249256
}
257+
258+
// `space` `=` POS_INT
259+
if (tryConsumeExpectedToken(TokenKind::kw_space)) {
260+
if (Params.Space.has_value()) {
261+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
262+
<< CurToken.TokKind;
263+
return std::nullopt;
264+
}
265+
266+
if (consumeExpectedToken(TokenKind::pu_equal))
267+
return std::nullopt;
268+
269+
auto Space = parseUIntParam();
270+
if (!Space.has_value())
271+
return std::nullopt;
272+
Params.Space = Space;
273+
}
274+
275+
// `visibility` `=` SHADER_VISIBILITY
276+
if (tryConsumeExpectedToken(TokenKind::kw_visibility)) {
277+
if (Params.Visibility.has_value()) {
278+
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_repeat_param)
279+
<< CurToken.TokKind;
280+
return std::nullopt;
281+
}
282+
283+
if (consumeExpectedToken(TokenKind::pu_equal))
284+
return std::nullopt;
285+
286+
auto Visibility = parseShaderVisibility();
287+
if (!Visibility.has_value())
288+
return std::nullopt;
289+
Params.Visibility = Visibility;
290+
}
250291
} while (tryConsumeExpectedToken(TokenKind::pu_comma));
251292

252293
return Params;

clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,9 @@ TEST_F(ParseHLSLRootSignatureTest, ValidSamplerFlagsTest) {
255255
TEST_F(ParseHLSLRootSignatureTest, ValidParseRootConsantsTest) {
256256
const llvm::StringLiteral Source = R"cc(
257257
RootConstants(num32BitConstants = 1, b0),
258-
RootConstants(b42, num32BitConstants = 4294967295)
258+
RootConstants(b42, space = 3, num32BitConstants = 4294967295,
259+
visibility = SHADER_VISIBILITY_HULL
260+
)
259261
)cc";
260262

261263
TrivialModuleLoader ModLoader;
@@ -278,12 +280,16 @@ TEST_F(ParseHLSLRootSignatureTest, ValidParseRootConsantsTest) {
278280
ASSERT_EQ(std::get<RootConstants>(Elem).Num32BitConstants, 1u);
279281
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.ViewType, RegisterType::BReg);
280282
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.Number, 0u);
283+
ASSERT_EQ(std::get<RootConstants>(Elem).Space, 0u);
284+
ASSERT_EQ(std::get<RootConstants>(Elem).Visibility, ShaderVisibility::All);
281285

282286
Elem = Elements[1];
283287
ASSERT_TRUE(std::holds_alternative<RootConstants>(Elem));
284288
ASSERT_EQ(std::get<RootConstants>(Elem).Num32BitConstants, 4294967295u);
285289
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.ViewType, RegisterType::BReg);
286290
ASSERT_EQ(std::get<RootConstants>(Elem).Reg.Number, 42u);
291+
ASSERT_EQ(std::get<RootConstants>(Elem).Space, 3u);
292+
ASSERT_EQ(std::get<RootConstants>(Elem).Visibility, ShaderVisibility::Hull);
287293

288294
ASSERT_TRUE(Consumer->isSatisfied());
289295
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ struct Register {
5858
struct RootConstants {
5959
uint32_t Num32BitConstants;
6060
Register Reg;
61+
uint32_t Space = 0;
62+
ShaderVisibility Visibility = ShaderVisibility::All;
6163
};
6264

6365
// Models the end of a descriptor table and stores its visibility

0 commit comments

Comments
 (0)