| Index: src/sksl/SkSLGLSLCodeGenerator.h
|
| diff --git a/src/sksl/SkSLGLSLCodeGenerator.h b/src/sksl/SkSLGLSLCodeGenerator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..76512e06a6e3f5e7cc10c2ced6e0f53821d326d8
|
| --- /dev/null
|
| +++ b/src/sksl/SkSLGLSLCodeGenerator.h
|
| @@ -0,0 +1,177 @@
|
| +/*
|
| + * Copyright 2016 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + */
|
| +
|
| +#ifndef SKSL_GLSLCODEGENERATOR
|
| +#define SKSL_GLSLCODEGENERATOR
|
| +
|
| +#include <stack>
|
| +#include <tuple>
|
| +#include <unordered_map>
|
| +
|
| +#include "SkSLCodeGenerator.h"
|
| +#include "ir/SkSLBinaryExpression.h"
|
| +#include "ir/SkSLBoolLiteral.h"
|
| +#include "ir/SkSLConstructor.h"
|
| +#include "ir/SkSLDoStatement.h"
|
| +#include "ir/SkSLExtension.h"
|
| +#include "ir/SkSLFloatLiteral.h"
|
| +#include "ir/SkSLIfStatement.h"
|
| +#include "ir/SkSLIndexExpression.h"
|
| +#include "ir/SkSLInterfaceBlock.h"
|
| +#include "ir/SkSLIntLiteral.h"
|
| +#include "ir/SkSLFieldAccess.h"
|
| +#include "ir/SkSLForStatement.h"
|
| +#include "ir/SkSLFunctionCall.h"
|
| +#include "ir/SkSLFunctionDeclaration.h"
|
| +#include "ir/SkSLFunctionDefinition.h"
|
| +#include "ir/SkSLPrefixExpression.h"
|
| +#include "ir/SkSLPostfixExpression.h"
|
| +#include "ir/SkSLProgramElement.h"
|
| +#include "ir/SkSLReturnStatement.h"
|
| +#include "ir/SkSLStatement.h"
|
| +#include "ir/SkSLSwizzle.h"
|
| +#include "ir/SkSLTernaryExpression.h"
|
| +#include "ir/SkSLVarDeclaration.h"
|
| +#include "ir/SkSLVarDeclarationStatement.h"
|
| +#include "ir/SkSLVariableReference.h"
|
| +#include "ir/SkSLWhileStatement.h"
|
| +
|
| +namespace SkSL {
|
| +
|
| +#define kLast_Capability SpvCapabilityMultiViewport
|
| +
|
| +struct GLCaps {
|
| + int fVersion;
|
| + enum {
|
| + kGL_Standard,
|
| + kGLES_Standard
|
| + } fStandard;
|
| +};
|
| +
|
| +/**
|
| + * Converts a Program into GLSL code.
|
| + */
|
| +class GLSLCodeGenerator : public CodeGenerator {
|
| +public:
|
| + enum Precedence {
|
| + kParentheses_Precedence = 1,
|
| + kPostfix_Precedence = 2,
|
| + kPrefix_Precedence = 3,
|
| + kMultiplicative_Precedence = 4,
|
| + kAdditive_Precedence = 5,
|
| + kShift_Precedence = 6,
|
| + kRelational_Precedence = 7,
|
| + kEquality_Precedence = 8,
|
| + kBitwiseAnd_Precedence = 9,
|
| + kBitwiseXor_Precedence = 10,
|
| + kBitwiseOr_Precedence = 11,
|
| + kLogicalAnd_Precedence = 12,
|
| + kLogicalXor_Precedence = 13,
|
| + kLogicalOr_Precedence = 14,
|
| + kTernary_Precedence = 15,
|
| + kAssignment_Precedence = 16,
|
| + kSequence_Precedence = 17,
|
| + kTopLevel_Precedence = 18
|
| + };
|
| +
|
| + GLSLCodeGenerator(const Context* context, GLCaps caps)
|
| + : fContext(*context)
|
| + , fCaps(caps)
|
| + , fIndentation(0)
|
| + , fAtLineStart(true) {}
|
| +
|
| + void generateCode(const Program& program, std::ostream& out) override;
|
| +
|
| +private:
|
| + void write(const char* s);
|
| +
|
| + void writeLine();
|
| +
|
| + void writeLine(const char* s);
|
| +
|
| + void write(const std::string& s);
|
| +
|
| + void writeLine(const std::string& s);
|
| +
|
| + void writeType(const Type& type);
|
| +
|
| + void writeExtension(const Extension& ext);
|
| +
|
| + void writeInterfaceBlock(const InterfaceBlock& intf);
|
| +
|
| + void writeFunctionStart(const FunctionDeclaration& f);
|
| +
|
| + void writeFunctionDeclaration(const FunctionDeclaration& f);
|
| +
|
| + void writeFunction(const FunctionDefinition& f);
|
| +
|
| + void writeLayout(const Layout& layout);
|
| +
|
| + void writeModifiers(const Modifiers& modifiers);
|
| +
|
| + void writeGlobalVars(const VarDeclaration& vs);
|
| +
|
| + void writeVarDeclaration(const VarDeclaration& decl);
|
| +
|
| + void writeVariableReference(const VariableReference& ref);
|
| +
|
| + void writeExpression(const Expression& expr, Precedence parentPrecedence);
|
| +
|
| + void writeIntrinsicCall(const FunctionCall& c);
|
| +
|
| + void writeFunctionCall(const FunctionCall& c);
|
| +
|
| + void writeConstructor(const Constructor& c);
|
| +
|
| + void writeFieldAccess(const FieldAccess& f);
|
| +
|
| + void writeSwizzle(const Swizzle& swizzle);
|
| +
|
| + void writeBinaryExpression(const BinaryExpression& b, Precedence parentPrecedence);
|
| +
|
| + void writeTernaryExpression(const TernaryExpression& t, Precedence parentPrecedence);
|
| +
|
| + void writeIndexExpression(const IndexExpression& expr);
|
| +
|
| + void writePrefixExpression(const PrefixExpression& p, Precedence parentPrecedence);
|
| +
|
| + void writePostfixExpression(const PostfixExpression& p, Precedence parentPrecedence);
|
| +
|
| + void writeBoolLiteral(const BoolLiteral& b);
|
| +
|
| + void writeIntLiteral(const IntLiteral& i);
|
| +
|
| + void writeFloatLiteral(const FloatLiteral& f);
|
| +
|
| + void writeStatement(const Statement& s);
|
| +
|
| + void writeBlock(const Block& b);
|
| +
|
| + void writeIfStatement(const IfStatement& stmt);
|
| +
|
| + void writeForStatement(const ForStatement& f);
|
| +
|
| + void writeWhileStatement(const WhileStatement& w);
|
| +
|
| + void writeDoStatement(const DoStatement& d);
|
| +
|
| + void writeReturnStatement(const ReturnStatement& r);
|
| +
|
| + const Context& fContext;
|
| + const GLCaps fCaps;
|
| + std::ostream* fOut;
|
| + int fIndentation;
|
| + bool fAtLineStart;
|
| + // Keeps track of which struct types we have written. Given that we are unlikely to ever write
|
| + // more than one or two structs per shader, a simple linear search will be faster than anything
|
| + // fancier.
|
| + std::vector<const Type*> fWrittenStructs;
|
| +};
|
| +
|
| +}
|
| +
|
| +#endif
|
|
|