Start · Sprachen · JavaScript · Referenz · GPUCompilationMessage.type

GPUCompilationMessage.type

Eigenschaft

Schreibgeschützter Aufzählungswert (<code>"error"</code>, <code>"warning"</code> oder <code>"info"</code>), der angibt, wie schwer eine Meldung des WGSL-Shader-Compilers wiegt.

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

Signatur

GPUCompilationMessage.type

Beschreibung

Die Eigenschaft type eines GPUCompilationMessage-Objekts gibt an, zu welcher Kategorie eine Meldung des Shader-Compilers gehört. Solche Meldungen entstehen, wenn Sie mit GPUDevice.createShaderModule() ein Shader-Modul aus WGSL-Quelltext erzeugen. Abrufen können Sie sie mit GPUShaderModule.getCompilationInfo().

Mögliche Werte:

  • "error" – ein Fehler bei der Shader-Erzeugung, der das Kompilieren verhindert. Das Modul ist ungültig, und eine Pipeline, die es verwendet, schlägt fehl.
  • "warning" – eine Warnung, die das Kompilieren nicht verhindert, aber auf ein mögliches Problem hinweist, z. B. eine veraltete Syntax oder nicht erreichbaren Code.
  • "info" – ein reiner Hinweis ohne Handlungsbedarf.

Typischerweise nutzen Sie type, um Meldungen zu filtern oder unterschiedlich darzustellen. Fehler geben Sie z. B. mit console.error aus, Warnungen mit console.warn. In Shader-Editoren oder Live-Coding-Werkzeugen lassen sich die Meldungen zusammen mit lineNum und linePos passend im Quelltext markieren.

Rückgabewert

Typ
"error" | "warning" | "info"
Beschreibung
Ein String aus dem Aufzählungstyp GPUCompilationMessageType, der die Schwere der Meldung angibt.

Beispiele

Compiler-Meldungen nach Typ ausgeben

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

const shaderModule = device.createShaderModule({
  code: `
    @vertex
    fn main() -> @builtin(position) vec4f {
      return vec4f(0.0, 0.0, 0.0, 1.0) // fehlendes Semikolon
    }
  `,
});

const info = await shaderModule.getCompilationInfo();
for (const msg of info.messages) {
  const text = `[${msg.type}] Zeile ${msg.lineNum}:${msg.linePos} – ${msg.message}`;
  if (msg.type === 'error') console.error(text);
  else if (msg.type === 'warning') console.warn(text);
  else console.info(text);
}
[error] Zeile 4:40 – expected ';' for return statement (genauer Wortlaut und Position hängen vom Browser ab)

Vor dem Erstellen der Pipeline auf Fehler prüfen

const compileShader = async (device, code) => {
  const module = device.createShaderModule({ code });
  const { messages } = await module.getCompilationInfo();

  const errors = messages.filter((m) => m.type === 'error');
  const warnings = messages.filter((m) => m.type === 'warning');

  if (warnings.length) {
    console.warn(`${warnings.length} Warnung(en) im Shader`);
  }
  if (errors.length) {
    throw new Error(
      errors.map((e) => `Zeile ${e.lineNum}: ${e.message}`).join('\n')
    );
  }
  return module;
};

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
try {
  const module = await compileShader(device, '@compute @workgroup_size(1) fn main() {}');
  console.log('Shader kompiliert:', module);
} catch (err) {
  console.error('Kompilierung fehlgeschlagen:\n' + err.message);
}
Shader kompiliert: GPUShaderModule {label: ''}

Meldungen nach Typ zählen (z. B. für eine Editor-Statusleiste)

const summarize = (messages) =>
  messages.reduce(
    (acc, { type }) => ({ ...acc, [type]: acc[type] + 1 }),
    { error: 0, warning: 0, info: 0 }
  );

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const module = device.createShaderModule({ code: 'fn f() { let x = ; }' });
const { messages } = await module.getCompilationInfo();
console.log(summarize(messages));
{ error: 1, warning: 0, info: 0 }

// Wichtig · Fallstricke

  • Schreibgeschützt: Wenn Sie type etwas zuweisen, passiert nichts (im Strict-Mode wird ein TypeError geworfen).
  • Wortlaut nicht verlässlich: Anzahl, Text und Position der Meldungen hängen von der Implementierung ab und unterscheiden sich zwischen Browsern. Fragen Sie deshalb nur type ab und werten Sie nie den Text von message aus.
  • Kein Fehler wird geworfen: createShaderModule() wirft bei einem ungültigen Shader keine Ausnahme. Fehler zeigen sich nur über getCompilationInfo(), pushErrorScope('validation') oder das Ereignis uncapturederror.
  • Kompatibilität: WebGPU läuft nur in sicheren Kontexten (HTTPS) und wird noch nicht überall unterstützt. Prüfen Sie vorher mit if (!navigator.gpu), ob die API vorhanden ist. Top-Level-await in den Beispielen funktioniert nur in ES-Modulen.