Require that runtime effect child variables are 'uniform'

Bug: skia:11374
Change-Id: I63d605eabbe514a0469d00d8a671969874f3edd4
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/393081
Reviewed-by: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
index 2699db1..07e7348 100644
--- a/RELEASE_NOTES.txt
+++ b/RELEASE_NOTES.txt
@@ -19,6 +19,10 @@
     are not supported.
     https://review.skia.org/391856
 
+  * SkRuntimeEffect requires that 'shader' variables be declared as 'uniform'. The deprecated
+    syntax of 'in shader' is no longer supported.
+    https://review.skia.org/393081
+
 * * *
 
 Milestone 90
diff --git a/resources/sksl/runtime_errors/IllegalShaderUse.rte b/resources/sksl/runtime_errors/IllegalShaderUse.rte
index 67f06b8..2216d39 100644
--- a/resources/sksl/runtime_errors/IllegalShaderUse.rte
+++ b/resources/sksl/runtime_errors/IllegalShaderUse.rte
@@ -1,11 +1,10 @@
-// Expect 5 errors
+// Expect >= 7 errors (currently 9, due to double-reporting)
 
 // Correct declaration (used in some test functions)
 uniform shader s1;
 uniform shader s2;
 
 // Incorrect shader declarations (they must be uniform)
-// TODO(skbug.com/11374): These are not detected as errors yet
 shader s3;
 in shader s4;
 
diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
index 4757f36..6fea273 100644
--- a/src/sksl/SkSLIRGenerator.cpp
+++ b/src/sksl/SkSLIRGenerator.cpp
@@ -294,11 +294,14 @@
         }
     }
     if (this->programKind() == ProgramKind::kRuntimeEffect) {
-        // TODO(skbug.com/11374): Remove this special case, 'in' should be prohibited in all cases
-        if ((modifiers.fFlags & Modifiers::kIn_Flag) && !baseType->isEffectChild()) {
+        if (modifiers.fFlags & Modifiers::kIn_Flag) {
             this->errorReporter().error(offset, "'in' variables not permitted in runtime effects");
         }
     }
+    if (baseType->isEffectChild() && !(modifiers.fFlags & Modifiers::kUniform_Flag)) {
+        this->errorReporter().error(
+                offset, "variables of type '" + baseType->displayName() + "' must be uniform");
+    }
     if ((modifiers.fLayout.fFlags & Layout::kKey_Flag) &&
         (modifiers.fFlags & Modifiers::kUniform_Flag)) {
         this->errorReporter().error(offset, "'key' is not permitted on 'uniform' variables");
diff --git a/tests/SkRuntimeEffectTest.cpp b/tests/SkRuntimeEffectTest.cpp
index fca5ce7..5305ba7 100644
--- a/tests/SkRuntimeEffectTest.cpp
+++ b/tests/SkRuntimeEffectTest.cpp
@@ -274,12 +274,6 @@
     effect.child("child") = rgbwShader;
     effect.test(0xFF0000FF, 0xFFFF0000, 0xFF00FF00, 0xFFFFFFFF);
 
-    // Legacy behavior - shaders can be declared 'in' rather than 'uniform'
-    effect.build("in shader child;"
-                 "half4 main() { return sample(child); }");
-    effect.child("child") = rgbwShader;
-    effect.test(0xFF0000FF, 0xFF00FF00, 0xFFFF0000, 0xFFFFFFFF);
-
     //
     // Helper functions
     //
diff --git a/tests/sksl/runtime_errors/IllegalShaderUse.skvm b/tests/sksl/runtime_errors/IllegalShaderUse.skvm
index 840154b..5690524 100644
--- a/tests/sksl/runtime_errors/IllegalShaderUse.skvm
+++ b/tests/sksl/runtime_errors/IllegalShaderUse.skvm
@@ -1,8 +1,12 @@
 ### Compilation failed:
 
-error: 13: variables of type 'shader' must be global
-error: 14: parameters of type 'shader' not allowed
-error: 15: functions may not return opaque type 'shader'
-error: 16: cannot construct 'shader'
-error: 17: ternary expression of opaque type 'shader' not allowed
-5 errors
+error: 8: variables of type 'shader' must be uniform
+error: 9: 'in' variables not permitted in runtime effects
+error: 9: variables of type 'shader' must be uniform
+error: 12: variables of type 'shader' must be global
+error: 12: variables of type 'shader' must be uniform
+error: 13: parameters of type 'shader' not allowed
+error: 14: functions may not return opaque type 'shader'
+error: 15: cannot construct 'shader'
+error: 16: ternary expression of opaque type 'shader' not allowed
+9 errors