Add generic uniform setter function to SkRuntimeShaderBuilder

Change-Id: Idab539a4b39fe5ceab54948c99c0dcd6d19fd345
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/352743
Commit-Queue: Derek Sollenberger <djsollen@google.com>
Auto-Submit: Derek Sollenberger <djsollen@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Reviewed-by: Mike Klein <mtklein@google.com>
diff --git a/tests/SkRuntimeEffectTest.cpp b/tests/SkRuntimeEffectTest.cpp
index 69520d2..90b45fa 100644
--- a/tests/SkRuntimeEffectTest.cpp
+++ b/tests/SkRuntimeEffectTest.cpp
@@ -334,6 +334,35 @@
     auto shader_1 = b.makeShader(nullptr, true);
 }
 
+DEF_TEST(SkRuntimeShaderBuilderSetUniforms, r) {
+    const char* kSource = R"(
+        uniform half x;
+        uniform vec2 offset;
+        half4 main() { return half4(x); }
+    )";
+
+    sk_sp<SkRuntimeEffect> effect = std::get<0>(SkRuntimeEffect::Make(SkString(kSource)));
+    REPORTER_ASSERT(r, effect);
+
+    SkRuntimeShaderBuilder b(std::move(effect));
+
+    // Test passes if this sequence doesn't assert.
+    float x = 1.0f;
+    REPORTER_ASSERT(r, b.uniform("x").set(&x, 1));
+
+    // add extra value to ensure that set doesn't try to use sizeof(array)
+    float origin[] = { 2.0f, 3.0f, 4.0f };
+    REPORTER_ASSERT(r, b.uniform("offset").set<float>(origin, 2));
+
+#ifndef SK_DEBUG
+    REPORTER_ASSERT(r, !b.uniform("offset").set<float>(origin, 1));
+    REPORTER_ASSERT(r, !b.uniform("offset").set<float>(origin, 3));
+#endif
+
+
+    auto shader = b.makeShader(nullptr, false);
+}
+
 DEF_TEST(SkRuntimeEffectThreaded, r) {
     // SkRuntimeEffect uses a single compiler instance, but it's mutex locked.
     // This tests that we can safely use it from more than one thread, and also