[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() {