summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/include/sksl/DSLVar.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/include/sksl/DSLVar.h')
-rw-r--r--gfx/skia/skia/include/sksl/DSLVar.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/gfx/skia/skia/include/sksl/DSLVar.h b/gfx/skia/skia/include/sksl/DSLVar.h
new file mode 100644
index 0000000000..f052a525e3
--- /dev/null
+++ b/gfx/skia/skia/include/sksl/DSLVar.h
@@ -0,0 +1,231 @@
+/*
+ * 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 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;
+ SkSL::Variable* fVar = nullptr;
+ Position fNamePosition;
+ std::string_view fName;
+ DSLExpression fInitialValue;
+ Position fPosition;
+ VariableStorage fStorage;
+ bool fInitialized = false;
+
+ friend class DSLCore;
+ friend class DSLFunction;
+ friend class DSLWriter;
+};
+
+/**
+ * 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