Skip to content

[NFC][HLSL][DirectX] Let HLSLRootSignature reuse the dxbc defined enums #145986

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

Merged
merged 28 commits into from
Jul 3, 2025
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
cc71ffc
nfc: prepare dxbc::RootFlags
inbelic Jun 26, 2025
b97cec4
nfc: move root flags
inbelic Jun 26, 2025
56b7fb9
nfc: prep dxbc::RootDescriptorFlags
inbelic Jun 26, 2025
c4aaa3c
nfc: move RootDescriptorFlags
inbelic Jun 26, 2025
4108498
nfc: prep dxbc::DescriptorRangeFlags
inbelic Jun 26, 2025
feacb11
nfc: move DescriptorRangeFlags
inbelic Jun 26, 2025
260123c
nfc: move ShaderVisibility
inbelic Jun 26, 2025
7a0a9f7
nfc: prep dxbc::StaticBorderColor
inbelic Jun 26, 2025
55111b9
nfc: move StaticBorderColor
inbelic Jun 26, 2025
35a4f5c
nfc: prep dxbc::ComparisonFunc and dxbc::TextureAddressMode
inbelic Jun 26, 2025
e1de7ef
nfc: move ComparisonFunc and TextureAddressMode
inbelic Jun 26, 2025
8313c0e
nfc: prep dxbc::SamplerFilter
inbelic Jun 26, 2025
3fb4908
nfc:: move SamplerFilter
inbelic Jun 26, 2025
168dc09
nfc: misc clean to make it consistent
inbelic Jun 26, 2025
f1b8eda
clang format
inbelic Jun 26, 2025
cf54c08
review: remove redundant namespacing to be consistent
inbelic Jun 27, 2025
80cadd2
nfc: add required bitmask enums
inbelic Jul 2, 2025
82c7ac7
review: use FlagT alias for flag type in tests
inbelic Jul 2, 2025
38f339b
review: enumerate valid flags
inbelic Jul 2, 2025
69fc958
Merge branch 'main' into inbelic/rs-move-enums
inbelic Jul 2, 2025
516e447
rebase-fix: update naming of new use
inbelic Jul 2, 2025
a92d95d
rebase-fix: update macro naming
inbelic Jul 2, 2025
e9a3cde
rebase-fix: update naming
inbelic Jul 2, 2025
9298944
review: name the flag types for readability and the diff
inbelic Jul 2, 2025
e98ee3b
rebase-fix: update ComparisonFunc macro/naming
inbelic Jul 2, 2025
cc38687
review: use enumerations in DumpTest file
inbelic Jul 3, 2025
5b52f53
Merge branch 'main' into inbelic/rs-move-enums
inbelic Jul 3, 2025
b733ee9
self-review: fix typo
inbelic Jul 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 19 additions & 23 deletions clang/include/clang/Parse/ParseHLSLRootSignature.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class RootSignatureParser {
// expected, or, there is a lexing error

/// Root Element parse methods:
std::optional<llvm::hlsl::rootsig::RootFlags> parseRootFlags();
std::optional<llvm::dxbc::RootFlags> parseRootFlags();
std::optional<llvm::hlsl::rootsig::RootConstants> parseRootConstants();
std::optional<llvm::hlsl::rootsig::RootDescriptor> parseRootDescriptor();
std::optional<llvm::hlsl::rootsig::DescriptorTable> parseDescriptorTable();
Expand All @@ -86,15 +86,15 @@ class RootSignatureParser {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<uint32_t> Num32BitConstants;
std::optional<uint32_t> Space;
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
};
std::optional<ParsedConstantParams> parseRootConstantParams();

struct ParsedRootDescriptorParams {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<uint32_t> Space;
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags> Flags;
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
std::optional<llvm::dxbc::RootDescriptorFlags> Flags;
};
std::optional<ParsedRootDescriptorParams>
parseRootDescriptorParams(RootSignatureToken::Kind RegType);
Expand All @@ -104,25 +104,25 @@ class RootSignatureParser {
std::optional<uint32_t> NumDescriptors;
std::optional<uint32_t> Space;
std::optional<uint32_t> Offset;
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags> Flags;
std::optional<llvm::dxbc::DescriptorRangeFlags> Flags;
};
std::optional<ParsedClauseParams>
parseDescriptorTableClauseParams(RootSignatureToken::Kind RegType);

struct ParsedStaticSamplerParams {
std::optional<llvm::hlsl::rootsig::Register> Reg;
std::optional<llvm::hlsl::rootsig::SamplerFilter> Filter;
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressU;
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressV;
std::optional<llvm::hlsl::rootsig::TextureAddressMode> AddressW;
std::optional<llvm::dxbc::SamplerFilter> Filter;
std::optional<llvm::dxbc::TextureAddressMode> AddressU;
std::optional<llvm::dxbc::TextureAddressMode> AddressV;
std::optional<llvm::dxbc::TextureAddressMode> AddressW;
std::optional<float> MipLODBias;
std::optional<uint32_t> MaxAnisotropy;
std::optional<llvm::hlsl::rootsig::ComparisonFunc> CompFunc;
std::optional<llvm::hlsl::rootsig::StaticBorderColor> BorderColor;
std::optional<llvm::dxbc::ComparisonFunc> CompFunc;
std::optional<llvm::dxbc::StaticBorderColor> BorderColor;
std::optional<float> MinLOD;
std::optional<float> MaxLOD;
std::optional<uint32_t> Space;
std::optional<llvm::hlsl::rootsig::ShaderVisibility> Visibility;
std::optional<llvm::dxbc::ShaderVisibility> Visibility;
};
std::optional<ParsedStaticSamplerParams> parseStaticSamplerParams();

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

/// Parsing methods of various enums
std::optional<llvm::hlsl::rootsig::ShaderVisibility> parseShaderVisibility();
std::optional<llvm::hlsl::rootsig::SamplerFilter> parseSamplerFilter();
std::optional<llvm::hlsl::rootsig::TextureAddressMode>
parseTextureAddressMode();
std::optional<llvm::hlsl::rootsig::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::hlsl::rootsig::StaticBorderColor>
parseStaticBorderColor();
std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
parseRootDescriptorFlags();
std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
parseDescriptorRangeFlags();
std::optional<llvm::dxbc::ShaderVisibility> parseShaderVisibility();
std::optional<llvm::dxbc::SamplerFilter> parseSamplerFilter();
std::optional<llvm::dxbc::TextureAddressMode> parseTextureAddressMode();
std::optional<llvm::dxbc::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::dxbc::StaticBorderColor> parseStaticBorderColor();
std::optional<llvm::dxbc::RootDescriptorFlags> parseRootDescriptorFlags();
std::optional<llvm::dxbc::DescriptorRangeFlags> parseDescriptorRangeFlags();

/// Use NumericLiteralParser to convert CurToken.NumSpelling into a unsigned
/// 32-bit integer
Expand Down
49 changes: 25 additions & 24 deletions clang/lib/Parse/ParseHLSLRootSignature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,15 @@ static FlagType maybeOrFlag(std::optional<FlagType> Flags, FlagType Flag) {
llvm::to_underlying(Flag));
}

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

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

