blob: 8371c6bb4706b29e21ecb5fbfaa057435fdaaebc [file] [log] [blame]
Ethan Nicholas95046142021-01-07 10:57:27 -05001/*
2 * Copyright 2020 Google LLC
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_DSLWRITER
9#define SKSL_DSLWRITER
10
Ethan Nicholasbffe80a2021-01-11 15:42:44 -050011#include "src/sksl/SkSLMangler.h"
Ethan Nicholas95046142021-01-07 10:57:27 -050012#include "src/sksl/dsl/DSLExpression.h"
13#include "src/sksl/ir/SkSLExpressionStatement.h"
14#include "src/sksl/ir/SkSLProgram.h"
15#include "src/sksl/ir/SkSLStatement.h"
16#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
17#include "src/gpu/glsl/GrGLSLFragmentProcessor.h"
18#endif // !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
19
20#include <stack>
21
22class AutoDSLContext;
23
24namespace SkSL {
25
26class Compiler;
27class Context;
28class IRGenerator;
29class SymbolTable;
30class Type;
31
32namespace dsl {
33
34class ErrorHandler;
35
36/**
37 * Thread-safe class that tracks per-thread state associated with DSL output. This class is for
38 * internal use only.
39 */
40class DSLWriter {
41public:
42 DSLWriter(SkSL::Compiler* compiler);
43
44 /**
45 * Returns the Compiler used by DSL operations in the current thread.
46 */
47 static SkSL::Compiler& Compiler() {
48 return *Instance().fCompiler;
49 }
50
51 /**
52 * Returns the IRGenerator used by DSL operations in the current thread.
53 */
54 static SkSL::IRGenerator& IRGenerator();
55
56 /**
57 * Returns the Context used by DSL operations in the current thread.
58 */
59 static const SkSL::Context& Context();
60
61 /**
62 * Returns the SymbolTable of the current thread's IRGenerator.
63 */
64 static const std::shared_ptr<SkSL::SymbolTable>& SymbolTable();
65
66 /**
Ethan Nicholasbffe80a2021-01-11 15:42:44 -050067 * Returns the final pointer to a pooled Modifiers object that should be used to represent the
68 * given modifiers.
69 */
70 static const SkSL::Modifiers* Modifiers(SkSL::Modifiers modifiers);
71
72 /**
Ethan Nicholasd6b26e52021-01-27 07:53:46 -050073 * Returns the SkSL variable corresponding to a DSLVar.
74 */
75 static const SkSL::Variable& Var(const DSLVar& var);
76
77 /**
Ethan Nicholasbffe80a2021-01-11 15:42:44 -050078 * Returns the (possibly mangled) final name that should be used for an entity with the given
79 * raw name.
80 */
81 static const char* Name(const char* name);
82
83 /**
Ethan Nicholas95046142021-01-07 10:57:27 -050084 * Reports an error if the argument is null. Returns its argument unmodified.
85 */
86 static std::unique_ptr<SkSL::Expression> Check(std::unique_ptr<SkSL::Expression> expr);
87
Ethan Nicholas92969f22021-01-13 10:38:59 -050088 static DSLExpression Coerce(std::unique_ptr<Expression> left, const SkSL::Type& type);
89
Ethan Nicholasb3d4e742021-01-08 11:42:25 -050090 static DSLExpression Construct(const SkSL::Type& type, std::vector<DSLExpression> rawArgs);
91
Ethan Nicholas92969f22021-01-13 10:38:59 -050092 static DSLExpression ConvertBinary(std::unique_ptr<Expression> left, Token::Kind op,
93 std::unique_ptr<Expression> right);
94
95 static DSLExpression ConvertIndex(std::unique_ptr<Expression> base,
96 std::unique_ptr<Expression> index);
97
98 static DSLExpression ConvertPostfix(std::unique_ptr<Expression> expr, Token::Kind op);
99
100 static DSLExpression ConvertPrefix(Token::Kind op, std::unique_ptr<Expression> expr);
101
Ethan Nicholas95046142021-01-07 10:57:27 -0500102 /**
103 * Sets the ErrorHandler associated with the current thread. This object will be notified when
104 * any DSL errors occur. With a null ErrorHandler (the default), any errors will be dumped to
105 * stderr and a fatal exception will be generated.
106 */
107 static void SetErrorHandler(ErrorHandler* errorHandler) {
108 Instance().fErrorHandler = errorHandler;
109 }
110
111 /**
112 * Notifies the current ErrorHandler that a DSL error has occurred. With a null ErrorHandler
113 * (the default), any errors will be dumped to stderr and a fatal exception will be generated.
114 */
115 static void ReportError(const char* msg);
116
Ethan Nicholasbffe80a2021-01-11 15:42:44 -0500117 /**
118 * Returns whether name mangling is enabled. This should always be enabled outside of tests.
119 */
120 static bool ManglingEnabled() {
121 return Instance().fMangle;
122 }
123
Ethan Nicholas95046142021-01-07 10:57:27 -0500124 static DSLWriter& Instance();
125
126 static void SetInstance(std::unique_ptr<DSLWriter> instance);
127
128private:
129 SkSL::Program::Settings fSettings;
130 SkSL::Compiler* fCompiler;
131 ErrorHandler* fErrorHandler = nullptr;
Ethan Nicholasbffe80a2021-01-11 15:42:44 -0500132 bool fMangle = true;
133 Mangler fMangler;
Ethan Nicholas95046142021-01-07 10:57:27 -0500134
135 friend class DSLCore;
136 friend class ::AutoDSLContext;
137};
138
139} // namespace dsl
140
141} // namespace SkSL
142
143#endif