[shaders] Fix memory leak

We need to free shaders after we create them every frame or we run
out of memory and see cryptic errors like "Invalid Memory Access".

This revealed a bug in how the shaders handled uniform memory,
addressed here: https://skia-review.googlesource.com/c/skia/+/543416

Change-Id: I270b6f1f6ed7bd01eacd4f2d2bb67b5b852a42d8
Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/543436
Reviewed-by: Jorge Betancourt <jmbetancourt@google.com>
diff --git a/shaders/modules/shadernode/index.ts b/shaders/modules/shadernode/index.ts
index 9d5c651..452f208 100644
--- a/shaders/modules/shadernode/index.ts
+++ b/shaders/modules/shadernode/index.ts
@@ -468,10 +468,10 @@
       const uniformsFloat32Array: Float32Array = this.uniformsMallocObj!.toTypedArray() as Float32Array;
 
       // Copy in predefined uniforms values.
-      predefinedUniformsValues.forEach((val, index) => { uniformsFloat32Array[index] = val; });
+      uniformsFloat32Array.set(predefinedUniformsValues);
 
-      // Copy in our local edited uniform values to the right spots.
-      this.currentUserUniformValues.forEach((val, index) => { uniformsFloat32Array[index + this._numPredefinedUniformValues] = val; });
+      // Copy in our local edited uniform values after the predefined uniforms.
+      uniformsFloat32Array.set(this.currentUserUniformValues, this._numPredefinedUniformValues);
 
       // Write in the iImageResolution uniform values.
       const imageResolution = this.findUniform('iImageResolution');
diff --git a/shaders/modules/shaders-app-sk/shaders-app-sk.ts b/shaders/modules/shaders-app-sk/shaders-app-sk.ts
index 44d98b5..0c263aa 100644
--- a/shaders/modules/shaders-app-sk/shaders-app-sk.ts
+++ b/shaders/modules/shaders-app-sk/shaders-app-sk.ts
@@ -619,6 +619,7 @@
     }
 
     this.surface!.flush();
+    shader.delete();
 
     this.rafID = requestAnimationFrame(() => {
       this.drawFrame();
@@ -656,6 +657,7 @@
       // Open the debugger in a separate tab, pointing it at our local storage buffer.
       window.open('/debug?local-storage', 'sksl-debug-target');
     }
+    shader.delete();
   }
 
   private async runClick() {