From 0884c6a4decabe5361866df178e9a203b4c9cf05 Mon Sep 17 00:00:00 2001 From: Rezmason Date: Mon, 26 May 2025 12:03:52 -0700 Subject: [PATCH] WebGPU Renderer now awaits the submitted work in the old device's queue before destroying it --- js/webgpu/endPass.js | 6 +++--- js/webgpu/renderer.js | 11 ++++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/js/webgpu/endPass.js b/js/webgpu/endPass.js index 14c7318..febf0b6 100644 --- a/js/webgpu/endPass.js +++ b/js/webgpu/endPass.js @@ -24,16 +24,16 @@ export default ({ device, cache, canvasFormat, canvasContext }) => { const assets = [loadShader(device, cache, "shaders/wgsl/endPass.wgsl")]; const loaded = (async () => { - const [imageShader] = await Promise.all(assets); + const [endShader] = await Promise.all(assets); renderPipeline = await device.createRenderPipelineAsync({ layout: "auto", vertex: { - module: imageShader.module, + module: endShader.module, entryPoint: "vertMain", }, fragment: { - module: imageShader.module, + module: endShader.module, entryPoint: "fragMain", targets: [ { diff --git a/js/webgpu/renderer.js b/js/webgpu/renderer.js index a3e85e0..3bd352b 100644 --- a/js/webgpu/renderer.js +++ b/js/webgpu/renderer.js @@ -184,6 +184,7 @@ export default class REGLRenderer extends Renderer { await this.#rebuildingPipeline; this.#renderFunc(performance.now()); if (oldDevice != null) { + await oldDevice.queue.onSubmittedWorkDone(); oldDevice.destroy(); } } @@ -202,10 +203,14 @@ export default class REGLRenderer extends Renderer { destroy() { if (this.destroyed) return; - if (this.#device != null) { - this.#device.destroy(); // This also destroys any objects created with the device - this.#device = null; + const oldDevice = this.#device; + if (oldDevice != null) { + (async () => { + await oldDevice.queue.onSubmittedWorkDone(); + oldDevice.destroy(); + }); } + this.#device = null; super.destroy(); } }