HLSL: Additional attribute support: [[]], namespace, parameters:
- support C++11 style brackets [[...]] - support namespaces [[vk::...]] - support these on parameter declarations in functions - support location, binding/set, input attachments
This commit is contained in:
@@ -295,13 +295,16 @@ bool HlslGrammar::acceptSamplerDeclarationDX9(TType& /*type*/)
|
||||
}
|
||||
|
||||
// declaration
|
||||
// : attributes attributed_declaration
|
||||
// | NAMESPACE IDENTIFIER LEFT_BRACE declaration_list RIGHT_BRACE
|
||||
//
|
||||
// attributed_declaration
|
||||
// : sampler_declaration_dx9 post_decls SEMICOLON
|
||||
// | fully_specified_type // for cbuffer/tbuffer
|
||||
// | fully_specified_type declarator_list SEMICOLON // for non cbuffer/tbuffer
|
||||
// | fully_specified_type identifier function_parameters post_decls compound_statement // function definition
|
||||
// | fully_specified_type identifier sampler_state post_decls compound_statement // sampler definition
|
||||
// | typedef declaration
|
||||
// | NAMESPACE IDENTIFIER LEFT_BRACE declaration_list RIGHT_BRACE
|
||||
//
|
||||
// declarator_list
|
||||
// : declarator COMMA declarator COMMA declarator... // zero or more declarators
|
||||
@@ -376,6 +379,8 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList)
|
||||
if (! acceptFullySpecifiedType(declaredType, nodeList))
|
||||
return false;
|
||||
|
||||
parseContext.transferTypeAttributes(declarator.attributes, declaredType);
|
||||
|
||||
// cbuffer and tbuffer end with the closing '}'.
|
||||
// No semicolon is included.
|
||||
if (forbidDeclarators)
|
||||
@@ -2371,16 +2376,25 @@ bool HlslGrammar::acceptDefaultParameterDeclaration(const TType& type, TIntermTy
|
||||
}
|
||||
|
||||
// parameter_declaration
|
||||
// : attributes attributed_declaration
|
||||
//
|
||||
// attributed_declaration
|
||||
// : fully_specified_type post_decls [ = default_parameter_declaration ]
|
||||
// | fully_specified_type identifier array_specifier post_decls [ = default_parameter_declaration ]
|
||||
//
|
||||
bool HlslGrammar::acceptParameterDeclaration(TFunction& function)
|
||||
{
|
||||
// attributes
|
||||
TAttributeMap attributes;
|
||||
acceptAttributes(attributes);
|
||||
|
||||
// fully_specified_type
|
||||
TType* type = new TType;
|
||||
if (! acceptFullySpecifiedType(*type))
|
||||
return false;
|
||||
|
||||
parseContext.transferTypeAttributes(attributes, *type);
|
||||
|
||||
// identifier
|
||||
HlslToken idToken;
|
||||
acceptIdentifier(idToken);
|
||||
@@ -3256,7 +3270,15 @@ bool HlslGrammar::acceptStatement(TIntermNode*& statement)
|
||||
}
|
||||
|
||||
// attributes
|
||||
// : list of zero or more of: LEFT_BRACKET attribute RIGHT_BRACKET
|
||||
// : [zero or more:] bracketed-attribute
|
||||
//
|
||||
// bracketed-attribute:
|
||||
// : LEFT_BRACKET scoped-attribute RIGHT_BRACKET
|
||||
// : LEFT_BRACKET LEFT_BRACKET scoped-attribute RIGHT_BRACKET RIGHT_BRACKET
|
||||
//
|
||||
// scoped-attribute:
|
||||
// : attribute
|
||||
// | namespace COLON COLON attribute
|
||||
//
|
||||
// attribute:
|
||||
// : UNROLL
|
||||
@@ -3283,18 +3305,33 @@ void HlslGrammar::acceptAttributes(TAttributeMap& attributes)
|
||||
// numthreads, which is used to set the CS local size.
|
||||
// TODO: subset to correct set? Pass on?
|
||||
do {
|
||||
HlslToken idToken;
|
||||
HlslToken attributeToken;
|
||||
|
||||
// LEFT_BRACKET?
|
||||
if (! acceptTokenClass(EHTokLeftBracket))
|
||||
return;
|
||||
// another LEFT_BRACKET?
|
||||
bool doubleBrackets = false;
|
||||
if (acceptTokenClass(EHTokLeftBracket))
|
||||
doubleBrackets = true;
|
||||
|
||||
// attribute
|
||||
if (acceptIdentifier(idToken)) {
|
||||
// 'idToken.string' is the attribute
|
||||
} else if (! peekTokenClass(EHTokRightBracket)) {
|
||||
expected("identifier");
|
||||
advanceToken();
|
||||
// attribute? (could be namespace; will adjust later)
|
||||
if (!acceptIdentifier(attributeToken)) {
|
||||
if (!peekTokenClass(EHTokRightBracket)) {
|
||||
expected("namespace or attribute identifier");
|
||||
advanceToken();
|
||||
}
|
||||
}
|
||||
|
||||
TString nameSpace;
|
||||
if (acceptTokenClass(EHTokColonColon)) {
|
||||
// namespace COLON COLON
|
||||
nameSpace = *attributeToken.string;
|
||||
// attribute
|
||||
if (!acceptIdentifier(attributeToken)) {
|
||||
expected("attribute identifier");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
TIntermAggregate* expressions = nullptr;
|
||||
@@ -3327,10 +3364,15 @@ void HlslGrammar::acceptAttributes(TAttributeMap& attributes)
|
||||
expected("]");
|
||||
return;
|
||||
}
|
||||
// another RIGHT_BRACKET?
|
||||
if (doubleBrackets && !acceptTokenClass(EHTokRightBracket)) {
|
||||
expected("]]");
|
||||
return;
|
||||
}
|
||||
|
||||
// Add any values we found into the attribute map. This accepts
|
||||
// (and ignores) values not mapping to a known TAttributeType;
|
||||
attributes.setAttribute(idToken.string, expressions);
|
||||
attributes.setAttribute(nameSpace, attributeToken.string, expressions);
|
||||
} while (true);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user