Add parser support for highp/mediump Tokens in vardecls.

These parse into new modifier bits; the IR generator does not yet
support these bits. That's coming in a followup CL.

Change-Id: I362e9227694f9b862eaad100f6afca45a9b62a01
Bug: skia:12248
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/436336
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
This commit is contained in:
John Stiles 2021-08-04 16:03:12 -04:00 committed by SkCQ
parent 35215fb68a
commit 020143148f
11 changed files with 53 additions and 21 deletions

View File

@ -346,7 +346,6 @@ sksl_shared_tests = [
"/sksl/shared/OutParamsNoInline.sksl",
"/sksl/shared/OutParamsTricky.sksl",
"/sksl/shared/Overflow.sksl",
"/sksl/shared/PrecisionQualifiers.sksl",
"/sksl/shared/RectangleTexture.sksl",
"/sksl/shared/ResizeMatrix.sksl",
"/sksl/shared/ResizeMatrixNonsquare.sksl",
@ -524,6 +523,7 @@ sksl_rte_tests = [
"/sksl/runtime/GlobalVariables.rts",
"/sksl/runtime/LoopInt.rts",
"/sksl/runtime/LoopFloat.rts",
"/sksl/runtime/PrecisionQualifiers.rts",
"/sksl/runtime/SampleWithExplicitCoord.rts",
"/sksl/runtime/VectorIndexing.rts",
]

View File

@ -27,9 +27,11 @@ struct Modifiers {
kFlat_Flag = 1 << 4,
kNoPerspective_Flag = 1 << 5,
kHasSideEffects_Flag = 1 << 6,
kInline_Flag = 1 << 8,
kNoInline_Flag = 1 << 9,
kHighp_Flag = 1 << 7,
kMediump_Flag = 1 << 8,
kLowp_Flag = 1 << 9,
kInline_Flag = 1 << 10,
kNoInline_Flag = 1 << 11,
};
Modifiers()
@ -60,6 +62,15 @@ struct Modifiers {
if (fFlags & kNoInline_Flag) {
result += "noinline ";
}
if (fFlags & kHighp_Flag) {
result += "highp ";
}
if (fFlags & kMediump_Flag) {
result += "mediump ";
}
if (fFlags & kLowp_Flag) {
result += "lowp ";
}
if ((fFlags & kIn_Flag) && (fFlags & kOut_Flag)) {
result += "inout ";
} else if (fFlags & kIn_Flag) {

View File

@ -1,9 +1,9 @@
uniform half4 colorGreen;
half4 main(float2 coords) {
highp vec4 zero = 0;
vec4 main(vec2 coords) {
highp vec4 zero = vec4(0);
mediump vec4 green = colorGreen;
lowp vec4 one = 1;
lowp vec4 one = vec4(1);
return green * one + zero;
}

View File

@ -33,6 +33,9 @@ static int parse_modifier_token(Token::Kind token) {
case Token::Kind::TK_HASSIDEEFFECTS: return Modifiers::kHasSideEffects_Flag;
case Token::Kind::TK_INLINE: return Modifiers::kInline_Flag;
case Token::Kind::TK_NOINLINE: return Modifiers::kNoInline_Flag;
case Token::Kind::TK_HIGHP: return Modifiers::kHighp_Flag;
case Token::Kind::TK_MEDIUMP: return Modifiers::kMediump_Flag;
case Token::Kind::TK_LOWP: return Modifiers::kLowp_Flag;
default: return 0;
}
}
@ -428,7 +431,10 @@ skstd::optional<DSLStatement> DSLParser::varDeclarationsOrExpressionStatement()
return this->varDeclarations();
}
if (IsType(this->text(nextToken))) {
if (nextToken.fKind == Token::Kind::TK_HIGHP ||
nextToken.fKind == Token::Kind::TK_MEDIUMP ||
nextToken.fKind == Token::Kind::TK_LOWP ||
IsType(this->text(nextToken))) {
// Statements that begin with a typename are most often variable declarations, but
// occasionally the type is part of a constructor, and these are actually expression-
// statements in disguise. First, attempt the common case: parse it as a vardecl.
@ -742,6 +748,9 @@ skstd::optional<DSLStatement> DSLParser::statement() {
case Token::Kind::TK_SEMICOLON:
this->nextToken();
return dsl::Block();
case Token::Kind::TK_HIGHP:
case Token::Kind::TK_MEDIUMP:
case Token::Kind::TK_LOWP:
case Token::Kind::TK_CONST:
case Token::Kind::TK_IDENTIFIER:
return this->varDeclarationsOrExpressionStatement();

View File

@ -743,6 +743,9 @@ void IRGenerator::CheckModifiers(const Context& context,
checkModifier(Modifiers::kHasSideEffects_Flag, "sk_has_side_effects");
checkModifier(Modifiers::kInline_Flag, "inline");
checkModifier(Modifiers::kNoInline_Flag, "noinline");
checkModifier(Modifiers::kHighp_Flag, "highp");
checkModifier(Modifiers::kMediump_Flag, "mediump");
checkModifier(Modifiers::kLowp_Flag, "lowp");
SkASSERT(flags == 0);
int layoutFlags = modifiers.fLayout.fFlags;

View File

@ -52,6 +52,9 @@ static int parse_modifier_token(Token::Kind token) {
case Token::Kind::TK_HASSIDEEFFECTS: return Modifiers::kHasSideEffects_Flag;
case Token::Kind::TK_INLINE: return Modifiers::kInline_Flag;
case Token::Kind::TK_NOINLINE: return Modifiers::kNoInline_Flag;
case Token::Kind::TK_HIGHP: return Modifiers::kHighp_Flag;
case Token::Kind::TK_MEDIUMP: return Modifiers::kMediump_Flag;
case Token::Kind::TK_LOWP: return Modifiers::kLowp_Flag;
default: return 0;
}
}
@ -387,7 +390,10 @@ ASTNode::ID Parser::varDeclarationsOrExpressionStatement() {
return this->varDeclarations();
}
if (this->isType(this->text(nextToken))) {
if (nextToken.fKind == Token::Kind::TK_HIGHP ||
nextToken.fKind == Token::Kind::TK_MEDIUMP ||
nextToken.fKind == Token::Kind::TK_LOWP ||
this->isType(this->text(nextToken))) {
// Statements that begin with a typename are most often variable declarations, but
// occasionally the type is part of a constructor, and these are actually expression-
// statements in disguise. First, attempt the common case: parse it as a vardecl.
@ -849,6 +855,9 @@ ASTNode::ID Parser::statement() {
case Token::Kind::TK_SEMICOLON:
this->nextToken();
return this->createNode(start.fOffset, ASTNode::Kind::kBlock);
case Token::Kind::TK_HIGHP:
case Token::Kind::TK_MEDIUMP:
case Token::Kind::TK_LOWP:
case Token::Kind::TK_CONST:
case Token::Kind::TK_IDENTIFIER:
return this->varDeclarationsOrExpressionStatement();

View File

@ -0,0 +1,6 @@
### Compilation failed:
error: 4: 'highp' is not permitted here
error: 5: 'mediump' is not permitted here
error: 6: 'lowp' is not permitted here
3 errors

View File

@ -0,0 +1,6 @@
### Compilation failed:
error: 4: 'highp' is not permitted here
error: 5: 'mediump' is not permitted here
error: 6: 'lowp' is not permitted here
3 errors

View File

@ -1,4 +0,0 @@
### Compilation failed:
error: 4: expected expression, but found 'highp'
1 error

View File

@ -1,4 +0,0 @@
### Compilation failed:
error: 4: expected expression, but found 'highp'
1 error

View File

@ -1,4 +0,0 @@
### Compilation failed:
error: 4: expected expression, but found 'highp'
1 error