From 00a5da4c59f81d04f0ef4e2de41490a68df0155a Mon Sep 17 00:00:00 2001 From: "Guan-Ming (Wesley) Chiu" <105915352+guan404ming@users.noreply.github.com> Date: Tue, 16 Jun 2026 20:59:58 +0800 Subject: [PATCH 1/2] Destroy GPUDevice once on buffer creation error Signed-off-by: Guan-Ming (Wesley) Chiu <105915352+guan404ming@users.noreply.github.com> --- web/src/webgpu.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/web/src/webgpu.ts b/web/src/webgpu.ts index 199fa14235ee..8b979b9d76ab 100644 --- a/web/src/webgpu.ts +++ b/web/src/webgpu.ts @@ -169,9 +169,18 @@ function tryCreateBuffer(device: GPUDevice, descriptor: GPUBufferDescriptor) { const buffer = device.createBuffer(descriptor); - device.popErrorScope().then((error) => {if (error) {device.destroy(); console.error(error);}}); - device.popErrorScope().then((error) => {if (error) {device.destroy(); console.error(error);}}); - device.popErrorScope().then((error) => {if (error) {device.destroy(); console.error(error);}}); + // Destroy at most once even if multiple error types fire. + Promise.all([ + device.popErrorScope(), + device.popErrorScope(), + device.popErrorScope(), + ]).then((errors) => { + const captured = errors.filter((error) => error !== null); + if (captured.length > 0) { + device.destroy(); + captured.forEach((error) => console.error(error)); + } + }); return buffer; } From e8558c39ebab0c50b2422950cfbda014ceb62443 Mon Sep 17 00:00:00 2001 From: "Guan-Ming (Wesley) Chiu" <105915352+guan404ming@users.noreply.github.com> Date: Tue, 16 Jun 2026 21:06:03 +0800 Subject: [PATCH 2/2] Update web/src/webgpu.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- web/src/webgpu.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/web/src/webgpu.ts b/web/src/webgpu.ts index 8b979b9d76ab..5a25833d1a8f 100644 --- a/web/src/webgpu.ts +++ b/web/src/webgpu.ts @@ -175,11 +175,13 @@ function tryCreateBuffer(device: GPUDevice, descriptor: GPUBufferDescriptor) { device.popErrorScope(), device.popErrorScope(), ]).then((errors) => { - const captured = errors.filter((error) => error !== null); + const captured = errors.filter((error): error is GPUError => error !== null); if (captured.length > 0) { device.destroy(); captured.forEach((error) => console.error(error)); } + }).catch((err) => { + console.error("Failed to pop error scopes:", err); }); return buffer;