summaryrefslogtreecommitdiffstats
path: root/gfx/skia/skia/src/sksl/transform/SkSLTransform.h
diff options
context:
space:
mode:
Diffstat (limited to 'gfx/skia/skia/src/sksl/transform/SkSLTransform.h')
-rw-r--r--gfx/skia/skia/src/sksl/transform/SkSLTransform.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/sksl/transform/SkSLTransform.h b/gfx/skia/skia/src/sksl/transform/SkSLTransform.h
new file mode 100644
index 0000000000..e051ec8086
--- /dev/null
+++ b/gfx/skia/skia/src/sksl/transform/SkSLTransform.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2021 Google LLC.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SKSL_TRANSFORM
+#define SKSL_TRANSFORM
+
+#include "include/core/SkSpan.h"
+#include <memory>
+#include <vector>
+
+namespace SkSL {
+
+class Context;
+class Expression;
+class IndexExpression;
+struct Modifiers;
+struct Module;
+struct Program;
+class ProgramElement;
+class ProgramUsage;
+class Statement;
+class Variable;
+enum class ProgramKind : int8_t;
+
+namespace Transform {
+
+/**
+ * Checks to see if it would be safe to add `const` to the modifiers of a variable. If so, returns
+ * the modifiers with `const` applied; if not, returns the existing modifiers as-is. Adding `const`
+ * allows the inliner to fold away more values and generate tighter code.
+ */
+const Modifiers* AddConstToVarModifiers(const Context& context,
+ const Variable& var,
+ const Expression* initialValue,
+ const ProgramUsage* usage);
+
+/**
+ * Rewrites indexed swizzles of the form `myVec.zyx[i]` by replacing the swizzle with a lookup into
+ * a constant vector. e.g., the above expression would be rewritten as `myVec[vec3(2, 1, 0)[i]]`.
+ * This roughly matches glslang's handling of the code.
+ */
+std::unique_ptr<Expression> RewriteIndexedSwizzle(const Context& context,
+ const IndexExpression& swizzle);
+
+/**
+ * Copies built-in functions from modules into the program. Relies on ProgramUsage to determine
+ * which functions are necessary.
+ */
+void FindAndDeclareBuiltinFunctions(Program& program);
+
+/**
+ * Scans the finished program for built-in variables like `sk_FragColor` and adds them to the
+ * program's shared elements.
+ */
+void FindAndDeclareBuiltinVariables(Program& program);
+
+/**
+ * Eliminates statements in a block which cannot be reached; for example, a statement
+ * immediately after a `return` or `continue` can safely be eliminated.
+ */
+void EliminateUnreachableCode(Module& module, ProgramUsage* usage);
+void EliminateUnreachableCode(Program& program);
+
+/**
+ * Eliminates empty statements in a module (Nops, or blocks holding only Nops). Not implemented for
+ * Programs because Nops are harmless, but they waste space in long-lived module IR.
+ */
+void EliminateEmptyStatements(Module& module);
+
+/**
+ * Eliminates functions in a program which are never called. Returns true if any changes were made.
+ */
+bool EliminateDeadFunctions(const Context& context, Module& module, ProgramUsage* usage);
+bool EliminateDeadFunctions(Program& program);
+
+/**
+ * Eliminates variables in a program which are never read or written (past their initializer).
+ * Preserves side effects from initializers, if any. Returns true if any changes were made.
+ */
+bool EliminateDeadLocalVariables(const Context& context,
+ Module& module,
+ ProgramUsage* usage);
+bool EliminateDeadLocalVariables(Program& program);
+bool EliminateDeadGlobalVariables(const Context& context,
+ Module& module,
+ ProgramUsage* usage,
+ bool onlyPrivateGlobals);
+bool EliminateDeadGlobalVariables(Program& program);
+
+/** Renames private functions and function-local variables to minimize code size. */
+void RenamePrivateSymbols(Context& context, Module& module, ProgramUsage* usage, ProgramKind kind);
+
+/** Replaces constant variables in a program with their equivalent values. */
+void ReplaceConstVarsWithLiterals(Module& module, ProgramUsage* usage);
+
+} // namespace Transform
+} // namespace SkSL
+
+#endif