| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "stdio.h" | 8 #include "stdio.h" |
| 9 #include "SkSLParser.h" | 9 #include "SkSLParser.h" |
| 10 #include "SkSLToken.h" | 10 #include "SkSLToken.h" |
| 11 | 11 |
| 12 #define register | 12 #define register |
| 13 #ifdef __clang__ | 13 #ifdef __clang__ |
| 14 #pragma clang diagnostic push | 14 #pragma clang diagnostic push |
| 15 #pragma clang diagnostic ignored "-Wunneeded-internal-declaration" | 15 #pragma clang diagnostic ignored "-Wunneeded-internal-declaration" |
| 16 #pragma clang diagnostic ignored "-Wnull-conversion" | 16 #pragma clang diagnostic ignored "-Wnull-conversion" |
| 17 #pragma clang diagnostic ignored "-Wsign-compare" |
| 17 #endif | 18 #endif |
| 18 #include "lex.sksl.c" | 19 #include "lex.sksl.c" |
| 19 #ifdef __clang__ | 20 #ifdef __clang__ |
| 20 #pragma clang diagnostic pop | 21 #pragma clang diagnostic pop |
| 21 #endif | 22 #endif |
| 22 #undef register | 23 #undef register |
| 23 | 24 |
| 24 #include "ast/SkSLASTBinaryExpression.h" | 25 #include "ast/SkSLASTBinaryExpression.h" |
| 25 #include "ast/SkSLASTBlock.h" | 26 #include "ast/SkSLASTBlock.h" |
| 26 #include "ast/SkSLASTBoolLiteral.h" | 27 #include "ast/SkSLASTBoolLiteral.h" |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 464 } | 465 } |
| 465 | 466 |
| 466 /* LAYOUT LPAREN IDENTIFIER EQ INT_LITERAL (COMMA IDENTIFIER EQ INT_LITERAL)* | 467 /* LAYOUT LPAREN IDENTIFIER EQ INT_LITERAL (COMMA IDENTIFIER EQ INT_LITERAL)* |
| 467 RPAREN */ | 468 RPAREN */ |
| 468 ASTLayout Parser::layout() { | 469 ASTLayout Parser::layout() { |
| 469 int location = -1; | 470 int location = -1; |
| 470 int binding = -1; | 471 int binding = -1; |
| 471 int index = -1; | 472 int index = -1; |
| 472 int set = -1; | 473 int set = -1; |
| 473 int builtin = -1; | 474 int builtin = -1; |
| 475 bool originUpperLeft = false; |
| 474 if (this->peek().fKind == Token::LAYOUT) { | 476 if (this->peek().fKind == Token::LAYOUT) { |
| 475 this->nextToken(); | 477 this->nextToken(); |
| 476 if (!this->expect(Token::LPAREN, "'('")) { | 478 if (!this->expect(Token::LPAREN, "'('")) { |
| 477 return ASTLayout(location, binding, index, set, builtin); | 479 return ASTLayout(location, binding, index, set, builtin, originUpper
Left); |
| 478 } | 480 } |
| 479 for (;;) { | 481 for (;;) { |
| 480 Token t = this->nextToken(); | 482 Token t = this->nextToken(); |
| 481 if (t.fText == "location") { | 483 if (t.fText == "location") { |
| 482 location = this->layoutInt(); | 484 location = this->layoutInt(); |
| 483 } else if (t.fText == "binding") { | 485 } else if (t.fText == "binding") { |
| 484 binding = this->layoutInt(); | 486 binding = this->layoutInt(); |
| 485 } else if (t.fText == "index") { | 487 } else if (t.fText == "index") { |
| 486 index = this->layoutInt(); | 488 index = this->layoutInt(); |
| 487 } else if (t.fText == "set") { | 489 } else if (t.fText == "set") { |
| 488 set = this->layoutInt(); | 490 set = this->layoutInt(); |
| 489 } else if (t.fText == "builtin") { | 491 } else if (t.fText == "builtin") { |
| 490 builtin = this->layoutInt(); | 492 builtin = this->layoutInt(); |
| 493 } else if (t.fText == "origin_upper_left") { |
| 494 originUpperLeft = true; |
| 491 } else { | 495 } else { |
| 492 this->error(t.fPosition, ("'" + t.fText + | 496 this->error(t.fPosition, ("'" + t.fText + |
| 493 "' is not a valid layout qualifier").c
_str()); | 497 "' is not a valid layout qualifier").c
_str()); |
| 494 } | 498 } |
| 495 if (this->peek().fKind == Token::RPAREN) { | 499 if (this->peek().fKind == Token::RPAREN) { |
| 496 this->nextToken(); | 500 this->nextToken(); |
| 497 break; | 501 break; |
| 498 } | 502 } |
| 499 if (!this->expect(Token::COMMA, "','")) { | 503 if (!this->expect(Token::COMMA, "','")) { |
| 500 break; | 504 break; |
| 501 } | 505 } |
| 502 } | 506 } |
| 503 } | 507 } |
| 504 return ASTLayout(location, binding, index, set, builtin); | 508 return ASTLayout(location, binding, index, set, builtin, originUpperLeft); |
| 505 } | 509 } |
| 506 | 510 |
| 507 /* layout? (UNIFORM | CONST | IN | OUT | INOUT | LOWP | | 511 /* layout? (UNIFORM | CONST | IN | OUT | INOUT | LOWP | MEDIUMP | HIGHP | FLAT |
NOPERSPECTIVE)* */ |
| 508 MEDIUMP | HIGHP)* */ | |
| 509 ASTModifiers Parser::modifiers() { | 512 ASTModifiers Parser::modifiers() { |
| 510 ASTLayout layout = this->layout(); | 513 ASTLayout layout = this->layout(); |
| 511 int flags = 0; | 514 int flags = 0; |
| 512 for (;;) { | 515 for (;;) { |
| 513 // TODO: handle duplicate / incompatible flags | 516 // TODO: handle duplicate / incompatible flags |
| 514 switch (peek().fKind) { | 517 switch (peek().fKind) { |
| 515 case Token::UNIFORM: | 518 case Token::UNIFORM: |
| 516 this->nextToken(); | 519 this->nextToken(); |
| 517 flags |= ASTModifiers::kUniform_Flag; | 520 flags |= ASTModifiers::kUniform_Flag; |
| 518 break; | 521 break; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 538 flags |= ASTModifiers::kLowp_Flag; | 541 flags |= ASTModifiers::kLowp_Flag; |
| 539 break; | 542 break; |
| 540 case Token::MEDIUMP: | 543 case Token::MEDIUMP: |
| 541 this->nextToken(); | 544 this->nextToken(); |
| 542 flags |= ASTModifiers::kMediump_Flag; | 545 flags |= ASTModifiers::kMediump_Flag; |
| 543 break; | 546 break; |
| 544 case Token::HIGHP: | 547 case Token::HIGHP: |
| 545 this->nextToken(); | 548 this->nextToken(); |
| 546 flags |= ASTModifiers::kHighp_Flag; | 549 flags |= ASTModifiers::kHighp_Flag; |
| 547 break; | 550 break; |
| 551 case Token::FLAT: |
| 552 this->nextToken(); |
| 553 flags |= ASTModifiers::kFlat_Flag; |
| 554 break; |
| 555 case Token::NOPERSPECTIVE: |
| 556 this->nextToken(); |
| 557 flags |= ASTModifiers::kNoPerspective_Flag; |
| 558 break; |
| 548 default: | 559 default: |
| 549 return ASTModifiers(layout, flags); | 560 return ASTModifiers(layout, flags); |
| 550 } | 561 } |
| 551 } | 562 } |
| 552 } | 563 } |
| 553 | 564 |
| 554 ASTModifiers Parser::modifiersWithDefaults(int defaultFlags) { | 565 ASTModifiers Parser::modifiersWithDefaults(int defaultFlags) { |
| 555 ASTModifiers result = this->modifiers(); | 566 ASTModifiers result = this->modifiers(); |
| 556 if (!result.fFlags) { | 567 if (!result.fFlags) { |
| 557 return ASTModifiers(result.fLayout, defaultFlags); | 568 return ASTModifiers(result.fLayout, defaultFlags); |
| (...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1382 bool Parser::identifier(std::string* dest) { | 1393 bool Parser::identifier(std::string* dest) { |
| 1383 Token t; | 1394 Token t; |
| 1384 if (this->expect(Token::IDENTIFIER, "identifier", &t)) { | 1395 if (this->expect(Token::IDENTIFIER, "identifier", &t)) { |
| 1385 *dest = t.fText; | 1396 *dest = t.fText; |
| 1386 return true; | 1397 return true; |
| 1387 } | 1398 } |
| 1388 return false; | 1399 return false; |
| 1389 } | 1400 } |
| 1390 | 1401 |
| 1391 } // namespace | 1402 } // namespace |
| OLD | NEW |