Signatur
Beschreibung
GPUSupportedLimits ist ein schreibgeschütztes Objekt der WebGPU API. Es enthält eine Reihe numerischer Eigenschaften, die angeben, wie weit die GPU-Ressourcen reichen, zum Beispiel maxTextureDimension2D, maxBufferSize, maxBindGroups oder maxComputeWorkgroupSizeX. Ein eigenes Objekt dieser Art legt man nie an. Man bekommt es über GPUAdapter.limits (was die Hardware maximal kann) oder über GPUDevice.limits (was für das erzeugte Gerät tatsächlich gilt).
Wichtig ist der Unterschied zwischen beiden Quellen: Ein GPUDevice erhält standardmäßig nur die Mindestgrenzen der Spezifikation, auch wenn der Adapter mehr kann. So verhalten sich Anwendungen auf allen Geräten gleich. Höhere Grenzen fordert man ausdrücklich über das Feld requiredLimits in GPUAdapter.requestDevice() an. Die Werte dürfen dabei höchstens so groß sein wie die entsprechenden Adapter-Grenzen.
Es gibt zwei Arten von Grenzen:
- „max“-Grenzen (z. B.
maxStorageBufferBindingSize): Ein höherer Wert ist besser. - „alignment“-Grenzen (z. B.
minUniformBufferOffsetAlignment): Ein niedrigerer Wert ist besser. Sie sind immer Zweierpotenzen.
Typische Einsatzfälle sind die Wahl von Texturauflösungen, die Größe von Compute-Workgroups und die Aufteilung großer Datenpuffer abhängig von der Hardware.
Rückgabewert
GPUAdapter.limits und GPUDevice.limits geliefert. Alle Eigenschaften sind schreibgeschützte Zahlen (unsigned long bzw. unsigned long long), z. B. maxTextureDimension1D/2D/3D, maxTextureArrayLayers, maxBindGroups, maxBindingsPerBindGroup, maxUniformBufferBindingSize, maxStorageBufferBindingSize, minUniformBufferOffsetAlignment, minStorageBufferOffsetAlignment, maxVertexBuffers, maxVertexAttributes, maxBufferSize, maxColorAttachments, maxComputeWorkgroupStorageSize, maxComputeInvocationsPerWorkgroup, maxComputeWorkgroupSizeX/Y/Z und maxComputeWorkgroupsPerDimension.Beispiele
Grenzen des Adapters auslesen
const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) throw new Error('WebGPU wird nicht unterstützt');
const { limits } = adapter;
console.log('Max. 2D-Textur:', limits.maxTextureDimension2D);
console.log('Max. Puffergröße:', limits.maxBufferSize);
console.log('Max. Bind Groups:', limits.maxBindGroups);
Höhere Grenzen beim Erzeugen des Geräts anfordern
const adapter = await navigator.gpu.requestAdapter();
// Ohne requiredLimits bekommt das Gerät nur die Standardwerte (z. B. 128 MiB)
const wunsch = 1024 * 1024 * 1024; // 1 GiB
const device = await adapter.requestDevice({
requiredLimits: {
maxStorageBufferBindingSize: Math.min(wunsch, adapter.limits.maxStorageBufferBindingSize),
maxBufferSize: Math.min(wunsch, adapter.limits.maxBufferSize)
}
});
console.log('Gerät:', device.limits.maxStorageBufferBindingSize);
Alle Grenzen als Tabelle ausgeben
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const tabelle = {};
// Die Eigenschaften sind Getter auf dem Prototyp, daher for...in statt Object.keys
for (const name in adapter.limits) {
tabelle[name] = { adapter: adapter.limits[name], geraet: device.limits[name] };
}
console.table(tabelle);
Workgroup-Größe an die Hardware anpassen
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const groesse = Math.min(256, device.limits.maxComputeWorkgroupSizeX,
device.limits.maxComputeInvocationsPerWorkgroup);
const module = device.createShaderModule({
code: `@compute @workgroup_size(${groesse})
fn main(@builtin(global_invocation_id) id: vec3u) {}`
});
console.log('Workgroup-Größe:', groesse);
// Wichtig · Fallstricke
- Adapter und Gerät unterscheiden sich:
device.limitsenthält nur die Standardwerte, solange man keinerequiredLimitsübergibt. Wer die Adapter-Werte voraussetzt, ohne sie anzufordern, bekommt Validierungsfehler. - Fordert man in
requiredLimitsmehr an, als der Adapter kann, wird das Promise vonrequestDevice()mit einemOperationErrorabgelehnt. Unbekannte Namen führen ebenfalls zu einem Fehler. Deshalb mitMath.min()gegenadapter.limitsbegrenzen. - Die Eigenschaften sind Getter auf dem Prototyp.
Object.keys()undJSON.stringify()liefern deshalb ein leeres Ergebnis. Zum Aufzählenfor...inverwenden. - Datenschutz: Browser können die gemeldeten Werte auf feste Stufen runden, damit sich Nutzer schwerer über ihre Hardware wiedererkennen lassen (Fingerprinting). Man sollte sich also nicht auf exakte Hardwarewerte verlassen.
- Kompatibilität: WebGPU gibt es nur in sicheren Kontexten und in modernen Browsern (Chromium 113+, Safari 26, Firefox 141 unter Windows). Vorher
navigator.gpuprüfen. Neue Grenzen können dazukommen, zum BeispielmaxInterStageShaderVariables.