Home | History | Annotate | Download | only in sksl
      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