1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SKSL_COMPILER 9 #define SKSL_COMPILER 10 11 #include <set> 12 #include <vector> 13 #include "ir/SkSLProgram.h" 14 #include "ir/SkSLSymbolTable.h" 15 #include "SkSLCFGGenerator.h" 16 #include "SkSLContext.h" 17 #include "SkSLErrorReporter.h" 18 #include "SkSLIRGenerator.h" 19 20 #define SK_FRAGCOLOR_BUILTIN 10001 21 #define SK_IN_BUILTIN 10002 22 #define SK_FRAGCOORD_BUILTIN 15 23 #define SK_VERTEXID_BUILTIN 5 24 #define SK_CLIPDISTANCE_BUILTIN 3 25 #define SK_INVOCATIONID_BUILTIN 8 26 27 namespace SkSL { 28 29 class IRGenerator; 30 31 /** 32 * Main compiler entry point. This is a traditional compiler design which first parses the .sksl 33 * file into an abstract syntax tree (a tree of ASTNodes), then performs semantic analysis to 34 * produce a Program (a tree of IRNodes), then feeds the Program into a CodeGenerator to produce 35 * compiled output. 36 * 37 * See the README for information about SkSL. 38 */ 39 class Compiler : public ErrorReporter { 40 public: 41 Compiler(); 42 43 ~Compiler() override; 44 45 std::unique_ptr<Program> convertProgram(Program::Kind kind, SkString text, 46 const Program::Settings& settings); 47 48 bool toSPIRV(const Program& program, SkWStream& out); 49 50 bool toSPIRV(const Program& program, SkString* out); 51 52 bool toGLSL(const Program& program, SkWStream& out); 53 54 bool toGLSL(const Program& program, SkString* out); 55 56 void error(Position position, SkString msg) override; 57 58 SkString errorText(); 59 60 void writeErrorCount(); 61 errorCount()62 int errorCount() override { 63 return fErrorCount; 64 } 65 66 private: 67 void addDefinition(const Expression* lvalue, std::unique_ptr<Expression>* expr, 68 DefinitionMap* definitions); 69 70 void addDefinitions(const BasicBlock::Node& node, DefinitionMap* definitions); 71 72 void scanCFG(CFG* cfg, BlockId block, std::set<BlockId>* workList); 73 74 void scanCFG(const FunctionDefinition& f); 75 76 void internalConvertProgram(SkString text, 77 Modifiers::Flag* defaultPrecision, 78 std::vector<std::unique_ptr<ProgramElement>>* result); 79 80 std::shared_ptr<SymbolTable> fTypes; 81 IRGenerator* fIRGenerator; 82 SkString fSkiaVertText; // FIXME store parsed version instead 83 84 Context fContext; 85 int fErrorCount; 86 SkString fErrorText; 87 }; 88 89 } // namespace 90 91 #endif 92