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;
 };