From 31530f726cc822bf2c652a979dbc594d77d329c4 Mon Sep 17 00:00:00 2001 From: Raanan Weber Date: Fri, 3 May 2024 14:11:32 +0200 Subject: [PATCH] xrCompatible false per default, canvas made compatible on demand (#15027) --- packages/dev/core/src/Engines/thinEngine.ts | 2 +- .../core/src/XR/webXRManagedOutputCanvas.ts | 24 +++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/dev/core/src/Engines/thinEngine.ts b/packages/dev/core/src/Engines/thinEngine.ts index f5c2f887945..d504b79a6c7 100644 --- a/packages/dev/core/src/Engines/thinEngine.ts +++ b/packages/dev/core/src/Engines/thinEngine.ts @@ -298,7 +298,7 @@ export class ThinEngine extends AbstractEngine { } if (options.xrCompatible === undefined) { - options.xrCompatible = true; + options.xrCompatible = false; } // Exceptions diff --git a/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts b/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts index 253dbe35293..e9088fa23d1 100644 --- a/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts +++ b/packages/dev/core/src/XR/webXRManagedOutputCanvas.ts @@ -73,6 +73,8 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { */ public onXRLayerInitObservable: Observable = new Observable(); + private _canvasCompatiblePromise: Promise; + /** * Initializes the canvas to be added/removed upon entering/exiting xr * @param _xrSessionManager The XR Session manager @@ -102,6 +104,8 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { _xrSessionManager.onXRSessionEnded.add(() => { this._removeCanvas(); }); + + this._makeCanvasCompatibleAsync(); } /** @@ -112,6 +116,18 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { this._setManagedOutputCanvas(null); } + private _makeCanvasCompatibleAsync() { + this._canvasCompatiblePromise = new Promise((resolve) => { + if (this.canvasContext && (this.canvasContext as any).makeXRCompatible) { + (this.canvasContext as any).makeXRCompatible().then(() => { + resolve(); + }); + } else { + resolve(); + } + }); + } + /** * Initializes a XRWebGLLayer to be used as the session's baseLayer. * @param xrSession xr session @@ -125,13 +141,7 @@ export class WebXRManagedOutputCanvas implements WebXRRenderTarget { return this.xrLayer; }; - // support canvases without makeXRCompatible - if (!(this.canvasContext as any).makeXRCompatible) { - return Promise.resolve(createLayer()); - } - - return (this.canvasContext as any) - .makeXRCompatible() + return this._canvasCompatiblePromise .then( // catch any error and continue. When using the emulator is throws this error for no apparent reason. () => {},