Signatur
Beschreibung
Die Eigenschaft limits eines GPUAdapter gibt ein GPUSupportedLimits-Objekt zurück. Es beschreibt die höchsten Werte, die der Adapter maximal unterstützt, etwa maxTextureDimension2D, maxBufferSize, maxStorageBufferBindingSize, maxBindGroups oder maxComputeWorkgroupSizeX.
Wichtig ist der Unterschied zwischen Adapter und Gerät: Ein mit adapter.requestDevice() erzeugtes GPUDevice bekommt standardmäßig nicht die Adapter-Grenzwerte, sondern nur die vom WebGPU-Standard garantierten Standardgrenzwerte. Wer höhere Grenzwerte braucht, muss sie über die Option requiredLimits ausdrücklich anfordern. Dabei darf der angeforderte Wert den Wert in adapter.limits nicht überschreiten (bzw. bei Ausrichtungs-Grenzwerten wie minUniformBufferOffsetAlignment nicht unterschreiten).
Typisch nutzt man adapter.limits, um vor dem Erzeugen des Geräts zu prüfen, ob die Hardware z. B. große Texturen oder große Storage-Buffer kann, und um die Anwendung entsprechend anzupassen (Qualitätsstufen, Kachelgrößen, Fallback-Pfade).
Rückgabewert
maxBufferSize, maxTextureDimension2D, maxBindGroups) die vom Adapter unterstützten Grenzwerte als Zahlen enthalten.Beispiele
Alle Adapter-Grenzwerte ausgeben
const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) {
throw new Error('WebGPU wird nicht unterstützt.');
}
// GPUSupportedLimits hat Getter auf dem Prototyp – daher for...in statt Object.keys
const limits = {};
for (const key in adapter.limits) {
limits[key] = adapter.limits[key];
}
console.table(limits);
Höhere Grenzwerte beim Gerät anfordern
const adapter = await navigator.gpu.requestAdapter();
// Gewünscht: 1 GiB Storage-Buffer, aber höchstens das, was der Adapter kann
const wanted = 1024 * 1024 * 1024;
const maxStorage = Math.min(wanted, adapter.limits.maxStorageBufferBindingSize);
const device = await adapter.requestDevice({
requiredLimits: {
maxStorageBufferBindingSize: maxStorage,
maxBufferSize: Math.min(wanted, adapter.limits.maxBufferSize)
}
});
console.log('Adapter:', adapter.limits.maxStorageBufferBindingSize);
console.log('Gerät: ', device.limits.maxStorageBufferBindingSize);
Texturgröße an die Hardware anpassen
const adapter = await navigator.gpu.requestAdapter();
const maxTex = adapter.limits.maxTextureDimension2D;
// Qualitätsstufe für eine Shadow-Map wählen
const shadowMapSize = maxTex >= 8192 ? 8192 : 4096;
const device = await adapter.requestDevice({
requiredLimits: { maxTextureDimension2D: shadowMapSize }
});
const shadowMap = device.createTexture({
size: [shadowMapSize, shadowMapSize],
format: 'depth32float',
usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
});
console.log(`Shadow-Map: ${shadowMapSize}×${shadowMapSize}`);
// Wichtig · Fallstricke
- Häufigster Fallstrick:
adapter.limitsgilt nicht automatisch für das Gerät. OhnerequiredLimitserhältGPUDevicenur die Standardgrenzwerte (z. B.maxStorageBufferBindingSize= 128 MiB,maxTextureDimension2D= 8192). Für das tatsächlich nutzbare Budget immerdevice.limitsabfragen. - Fordert man in
requiredLimitseinen Wert an, der über dem Adapter-Grenzwert liegt, wird das Promise vonrequestDevice()mit einemOperationErrorabgelehnt. Unbekannte Schlüssel lösen ebenfalls einen Fehler aus. - Die Eigenschaften liegen als Getter auf dem Prototyp;
JSON.stringify(adapter.limits)undObject.keys()liefern daher ein leeres Ergebnis bzw.{}. Mitfor...inauslesen. - Aus Datenschutzgründen (Fingerprinting) können Browser die gemeldeten Werte in Stufen runden oder vereinheitlichen, sodass sie nicht exakt der Hardware entsprechen.
- Kompatibilität: WebGPU ist nur in sicheren Kontexten verfügbar und noch nicht auf allen Plattformen aktiviert. Vorher
navigator.gpuprüfen und den Fall behandeln, dassrequestAdapter()nullzurückgibt.