// We need to max out the adapter limits related to texture dimensions to more reliably cause an // OOM error when asked for it, so set that on the device now. const device = await this.requestDeviceTracked(adapter, {
requiredLimits: {
maxTextureDimension2D: adapter.limits.maxTextureDimension2D,
maxTextureArrayLayers: adapter.limits.maxTextureArrayLayers,
},
}); assert(device !== null); this._device = device;
}
/** *Generatesanerrorofthegivenfiltertype.Fornow,theerrorsaregeneratedbycallinga *knowncode-pathtocausetheerror.Thiscanbeupdatedinthefutureshouldtherebeamore *directwaytoinjecterrors.
*/
generateError(filter: GPUErrorFilter): void { switch (filter) { case'out-of-memory': this.trackForCleanup( this.device.createTexture({ // One of the largest formats. With the base limits, the texture will be 256 GiB.
format: 'rgba32float',
usage: GPUTextureUsage.COPY_DST,
size: [ this.device.limits.maxTextureDimension2D, this.device.limits.maxTextureDimension2D, this.device.limits.maxTextureArrayLayers,
],
})
); break; case'validation': // Generating a validation error by passing in an invalid usage when creating a buffer. this.trackForCleanup( this.device.createBuffer({
size: 1024,
usage: 0xffff, // Invalid GPUBufferUsage
})
); break;
} // MAINTENANCE_TODO: This is a workaround for Chromium not flushing. Remove when not needed. this.device.queue.submit([]);
}
/** *Pop`count`errorscopes,andasserttheyallreturn`null`.Chunksthe *awaitssoweonly`Promise.all`200scopesatatime,insteadofstalling *onahuge`Promise.all`allatonce.ThishelpsChromium's"heartbeat" *mechanismknowthatthetestisstillrunning(andnothung).
*/
async chunkedPopManyErrorScopes(count: number) { const promises = []; for (let i = 0; i < count; i++) {
promises.push(this.device.popErrorScope()); if (promises.length >= 200) { this.expect((await Promise.all(promises)).every(e => e === null));
promises.length = 0;
}
} this.expect((await Promise.all(promises)).every(e => e === null));
}
/** *Expectanuncapturederroreventtooccur.Note:thisMUSTbeawaited,because *otherwiseitcoulderroneouslypassbycapturinganerrorfromlaterinthetest.
*/
async expectUncapturedError(
fn: Function,
useOnuncapturederror = false
): Promise<GPUUncapturedErrorEvent> {
return this.immediateAsyncExpectation(() => { const promise: Promise<GPUUncapturedErrorEvent> = new Promise(resolve => { const eventListener = (event: GPUUncapturedErrorEvent) => { // Don't emit error to console.
event.preventDefault(); // Unregister before resolving so we can be certain these are cleaned // up before the next test. if (useOnuncapturederror) { this.device.onuncapturederror = null;
} else { this.device.removeEventListener('uncapturederror', eventListener);
}
this.debug(`Got uncaptured error event with ${event.error}`);
resolve(event);
};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.