Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
SkSLIRHelpers.h
Go to the documentation of this file.
1/*
2 * Copyright 2023 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SKSL_IRHELPERS
9#define SKSL_IRHELPERS
10
27
28#include <memory>
29#include <utility>
30
31namespace SkSL {
32
33class Statement;
34class Variable;
35
36struct IRHelpers {
37 IRHelpers(const Context& c) : fContext(c) {}
38
39 // Note that this class doesn't adhere to the typical Skia style rules; function names are
40 // capitalized, and we don't use `this->` prefixes. This helps nested expressions flow more
41 // naturally.
42
43 std::unique_ptr<Expression> Ref(const Variable* var) const {
44 return VariableReference::Make(Position(), var);
45 }
46
47 std::unique_ptr<Expression> Field(const Variable* var, int idx) const {
48 return FieldAccess::Make(fContext, Position(), Ref(var), idx,
49 FieldAccess::OwnerKind::kAnonymousInterfaceBlock);
50 }
51
52 std::unique_ptr<Expression> Swizzle(std::unique_ptr<Expression> base, ComponentArray c) const {
53 Position pos = base->fPosition;
54 return Swizzle::Make(fContext, pos, std::move(base), std::move(c));
55 }
56
57 std::unique_ptr<Expression> Index(std::unique_ptr<Expression> base,
58 std::unique_ptr<Expression> idx) const {
59 Position pos = base->fPosition.rangeThrough(idx->fPosition);
60 return IndexExpression::Make(fContext, pos, std::move(base), std::move(idx));
61 }
62
63 std::unique_ptr<Expression> Binary(std::unique_ptr<Expression> l,
64 Operator op,
65 std::unique_ptr<Expression> r) const {
66 Position pos = l->fPosition.rangeThrough(r->fPosition);
67 return BinaryExpression::Make(fContext, pos, std::move(l), op, std::move(r));
68 }
69
70 std::unique_ptr<Expression> Mul(std::unique_ptr<Expression> l,
71 std::unique_ptr<Expression> r) const {
72 return Binary(std::move(l), OperatorKind::STAR, std::move(r));
73 }
74
75 std::unique_ptr<Expression> Add(std::unique_ptr<Expression> l,
76 std::unique_ptr<Expression> r) const {
77 return Binary(std::move(l), OperatorKind::PLUS, std::move(r));
78 }
79
80 std::unique_ptr<Expression> Float(float value) const {
82 }
83
84 std::unique_ptr<Expression> Int(int value) const {
86 }
87
88 std::unique_ptr<Expression> CtorXYZW(std::unique_ptr<Expression> xy,
89 std::unique_ptr<Expression> z,
90 std::unique_ptr<Expression> w) const {
92 args.push_back(std::move(xy));
93 args.push_back(std::move(z));
94 args.push_back(std::move(w));
96 std::move(args));
97 }
98
99 std::unique_ptr<Statement> Assign(std::unique_ptr<Expression> l,
100 std::unique_ptr<Expression> r) const {
103 Binary(std::move(l), OperatorKind::EQ, std::move(r)));
104 }
105
107};
108
109} // namespace SkSL
110
111#endif
SkPoint pos
#define SkAssertResult(cond)
Definition SkAssert.h:123
static std::unique_ptr< Expression > Make(const Context &context, Position pos, std::unique_ptr< Expression > left, Operator op, std::unique_ptr< Expression > right)
const std::unique_ptr< Type > fInt
const std::unique_ptr< Type > fFloat4
const std::unique_ptr< Type > fFloat
static std::unique_ptr< Expression > Make(const Context &context, Position pos, const Type &type, ExpressionArray args)
const BuiltinTypes & fTypes
Definition SkSLContext.h:30
static std::unique_ptr< Statement > Make(const Context &context, std::unique_ptr< Expression > expr)
static std::unique_ptr< Expression > Make(const Context &context, Position pos, std::unique_ptr< Expression > base, int fieldIndex, OwnerKind ownerKind=OwnerKind::kDefault)
static std::unique_ptr< Expression > Make(const Context &context, Position pos, std::unique_ptr< Expression > base, std::unique_ptr< Expression > index)
static std::unique_ptr< Literal > MakeInt(const Context &context, Position pos, SKSL_INT value)
Definition SkSLLiteral.h:54
static std::unique_ptr< Literal > MakeFloat(const Context &context, Position pos, float value)
Definition SkSLLiteral.h:43
static std::unique_ptr< Expression > Make(const Context &context, Position pos, std::unique_ptr< Expression > expr, ComponentArray inComponents)
static std::unique_ptr< Expression > Make(Position pos, const Variable *variable, RefKind refKind=RefKind::kRead)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
uint8_t value
bool UpdateVariableRefKind(Expression *expr, VariableRefKind kind, ErrorReporter *errors=nullptr)
SkScalar w
std::unique_ptr< Expression > Ref(const Variable *var) const
std::unique_ptr< Expression > Swizzle(std::unique_ptr< Expression > base, ComponentArray c) const
std::unique_ptr< Expression > Add(std::unique_ptr< Expression > l, std::unique_ptr< Expression > r) const
IRHelpers(const Context &c)
std::unique_ptr< Expression > Field(const Variable *var, int idx) const
const Context & fContext
std::unique_ptr< Expression > Mul(std::unique_ptr< Expression > l, std::unique_ptr< Expression > r) const
std::unique_ptr< Expression > Index(std::unique_ptr< Expression > base, std::unique_ptr< Expression > idx) const
std::unique_ptr< Expression > CtorXYZW(std::unique_ptr< Expression > xy, std::unique_ptr< Expression > z, std::unique_ptr< Expression > w) const
std::unique_ptr< Expression > Float(float value) const
std::unique_ptr< Expression > Int(int value) const
std::unique_ptr< Expression > Binary(std::unique_ptr< Expression > l, Operator op, std::unique_ptr< Expression > r) const
std::unique_ptr< Statement > Assign(std::unique_ptr< Expression > l, std::unique_ptr< Expression > r) const