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:
parent
35215fb68a
commit
020143148f
@ -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",
|
||||
]
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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();
|
||||
|
6
tests/sksl/runtime/PrecisionQualifiers.skvm
Normal file
6
tests/sksl/runtime/PrecisionQualifiers.skvm
Normal 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
|
6
tests/sksl/runtime/PrecisionQualifiers.stage
Normal file
6
tests/sksl/runtime/PrecisionQualifiers.stage
Normal 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
|
@ -1,4 +0,0 @@
|
||||
### Compilation failed:
|
||||
|
||||
error: 4: expected expression, but found 'highp'
|
||||
1 error
|
@ -1,4 +0,0 @@
|
||||
### Compilation failed:
|
||||
|
||||
error: 4: expected expression, but found 'highp'
|
||||
1 error
|
@ -1,4 +0,0 @@
|
||||
### Compilation failed:
|
||||
|
||||
error: 4: expected expression, but found 'highp'
|
||||
1 error
|
Loading…
Reference in New Issue
Block a user