Start · Sprachen · JavaScript · Referenz · GPUDevice.lost

GPUDevice.lost

Eigenschaft

Schreibgeschütztes <code>Promise&lt;GPUDeviceLostInfo&gt;</code>, das erst dann erfüllt wird, wenn das <code>GPUDevice</code> verloren geht, und bis dahin schwebend bleibt.

seit JavaScript WebGPU – Chrome/Edge 113+, Safari 26+, Firefox 141 Kategorie: webapi

Signatur

GPUDevice.lost

Beschreibung

Die Eigenschaft lost eines GPUDevice liefert ein Promise, das während der gesamten Lebensdauer des Geräts schwebend (pending) bleibt. Erst wenn das logische Gerät unbrauchbar wird, erfüllt es sich mit einem GPUDeviceLostInfo-Objekt. Das Promise wird nie abgelehnt.

Ein Gerät kann aus vielen Gründen verloren gehen: Der Treiber stürzt ab oder wird aktualisiert, die GPU wird zurückgesetzt (z. B. nach einem zu langen Shader), ein externer Grafikadapter wird abgezogen, der Browser gibt Ressourcen frei, oder Sie rufen selbst device.destroy() auf. Das Objekt GPUDeviceLostInfo enthält die Eigenschaft reason ("destroyed" bei absichtlichem Zerstören, sonst "unknown") und eine lesbare message, die nur zu Diagnosezwecken dient.

Robuste WebGPU-Anwendungen sollten device.lost immer beobachten, direkt nachdem das Gerät mit adapter.requestDevice() angefordert wurde. Bei einem unerwarteten Verlust fordern Sie einen neuen Adapter und ein neues Gerät an und legen alle GPU-Ressourcen (Puffer, Texturen, Pipelines) neu an – alte Objekte lassen sich nicht wiederverwenden.

Rückgabewert

Typ
Promise<GPUDeviceLostInfo>
Beschreibung
Ein Promise, das sich beim Verlust des Geräts mit einem GPUDeviceLostInfo-Objekt (reason: "destroyed" | "unknown", message: string) erfüllt. Es wird nie abgelehnt. Bei jedem Zugriff kommt dasselbe Promise zurück.

Beispiele

Geräteverlust protokollieren

const adapter = await navigator.gpu?.requestAdapter();
if (!adapter) throw new Error('WebGPU nicht verfügbar');
const device = await adapter.requestDevice();

device.lost.then((info) => {
  console.warn(`GPU-Gerät verloren (${info.reason}): ${info.message}`);
});
GPU-Gerät verloren (unknown): … (erst beim tatsächlichen Verlust)

Automatische Wiederherstellung nach unerwartetem Verlust

const initWebGPU = async () => {
  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    console.error('Kein GPU-Adapter gefunden');
    return;
  }
  const device = await adapter.requestDevice();

  device.lost.then(async (info) => {
    console.error('Gerät verloren:', info.message);
    // Absichtliches destroy() nicht neu starten
    if (info.reason !== 'destroyed') {
      await initWebGPU(); // Ressourcen komplett neu aufbauen
    }
  });

  // Hier Puffer, Texturen, Pipelines anlegen …
  return device;
};

await initWebGPU();

Absichtliches Zerstören erkennen

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const lostPromise = device.lost;
device.destroy();

const info = await lostPromise;
console.log(info.reason);
console.log(device.lost === lostPromise);
destroyed true

// Wichtig · Fallstricke

  • Das Promise wird nie abgelehnt – ein .catch() reicht zur Überwachung nicht, nutzen Sie .then() bzw. await. Ein await device.lost im Hauptablauf blockiert die Funktion, bis das Gerät verloren geht; hängen Sie den Handler daher asynchron an.
  • Nach dem Verlust sind alle von diesem Gerät erzeugten Objekte unbrauchbar. Befehle schlagen still fehl (keine Ausnahmen), und mapAsync() wird abgelehnt. Legen Sie alles über ein neues Gerät neu an.
  • Auch adapter.requestDevice() kann ein bereits verlorenes Gerät zurückgeben, wenn der Adapter nicht mehr gültig ist – in diesem Fall ist lost sofort erfüllt. Fordern Sie zur Wiederherstellung daher immer einen neuen Adapter an.
  • Werten Sie message nicht programmatisch aus; der Text ist implementierungsabhängig. Entscheiden Sie nur anhand von reason.
  • WebGPU steht nur in sicheren Kontexten (HTTPS) zur Verfügung und wird noch nicht von allen Browsern und Plattformen unterstützt – prüfen Sie vorher navigator.gpu.