diff options
Diffstat (limited to 'src/sksl/SkSLIRGenerator.h')
-rw-r--r-- | src/sksl/SkSLIRGenerator.h | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/src/sksl/SkSLIRGenerator.h b/src/sksl/SkSLIRGenerator.h index 29513d8d34..3078a9e8df 100644 --- a/src/sksl/SkSLIRGenerator.h +++ b/src/sksl/SkSLIRGenerator.h @@ -27,6 +27,7 @@ #include "ast/SkSLASTModifiersDeclaration.h" #include "ast/SkSLASTPrefixExpression.h" #include "ast/SkSLASTReturnStatement.h" +#include "ast/SkSLASTSection.h" #include "ast/SkSLASTStatement.h" #include "ast/SkSLASTSuffixExpression.h" #include "ast/SkSLASTSwitchStatement.h" @@ -42,6 +43,7 @@ #include "ir/SkSLModifiers.h" #include "ir/SkSLModifiersDeclaration.h" #include "ir/SkSLProgram.h" +#include "ir/SkSLSection.h" #include "ir/SkSLSymbolTable.h" #include "ir/SkSLStatement.h" #include "ir/SkSLType.h" @@ -50,28 +52,6 @@ namespace SkSL { -struct CapValue { - CapValue() - : fKind(kInt_Kind) - , fValue(-1) { - ASSERT(false); - } - - CapValue(bool b) - : fKind(kBool_Kind) - , fValue(b) {} - - CapValue(int i) - : fKind(kInt_Kind) - , fValue(i) {} - - enum { - kBool_Kind, - kInt_Kind, - } fKind; - int fValue; -}; - /** * Performs semantic analysis on an abstract syntax tree (AST) and produces the corresponding * (unoptimized) intermediate representation (IR). @@ -95,6 +75,7 @@ public: Token::Kind op, const Expression& right) const; Program::Inputs fInputs; + const Program::Settings* fSettings; const Context& fContext; private: @@ -160,7 +141,9 @@ private: Modifiers convertModifiers(const Modifiers& m); std::unique_ptr<Expression> convertPrefixExpression(const ASTPrefixExpression& expression); std::unique_ptr<Statement> convertReturn(const ASTReturnStatement& r); + std::unique_ptr<Section> convertSection(const ASTSection& e); std::unique_ptr<Expression> getCap(Position position, String name); + std::unique_ptr<Expression> getArg(Position position, String name); std::unique_ptr<Expression> convertSuffixExpression(const ASTSuffixExpression& expression); std::unique_ptr<Expression> convertField(std::unique_ptr<Expression> base, const String& field); @@ -173,16 +156,26 @@ private: std::unique_ptr<Block> main, std::vector<std::unique_ptr<ProgramElement>>* out); + /** + * Wraps an expression in code that applies a colorspace transformation to it. This is used + * to implement texture(sampler, coord, colorSpaceXForm). + */ + std::unique_ptr<Expression> applyColorSpace(std::unique_ptr<Expression> texture, + const Variable* xform); void fixRectSampling(std::vector<std::unique_ptr<Expression>>& arguments); void checkValid(const Expression& expr); void markWrittenTo(const Expression& expr, bool readWrite); const FunctionDeclaration* fCurrentFunction; - const Program::Settings* fSettings; - std::unordered_map<String, CapValue> fCapsMap; + std::unordered_map<String, Program::Settings::Value> fCapsMap; + std::shared_ptr<SymbolTable> fRootSymbolTable; std::shared_ptr<SymbolTable> fSymbolTable; + // holds extra temp variable declarations needed for the current function + std::vector<std::unique_ptr<Statement>> fExtraVars; int fLoopLevel; int fSwitchLevel; + // count of temporary variables we have created + int fTmpCount; ErrorReporter& fErrors; int fInvocations; |