| /* |
| * Copyright 2020 Google LLC |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SKSL_DSL_VAR |
| #define SKSL_DSL_VAR |
| |
| #include "include/private/SkSLStatement.h" |
| #include "include/sksl/DSLExpression.h" |
| #include "include/sksl/DSLModifiers.h" |
| #include "include/sksl/DSLType.h" |
| #include "include/sksl/SkSLPosition.h" |
| |
| #include <cstdint> |
| #include <memory> |
| #include <string_view> |
| #include <utility> |
| |
| namespace SkSL { |
| |
| class Expression; |
| class ExpressionArray; |
| class IRGenerator; |
| class SPIRVCodeGenerator; |
| class Variable; |
| enum class VariableStorage : int8_t; |
| |
| namespace dsl { |
| |
| class DSLVarBase { |
| public: |
| /** |
| * Constructs a new variable with the specified type and name. |
| */ |
| DSLVarBase(VariableStorage storage, DSLType type, std::string_view name, |
| DSLExpression initialValue, Position pos, Position namePos); |
| |
| DSLVarBase(VariableStorage storage, const DSLModifiers& modifiers, DSLType type, |
| std::string_view name, DSLExpression initialValue, Position pos, Position namePos); |
| |
| DSLVarBase(DSLVarBase&&) = default; |
| |
| std::string_view name() const { |
| return fName; |
| } |
| |
| const DSLModifiers& modifiers() const { |
| return fModifiers; |
| } |
| |
| VariableStorage storage() const { |
| return fStorage; |
| } |
| |
| DSLExpression x() { |
| return DSLExpression(*this).x(); |
| } |
| |
| DSLExpression y() { |
| return DSLExpression(*this).y(); |
| } |
| |
| DSLExpression z() { |
| return DSLExpression(*this).z(); |
| } |
| |
| DSLExpression w() { |
| return DSLExpression(*this).w(); |
| } |
| |
| DSLExpression r() { |
| return DSLExpression(*this).r(); |
| } |
| |
| DSLExpression g() { |
| return DSLExpression(*this).g(); |
| } |
| |
| DSLExpression b() { |
| return DSLExpression(*this).b(); |
| } |
| |
| DSLExpression a() { |
| return DSLExpression(*this).a(); |
| } |
| |
| DSLExpression field(std::string_view name) { |
| return DSLExpression(*this).field(name); |
| } |
| |
| DSLExpression operator[](DSLExpression&& index); |
| |
| DSLExpression operator++() { |
| return ++DSLExpression(*this); |
| } |
| |
| DSLExpression operator++(int) { |
| return DSLExpression(*this)++; |
| } |
| |
| DSLExpression operator--() { |
| return --DSLExpression(*this); |
| } |
| |
| DSLExpression operator--(int) { |
| return DSLExpression(*this)--; |
| } |
| |
| template <class T> DSLExpression assign(T&& param) { |
| return this->assignExpression(DSLExpression(std::forward<T>(param))); |
| } |
| |
| protected: |
| /** |
| * Creates an empty, unpopulated var. Can be replaced with a real var later via `swap`. |
| */ |
| DSLVarBase(VariableStorage storage) : fType(kVoid_Type), fStorage(storage) {} |
| |
| DSLExpression assignExpression(DSLExpression other); |
| |
| void swap(DSLVarBase& other); |
| |
| DSLModifiers fModifiers; |
| // We only need to keep track of the type here so that we can create the SkSL::Variable. For |
| // predefined variables this field is unnecessary, so we don't bother tracking it and just set |
| // it to kVoid; in other words, you shouldn't generally be relying on this field to be correct. |
| // If you need to determine the variable's type, look at DSLWriter::Var(...)->type() instead. |
| DSLType fType; |
| std::unique_ptr<SkSL::Statement> fDeclaration; |
| const SkSL::Variable* fVar = nullptr; |
| Position fNamePosition; |
| std::string_view fName; |
| DSLExpression fInitialValue; |
| Position fPosition; |
| VariableStorage fStorage; |
| bool fInitialized = false; |
| |
| friend class DSLCore; |
| friend class DSLExpression; |
| friend class DSLFunction; |
| friend class DSLWriter; |
| friend class ::SkSL::IRGenerator; |
| friend class ::SkSL::SPIRVCodeGenerator; |
| }; |
| |
| /** |
| * A local variable. |
| */ |
| class DSLVar : public DSLVarBase { |
| public: |
| DSLVar(); |
| |
| DSLVar(DSLType type, std::string_view name, DSLExpression initialValue = DSLExpression(), |
| Position pos = {}, Position namePos = {}); |
| |
| DSLVar(const DSLModifiers& modifiers, DSLType type, std::string_view name, |
| DSLExpression initialValue = DSLExpression(), Position pos = {}, Position namePos = {}); |
| |
| DSLVar(DSLVar&&) = default; |
| |
| void swap(DSLVar& other); |
| |
| private: |
| using INHERITED = DSLVarBase; |
| }; |
| |
| /** |
| * A global variable. |
| */ |
| class DSLGlobalVar : public DSLVarBase { |
| public: |
| DSLGlobalVar(); |
| |
| DSLGlobalVar(DSLType type, std::string_view name, DSLExpression initialValue = DSLExpression(), |
| Position pos = {}, Position namePos = {}); |
| |
| DSLGlobalVar(const DSLModifiers& modifiers, DSLType type, std::string_view name, |
| DSLExpression initialValue = DSLExpression(), |
| Position pos = {}, Position namePos = {}); |
| |
| DSLGlobalVar(const char* name); |
| |
| DSLGlobalVar(DSLGlobalVar&&) = default; |
| |
| void swap(DSLGlobalVar& other); |
| |
| /** |
| * Implements the following method calls: |
| * half4 shader::eval(float2 coords); |
| * half4 colorFilter::eval(half4 input); |
| */ |
| DSLExpression eval(DSLExpression x, Position pos = {}); |
| |
| /** |
| * Implements the following method call: |
| * half4 blender::eval(half4 src, half4 dst); |
| */ |
| DSLExpression eval(DSLExpression x, DSLExpression y, Position pos = {}); |
| |
| private: |
| DSLExpression eval(ExpressionArray args, Position pos); |
| |
| std::unique_ptr<SkSL::Expression> methodCall(std::string_view methodName, Position pos); |
| |
| using INHERITED = DSLVarBase; |
| }; |
| |
| /** |
| * A function parameter. |
| */ |
| class DSLParameter : public DSLVarBase { |
| public: |
| DSLParameter(); |
| |
| DSLParameter(DSLType type, std::string_view name, Position pos = {}, Position namePos = {}); |
| |
| DSLParameter(const DSLModifiers& modifiers, DSLType type, std::string_view name, |
| Position pos = {}, Position namePos = {}); |
| |
| DSLParameter(DSLParameter&&) = default; |
| |
| void swap(DSLParameter& other); |
| |
| private: |
| using INHERITED = DSLVarBase; |
| }; |
| |
| } // namespace dsl |
| |
| } // namespace SkSL |
| |
| |
| #endif |