SkSL DSL code is now automatically incorporated into the output
Previously, a manual codeAppend call was required to add a statement. We
now automatically invoke codeAppend when a statement is destroyed.
Change-Id: I09eaf230b1d58242c3ff6abb85e970ed5ed3bce2
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/371141
Auto-Submit: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/gm/dsl_processor_test.cpp b/gm/dsl_processor_test.cpp
index 13264a8..dbe9f3f 100644
--- a/gm/dsl_processor_test.cpp
+++ b/gm/dsl_processor_test.cpp
@@ -35,9 +35,8 @@
Var blueAlpha(kUniform_Modifier, kHalf2);
fBlueAlphaUniform = VarUniformHandle(blueAlpha);
Var coords(kFloat4);
- args.fFragBuilder->codeAppend(Declare(coords, sk_FragCoord()));
- args.fFragBuilder->codeAppend(Return(Half4(Swizzle(coords, X, Y) / 100,
- blueAlpha)));
+ Declare(coords, sk_FragCoord());
+ Return(Half4(Swizzle(coords, X, Y) / 100, blueAlpha));
EndFragmentProcessor();
}
diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.cpp b/src/gpu/glsl/GrGLSLShaderBuilder.cpp
index 76e995c..6421c25 100644
--- a/src/gpu/glsl/GrGLSLShaderBuilder.cpp
+++ b/src/gpu/glsl/GrGLSLShaderBuilder.cpp
@@ -89,12 +89,10 @@
this->functions().append(";\n");
}
-void GrGLSLShaderBuilder::codeAppend(SkSL::dsl::Statement stmt) {
+void GrGLSLShaderBuilder::codeAppend(std::unique_ptr<SkSL::Statement> stmt) {
SkASSERT(SkSL::dsl::DSLWriter::CurrentProcessor());
- std::unique_ptr<SkSL::Statement> skslStmt = stmt.release();
- if (skslStmt) {
- this->codeAppend(skslStmt->description().c_str());
- }
+ SkASSERT(stmt);
+ this->codeAppend(stmt->description().c_str());
}
static inline void append_texture_swizzle(SkString* out, GrSwizzle swizzle) {
diff --git a/src/gpu/glsl/GrGLSLShaderBuilder.h b/src/gpu/glsl/GrGLSLShaderBuilder.h
index 5182795..b46cf42 100644
--- a/src/gpu/glsl/GrGLSLShaderBuilder.h
+++ b/src/gpu/glsl/GrGLSLShaderBuilder.h
@@ -20,9 +20,13 @@
class GrGLSLColorSpaceXformHelper;
namespace SkSL {
+
+class Statement;
+
namespace dsl {
class DSLStatement;
} // namespace dsl
+
} // namespace SkSL
/**
@@ -117,7 +121,7 @@
void codeAppend(const char* str, size_t length) { this->code().append(str, length); }
- void codeAppend(SkSL::dsl::DSLStatement stmt);
+ void codeAppend(std::unique_ptr<SkSL::Statement> stmt);
void codePrependf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
va_list args;
diff --git a/src/sksl/dsl/DSLExpression.cpp b/src/sksl/dsl/DSLExpression.cpp
index 7fa19f3..780d22f 100644
--- a/src/sksl/dsl/DSLExpression.cpp
+++ b/src/sksl/dsl/DSLExpression.cpp
@@ -19,6 +19,10 @@
#include "math.h"
+#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
+#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
+#endif
+
namespace SkSL {
namespace dsl {
@@ -63,6 +67,13 @@
SkSL::VariableReference::RefKind::kRead)) {}
DSLExpression::~DSLExpression() {
+#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
+ if (fExpression && DSLWriter::InFragmentProcessor()) {
+ DSLWriter::CurrentEmitArgs()->fFragBuilder->codeAppend(
+ DSLStatement(this->release()).release());
+ return;
+ }
+#endif
SkASSERTF(fExpression == nullptr,
"Expression destroyed without being incorporated into program");
}
diff --git a/src/sksl/dsl/DSLStatement.cpp b/src/sksl/dsl/DSLStatement.cpp
index ffbc27c..55c4b5e 100644
--- a/src/sksl/dsl/DSLStatement.cpp
+++ b/src/sksl/dsl/DSLStatement.cpp
@@ -13,6 +13,10 @@
#include "src/sksl/dsl/priv/DSLWriter.h"
#include "src/sksl/ir/SkSLExpressionStatement.h"
+#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
+#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
+#endif
+
namespace SkSL {
namespace dsl {
@@ -38,6 +42,16 @@
}
}
+DSLStatement::~DSLStatement() {
+#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU
+ if (fStatement && DSLWriter::InFragmentProcessor()) {
+ DSLWriter::CurrentEmitArgs()->fFragBuilder->codeAppend(this->release());
+ return;
+ }
+#endif
+ SkASSERTF(!fStatement, "Statement destroyed without being incorporated into program");
+}
+
} // namespace dsl
} // namespace SkSL
diff --git a/src/sksl/dsl/DSLStatement.h b/src/sksl/dsl/DSLStatement.h
index ed033f1..b03dc095 100644
--- a/src/sksl/dsl/DSLStatement.h
+++ b/src/sksl/dsl/DSLStatement.h
@@ -36,9 +36,7 @@
DSLStatement(DSLStatement&&) = default;
- ~DSLStatement() {
- SkASSERTF(!fStatement, "Statement destroyed without being incorporated into program");
- }
+ ~DSLStatement();
std::unique_ptr<SkSL::Statement> release() {
return std::move(fStatement);
@@ -53,6 +51,7 @@
friend class DSLBlock;
friend class DSLCore;
+ friend class DSLExpression;
friend class DSLWriter;
};