Skip to content

Commit

Permalink
Fix device_pool refactor (#3469)
Browse files Browse the repository at this point in the history
The old version made one device with no descriptor.
If that fail then it stopped creating any devices period.

The previous refactor was bad in that if the any device
failed it would just stop making devices.

This one is simplified. It just used the pool as a pool.
There is no special handling for failed devices.
  • Loading branch information
greggman authored Mar 8, 2024
1 parent 8a03f77 commit f71a834
Showing 1 changed file with 2 additions and 23 deletions.
25 changes: 2 additions & 23 deletions src/webgpu/util/device_pool.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class FeaturesNotSupported extends Error {}
export class TestOOMedShouldAttemptGC extends Error {}

export class DevicePool {
private holders: 'uninitialized' | 'failed' | DescriptorToHolderMap = 'uninitialized';
private holders = new DescriptorToHolderMap();

async requestAdapter(recorder: TestCaseRecorder) {
const gpu = getGPU(recorder);
Expand All @@ -36,28 +36,7 @@ export class DevicePool {
adapter: GPUAdapter,
descriptor?: UncanonicalizedDeviceDescriptor
): Promise<DeviceProvider> {
let holder;
if (this.holders === 'uninitialized') {
this.holders = new DescriptorToHolderMap();
}

let errorMessage = '';
if (this.holders !== 'failed') {
try {
holder = await this.holders.getOrCreate(adapter, descriptor);
} catch (ex) {
this.holders = 'failed';
if (ex instanceof Error) {
errorMessage = ` with ${ex.name} "${ex.message}"`;
}
}
}

assert(
this.holders !== 'failed',
`WebGPU device failed to initialize${errorMessage}; not retrying`
);
assert(!!holder);
const holder = await this.holders.getOrCreate(adapter, descriptor);
assert(holder.state === 'free', 'Device was in use on DevicePool.acquire');
holder.state = 'acquired';
holder.beginTestScope();
Expand Down

0 comments on commit f71a834

Please sign in to comment.