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