ec02c5ac521813ddd0ec3f203bff2ac147d9bb22
[platform/upstream/libSkiaSharp.git] / src / sksl / SkSLCompiler.h
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
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