{"record":{"id":"fad42de890552150","repo":"phaserjs/phaser","slug":"oes-vertex-array-object-extension-not-supported-r","errorCode":null,"errorMessage":"OES_vertex_array_object extension not supported. Required for rendering.","messagePattern":"OES_vertex_array_object extension not supported\\. Required for rendering\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/renderer/webgl/WebGLRenderer.js","lineNumber":922,"sourceCode":"                gl.drawArraysInstanced = this.instancedArraysExtension.drawArraysInstancedANGLE.bind(this.instancedArraysExtension);\n                gl.drawElementsInstanced = this.instancedArraysExtension.drawElementsInstancedANGLE.bind(this.instancedArraysExtension);\n            }\n            else\n            {\n                throw new Error('ANGLE_instanced_arrays extension not supported. Required for rendering.');\n            }\n\n            // Incorporate vertex array objects.\n            if (this.vaoExtension)\n            {\n                gl.createVertexArray = this.vaoExtension.createVertexArrayOES.bind(this.vaoExtension);\n                gl.bindVertexArray = this.vaoExtension.bindVertexArrayOES.bind(this.vaoExtension);\n                gl.deleteVertexArray = this.vaoExtension.deleteVertexArrayOES.bind(this.vaoExtension);\n                gl.isVertexArray = this.vaoExtension.isVertexArrayOES.bind(this.vaoExtension);\n            }\n            else\n            {\n                throw new Error('OES_vertex_array_object extension not supported. Required for rendering.');\n            }\n\n            // Incorporate standard derivatives.\n            if (this.standardDerivativesExtension)\n            {\n                gl.FRAGMENT_SHADER_DERIVATIVE_HINT = this.standardDerivativesExtension.FRAGMENT_SHADER_DERIVATIVE_HINT_OES;\n            }\n            else if (game.config.smoothPixelArt)\n            {\n                throw new Error('OES_standard_derivatives extension not supported. Cannot use smoothPixelArt.');\n            }\n        }\n    },\n\n    /**\n     * Sets the handlers that are called when WebGL context is lost or restored by the browser.\n     *\n     * The default handlers are referenced via the properties `WebGLRenderer.contextLostHandler` and `WebGLRenderer.contextRestoredHandler`.","sourceCodeStart":904,"sourceCodeEnd":940,"githubUrl":"https://github.com/phaserjs/phaser/blob/41be1e462bc600064e498cba370bfa8c5c055a22/src/renderer/webgl/WebGLRenderer.js#L904-L940","documentation":"WebGLRenderer.js:922 throws when the OES_vertex_array_object extension is missing under a WebGL1 context. Like the instancing extension, VAOs are required by Phaser's WebGL1 batching pipeline to manage vertex attribute bindings efficiently. WebGL2 provides VAOs natively, so the branch is skipped there.","triggerScenarios":"A WebGL1-only context that does not expose OES_vertex_array_object. Same family as error 17; occurs during `setExtensions`/context setup in the WebGL1 code path.","commonSituations":"Old mobile GPUs/drivers with incomplete WebGL1 extension support; embedded/legacy devices; some software rasterizers that expose only a subset of WebGL1 extensions.","solutions":["Prefer a WebGL2 context (ensure device/browser support WebGL2, which bundles VAOs).","Fall back to Canvas rendering (`type: Phaser.AUTO` or `Phaser.CANVAS`).","Treat the device as unsupported for the WebGL renderer."],"exampleFix":"// before\ntype: Phaser.WEBGL // WebGL1 without OES_vertex_array_object\n// after\ntype: Phaser.CANVAS","handlingStrategy":"fallback","validationCode":"const c = document.createElement('canvas')\nconst gl2 = c.getContext('webgl2')\nlet type\nif (gl2) {\n  type = Phaser.WEBGL\n} else {\n  const gl1 = c.getContext('webgl')\n  const hasVAO = gl1 && gl1.getExtension('OES_vertex_array_object')\n  type = hasVAO ? Phaser.WEBGL : Phaser.CANVAS\n}\nconst game = new Phaser.Game({ type, width: 800, height: 600 })","typeGuard":"const webgl1HasVAO = () => {\n  const c = document.createElement('canvas')\n  const gl = c.getContext('webgl')\n  return !!gl && !!gl.getExtension('OES_vertex_array_object')\n}","tryCatchPattern":"try {\n  game = new Phaser.Game({ type: Phaser.WEBGL, ... })\n} catch (e) {\n  if (/OES_vertex_array_object/.test(e.message)) {\n    game = new Phaser.Game({ type: Phaser.CANVAS, ... })\n  } else { throw e }\n}","preventionTips":["Target WebGL2 devices to avoid the WebGL1 VAO requirement.","Probe for OES_vertex_array_object and fall back to Canvas if absent.","Maintain a documented minimum-spec list when requiring the WebGL renderer."],"tags":["renderer","webgl","extensions","webgl1"],"backgroundTag":null,"analyzedSha":"41be1e462bc600064e498cba370bfa8c5c055a22","analyzedAt":"2026-08-13T04:23:39.729Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}