Skip to content

Commit 0ceb0c3

Browse files
authored
[NFC][HLSL][DirectX] Let HLSLRootSignature reuse the dxbc defined enums (#145986)
This pr removes the redundancy of having the same enums defined in both the front-end and back-end of handling root signatures. Since there are many more uses of the enum in the front-end of the code, we will adhere to the naming conventions used in the front-end, to minimize the diff. The macros in `DXContainerConstants.def` are also touched-up to be consistent and to have each macro name follow its respective definition in d3d12.h and searchable by name [here](https://learn.microsoft.com/en-us/windows/win32/api/d3d12/). Additionally, the many `getEnumNames` are moved to `DXContainer` from `HLSLRootSignatureUtils` as they we will want them to be exposed publicly anyways. Changes for each enum follow the pattern of a commit that will make the enum definition in `DXContainer` adhere to above listed naming conventions, followed by a commit to actually use that enum in the front-end. Resolves #145815
1 parent 1725cc0 commit 0ceb0c3

File tree

15 files changed

+474
-548
lines changed

15 files changed

+474
-548
lines changed

clang/include/clang/Parse/ParseHLSLRootSignature.h

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +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();
74+
std::optional<llvm::dxbc::RootFlags> parseRootFlags();
7575
std::optional<llvm::hlsl::rootsig::RootConstants> parseRootConstants();
7676
std::optional<llvm::hlsl::rootsig::RootDescriptor> parseRootDescriptor();
7777
std::optional<llvm::hlsl::rootsig::DescriptorTable> parseDescriptorTable();
@@ -86,15 +86,15 @@ class RootSignatureParser {
8686
std::optional<llvm::hlsl::rootsig::Register> Reg;
8787
std::optional<uint32_t> Num32BitConstants;
8888
std::optional<uint32_t> Space;
89-
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
89+
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
9090
};
9191
std::optional<ParsedConstantParams> parseRootConstantParams();
9292

9393
struct ParsedRootDescriptorParams {
9494
std::optional<llvm::hlsl::rootsig::Register> Reg;
9595
std::optional<uint32_t> Space;
96-
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
97-
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags> Flags;
96+
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
97+
std::optional<llvm::dxbc::RootDescriptorFlags> Flags;
9898
};
9999
std::optional<ParsedRootDescriptorParams>
100100
parseRootDescriptorParams(RootSignatureToken::Kind RegType);
@@ -104,25 +104,25 @@ class RootSignatureParser {
104104
std::optional<uint32_t> NumDescriptors;
105105
std::optional<uint32_t> Space;
106106
std::optional<uint32_t> Offset;
107-
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags> Flags;
107+
std::optional<llvm::dxbc::DescriptorRangeFlags> Flags;
108108
};
109109
std::optional<ParsedClauseParams>
110110
parseDescriptorTableClauseParams(RootSignatureToken::Kind RegType);
111111

112112
struct ParsedStaticSamplerParams {
113113
std::optional<llvm::hlsl::rootsig::Register> Reg;
114-
std::optional<llvm::hlsl::rootsig::SamplerFilter> Filter;
115-
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU;
116-
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
117-
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
114+
std::optional<llvm::dxbc::SamplerFilter> Filter;
115+
std::optional<llvm::dxbc::TextureAddressMode> AddressU;
116+
std::optional<llvm::dxbc::TextureAddressMode> AddressV;
117+
std::optional<llvm::dxbc::TextureAddressMode> AddressW;
118118
std::optional<float> MipLODBias;
119119
std::optional<uint32_t> MaxAnisotropy;
120-
std::optional<llvm::hlsl::rootsig::ComparisonFunc> CompFunc;
121-
std::optional<llvm::hlsl::rootsig::StaticBorderColor> BorderColor;
120+
std::optional<llvm::dxbc::ComparisonFunc> CompFunc;
121+
std::optional<llvm::dxbc::StaticBorderColor> BorderColor;
122122
std::optional<float> MinLOD;
123123
std::optional<float> MaxLOD;
124124
std::optional<uint32_t> Space;
125-
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
125+
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
126126
};
127127
std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams();
128128

@@ -132,17 +132,13 @@ class RootSignatureParser {
132132
std::optional<float> parseFloatParam();
133133

134134
/// Parsing methods of various enums
135-
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
136-
std::optional<llvm::hlsl::rootsig::SamplerFilter> parseSamplerFilter();
137-
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
138-
parseTextureAddressMode();
139-
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
140-
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
141-
parseStaticBorderColor();
142-
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
143-
parseRootDescriptorFlags();
144-
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
145-
parseDescriptorRangeFlags();
135+
std::optional<llvm::dxbc::ShaderVisibility> parseShaderVisibility();
136+
std::optional<llvm::dxbc::SamplerFilter> parseSamplerFilter();
137+
std::optional<llvm::dxbc::TextureAddressMode> parseTextureAddressMode();
138+
std::optional<llvm::dxbc::ComparisonFunc> parseComparisonFunc();
139+
std::optional<llvm::dxbc::StaticBorderColor> parseStaticBorderColor();
140+
std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
141+
std::optional<llvm::dxbc::DescriptorRangeFlags> parseDescriptorRangeFlags();
146142

147143
/// Use NumericLiteralParser to convert CurToken.NumSpelling into a unsigned
148144
/// 32-bit integer

clang/lib/Parse/ParseHLSLRootSignature.cpp

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,15 @@ static FlagType maybeOrFlag(std::optional<FlagType> Flags, FlagType Flag) {
7676
llvm::to_underlying(Flag));
7777
}
7878

79-
std::optional<RootFlags> RootSignatureParser::parseRootFlags() {
79+
std::optional<llvm::dxbc::RootFlags> RootSignatureParser::parseRootFlags() {
8080
assert(CurToken.TokKind == TokenKind::kw_RootFlags &&
8181
"Expects to only be invoked starting at given keyword");
8282

8383
if (consumeExpectedToken(TokenKind::pu_l_paren, diag::err_expected_after,
8484
CurToken.TokKind))
8585
return std::nullopt;
8686

87-
std::optional<RootFlags> Flags = RootFlags::None;
87+
std::optional<llvm::dxbc::RootFlags> Flags = llvm::dxbc::RootFlags::None;
8888

8989
// Handle the edge-case of '0' to specify no flags set
9090
if (tryConsumeExpectedToken(TokenKind::int_literal)) {
@@ -104,7 +104,8 @@ std::optional<RootFlags> RootSignatureParser::parseRootFlags() {
104104
switch (CurToken.TokKind) {
105105
#define ROOT_FLAG_ENUM(NAME, LIT) \
106106
case TokenKind::en_##NAME: \
107-
Flags = maybeOrFlag<RootFlags>(Flags, RootFlags::NAME); \
107+
Flags = maybeOrFlag<llvm::dxbc::RootFlags>(Flags, \
108+
llvm::dxbc::RootFlags::NAME); \
108109
break;
109110
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
110111
default:
@@ -240,7 +241,7 @@ std::optional<DescriptorTable> RootSignatureParser::parseDescriptorTable() {
240241
return std::nullopt;
241242

242243
DescriptorTable Table;
243-
std::optional<ShaderVisibility> Visibility;
244+
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
244245

245246
// Iterate as many Clauses as possible
246247
do {
@@ -983,7 +984,7 @@ std::optional<float> RootSignatureParser::parseFloatParam() {
983984
return std::nullopt;
984985
}
985986

986-
std::optional<llvm::hlsl::rootsig::ShaderVisibility>
987+
std::optional<llvm::dxbc::ShaderVisibility>
987988
RootSignatureParser::parseShaderVisibility() {
988989
assert(CurToken.TokKind == TokenKind::pu_equal &&
989990
"Expects to only be invoked starting at given keyword");
@@ -999,7 +1000,7 @@ RootSignatureParser::parseShaderVisibility() {
9991000
switch (CurToken.TokKind) {
10001001
#define SHADER_VISIBILITY_ENUM(NAME, LIT) \
10011002
case TokenKind::en_##NAME: \
1002-
return ShaderVisibility::NAME; \
1003+
return llvm::dxbc::ShaderVisibility::NAME; \
10031004
break;
10041005
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10051006
default:
@@ -1009,7 +1010,7 @@ RootSignatureParser::parseShaderVisibility() {
10091010
return std::nullopt;
10101011
}
10111012

1012-
std::optional<llvm::hlsl::rootsig::SamplerFilter>
1013+
std::optional<llvm::dxbc::SamplerFilter>
10131014
RootSignatureParser::parseSamplerFilter() {
10141015
assert(CurToken.TokKind == TokenKind::pu_equal &&
10151016
"Expects to only be invoked starting at given keyword");
@@ -1025,7 +1026,7 @@ RootSignatureParser::parseSamplerFilter() {
10251026
switch (CurToken.TokKind) {
10261027
#define FILTER_ENUM(NAME, LIT) \
10271028
case TokenKind::en_##NAME: \
1028-
return SamplerFilter::NAME; \
1029+
return llvm::dxbc::SamplerFilter::NAME; \
10291030
break;
10301031
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10311032
default:
@@ -1035,7 +1036,7 @@ RootSignatureParser::parseSamplerFilter() {
10351036
return std::nullopt;
10361037
}
10371038

1038-
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
1039+
std::optional<llvm::dxbc::TextureAddressMode>
10391040
RootSignatureParser::parseTextureAddressMode() {
10401041
assert(CurToken.TokKind == TokenKind::pu_equal &&
10411042
"Expects to only be invoked starting at given keyword");
@@ -1051,7 +1052,7 @@ RootSignatureParser::parseTextureAddressMode() {
10511052
switch (CurToken.TokKind) {
10521053
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) \
10531054
case TokenKind::en_##NAME: \
1054-
return TextureAddressMode::NAME; \
1055+
return llvm::dxbc::TextureAddressMode::NAME; \
10551056
break;
10561057
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10571058
default:
@@ -1061,7 +1062,7 @@ RootSignatureParser::parseTextureAddressMode() {
10611062
return std::nullopt;
10621063
}
10631064

1064-
std::optional<llvm::hlsl::rootsig::ComparisonFunc>
1065+
std::optional<llvm::dxbc::ComparisonFunc>
10651066
RootSignatureParser::parseComparisonFunc() {
10661067
assert(CurToken.TokKind == TokenKind::pu_equal &&
10671068
"Expects to only be invoked starting at given keyword");
@@ -1077,7 +1078,7 @@ RootSignatureParser::parseComparisonFunc() {
10771078
switch (CurToken.TokKind) {
10781079
#define COMPARISON_FUNC_ENUM(NAME, LIT) \
10791080
case TokenKind::en_##NAME: \
1080-
return ComparisonFunc::NAME; \
1081+
return llvm::dxbc::ComparisonFunc::NAME; \
10811082
break;
10821083
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
10831084
default:
@@ -1087,7 +1088,7 @@ RootSignatureParser::parseComparisonFunc() {
10871088
return std::nullopt;
10881089
}
10891090

1090-
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
1091+
std::optional<llvm::dxbc::StaticBorderColor>
10911092
RootSignatureParser::parseStaticBorderColor() {
10921093
assert(CurToken.TokKind == TokenKind::pu_equal &&
10931094
"Expects to only be invoked starting at given keyword");
@@ -1103,7 +1104,7 @@ RootSignatureParser::parseStaticBorderColor() {
11031104
switch (CurToken.TokKind) {
11041105
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
11051106
case TokenKind::en_##NAME: \
1106-
return StaticBorderColor::NAME; \
1107+
return llvm::dxbc::StaticBorderColor::NAME; \
11071108
break;
11081109
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
11091110
default:
@@ -1113,7 +1114,7 @@ RootSignatureParser::parseStaticBorderColor() {
11131114
return std::nullopt;
11141115
}
11151116

1116-
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
1117+
std::optional<llvm::dxbc::RootDescriptorFlags>
11171118
RootSignatureParser::parseRootDescriptorFlags() {
11181119
assert(CurToken.TokKind == TokenKind::pu_equal &&
11191120
"Expects to only be invoked starting at given keyword");
@@ -1124,23 +1125,23 @@ RootSignatureParser::parseRootDescriptorFlags() {
11241125
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_non_zero_flag);
11251126
return std::nullopt;
11261127
}
1127-
return RootDescriptorFlags::None;
1128+
return llvm::dxbc::RootDescriptorFlags::None;
11281129
}
11291130

11301131
TokenKind Expected[] = {
11311132
#define ROOT_DESCRIPTOR_FLAG_ENUM(NAME, LIT) TokenKind::en_##NAME,
11321133
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
11331134
};
11341135

1135-
std::optional<RootDescriptorFlags> Flags;
1136+
std::optional<llvm::dxbc::RootDescriptorFlags> Flags;
11361137

11371138
do {
11381139
if (tryConsumeExpectedToken(Expected)) {
11391140
switch (CurToken.TokKind) {
11401141
#define ROOT_DESCRIPTOR_FLAG_ENUM(NAME, LIT) \
11411142
case TokenKind::en_##NAME: \
1142-
Flags = \
1143-
maybeOrFlag<RootDescriptorFlags>(Flags, RootDescriptorFlags::NAME); \
1143+
Flags = maybeOrFlag<llvm::dxbc::RootDescriptorFlags>( \
1144+
Flags, llvm::dxbc::RootDescriptorFlags::NAME); \
11441145
break;
11451146
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
11461147
default:
@@ -1152,7 +1153,7 @@ RootSignatureParser::parseRootDescriptorFlags() {
11521153
return Flags;
11531154
}
11541155

1155-
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
1156+
std::optional<llvm::dxbc::DescriptorRangeFlags>
11561157
RootSignatureParser::parseDescriptorRangeFlags() {
11571158
assert(CurToken.TokKind == TokenKind::pu_equal &&
11581159
"Expects to only be invoked starting at given keyword");
@@ -1163,23 +1164,23 @@ RootSignatureParser::parseDescriptorRangeFlags() {
11631164
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_non_zero_flag);
11641165
return std::nullopt;
11651166
}
1166-
return DescriptorRangeFlags::None;
1167+
return llvm::dxbc::DescriptorRangeFlags::None;
11671168
}
11681169

11691170
TokenKind Expected[] = {
11701171
#define DESCRIPTOR_RANGE_FLAG_ENUM(NAME, LIT, ON) TokenKind::en_##NAME,
11711172
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
11721173
};
11731174

1174-
std::optional<DescriptorRangeFlags> Flags;
1175+
std::optional<llvm::dxbc::DescriptorRangeFlags> Flags;
11751176

11761177
do {
11771178
if (tryConsumeExpectedToken(Expected)) {
11781179
switch (CurToken.TokKind) {
11791180
#define DESCRIPTOR_RANGE_FLAG_ENUM(NAME, LIT, ON) \
11801181
case TokenKind::en_##NAME: \
1181-
Flags = \
1182-
maybeOrFlag<DescriptorRangeFlags>(Flags, DescriptorRangeFlags::NAME); \
1182+
Flags = maybeOrFlag<llvm::dxbc::DescriptorRangeFlags>( \
1183+
Flags, llvm::dxbc::DescriptorRangeFlags::NAME); \
11831184
break;
11841185
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
11851186
default:

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,10 +1200,9 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
12001200
auto ReportOverlap = [this, Loc, &HadOverlap](const RangeInfo *Info,
12011201
const RangeInfo *OInfo) {
12021202
HadOverlap = true;
1203-
auto CommonVis =
1204-
Info->Visibility == llvm::hlsl::rootsig::ShaderVisibility::All
1205-
? OInfo->Visibility
1206-
: Info->Visibility;
1203+
auto CommonVis = Info->Visibility == llvm::dxbc::ShaderVisibility::All
1204+
? OInfo->Visibility
1205+
: Info->Visibility;
12071206
this->Diag(Loc, diag::err_hlsl_resource_range_overlap)
12081207
<< llvm::to_underlying(Info->Class) << Info->LowerBound
12091208
<< /*unbounded=*/(Info->UpperBound == RangeInfo::Unbounded)
@@ -1238,7 +1237,7 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
12381237
// ResourceRanges in the former case and it will be an ArrayRef to just the
12391238
// all visiblity ResourceRange in the latter case.
12401239
ArrayRef<ResourceRange> OverlapRanges =
1241-
Info.Visibility == llvm::hlsl::rootsig::ShaderVisibility::All
1240+
Info.Visibility == llvm::dxbc::ShaderVisibility::All
12421241
? ArrayRef<ResourceRange>{Ranges}.drop_front()
12431242
: ArrayRef<ResourceRange>{Ranges}.take_front();
12441243

0 commit comments

Comments
 (0)