From 5ef728a6eec6cfc9470b5627ebd765093bd9a8ae Mon Sep 17 00:00:00 2001 From: Mike Nisbet Date: Fri, 18 Jul 2025 09:09:37 +0100 Subject: [PATCH 1/2] Set `glBinding` separately from layer creation --- src/renderers/webxr/WebXRManager.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/renderers/webxr/WebXRManager.js b/src/renderers/webxr/WebXRManager.js index b5c074fa5bf60e..6cec3bf19cb12f 100644 --- a/src/renderers/webxr/WebXRManager.js +++ b/src/renderers/webxr/WebXRManager.js @@ -398,9 +398,15 @@ class WebXRManager extends EventDispatcher { currentPixelRatio = renderer.getPixelRatio(); renderer.getSize( currentSize ); + if ( typeof XRWebGLBinding !== 'undefined' ) { + + glBinding = new XRWebGLBinding( session, gl ); + + } + // Check that the browser implements the necessary APIs to use an // XRProjectionLayer rather than an XRWebGLLayer - const useLayers = typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding.prototype; + const useLayers = glBinding !== null && 'createProjectionLayer' in XRWebGLBinding.prototype; if ( ! useLayers ) { @@ -453,8 +459,6 @@ class WebXRManager extends EventDispatcher { scaleFactor: framebufferScaleFactor }; - glBinding = new XRWebGLBinding( session, gl ); - glProjLayer = glBinding.createProjectionLayer( projectionlayerInit ); session.updateRenderState( { layers: [ glProjLayer ] } ); From afd2e9121594450bb57a19bb69e47d15c7865f9c Mon Sep 17 00:00:00 2001 From: Mike Nisbet Date: Fri, 18 Jul 2025 13:34:03 +0100 Subject: [PATCH 2/2] Implement in XRManager --- src/renderers/common/XRManager.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/renderers/common/XRManager.js b/src/renderers/common/XRManager.js index 67feb75ed4c62e..3090209fdcf176 100644 --- a/src/renderers/common/XRManager.js +++ b/src/renderers/common/XRManager.js @@ -171,6 +171,15 @@ class XRManager extends EventDispatcher { */ this._supportsLayers = false; + /** + * Whether the device supports binding gl objects. + * + * @private + * @type {boolean} + * @readonly + */ + this._supportsGlBinding = typeof XRWebGLBinding !== 'undefined'; + this._frameBufferTargets = null; /** @@ -357,7 +366,7 @@ class XRManager extends EventDispatcher { * @type {boolean} * @readonly */ - this._useLayers = ( typeof XRWebGLBinding !== 'undefined' && 'createProjectionLayer' in XRWebGLBinding.prototype ); // eslint-disable-line compat/compat + this._useLayers = ( this._supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype ); // eslint-disable-line compat/compat /** * Whether the usage of multiview has been requested by the application or not. @@ -915,9 +924,18 @@ class XRManager extends EventDispatcher { // + if ( this._supportsGlBinding ) { + + const glBinding = new XRWebGLBinding( session, gl ); + this._glBinding = glBinding; + + } + + // + if ( this._useLayers === true ) { - // default path using XRWebGLBinding/XRProjectionLayer + // default path using XRProjectionLayer let depthFormat = null; let depthType = null; @@ -945,11 +963,9 @@ class XRManager extends EventDispatcher { } - const glBinding = new XRWebGLBinding( session, gl ); - const glProjLayer = glBinding.createProjectionLayer( projectionlayerInit ); + const glProjLayer = this._glBinding.createProjectionLayer( projectionlayerInit ); const layersArray = [ glProjLayer ]; - this._glBinding = glBinding; this._glProjLayer = glProjLayer; renderer.setPixelRatio( 1 );