Remove expression scanning from function finalization pass.

Now that built-in functions are handled elsewhere, the only thing left
here was a check for calls to `dFdy`. This job is better suited to the
built-in-function scanner anyway.

With this change, the function finalization pass only needs to scan
statements. Expressions can be skipped over entirely.

Change-Id: I265a8708826f5621d905cffcaa00435c0eea6405
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/563124
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/sksl/ir/SkSLFunctionDefinition.cpp b/src/sksl/ir/SkSLFunctionDefinition.cpp
index 1df55a4..52493f2 100644
--- a/src/sksl/ir/SkSLFunctionDefinition.cpp
+++ b/src/sksl/ir/SkSLFunctionDefinition.cpp
@@ -24,9 +24,7 @@
 #include "src/sksl/ir/SkSLBlock.h"
 #include "src/sksl/ir/SkSLExpression.h"
 #include "src/sksl/ir/SkSLFieldAccess.h"
-#include "src/sksl/ir/SkSLFunctionCall.h"
 #include "src/sksl/ir/SkSLInterfaceBlock.h"
-#include "src/sksl/ir/SkSLProgram.h"
 #include "src/sksl/ir/SkSLReturnStatement.h"
 #include "src/sksl/ir/SkSLType.h"
 #include "src/sksl/ir/SkSLVarDeclarations.h"
@@ -107,16 +105,8 @@
         }
 
         bool visitExpression(Expression& expr) override {
-            if (expr.is<FunctionCall>()) {
-                const FunctionDeclaration& func = expr.as<FunctionCall>().function();
-                if (func.isBuiltin()) {
-                    if (func.intrinsicKind() == k_dFdy_IntrinsicKind) {
-                        ThreadContext::Inputs().fUseFlipRTUniform =
-                                !fContext.fConfig->fSettings.fForceNoRTFlip;
-                    }
-                }
-            }
-            return INHERITED::visitExpression(expr);
+            // We don't need to scan expressions.
+            return false;
         }
 
         bool visitStatement(Statement& stmt) override {
diff --git a/src/sksl/transform/SkSLFindAndDeclareBuiltinFunctions.cpp b/src/sksl/transform/SkSLFindAndDeclareBuiltinFunctions.cpp
index 5ffc7db..47e1140 100644
--- a/src/sksl/transform/SkSLFindAndDeclareBuiltinFunctions.cpp
+++ b/src/sksl/transform/SkSLFindAndDeclareBuiltinFunctions.cpp
@@ -10,6 +10,7 @@
 #include "include/private/SkTHash.h"
 #include "src/sksl/SkSLBuiltinMap.h"
 #include "src/sksl/SkSLContext.h"
+#include "src/sksl/SkSLProgramSettings.h"
 #include "src/sksl/analysis/SkSLProgramUsage.h"
 #include "src/sksl/ir/SkSLFunctionDeclaration.h"
 #include "src/sksl/ir/SkSLFunctionDefinition.h"
@@ -38,6 +39,10 @@
                 // Not a built-in; skip it.
                 continue;
             }
+            if (fn->intrinsicKind() == k_dFdy_IntrinsicKind) {
+                // Programs that invoke the `dFdy` intrinsic will need the RTFlip input.
+                program.fInputs.fUseFlipRTUniform = !context.fConfig->fSettings.fForceNoRTFlip;
+            }
             const ProgramElement* added = context.fBuiltins->findAndInclude(fn->description());
             if (!added) {
                 // This built-in has already been dealt with; skip it.