1762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas/*
2762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * Copyright 2017 Google Inc.
3762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas *
4762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * Use of this source code is governed by a BSD-style license that can be
5762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas * found in the LICENSE file.
6762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas */
7762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
8762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#ifndef SKSL_CPPCODEGENERATOR
9762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#define SKSL_CPPCODEGENERATOR
10762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
11762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#include "SkSLGLSLCodeGenerator.h"
12762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#include "SkSLSectionAndParameterHelper.h"
13762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
14762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#include <set>
15762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
16762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholasnamespace SkSL {
17762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
18762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholasclass CPPCodeGenerator : public GLSLCodeGenerator {
19762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholaspublic:
20762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    CPPCodeGenerator(const Context* context, const Program* program, ErrorReporter* errors,
21762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas                     String name, OutputStream* out);
22762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
23762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    bool generateCode() override;
24762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
25762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholasprivate:
26762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writef(const char* s, va_list va) SKSL_PRINTF_LIKE(2, 0);
27762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
28762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writef(const char* s, ...) SKSL_PRINTF_LIKE(2, 3);
29762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
30f57c0d67611186ba74179b53b421e64b63a579c7Ethan Nicholas    bool writeSection(const char* name, const char* prefix = "");
31762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
32762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeHeader() override;
33762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
34f7b8820dc813d1eb0b6b43fe4581dded0da38cafEthan Nicholas    bool usesPrecisionModifiers() const override;
35762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
36f7b8820dc813d1eb0b6b43fe4581dded0da38cafEthan Nicholas    String getTypeName(const Type& type) override;
375af9ea399d5e0344cc4b7da4e97b5dc5b3c74f64Ethan Nicholas
38762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeBinaryExpression(const BinaryExpression& b, Precedence parentPrecedence) override;
39762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
40762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeIndexExpression(const IndexExpression& i) override;
41762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
42dcba08e891f1766b047cf0dbe8bbd275d9f55d2bEthan Nicholas    void writeIntLiteral(const IntLiteral& i) override;
43dcba08e891f1766b047cf0dbe8bbd275d9f55d2bEthan Nicholas
44823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas    void writeSwizzle(const Swizzle& swizzle) override;
45823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas
46762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeVariableReference(const VariableReference& ref) override;
47762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
48ceb4d48ef4839aab9d99d0200dcfe403ccd0cdf3Ethan Nicholas    String getSamplerHandle(const Variable& var);
49ceb4d48ef4839aab9d99d0200dcfe403ccd0cdf3Ethan Nicholas
506e1cbc012b10e99d9caed19eef43939778d1d8ffEthan Nicholas    void writeIfStatement(const IfStatement& s) override;
516e1cbc012b10e99d9caed19eef43939778d1d8ffEthan Nicholas
526e1cbc012b10e99d9caed19eef43939778d1d8ffEthan Nicholas    void writeSwitchStatement(const SwitchStatement& s) override;
536e1cbc012b10e99d9caed19eef43939778d1d8ffEthan Nicholas
54ceb4d48ef4839aab9d99d0200dcfe403ccd0cdf3Ethan Nicholas    void writeFunctionCall(const FunctionCall& c) override;
55ceb4d48ef4839aab9d99d0200dcfe403ccd0cdf3Ethan Nicholas
56762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeFunction(const FunctionDefinition& f) override;
57762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
58762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeSetting(const Setting& s) override;
59762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
60762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeProgramElement(const ProgramElement& p) override;
61762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
62762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void addUniform(const Variable& var);
63762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
64762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    // writes a printf escape that will be filled in at runtime by the given C++ expression string
65d608c09ac5d862568962d63e62e693d22c58f95cEthan Nicholas    void writeRuntimeValue(const Type& type, const Layout& layout, const String& cppCode);
66762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
67762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeVarInitializer(const Variable& var, const Expression& value) override;
68762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
69762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writePrivateVars();
70762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
71762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writePrivateVarValues();
72762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
735b6e6277ad8768e37199b677eea361ca51654477Ethan Nicholas    void writeCodeAppend(const String& code);
745b6e6277ad8768e37199b677eea361ca51654477Ethan Nicholas
75762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    bool writeEmitCode(std::vector<const Variable*>& uniforms);
76762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
77762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeSetData(std::vector<const Variable*>& uniforms);
78762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
79762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeGetKey();
80762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
81f57c0d67611186ba74179b53b421e64b63a579c7Ethan Nicholas    void writeClone();
82f57c0d67611186ba74179b53b421e64b63a579c7Ethan Nicholas
83762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    void writeTest();
84762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
85762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    String fName;
86762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    String fFullName;
87762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    SectionAndParameterHelper fSectionAndParameterHelper;
88762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    String fExtraEmitCodeCode;
89762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    std::vector<String> fFormatArgs;
90762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    std::set<int> fWrittenTransformedCoords;
91823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas    // if true, we are writing a C++ expression instead of a GLSL expression
92823994624aa5e805e16833ecd3d748fc769a164dEthan Nicholas    bool fCPPMode = false;
93762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
94762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas    typedef GLSLCodeGenerator INHERITED;
95762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas};
96762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
97762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas}
98762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas
99762466e9fe0478bcf11fba532998e81e33b3069eEthan Nicholas#endif
100