Skip to content

[NFC][HLSL][DXIL] Move D3D12.h enums and flags to DXILABI #143041

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

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
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::dxil::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::dxil::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::dxil::ShaderVisibility> Visibility;
std::optional<llvm::dxil::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::dxil::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::dxil::SamplerFilter> Filter;
std::optional<llvm::dxil::TextureAddressMode> AddressU;
std::optional<llvm::dxil::TextureAddressMode> AddressV;
std::optional<llvm::dxil::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::dxil::ComparisonFunc> CompFunc;
std::optional<llvm::dxil::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::dxil::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::dxil::ShaderVisibility> parseShaderVisibility();
std::optional<llvm::dxil::SamplerFilter> parseSamplerFilter();
std::optional<llvm::dxil::TextureAddressMode> parseTextureAddressMode();
std::optional<llvm::dxil::ComparisonFunc> parseComparisonFunc();
std::optional<llvm::dxil::StaticBorderColor> parseStaticBorderColor();
std::optional<llvm::dxil::RootDescriptorFlags> parseRootDescriptorFlags();
std::optional<llvm::dxil::DescriptorRangeFlags> parseDescriptorRangeFlags();

/// Use NumericLiteralParser to convert CurToken.NumSpelling into a unsigned
/// 32-bit integer
Expand Down
18 changes: 8 additions & 10 deletions clang/lib/Parse/ParseHLSLRootSignature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include "clang/Lex/LiteralSupport.h"

using namespace llvm::hlsl::rootsig;
using namespace llvm::dxil;

