Signatur
Beschreibung
Die schreibgeschützte Eigenschaft lineNum eines GPUCompilationMessage-Objekts gibt an, in welcher Zeile des an GPUDevice.createShaderModule() übergebenen WGSL-Quelltexts ein Fehler, eine Warnung oder ein Hinweis aufgetreten ist. Die Zählung beginnt bei 1 – die erste Zeile des Shaders hat also lineNum === 1.
Man erhält die Meldungen über GPUShaderModule.getCompilationInfo(), das ein Promise mit einem GPUCompilationInfo-Objekt liefert. Dessen Array messages enthält pro Diagnose ein GPUCompilationMessage. Zusammen mit linePos (Spalte), offset und length lässt sich die Fehlerstelle präzise im Quelltext markieren – etwa für eigene Fehlerausgaben, Shader-Editoren oder Live-Coding-Tools.
Bezieht sich eine Meldung auf keine konkrete Stelle im Quelltext, sind lineNum und linePos beide 0. Diesen Fall sollte man immer gesondert behandeln, bevor man per Index auf Quelltextzeilen zugreift.
Rückgabewert
0, wenn die Meldung keiner Stelle zugeordnet ist.Beispiele
Compiler-Fehler mit Zeilennummer ausgeben
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `@vertex
fn main() -> @builtin(position) vec4f {
return vec4f(0.0, 0.0, 0.0) // fehlerhaft: nur 3 Komponenten
}`;
const module = device.createShaderModule({ code });
const info = await module.getCompilationInfo();
for (const msg of info.messages) {
console.log(`${msg.type} in Zeile ${msg.lineNum}, Spalte ${msg.linePos}: ${msg.message}`);
}
Fehlerzeile mit Markierung anzeigen
const formatMessage = (source, msg) => {
if (msg.lineNum === 0) {
return `[${msg.type}] ${msg.message}`; // keine Position bekannt
}
const lines = source.split(/\r\n|\r|\n/);
const line = lines[msg.lineNum - 1] ?? ''; // lineNum ist 1-basiert
const caret = ' '.repeat(Math.max(0, msg.linePos - 1)) + '^'.repeat(Math.max(1, msg.length));
return `[${msg.type}] Zeile ${msg.lineNum}: ${msg.message}\n${line}\n${caret}`;
};
const module = device.createShaderModule({ code: shaderSource });
const { messages } = await module.getCompilationInfo();
messages.forEach((m) => console.warn(formatMessage(shaderSource, m)));
Meldungen in Editor-Markierungen umwandeln
const toEditorMarkers = (messages) =>
messages
.filter((m) => m.lineNum > 0)
.map((m) => ({
severity: m.type, // 'error' | 'warning' | 'info'
startLine: m.lineNum,
startColumn: m.linePos,
endColumn: m.linePos + m.length,
text: m.message,
}));
const { messages } = await device
.createShaderModule({ code: shaderSource })
.getCompilationInfo();
console.table(toEditorMarkers(messages));
// Wichtig · Fallstricke
- 1-basiert: Für den Array-Zugriff auf gesplittete Zeilen immer
lineNum - 1verwenden. - Wert 0: Bedeutet „keine Position“ – nicht „erste Zeile“. Vor dem Zugriff prüfen.
- Zeilenumbrüche: WGSL erkennt neben
\nauch\r\n,\rund weitere Unicode-Umbrüche (z. B. U+2028). Ein naivessplit('\n')kann daher zu verschobenen Zeilen führen. linePos,offsetundlengthwerden in UTF-16-Codeeinheiten gezählt – passend zu JavaScript-Strings.- Meldungstexte und die genaue Position sind implementierungsabhängig; nicht für Logik auf den Text der Meldung parsen.
- WebGPU ist nur in sicheren Kontexten (HTTPS) verfügbar und noch nicht in allen Browsern/Plattformen aktiviert – vorher
navigator.gpuprüfen.