diff --git a/include/sksl/BUILD.bazel b/include/sksl/BUILD.bazel index c6cde3720d..b9677997a3 100644 --- a/include/sksl/BUILD.bazel +++ b/include/sksl/BUILD.bazel @@ -133,6 +133,7 @@ generated_cc_atom( ":DSLModifiers_hdr", ":DSLType_hdr", ":SkSLPosition_hdr", + "//include/private:SkSLStatement_hdr", ], ) diff --git a/include/sksl/DSLVar.h b/include/sksl/DSLVar.h index c3a9bb6edc..eb833a2740 100644 --- a/include/sksl/DSLVar.h +++ b/include/sksl/DSLVar.h @@ -8,6 +8,7 @@ #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" @@ -24,7 +25,6 @@ class Expression; class ExpressionArray; class IRGenerator; class SPIRVCodeGenerator; -class Statement; class Variable; enum class VariableStorage : int8_t; @@ -32,23 +32,16 @@ namespace dsl { class DSLVarBase { public: - /** - * Creates an empty, unpopulated var. Can be replaced with a real var later via `swap`. - */ - DSLVarBase() : fType(kVoid_Type) {} - /** * Constructs a new variable with the specified type and name. */ - DSLVarBase(DSLType type, std::string_view name, DSLExpression initialValue, Position pos, - Position namePos); - - DSLVarBase(const DSLModifiers& modifiers, DSLType type, std::string_view name, + DSLVarBase(VariableStorage storage, DSLType type, std::string_view name, DSLExpression initialValue, Position pos, Position namePos); - DSLVarBase(DSLVarBase&&) = default; + DSLVarBase(VariableStorage storage, const DSLModifiers& modifiers, DSLType type, + std::string_view name, DSLExpression initialValue, Position pos, Position namePos); - virtual ~DSLVarBase(); + DSLVarBase(DSLVarBase&&) = default; std::string_view name() const { return fName; @@ -58,7 +51,9 @@ public: return fModifiers; } - virtual VariableStorage storage() const = 0; + VariableStorage storage() const { + return fStorage; + } DSLExpression x() { return DSLExpression(*this, Position()).x(); @@ -119,6 +114,11 @@ public: } protected: + /** + * Creates an empty, unpopulated var. Can be replaced with a real var later via `swap`. + */ + DSLVarBase(VariableStorage storage) : fType(kVoid_Type), fStorage(storage) {} + DSLPossibleExpression assignExpression(DSLExpression other); void swap(DSLVarBase& other); @@ -134,8 +134,9 @@ protected: Position fNamePosition; std::string_view fName; DSLExpression fInitialValue; - bool fInitialized = false; Position fPosition; + VariableStorage fStorage; + bool fInitialized = false; friend class DSLCore; friend class DSLExpression; @@ -150,21 +151,16 @@ protected: */ class DSLVar : public DSLVarBase { public: - DSLVar() = default; + DSLVar(); - DSLVar(DSLType type, std::string_view name, - DSLExpression initialValue = DSLExpression(), - Position pos = {}, Position namePos = {}) - : INHERITED(type, name, std::move(initialValue), pos, namePos) {} + 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 = {}) - : INHERITED(modifiers, type, name, std::move(initialValue), pos, namePos) {} + DSLExpression initialValue = DSLExpression(), Position pos = {}, Position namePos = {}); DSLVar(DSLVar&&) = default; - VariableStorage storage() const override; - void swap(DSLVar& other); private: @@ -176,22 +172,19 @@ private: */ class DSLGlobalVar : public DSLVarBase { public: - DSLGlobalVar() = default; + DSLGlobalVar(); - DSLGlobalVar(DSLType type, std::string_view name, - DSLExpression initialValue = DSLExpression(), Position pos = {}, Position namePos = {}) - : INHERITED(type, name, std::move(initialValue), pos, namePos) {} + 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 = {}) - : INHERITED(modifiers, type, name, std::move(initialValue), pos, namePos) {} + DSLExpression initialValue = DSLExpression(), + Position pos = {}, Position namePos = {}); DSLGlobalVar(const char* name); DSLGlobalVar(DSLGlobalVar&&) = default; - VariableStorage storage() const override; - void swap(DSLGlobalVar& other); /** @@ -205,8 +198,7 @@ public: * Implements the following method call: * half4 blender::eval(half4 src, half4 dst); */ - DSLExpression eval(DSLExpression x, DSLExpression y, - Position pos = {}); + DSLExpression eval(DSLExpression x, DSLExpression y, Position pos = {}); private: DSLExpression eval(ExpressionArray args, Position pos); @@ -221,19 +213,15 @@ private: */ class DSLParameter : public DSLVarBase { public: - DSLParameter() = default; + DSLParameter(); - DSLParameter(DSLType type, std::string_view name, Position pos = {}, Position namePos = {}) - : INHERITED(type, name, DSLExpression(), pos, namePos) {} + 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 = {}) - : INHERITED(modifiers, type, name, DSLExpression(), pos, namePos) {} + Position pos = {}, Position namePos = {}); DSLParameter(DSLParameter&&) = default; - VariableStorage storage() const override; - void swap(DSLParameter& other); private: diff --git a/src/sksl/dsl/DSLVar.cpp b/src/sksl/dsl/DSLVar.cpp index dc546b4e0e..1d69290439 100644 --- a/src/sksl/dsl/DSLVar.cpp +++ b/src/sksl/dsl/DSLVar.cpp @@ -22,24 +22,31 @@ #include "src/sksl/ir/SkSLSymbolTable.h" #include "src/sksl/ir/SkSLVariable.h" +#include + namespace SkSL { namespace dsl { -DSLVarBase::DSLVarBase(DSLType type, std::string_view name, DSLExpression initialValue, - Position pos, Position namePos) - : DSLVarBase(DSLModifiers(), std::move(type), name, std::move(initialValue), pos, namePos) {} +/** + * DSLVarBase + */ -DSLVarBase::DSLVarBase(const DSLModifiers& modifiers, DSLType type, std::string_view name, +DSLVarBase::DSLVarBase(VariableStorage storage, DSLType type, std::string_view name, DSLExpression initialValue, Position pos, Position namePos) + : DSLVarBase(storage, DSLModifiers(), std::move(type), name, std::move(initialValue), + pos, namePos) {} + +DSLVarBase::DSLVarBase(VariableStorage storage, const DSLModifiers& modifiers, DSLType type, + std::string_view name, DSLExpression initialValue, Position pos, + Position namePos) : fModifiers(std::move(modifiers)) , fType(std::move(type)) , fNamePosition(namePos) , fName(name) , fInitialValue(std::move(initialValue)) - , fPosition(pos) {} - -DSLVarBase::~DSLVarBase() {} + , fPosition(pos) + , fStorage(storage) {} void DSLVarBase::swap(DSLVarBase& other) { SkASSERT(this->storage() == other.storage()); @@ -54,16 +61,55 @@ void DSLVarBase::swap(DSLVarBase& other) { std::swap(fPosition, other.fPosition); } +DSLPossibleExpression DSLVarBase::operator[](DSLExpression&& index) { + return DSLExpression(*this, Position())[std::move(index)]; +} + +DSLPossibleExpression DSLVarBase::assignExpression(DSLExpression expr) { + return BinaryExpression::Convert(ThreadContext::Context(), Position(), + DSLExpression(*this, Position()).release(), SkSL::Operator::Kind::EQ, + expr.release()); +} + +/** + * DSLVar + */ + +DSLVar::DSLVar() : DSLVarBase(SkSL::VariableStorage::kLocal) {} + +DSLVar::DSLVar(DSLType type, std::string_view name, DSLExpression initialValue, + Position pos, Position namePos) + : INHERITED(SkSL::VariableStorage::kLocal, type, name, std::move(initialValue), + pos, namePos) {} + +DSLVar::DSLVar(const DSLModifiers& modifiers, DSLType type, std::string_view name, + DSLExpression initialValue, Position pos, Position namePos) + : INHERITED(SkSL::VariableStorage::kLocal, modifiers, type, name, std::move(initialValue), + pos, namePos) {} + void DSLVar::swap(DSLVar& other) { INHERITED::swap(other); } -VariableStorage DSLVar::storage() const { - return VariableStorage::kLocal; -} +/** + * DSLGlobalVar + */ + +DSLGlobalVar::DSLGlobalVar() : DSLVarBase(SkSL::VariableStorage::kGlobal) {} + +DSLGlobalVar::DSLGlobalVar(DSLType type, std::string_view name, DSLExpression initialValue, + Position pos, Position namePos) + : INHERITED(SkSL::VariableStorage::kGlobal, type, name, std::move(initialValue), + pos, namePos) {} + +DSLGlobalVar::DSLGlobalVar(const DSLModifiers& modifiers, DSLType type, std::string_view name, + DSLExpression initialValue, Position pos, Position namePos) + : INHERITED(SkSL::VariableStorage::kGlobal, modifiers, type, name, std::move(initialValue), + pos, namePos) {} DSLGlobalVar::DSLGlobalVar(const char* name) - : INHERITED(kVoid_Type, name, DSLExpression(), Position(), Position()) { + : INHERITED(SkSL::VariableStorage::kGlobal, kVoid_Type, name, DSLExpression(), + Position(), Position()) { fName = name; const SkSL::Symbol* result = (*ThreadContext::SymbolTable())[fName]; SkASSERTF(result, "could not find '%.*s' in symbol table", (int)fName.length(), fName.data()); @@ -75,29 +121,6 @@ void DSLGlobalVar::swap(DSLGlobalVar& other) { INHERITED::swap(other); } -VariableStorage DSLGlobalVar::storage() const { - return VariableStorage::kGlobal; -} - -void DSLParameter::swap(DSLParameter& other) { - INHERITED::swap(other); -} - -VariableStorage DSLParameter::storage() const { - return VariableStorage::kParameter; -} - - -DSLPossibleExpression DSLVarBase::operator[](DSLExpression&& index) { - return DSLExpression(*this, Position())[std::move(index)]; -} - -DSLPossibleExpression DSLVarBase::assignExpression(DSLExpression expr) { - return BinaryExpression::Convert(ThreadContext::Context(), Position(), - DSLExpression(*this, Position()).release(), SkSL::Operator::Kind::EQ, - expr.release()); -} - std::unique_ptr DSLGlobalVar::methodCall(std::string_view methodName, Position pos) { if (!this->fType.isEffectChild()) { @@ -130,6 +153,24 @@ DSLExpression DSLGlobalVar::eval(DSLExpression x, DSLExpression y, Position pos) return this->eval(std::move(converted), pos); } +/** + * DSLParameter + */ + +DSLParameter::DSLParameter() : DSLVarBase(SkSL::VariableStorage::kParameter) {} + +DSLParameter::DSLParameter(DSLType type, std::string_view name, Position pos, Position namePos) + : INHERITED(SkSL::VariableStorage::kParameter, type, name, DSLExpression(), pos, namePos) {} + +DSLParameter::DSLParameter(const DSLModifiers& modifiers, DSLType type, std::string_view name, + Position pos, Position namePos) + : INHERITED(SkSL::VariableStorage::kParameter, modifiers, type, name, DSLExpression(), + pos, namePos) {} + +void DSLParameter::swap(DSLParameter& other) { + INHERITED::swap(other); +} + } // namespace dsl } // namespace SkSL