{"record":{"id":"80c87446d2ed9021","repo":"phaserjs/phaser","slug":"angle-instanced-arrays-extension-not-supported-re","errorCode":null,"errorMessage":"ANGLE_instanced_arrays extension not supported. Required for rendering.","messagePattern":"ANGLE_instanced_arrays extension not supported\\. Required for rendering\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"src/renderer/webgl/WebGLRenderer.js","lineNumber":909,"sourceCode":"\n        var stdDerivativesString = 'OES_standard_derivatives';\n\n        this.standardDerivativesExtension = (exts.indexOf(stdDerivativesString) > -1) ? gl.getExtension(stdDerivativesString) : null;\n\n        // Make WebGL2 core features which were extensions available on the WebGL1 context.\n        // This allows us to use a WebGL2 context.\n        if (gl instanceof WebGLRenderingContext)\n        {\n            // Incorporate instanced arrays.\n            if (this.instancedArraysExtension)\n            {\n                gl.vertexAttribDivisor = this.instancedArraysExtension.vertexAttribDivisorANGLE.bind(this.instancedArraysExtension);\n                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            {","sourceCodeStart":891,"sourceCodeEnd":927,"githubUrl":"https://github.com/phaserjs/phaser/blob/41be1e462bc600064e498cba370bfa8c5c055a22/src/renderer/webgl/WebGLRenderer.js#L891-L927","documentation":"WebGLRenderer.js:909 throws during WebGL1 extension incorporation when `this.instancedArraysExtension` (ANGLE_instanced_arrays) is null. Phaser's WebGL1 renderer requires hardware instancing to batch sprites/particles; without it the renderer cannot be built. The branch only runs when `gl instanceof WebGLRenderingContext` (WebGL1) — WebGL2 provides instancing natively.","triggerScenarios":"Running on a WebGL1-only context where the ANGLE_instanced_arrays extension is unavailable or disabled. WebGL2 contexts skip this branch entirely, so this is effectively a legacy/old-device failure.","commonSituations":"Very old mobile devices or GPUs that expose WebGL1 but not the ANGLE instancing extension; browsers/drivers that disable optional WebGL1 extensions; test environments pinned to WebGL1.","solutions":["Force a WebGL2 context where possible (newer Phaser builds prefer WebGL2 if available) — ensure the browser/device supports it.","Upgrade the target device/browser to one that exposes ANGLE_instanced_arrays or WebGL2.","Accept the device is unsupported by Phaser's WebGL renderer and fall back to `type: Phaser.CANVAS`."],"exampleFix":"// before (WebGL1 device without ANGLE_instanced_arrays)\ntype: Phaser.WEBGL\n// after\ntype: Phaser.AUTO // or Phaser.CANVAS on that device","handlingStrategy":"fallback","validationCode":"const c = document.createElement('canvas')\nconst gl2 = c.getContext('webgl2')\nlet type\nif (gl2) {\n  type = Phaser.WEBGL // WebGL2 has instancing built in\n} else {\n  const gl1 = c.getContext('webgl')\n  const hasInstancing = gl1 && gl1.getExtension('ANGLE_instanced_arrays')\n  type = hasInstancing ? Phaser.WEBGL : Phaser.CANVAS\n}\nconst game = new Phaser.Game({ type, width: 800, height: 600 })","typeGuard":"const webgl1HasInstancing = () => {\n  const c = document.createElement('canvas')\n  const gl = c.getContext('webgl')\n  return !!gl && !!gl.getExtension('ANGLE_instanced_arrays')\n}","tryCatchPattern":"try {\n  game = new Phaser.Game({ type: Phaser.WEBGL, ... })\n} catch (e) {\n  if (/ANGLE_instanced_arrays/.test(e.message)) {\n    game = new Phaser.Game({ type: Phaser.CANVAS, ... })\n  } else { throw e }\n}","preventionTips":["Prefer WebGL2 contexts to bypass the WebGL1 extension requirements.","Detect instancing support before committing to WEBGL and fall back to CANVAS.","Document minimum device requirements if WebGL is mandatory."],"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"}