-
Notifications
You must be signed in to change notification settings - Fork 14.7k
[HLSL][RootSignature] Implement Lexing of DescriptorTables #122981
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
Changes from 8 commits
98deff6
5f43ed8
dc0c7ba
c5d3881
dc784ff
82c645d
1c95e6d
d648f4c
de2f62e
f557d5a
de364d8
35c1566
8ac979c
0c372bf
e58c89a
aa7a73d
ca2a2cb
8345ff1
5439fa8
cf9788e
6a5545f
7f27295
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,121 @@ | ||
//===--- HLSLRootSignature.def - Tokens and Enum Database -------*- C++ -*-===// | ||
|
||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines the TokenKinds used in the Root Signature DSL. This | ||
// includes keywords, enums and a small subset of punctuators. Users of this | ||
// file must optionally #define the TOK, KEYWORD, ENUM or specific ENUM macros | ||
// to make use of this file. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef TOK | ||
#define TOK(X) | ||
#endif | ||
#ifndef PUNCTUATOR | ||
#define PUNCTUATOR(X,Y) TOK(pu_ ## X) | ||
#endif | ||
#ifndef KEYWORD | ||
#define KEYWORD(X) TOK(kw_ ## X) | ||
#endif | ||
#ifndef ENUM | ||
#define ENUM(NAME, LIT) TOK(en_ ## NAME) | ||
#endif | ||
|
||
// Defines the various types of enum | ||
#ifndef DESCRIPTOR_RANGE_OFFSET_ENUM | ||
#define DESCRIPTOR_RANGE_OFFSET_ENUM(NAME, LIT) ENUM(NAME, LIT) | ||
#endif | ||
#ifndef ROOT_DESCRIPTOR_FLAG_ENUM | ||
#define ROOT_DESCRIPTOR_FLAG_ENUM(NAME, LIT) ENUM(NAME, LIT) | ||
#endif | ||
// Note: ON denotes that the flag is unique from the above Root Descriptor | ||
// Flags. This is required to avoid token kind enum conflicts. | ||
#ifndef DESCRIPTOR_RANGE_FLAG_ENUM_OFF | ||
#define DESCRIPTOR_RANGE_FLAG_ENUM_OFF(NAME, LIT) | ||
#endif | ||
#ifndef DESCRIPTOR_RANGE_FLAG_ENUM_ON | ||
#define DESCRIPTOR_RANGE_FLAG_ENUM_ON(NAME, LIT) ENUM(NAME, LIT) | ||
#endif | ||
#ifndef DESCRIPTOR_RANGE_FLAG_ENUM | ||
#define DESCRIPTOR_RANGE_FLAG_ENUM(NAME, LIT, ON) DESCRIPTOR_RANGE_FLAG_ENUM_##ON(NAME, LIT) | ||
#endif | ||
#ifndef SHADER_VISIBILITY_ENUM | ||
#define SHADER_VISIBILITY_ENUM(NAME, LIT) ENUM(NAME, LIT) | ||
#endif | ||
|
||
// General Tokens: | ||
TOK(invalid) | ||
TOK(int_literal) | ||
|
||
// Register Tokens: | ||
TOK(bReg) | ||
TOK(tReg) | ||
TOK(uReg) | ||
TOK(sReg) | ||
|
||
// Punctuators: | ||
PUNCTUATOR(l_paren, '(') | ||
PUNCTUATOR(r_paren, ')') | ||
PUNCTUATOR(comma, ',') | ||
PUNCTUATOR(or, '|') | ||
PUNCTUATOR(equal, '=') | ||
|
||
// RootElement Keywords: | ||
KEYWORD(DescriptorTable) | ||
|
||
// DescriptorTable Keywords: | ||
KEYWORD(CBV) | ||
KEYWORD(SRV) | ||
KEYWORD(UAV) | ||
KEYWORD(Sampler) | ||
|
||
// General Parameter Keywords: | ||
KEYWORD(space) | ||
KEYWORD(visibility) | ||
KEYWORD(flags) | ||
|
||
// View Parameter Keywords: | ||
KEYWORD(numDescriptors) | ||
KEYWORD(offset) | ||
|
||
// Descriptor Range Offset Enum: | ||
DESCRIPTOR_RANGE_OFFSET_ENUM(DescriptorRangeOffsetAppend, "DESCRIPTOR_RANGE_OFFSET_APPEND") | ||
inbelic marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
// Root Descriptor Flag Enums: | ||
ROOT_DESCRIPTOR_FLAG_ENUM(DataVolatile, "DATA_VOLATILE") | ||
ROOT_DESCRIPTOR_FLAG_ENUM(DataStaticWhileSetAtExecute, "DATA_STATIC_WHILE_SET_AT_EXECUTE") | ||
ROOT_DESCRIPTOR_FLAG_ENUM(DataStatic, "DATA_STATIC") | ||
|
||
// Descriptor Range Flag Enums: | ||
DESCRIPTOR_RANGE_FLAG_ENUM(DescriptorsVolatile, "DESCRIPTORS_VOLATILE", ON) | ||
DESCRIPTOR_RANGE_FLAG_ENUM(DataVolatile, "DATA_VOLATILE", OFF) | ||
DESCRIPTOR_RANGE_FLAG_ENUM(DataStaticWhileSetAtExecute, "DATA_STATIC_WHILE_SET_AT_EXECUTE", OFF) | ||
DESCRIPTOR_RANGE_FLAG_ENUM(DataStatic, "DATA_STATIC", OFF) | ||
DESCRIPTOR_RANGE_FLAG_ENUM(DescriptorsStaticKeepingBufferBoundsChecks, "DESCRIPTORS_STATIC_KEEPING_BUFFER_BOUNDS_CHECKS", ON) | ||
|
||
// Shader Visibiliy Enums: | ||
SHADER_VISIBILITY_ENUM(All, "SHADER_VISIBILITY_ALL") | ||
SHADER_VISIBILITY_ENUM(Vertex, "SHADER_VISIBILITY_VERTEX") | ||
SHADER_VISIBILITY_ENUM(Hull, "SHADER_VISIBILITY_HULL") | ||
SHADER_VISIBILITY_ENUM(Domain, "SHADER_VISIBILITY_DOMAIN") | ||
SHADER_VISIBILITY_ENUM(Geometry, "SHADER_VISIBILITY_GEOMETRY") | ||
SHADER_VISIBILITY_ENUM(Pixel, "SHADER_VISIBILITY_PIXEL") | ||
SHADER_VISIBILITY_ENUM(Amplification, "SHADER_VISIBILITY_AMPLIFICATION") | ||
SHADER_VISIBILITY_ENUM(Mesh, "SHADER_VISIBILITY_MESH") | ||
|
||
#undef SHADER_VISIBILITY_ENUM | ||
#undef DESCRIPTOR_RANGE_FLAG_ENUM | ||
#undef DESCRIPTOR_RANGE_FLAG_ENUM_OFF | ||
#undef DESCRIPTOR_RANGE_FLAG_ENUM_ON | ||
#undef ROOT_DESCRIPTOR_FLAG_ENUM | ||
#undef DESCRIPTOR_RANGE_OFFSET_ENUM | ||
#undef ENUM | ||
#undef KEYWORD | ||
#undef PUNCTUATOR | ||
#undef TOK |
inbelic marked this conversation as resolved.
Show resolved
Hide resolved
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
//===--- ParseHLSLRootSignature.h -------------------------------*- C++ -*-===// | ||
// | ||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
// See https://llvm.org/LICENSE.txt for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
// | ||
//===----------------------------------------------------------------------===// | ||
// | ||
// This file defines the ParseHLSLRootSignature interface. | ||
// | ||
//===----------------------------------------------------------------------===// | ||
|
||
#ifndef LLVM_CLANG_PARSE_PARSEHLSLROOTSIGNATURE_H | ||
#define LLVM_CLANG_PARSE_PARSEHLSLROOTSIGNATURE_H | ||
|
||
#include "clang/AST/APValue.h" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is this needed? In general it is also best to prefer forward declarations in headers rather than including headers where possible to reduce compile time overhead. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Removed this and the other no longer needed headers |
||
#include "clang/Basic/DiagnosticLex.h" | ||
#include "clang/Lex/LiteralSupport.h" | ||
#include "clang/Lex/Preprocessor.h" | ||
|
||
#include "llvm/ADT/SmallVector.h" | ||
#include "llvm/ADT/StringRef.h" | ||
#include "llvm/ADT/StringSwitch.h" | ||
|
||
namespace clang { | ||
namespace hlsl { | ||
|
||
struct RootSignatureToken { | ||
enum Kind { | ||
#define TOK(X) X, | ||
#include "clang/Parse/HLSLRootSignatureTokenKinds.def" | ||
}; | ||
|
||
Kind Kind = Kind::invalid; | ||
|
||
// Retain the SouceLocation of the token for diagnostics | ||
clang::SourceLocation TokLoc; | ||
|
||
APValue NumLiteral = APValue(); | ||
|
||
// Constructors | ||
RootSignatureToken(clang::SourceLocation TokLoc) : TokLoc(TokLoc) {} | ||
}; | ||
using TokenKind = enum RootSignatureToken::Kind; | ||
|
||
class RootSignatureLexer { | ||
public: | ||
RootSignatureLexer(StringRef Signature, clang::SourceLocation SourceLoc, | ||
clang::Preprocessor &PP) | ||
: Buffer(Signature), SourceLoc(SourceLoc), PP(PP) {} | ||
|
||
// Consumes the internal buffer as a list of tokens and will emplace them | ||
// onto the given tokens. | ||
// | ||
// It will consume until it successfully reaches the end of the buffer, | ||
// or, until the first error is encountered. The return value denotes if | ||
// there was a failure. | ||
bool Lex(SmallVector<RootSignatureToken> &Tokens); | ||
|
||
private: | ||
// Internal buffer to iterate over | ||
StringRef Buffer; | ||
|
||
// Passed down parameters from Sema | ||
clang::SourceLocation SourceLoc; | ||
clang::Preprocessor &PP; | ||
|
||
bool LexNumber(RootSignatureToken &Result); | ||
|
||
// Consumes the internal buffer for a single token. | ||
// | ||
// The return value denotes if there was a failure. | ||
bool LexToken(RootSignatureToken &Token); | ||
|
||
// Advance the buffer by the specified number of characters. Updates the | ||
// SourceLocation appropriately. | ||
void AdvanceBuffer(unsigned NumCharacters = 1) { | ||
Buffer = Buffer.drop_front(NumCharacters); | ||
SourceLoc = SourceLoc.getLocWithOffset(NumCharacters); | ||
} | ||
}; | ||
|
||
} // namespace hlsl | ||
} // namespace clang | ||
|
||
#endif // LLVM_CLANG_PARSE_PARSEHLSLROOTSIGNATURE_H |
Uh oh!
There was an error while loading. Please reload this page.