Signatur
Beschreibung
Die Eigenschaft limits eines GPUDevice liefert ein GPUSupportedLimits-Objekt. Es enthält die Grenzwerte, die für dieses logische Gerät gelten, etwa maxTextureDimension2D, maxBufferSize, maxBindGroups, maxComputeWorkgroupSizeX oder maxStorageBufferBindingSize.
Wichtig ist der Unterschied zu GPUAdapter.limits: Der Adapter meldet, was die Hardware höchstens kann. Das Gerät hat dagegen nur die Grenzen, die beim Aufruf von adapter.requestDevice() über requiredLimits angefordert wurden. Alles, was nicht angefordert wurde, steht auf den Standardwerten der WebGPU-Spezifikation. Das ist Absicht: So verhält sich eine Anwendung auf verschiedenen Geräten gleich, und es werden weniger Merkmale für Fingerprinting preisgegeben.
Nutzen Sie device.limits, bevor Sie Puffer, Texturen oder Compute-Dispatches anlegen. Dann bleiben Größen und Workgroup-Dimensionen innerhalb der Grenzen, und Sie bekommen keine Validierungsfehler. Das Objekt ist schreibgeschützt. Um andere Grenzen zu bekommen, müssen Sie ein neues Gerät anfordern.
Rückgabewert
maxBufferSize, maxBindGroups) als number die gültigen Grenzen des Geräts angeben.Beispiele
Grenzen des Geräts auslesen
const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) throw new Error('WebGPU nicht verfügbar');
const device = await adapter.requestDevice();
console.log('Max. 2D-Textur:', device.limits.maxTextureDimension2D);
console.log('Max. Bind Groups:', device.limits.maxBindGroups);
console.log('Max. Puffergröße:', device.limits.maxBufferSize);
Höhere Grenzen anfordern und prüfen
const adapter = await navigator.gpu.requestAdapter();
// Nur so viel anfordern, wie der Adapter auch hergibt
const wanted = 1024 * 1024 * 1024; // 1 GiB
const device = await adapter.requestDevice({
requiredLimits: {
maxBufferSize: Math.min(wanted, adapter.limits.maxBufferSize),
maxStorageBufferBindingSize: Math.min(wanted, adapter.limits.maxStorageBufferBindingSize)
}
});
console.log('Adapter:', adapter.limits.maxBufferSize);
console.log('Gerät: ', device.limits.maxBufferSize);
Puffergröße und Workgroup-Größe an die Grenzen anpassen
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const { maxBufferSize, maxComputeWorkgroupSizeX, maxComputeInvocationsPerWorkgroup } = device.limits;
const requestedBytes = 512 * 1024 * 1024;
const size = Math.min(requestedBytes, maxBufferSize);
const buffer = device.createBuffer({
size,
usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
});
const workgroupSize = Math.min(256, maxComputeWorkgroupSizeX, maxComputeInvocationsPerWorkgroup);
console.log(`Puffer: ${buffer.size} Bytes, Workgroup-Größe: ${workgroupSize}`);
// Wichtig · Fallstricke
- Standardwerte statt Hardwarewerte: Ohne
requiredLimitsliefertdevice.limitsnur die Standardwerte der Spezifikation (z. B.maxBufferSize= 256 MiB), auch wenn die Hardware mehr kann. Die tatsächlichen Hardware-Grenzen stehen inadapter.limits. - Fordern Sie in
requiredLimitsmehr an, als der Adapter hergibt, wird das Promise vonrequestDevice()mit einemOperationErrorabgelehnt. Begrenzen Sie die Werte deshalb vorher mitadapter.limits. - Bei Grenzen vom Typ
min*(z. B.minUniformBufferOffsetAlignment) ist ein kleinerer Wert „besser“. Dort sind die Vergleiche also umgekehrt. - Die Werte kommen als
numberzurück. Sehr große Grenzen wiemaxBufferSizekönnen über 2³² liegen. Rechnen Sie also nicht mit 32-Bit-Integer-Operationen (|0) weiter. - WebGPU gibt es nur in sicheren Kontexten (HTTPS) und noch nicht in allen Browsern. Prüfen Sie vorher, ob
navigator.gpuvorhanden ist.