export const description = ` Tests for the behavior of GPUQueue.onSubmittedWorkDone(). Note that any promise timeouts will be detected by the framework. `; import { makeTestGroup } from '../../../common/framework/test_group.js'; import { range } from '../../../common/util/util.js'; import { AllFeaturesMaxLimitsGPUTest } from '../../gpu_test.js'; export const g = makeTestGroup(AllFeaturesMaxLimitsGPUTest); g.test('without_work') .desc(`Await onSubmittedWorkDone once without having submitted any work.`) .fn(async t => { await t.queue.onSubmittedWorkDone(); }); g.test('with_work') .desc(`Await onSubmittedWorkDone once after submitting some work (writeBuffer).`) .fn(async t => { const buffer = t.createBufferTracked({ size: 4, usage: GPUBufferUsage.COPY_DST }); t.queue.writeBuffer(buffer, 0, new Uint8Array(4)); await t.queue.onSubmittedWorkDone(); }); g.test('many,serial') .desc(`Await 1000 onSubmittedWorkDone calls in serial.`) .fn(async t => { for (let i = 0; i < 1000; ++i) { await t.queue.onSubmittedWorkDone(); } }); g.test('many,parallel') .desc(`Await 1000 onSubmittedWorkDone calls in parallel with Promise.all().`) .fn(async t => { const promises = range(1000, () => t.queue.onSubmittedWorkDone()); await Promise.all(promises); }); g.test('many,parallel_order') .desc(`Issue 200 onSubmittedWorkDone calls and make sure they resolve in the right order.`) .fn(async t => { const promises = []; let lastResolved = -1; for (const i of range(200, i => i)) { promises.push( t.queue.onSubmittedWorkDone().then(() => { t.expect(i === lastResolved + 1); lastResolved++; }) ); } await Promise.all(promises); });