• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 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_CPPCODEGENERATOR
9 #define SKSL_CPPCODEGENERATOR
10 
11 #include "SkSLGLSLCodeGenerator.h"
12 #include "SkSLSectionAndParameterHelper.h"
13 
14 #include <set>
15 
16 namespace SkSL {
17 
18 class CPPCodeGenerator : public GLSLCodeGenerator {
19 public:
20     CPPCodeGenerator(const Context* context, const Program* program, ErrorReporter* errors,
21                      String name, OutputStream* out);
22 
23     bool generateCode() override;
24 
25 private:
26     void writef(const char* s, va_list va) SKSL_PRINTF_LIKE(2, 0);
27 
28     void writef(const char* s, ...) SKSL_PRINTF_LIKE(2, 3);
29 
30     void writeSection(const char* name, const char* prefix = "");
31 
32     void writeHeader() override;
33 
34     void writePrecisionModifier() override;
35 
36     void writeBinaryExpression(const BinaryExpression& b, Precedence parentPrecedence) override;
37 
38     void writeIndexExpression(const IndexExpression& i) override;
39 
40     void writeVariableReference(const VariableReference& ref) override;
41 
42     String getSamplerHandle(const Variable& var);
43 
44     void writeIfStatement(const IfStatement& s) override;
45 
46     void writeSwitchStatement(const SwitchStatement& s) override;
47 
48     void writeFunctionCall(const FunctionCall& c) override;
49 
50     void writeFunction(const FunctionDefinition& f) override;
51 
52     void writeSetting(const Setting& s) override;
53 
54     void writeProgramElement(const ProgramElement& p) override;
55 
56     void addUniform(const Variable& var);
57 
58     // writes a printf escape that will be filled in at runtime by the given C++ expression string
59     void writeRuntimeValue(const Type& type, const String& cppCode);
60 
61     void writeVarInitializer(const Variable& var, const Expression& value) override;
62 
63     void writePrivateVars();
64 
65     void writePrivateVarValues();
66 
67     bool writeEmitCode(std::vector<const Variable*>& uniforms);
68 
69     void writeSetData(std::vector<const Variable*>& uniforms);
70 
71     void writeGetKey();
72 
73     void writeTest();
74 
75     String fName;
76     String fFullName;
77     SectionAndParameterHelper fSectionAndParameterHelper;
78     String fExtraEmitCodeCode;
79     std::vector<String> fFormatArgs;
80     std::set<int> fWrittenTransformedCoords;
81     bool fNeedColorSpaceHelper = false;
82 
83     typedef GLSLCodeGenerator INHERITED;
84 };
85 
86 }
87 
88 #endif
89