From 97d7ba7ceb7b4bc676695e4cd1f373f02f4965e5 Mon Sep 17 00:00:00 2001 From: sagudev <16504129+sagudev@users.noreply.github.com> Date: Sat, 26 Sep 2026 10:18:36 +0200 Subject: [PATCH] mapAsync on destroyed device Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com> --- .../api/validation/buffer/mapping.spec.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/webgpu/api/validation/buffer/mapping.spec.ts b/src/webgpu/api/validation/buffer/mapping.spec.ts index 947d1e10ef44..c5badcd37c46 100644 --- a/src/webgpu/api/validation/buffer/mapping.spec.ts +++ b/src/webgpu/api/validation/buffer/mapping.spec.ts @@ -158,6 +158,37 @@ g.test('mapAsync,invalidBuffer') ); }); +g.test('mapAsync,destroyedDevice') + .desc('Test that mapAsync is an error when called on a destroyed device.') + .params(u => + u.combine('bufferState', ['valid', 'invalid'] as const).combine('awaitLost', [true, false]) + ) + .fn(async t => { + const { awaitLost, bufferState } = t.params; + const buffer = + bufferState === 'valid' ? t.createMappableBuffer(GPUMapMode.READ, 4) : vtu.getErrorBuffer(t); + t.expectDeviceLost('destroyed'); + + await t.testMapAsyncCall( + bufferState === 'valid' + ? 'success' + : { validationError: true, earlyRejection: false, rejectName: 'OperationError' }, + buffer, + GPUMapMode.READ + ); + buffer.unmap(); + t.device.destroy(); + if (awaitLost) { + const lostInfo = await t.device.lost; + t.expect(lostInfo.reason === 'destroyed'); + } + await t.testMapAsyncCall( + { validationError: false, earlyRejection: false, rejectName: 'AbortError' }, + buffer, + GPUMapMode.READ + ); + }); + g.test('mapAsync,state,destroyed') .desc('Test that mapAsync is an error when called on a destroyed buffer.') .paramsSubcasesOnly(u => u.combine('mapMode', kMapModeOptions))