Signatur
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
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);
}
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);
}
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));
// Wichtig · Fallstricke
- Schreibgeschützt: Wenn Sie
typeetwas zuweisen, passiert nichts (im Strict-Mode wird einTypeErrorgeworfen). - 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
typeab und werten Sie nie den Text vonmessageaus. - Kein Fehler wird geworfen:
createShaderModule()wirft bei einem ungültigen Shader keine Ausnahme. Fehler zeigen sich nur übergetCompilationInfo(),pushErrorScope('validation')oder das Ereignisuncapturederror. - 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-awaitin den Beispielen funktioniert nur in ES-Modulen.