Start · Sprachen · JavaScript · Referenz · WebGLRenderingContext.isProgram()

WebGLRenderingContext.isProgram()

Methode

Prüft, ob das übergebene <code>WebGLProgram</code> ein gültiges, noch nicht gelöschtes Programm-Objekt dieses Kontexts ist, und gibt <code>true</code> oder <code>false</code> zurück.

seit JavaScript WebGL 1.0 – Baseline: alle modernen Browser Kategorie: webapi

Signatur

WebGLRenderingContext.prototype.isProgram(program)

Beschreibung

Mit isProgram() fragst du ab, ob ein WebGLProgram-Objekt aus Sicht des aktuellen WebGL-Kontexts noch ein gültiges Shader-Programm ist. Die Methode liefert true, wenn das Programm mit createProgram() in diesem Kontext erzeugt und noch nicht (endgültig) mit deleteProgram() freigegeben wurde.

In diesen Fällen gibt sie false zurück:

  • Du übergibst null.
  • Das Programm wurde mit deleteProgram() gelöscht.
  • Der WebGL-Kontext ist verloren gegangen (webglcontextlost). Alle GPU-Ressourcen sind dann ungültig.

Wichtig: isProgram() sagt nichts darüber aus, ob das Programm erfolgreich gelinkt wurde oder benutzbar ist. Das prüfst du mit getProgramParameter(program, gl.LINK_STATUS) bzw. gl.VALIDATE_STATUS. Typische Einsatzgebiete für isProgram() sind Aufräumroutinen, Debugging, Ressourcen-Manager und die Wiederherstellung nach einem Kontextverlust.

Parameter

Name Typ Default Beschreibung
$program Pflicht WebGLProgram | null Das zu prüfende Programm-Objekt, normalerweise von gl.createProgram() erzeugt.

Rückgabewert

Typ
boolean (GLboolean)
Beschreibung
true, wenn program ein gültiges Programm-Objekt dieses Kontexts ist, sonst false.

Beispiele

Gültigkeit vor und nach dem Löschen prüfen

const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');

const program = gl.createProgram();
console.log(gl.isProgram(program)); // frisch erzeugt

gl.deleteProgram(program);
console.log(gl.isProgram(program)); // nach dem Löschen

console.log(gl.isProgram(null));
true false false

isProgram() und LINK_STATUS unterscheiden

const gl = document.createElement('canvas').getContext('webgl');

const compile = (type, src) => {
  const s = gl.createShader(type);
  gl.shaderSource(s, src);
  gl.compileShader(s);
  return s;
};

const vs = compile(gl.VERTEX_SHADER, 'attribute vec4 p; void main(){ gl_Position = p; }');
const fs = compile(gl.FRAGMENT_SHADER, 'precision mediump float; void main(){ gl_FragColor = vec4(1.0); }');

const program = gl.createProgram();
gl.attachShader(program, vs);
gl.attachShader(program, fs);

console.log('gültig:', gl.isProgram(program));
console.log('gelinkt:', gl.getProgramParameter(program, gl.LINK_STATUS));

gl.linkProgram(program);
console.log('gelinkt:', gl.getProgramParameter(program, gl.LINK_STATUS));
gültig: true gelinkt: false gelinkt: true

Sicheres Aufräumen in einem Ressourcen-Manager

class ProgramCache {
  constructor(gl) {
    this.gl = gl;
    this.programs = new Map();
  }

  add(name, program) {
    this.programs.set(name, program);
  }

  dispose() {
    const { gl } = this;
    for (const [name, program] of this.programs) {
      // Nur löschen, was noch gültig ist
      if (gl.isProgram(program)) {
        gl.deleteProgram(program);
        console.log(`Programm "${name}" gelöscht`);
      }
    }
    this.programs.clear();
  }
}

const gl = document.createElement('canvas').getContext('webgl');
const cache = new ProgramCache(gl);
cache.add('basic', gl.createProgram());
cache.dispose();
Programm "basic" gelöscht

Nach Kontextverlust neu aufbauen

const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl');
let program = gl.createProgram();

canvas.addEventListener('webglcontextlost', (e) => {
  e.preventDefault(); // Wiederherstellung erlauben
  console.log('Nach Verlust gültig?', gl.isProgram(program));
});

canvas.addEventListener('webglcontextrestored', () => {
  program = gl.createProgram(); // alte Objekte sind unbrauchbar
  console.log('Neu erzeugt gültig?', gl.isProgram(program));
});
Nach Verlust gültig? false Neu erzeugt gültig? true

// Wichtig · Fallstricke

  • Kein Link-Test: isProgram() liefert auch für nicht gelinkte oder fehlerhafte Programme true. Für den Link-Erfolg prüfst du getProgramParameter(program, gl.LINK_STATUS) und liest Fehler mit getProgramInfoLog() aus.
  • Verzögertes Löschen: Ist ein Programm per useProgram() noch aktiv, gibt der Treiber es nach deleteProgram() erst frei, wenn es nicht mehr benutzt wird. Das Objekt gilt trotzdem als gelöscht und darf nicht wiederverwendet werden.
  • Fremder Kontext: Ein Programm aus einem anderen WebGL-Kontext ist hier nie gültig. Je nach Browser kann zusätzlich ein INVALID_OPERATION-Fehler gesetzt werden.
  • Performance: Die Methode kann eine Synchronisierung mit der GPU bzw. dem GPU-Prozess auslösen. Rufe sie daher nicht in jedem Frame der Render-Schleife auf, sondern nur beim Aufräumen oder Debuggen.
  • Kompatibilität: Die Methode wird in allen Browsern mit WebGL unterstützt und steht genauso in WebGL2RenderingContext zur Verfügung.