namespace clang {
namespace hlsl {
Expand Down Expand Up @@ -983,8 +984,7 @@ std::optional<float> RootSignatureParser::parseFloatParam() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::ShaderVisibility>
RootSignatureParser::parseShaderVisibility() {
std::optional<::ShaderVisibility> RootSignatureParser::parseShaderVisibility() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");

Expand All @@ -1009,8 +1009,7 @@ RootSignatureParser::parseShaderVisibility() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::SamplerFilter>
RootSignatureParser::parseSamplerFilter() {
std::optional<::SamplerFilter> RootSignatureParser::parseSamplerFilter() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");

Expand All @@ -1035,7 +1034,7 @@ RootSignatureParser::parseSamplerFilter() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::TextureAddressMode>
std::optional<::TextureAddressMode>
RootSignatureParser::parseTextureAddressMode() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1061,8 +1060,7 @@ RootSignatureParser::parseTextureAddressMode() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::ComparisonFunc>
RootSignatureParser::parseComparisonFunc() {
std::optional<::ComparisonFunc> RootSignatureParser::parseComparisonFunc() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");

Expand All @@ -1087,7 +1085,7 @@ RootSignatureParser::parseComparisonFunc() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::StaticBorderColor>
std::optional<::StaticBorderColor>
RootSignatureParser::parseStaticBorderColor() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand All @@ -1113,7 +1111,7 @@ RootSignatureParser::parseStaticBorderColor() {
return std::nullopt;
}

std::optional<llvm::hlsl::rootsig::RootDescriptorFlags>
std::optional<::RootDescriptorFlags>
RootSignatureParser::parseRootDescriptorFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand Down Expand Up @@ -1152,7 +1150,7 @@ RootSignatureParser::parseRootDescriptorFlags() {
return Flags;
}

std::optional<llvm::hlsl::rootsig::DescriptorRangeFlags>
std::optional<::DescriptorRangeFlags>
RootSignatureParser::parseDescriptorRangeFlags() {
assert(CurToken.TokKind == TokenKind::pu_equal &&
"Expects to only be invoked starting at given keyword");
Expand Down
1 change: 1 addition & 0 deletions clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "gtest/gtest.h"

using namespace clang;
using namespace llvm::dxil;
using namespace llvm::hlsl::rootsig;

namespace {
Expand Down
158 changes: 19 additions & 139 deletions llvm/include/llvm/Frontend/HLSL/HLSLRootSignature.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,126 +22,6 @@ namespace llvm {
namespace hlsl {
namespace rootsig {

// Definition of the various enumerations and flags. The definitions of all
// values here correspond to their description in the d3d12.h header and are
// carried over from their values in DXC. For reference:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/

enum class RootFlags : uint32_t {
None = 0,
AllowInputAssemblerInputLayout = 0x1,
DenyVertexShaderRootAccess = 0x2,
DenyHullShaderRootAccess = 0x4,
DenyDomainShaderRootAccess = 0x8,
DenyGeometryShaderRootAccess = 0x10,
DenyPixelShaderRootAccess = 0x20,
AllowStreamOutput = 0x40,
LocalRootSignature = 0x80,
DenyAmplificationShaderRootAccess = 0x100,
DenyMeshShaderRootAccess = 0x200,
CBVSRVUAVHeapDirectlyIndexed = 0x400,
SamplerHeapDirectlyIndexed = 0x800,
ValidFlags = 0x00000fff
};

enum class RootDescriptorFlags : unsigned {
None = 0,
DataVolatile = 0x2,
DataStaticWhileSetAtExecute = 0x4,
DataStatic = 0x8,
ValidFlags = 0xe,
};

enum class DescriptorRangeFlags : unsigned {
None = 0,
DescriptorsVolatile = 0x1,
DataVolatile = 0x2,
DataStaticWhileSetAtExecute = 0x4,
DataStatic = 0x8,
DescriptorsStaticKeepingBufferBoundsChecks = 0x10000,
ValidFlags = 0x1000f,
ValidSamplerFlags = DescriptorsVolatile,
};

enum class ShaderVisibility {
All = 0,
Vertex = 1,
Hull = 2,
Domain = 3,
Geometry = 4,
Pixel = 5,
Amplification = 6,
Mesh = 7,
};

// D3D12_FILTER enumeration:
// https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_filter
enum class SamplerFilter {
MinMagMipPoint = 0,
MinMagPointMipLinear = 0x1,
MinPointMagLinearMipPoint = 0x4,
MinPointMagMipLinear = 0x5,
MinLinearMagMipPoint = 0x10,
MinLinearMagPointMipLinear = 0x11,
MinMagLinearMipPoint = 0x14,
MinMagMipLinear = 0x15,
Anisotropic = 0x55,
ComparisonMinMagMipPoint = 0x80,
ComparisonMinMagPointMipLinear = 0x81,
ComparisonMinPointMagLinearMipPoint = 0x84,
ComparisonMinPointMagMipLinear = 0x85,
ComparisonMinLinearMagMipPoint = 0x90,
ComparisonMinLinearMagPointMipLinear = 0x91,
ComparisonMinMagLinearMipPoint = 0x94,
ComparisonMinMagMipLinear = 0x95,
ComparisonAnisotropic = 0xd5,
MinimumMinMagMipPoint = 0x100,
MinimumMinMagPointMipLinear = 0x101,
MinimumMinPointMagLinearMipPoint = 0x104,
MinimumMinPointMagMipLinear = 0x105,
MinimumMinLinearMagMipPoint = 0x110,
MinimumMinLinearMagPointMipLinear = 0x111,
MinimumMinMagLinearMipPoint = 0x114,
MinimumMinMagMipLinear = 0x115,
MinimumAnisotropic = 0x155,
MaximumMinMagMipPoint = 0x180,
MaximumMinMagPointMipLinear = 0x181,
MaximumMinPointMagLinearMipPoint = 0x184,
MaximumMinPointMagMipLinear = 0x185,
MaximumMinLinearMagMipPoint = 0x190,
MaximumMinLinearMagPointMipLinear = 0x191,
MaximumMinMagLinearMipPoint = 0x194,
MaximumMinMagMipLinear = 0x195,
MaximumAnisotropic = 0x1d5
};

enum class TextureAddressMode {
Wrap = 1,
Mirror = 2,
Clamp = 3,
Border = 4,
MirrorOnce = 5
};

enum class ComparisonFunc : unsigned {
Never = 1,
Less = 2,
Equal = 3,
LessEqual = 4,
Greater = 5,
NotEqual = 6,
GreaterEqual = 7,
Always = 8
};

enum class StaticBorderColor {
TransparentBlack = 0,
OpaqueBlack = 1,
OpaqueWhite = 2,
OpaqueBlackUint = 3,
OpaqueWhiteUint = 4
};

// Definitions of the in-memory data layout structures

// Models the different registers: bReg | tReg | uReg | sReg
Expand All @@ -156,7 +36,7 @@ struct RootConstants {
uint32_t Num32BitConstants;
Register Reg;
uint32_t Space = 0;
ShaderVisibility Visibility = ShaderVisibility::All;
dxil::ShaderVisibility Visibility = dxil::ShaderVisibility::All;
};

enum class DescriptorType : uint8_t { SRV = 0, UAV, CBuffer };
Expand All @@ -165,25 +45,25 @@ struct RootDescriptor {
DescriptorType Type;
Register Reg;
uint32_t Space = 0;
ShaderVisibility Visibility = ShaderVisibility::All;
RootDescriptorFlags Flags;
dxil::ShaderVisibility Visibility = dxil::ShaderVisibility::All;
dxil::RootDescriptorFlags Flags;

void setDefaultFlags() {
switch (Type) {
case DescriptorType::CBuffer:
case DescriptorType::SRV:
Flags = RootDescriptorFlags::DataStaticWhileSetAtExecute;
Flags = dxil::RootDescriptorFlags::DataStaticWhileSetAtExecute;
break;
case DescriptorType::UAV:
Flags = RootDescriptorFlags::DataVolatile;
Flags = dxil::RootDescriptorFlags::DataVolatile;
break;
}
}
};

// Models the end of a descriptor table and stores its visibility
struct DescriptorTable {
ShaderVisibility Visibility = ShaderVisibility::All;
dxil::ShaderVisibility Visibility = dxil::ShaderVisibility::All;
// Denotes that the previous NumClauses in the RootElement array
// are the clauses in the table.
uint32_t NumClauses = 0;
Expand All @@ -199,38 +79,38 @@ struct DescriptorTableClause {
uint32_t NumDescriptors = 1;
uint32_t Space = 0;
uint32_t Offset = DescriptorTableOffsetAppend;
DescriptorRangeFlags Flags;
dxil::DescriptorRangeFlags Flags;

void setDefaultFlags() {
switch (Type) {
case ClauseType::CBuffer:
case ClauseType::SRV:
Flags = DescriptorRangeFlags::DataStaticWhileSetAtExecute;
Flags = dxil::DescriptorRangeFlags::DataStaticWhileSetAtExecute;
break;
case ClauseType::UAV:
Flags = DescriptorRangeFlags::DataVolatile;
Flags = dxil::DescriptorRangeFlags::DataVolatile;
break;
case ClauseType::Sampler:
Flags = DescriptorRangeFlags::None;
Flags = dxil::DescriptorRangeFlags::None;
break;
}
}
};

struct StaticSampler {
Register Reg;
SamplerFilter Filter = SamplerFilter::Anisotropic;
TextureAddressMode AddressU = TextureAddressMode::Wrap;
TextureAddressMode AddressV = TextureAddressMode::Wrap;
TextureAddressMode AddressW = TextureAddressMode::Wrap;
dxil::SamplerFilter Filter = dxil::SamplerFilter::Anisotropic;
dxil::TextureAddressMode AddressU = dxil::TextureAddressMode::Wrap;
dxil::TextureAddressMode AddressV = dxil::TextureAddressMode::Wrap;
dxil::TextureAddressMode AddressW = dxil::TextureAddressMode::Wrap;
float MipLODBias = 0.f;
uint32_t MaxAnisotropy = 16;
ComparisonFunc CompFunc = ComparisonFunc::LessEqual;
StaticBorderColor BorderColor = StaticBorderColor::OpaqueWhite;
dxil::ComparisonFunc CompFunc = dxil::ComparisonFunc::LessEqual;
dxil::StaticBorderColor BorderColor = dxil::StaticBorderColor::OpaqueWhite;
float MinLOD = 0.f;
float MaxLOD = std::numeric_limits<float>::max();
uint32_t Space = 0;
ShaderVisibility Visibility = ShaderVisibility::All;
dxil::ShaderVisibility Visibility = dxil::ShaderVisibility::All;
};

/// Models RootElement : RootFlags | RootConstants | RootParam
Expand All @@ -250,8 +130,8 @@ struct StaticSampler {
/// RootElements in the array, and it holds a data member for the Visibility
/// parameter.
using RootElement =
std::variant<RootFlags, RootConstants, RootDescriptor, DescriptorTable,
DescriptorTableClause, StaticSampler>;
std::variant<dxil::RootFlags, RootConstants, RootDescriptor,
DescriptorTable, DescriptorTableClause, StaticSampler>;

} // namespace rootsig
} // namespace hlsl
Expand Down
Loading
Loading