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     bool writeSection(const char* name, const char* prefix = "");
31 
32     void writeHeader() override;
33 
34     bool usesPrecisionModifiers() const override;
35 
36     String getTypeName(const Type& type) override;
37 
38     void writeBinaryExpression(const BinaryExpression& b, Precedence parentPrecedence) override;
39 
40     void writeIndexExpression(const IndexExpression& i) override;
41 
42     void writeIntLiteral(const IntLiteral& i) override;
43 
44     void writeSwizzle(const Swizzle& swizzle) override;
45 
46     void writeVariableReference(const VariableReference& ref) override;
47 
48     String getSamplerHandle(const Variable& var);
49 
50     void writeIfStatement(const IfStatement& s) override;
51 
52     void writeSwitchStatement(const SwitchStatement& s) override;
53 
54     void writeFunctionCall(const FunctionCall& c) override;
55 
56     void writeFunction(const FunctionDefinition& f) override;
57 
58     void writeSetting(const Setting& s) override;
59 
60     void writeProgramElement(const ProgramElement& p) override;
61 
62     void addUniform(const Variable& var);
63 
64     // writes a printf escape that will be filled in at runtime by the given C++ expression string
65     void writeRuntimeValue(const Type& type, const Layout& layout, const String& cppCode);
66 
67     void writeVarInitializer(const Variable& var, const Expression& value) override;
68 
69     void writePrivateVars();
70 
71     void writePrivateVarValues();
72 
73     void writeCodeAppend(const String& code);
74 
75     bool writeEmitCode(std::vector<const Variable*>& uniforms);
76 
77     void writeSetData(std::vector<const Variable*>& uniforms);
78 
79     void writeGetKey();
80 
81     void writeClone();
82 
83     void writeTest();
84 
85     String fName;
86     String fFullName;
87     SectionAndParameterHelper fSectionAndParameterHelper;
88     String fExtraEmitCodeCode;
89     std::vector<String> fFormatArgs;
90     std::set<int> fWrittenTransformedCoords;
91     // if true, we are writing a C++ expression instead of a GLSL expression
92     bool fCPPMode = false;
93 
94     typedef GLSLCodeGenerator INHERITED;
95 };
96 
97 }
98 
99 #endif
100