std::optional<RootFlags> Flags = RootFlags::None;
std::optional<llvm::dxbc::RootFlags> Flags = llvm::dxbc::RootFlags::None;

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

DescriptorTable Table;
std::optional<ShaderVisibility> Visibility;
std::optional<llvm::dxbc::ShaderVisibility> Visibility;

// Iterate as many Clauses as possible
do {
Expand Down Expand Up @@ -983,7 +984,7 @@ std::optional<float> RootSignatureParser::parseFloatParam() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::ShaderVisibility>
std::optional<llvm::dxbc::ShaderVisibility>
RootSignatureParser::parseShaderVisibility() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -999,7 +1000,7 @@ RootSignatureParser::parseShaderVisibility() {
switch (CurToken.TokKind) {
#define SHADER_VISIBILITY_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
return ShaderVisibility::NAME; \
return llvm::dxbc::ShaderVisibility::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand All @@ -1009,7 +1010,7 @@ RootSignatureParser::parseShaderVisibility() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::SamplerFilter>
std::optional<llvm::dxbc::SamplerFilter>
RootSignatureParser::parseSamplerFilter() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1025,7 +1026,7 @@ RootSignatureParser::parseSamplerFilter() {
switch (CurToken.TokKind) {
#define FILTER_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
return SamplerFilter::NAME; \
return llvm::dxbc::SamplerFilter::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand All @@ -1035,7 +1036,7 @@ RootSignatureParser::parseSamplerFilter() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::TextureAddressMode>
std::optional<llvm::dxbc::TextureAddressMode>
RootSignatureParser::parseTextureAddressMode() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1051,7 +1052,7 @@ RootSignatureParser::parseTextureAddressMode() {
switch (CurToken.TokKind) {
#define TEXTURE_ADDRESS_MODE_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
return TextureAddressMode::NAME; \
return llvm::dxbc::TextureAddressMode::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand All @@ -1061,7 +1062,7 @@ RootSignatureParser::parseTextureAddressMode() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::ComparisonFunc>
std::optional<llvm::dxbc::ComparisonFunc>
RootSignatureParser::parseComparisonFunc() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1077,7 +1078,7 @@ RootSignatureParser::parseComparisonFunc() {
switch (CurToken.TokKind) {
#define COMPARISON_FUNC_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
return ComparisonFunc::NAME; \
return llvm::dxbc::ComparisonFunc::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand All @@ -1087,7 +1088,7 @@ RootSignatureParser::parseComparisonFunc() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::StaticBorderColor>
std::optional<llvm::dxbc::StaticBorderColor>
RootSignatureParser::parseStaticBorderColor() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1103,7 +1104,7 @@ RootSignatureParser::parseStaticBorderColor() {
switch (CurToken.TokKind) {
#define STATIC_BORDER_COLOR_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
return StaticBorderColor::NAME; \
return llvm::dxbc::StaticBorderColor::NAME; \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand All @@ -1113,7 +1114,7 @@ RootSignatureParser::parseStaticBorderColor() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
std::optional<llvm::dxbc::RootDescriptorFlags>
RootSignatureParser::parseRootDescriptorFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1124,23 +1125,23 @@ RootSignatureParser::parseRootDescriptorFlags() {
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_non_zero_flag);
return std::nullopt;
}
return RootDescriptorFlags::None;
return llvm::dxbc::RootDescriptorFlags::None;
}

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

std::optional<RootDescriptorFlags> Flags;
std::optional<llvm::dxbc::RootDescriptorFlags> Flags;

do {
if (tryConsumeExpectedToken(Expected)) {
switch (CurToken.TokKind) {
#define ROOT_DESCRIPTOR_FLAG_ENUM(NAME, LIT) \
case TokenKind::en_##NAME: \
Flags = \
maybeOrFlag<RootDescriptorFlags>(Flags, RootDescriptorFlags::NAME); \
Flags = maybeOrFlag<llvm::dxbc::RootDescriptorFlags>( \
Flags, llvm::dxbc::RootDescriptorFlags::NAME); \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand All @@ -1152,7 +1153,7 @@ RootSignatureParser::parseRootDescriptorFlags() {
return Flags;
}

std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
std::optional<llvm::dxbc::DescriptorRangeFlags>
RootSignatureParser::parseDescriptorRangeFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1163,23 +1164,23 @@ RootSignatureParser::parseDescriptorRangeFlags() {
getDiags().Report(CurToken.TokLoc, diag::err_hlsl_rootsig_non_zero_flag);
return std::nullopt;
}
return DescriptorRangeFlags::None;
return llvm::dxbc::DescriptorRangeFlags::None;
}

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

std::optional<DescriptorRangeFlags> Flags;
std::optional<llvm::dxbc::DescriptorRangeFlags> Flags;

do {
if (tryConsumeExpectedToken(Expected)) {
switch (CurToken.TokKind) {
#define DESCRIPTOR_RANGE_FLAG_ENUM(NAME, LIT, ON) \
case TokenKind::en_##NAME: \
Flags = \
maybeOrFlag<DescriptorRangeFlags>(Flags, DescriptorRangeFlags::NAME); \
Flags = maybeOrFlag<llvm::dxbc::DescriptorRangeFlags>( \
Flags, llvm::dxbc::DescriptorRangeFlags::NAME); \
break;
#include "clang/Lex/HLSLRootSignatureTokenKinds.def"
default:
Expand Down
9 changes: 4 additions & 5 deletions clang/lib/Sema/SemaHLSL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1199,10 +1199,9 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
auto ReportOverlap = [this, Loc, &HadOverlap](const RangeInfo *Info,
const RangeInfo *OInfo) {
HadOverlap = true;
auto CommonVis =
Info->Visibility == llvm::hlsl::rootsig::ShaderVisibility::All
? OInfo->Visibility
: Info->Visibility;
auto CommonVis = Info->Visibility == llvm::dxbc::ShaderVisibility::All
? OInfo->Visibility
: Info->Visibility;
this->Diag(Loc, diag::err_hlsl_resource_range_overlap)
<< llvm::to_underlying(Info->Class) << Info->LowerBound
<< /*unbounded=*/(Info->UpperBound == RangeInfo::Unbounded)
Expand Down Expand Up @@ -1237,7 +1236,7 @@ bool SemaHLSL::handleRootSignatureDecl(HLSLRootSignatureDecl *D,
// ResourceRanges in the former case and it will be an ArrayRef to just the
// all visiblity ResourceRange in the latter case.
ArrayRef<ResourceRange> OverlapRanges =
Info.Visibility == llvm::hlsl::rootsig::ShaderVisibility::All
Info.Visibility == llvm::dxbc::ShaderVisibility::All
? ArrayRef<ResourceRange>{Ranges}.drop_front()
: ArrayRef<ResourceRange>{Ranges}.take_front();

Expand Down
Loading
Loading