# WebXR/WebGPU Binding

**URL:** <https://forum.babylonjs.com/t/webxr-webgpu-binding/63712>\
**Category:** Feature requests\
**Tags:** webgpu, webxr, quest\
**Created:** [June 29, 2026, 11:11am UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712 "2026-06-29T11:11:42Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![SirFizX](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/sirfizx/32/11703_2.png) [@SirFizX](https://forum.babylonjs.com/u/SirFizX)\
**Post date:** [June 29, 2026, 11:11am UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/1 "2026-06-29T11:11:42Z")

</div>

**The spec is finally moving.** The WebXR/WebGPU Binding is now an official Immersive Web **Editor’s Draft (dated 15 June 2026)**. It defines XRGPUBinding where you request an xrCompatible GPUDevice and create WebGPU-backed projection/composition layers instead of XRWebGLLayer. After ~3 years of the proposal sitting dead, it’s active again, largely because Quest Browser shipping WebGPU made it worth doing. As a result, can we expect Babylon to enable a WebGPU backend for immersive mode sometime in the near future? 🥳

[https://immersive-web.github.io/WebXR-WebGPU-Binding/](https://immersive-web.github.io/WebXR-WebGPU-Binding/)

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [June 29, 2026, 3:01pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/2 "2026-06-29T15:01:52Z")

</div>

Things are happening. I will keep you updated about the WebGPU support.

---

<div class="post-metadata">

**Author:** ![drumath2237](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/drumath2237/32/27431_2.png) [@drumath2237](https://forum.babylonjs.com/u/drumath2237)\
**Post date:** [June 29, 2026, 5:07pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/3 "2026-06-29T17:07:32Z")

</div>

Oh, the link of the proposal has been updated to below I think:

> **[WebXR/WebGPU Binding Module - Level 1](https://immersive-web.github.io/webxr-webgpu-binding/)**

---

<div class="post-metadata">

**Author:** ![sebavan](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/sebavan/32/57_2.png) [@sebavan](https://forum.babylonjs.com/u/sebavan)\
**Post date:** [June 29, 2026, 5:41pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/4 "2026-06-29T17:41:05Z")

</div>

Yup, we are actively connected with the spec ppl there 🙂

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [July 1, 2026, 11:55am UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/5 "2026-07-01T11:55:59Z")

</div>

If anyone wants to track the work - [[Epic] WebGPU support for WebXR · Issue #18635 · BabylonJS/Babylon.js · GitHub](https://github.com/BabylonJS/Babylon.js/issues/18635)

Experimental on the quest browser is more than enough to start playing around with it 🙂

---

<div class="post-metadata">

**Author:** ![nurse-the-code](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/nurse-the-code/32/17623_2.png) [@nurse-the-code](https://forum.babylonjs.com/u/nurse-the-code)\
**Post date:** [July 9, 2026, 8:36pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/6 "2026-07-09T20:36:17Z")

</div>

Will this help unlock WebXR support for Babylon Lite?

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [July 10, 2026, 12:16pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/7 "2026-07-10T12:16:38Z")

</div>

Of course. WebXR for lite is already partly implemented, but will stay experimental for a long time because of the lack of WebGPU support in most browsers. It is not yet commited and there are still things to be fixed. But know that I am working on it.

---

<div class="post-metadata">

**Author:** ![DougReeder](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/dougreeder/32/42469_2.png) [@DougReeder](https://forum.babylonjs.com/u/DougReeder)\
**Post date:** [September 17, 2026, 7:42pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/8 "2026-09-17T19:42:30Z")

</div>

What all has to be done to check and set up WebGPU with WebXR if it is fully supported (and fall back to WebGL?)

I’ve attempted to create a Playground, but haven’t figured out how even to get ordinary WebGPU running in the Playground — my latest attempt is

```auto
export const createEngine = async function () {
    const cvs = (typeof canvas !== "undefined" && canvas) || document.querySelector("canvas");
    let supported = false;
    try {
        supported = !!(BABYLON.WebGPUEngine && (await BABYLON.WebGPUEngine.IsSupportedAsync));
    } catch (e) {
        console.error(e);
    }

    if (supported) {
        try {
            const wgpu = new BABYLON.WebGPUEngine(cvs, { xrCompatible: true, antialias: true });
            await wgpu.initAsync();
            return wgpu;
        } catch (e) {
            console.error(e);
        }
    }
    const gl = new BABYLON.Engine(cvs, true, { preserveDrawingBuffer: true, stencil: true, xrCompatible: true });
    return gl;
};

```

based on [https://playground.babylonjs.com/#55MXDY#0](https://playground.babylonjs.com/#55MXDY#0)

Based on [Babylon.js docs](https://doc.babylonjs.com/features/featuresDeepDive/webXR/webGPUXR/) the code in my app checks both `WebGPUEngine.IsSupportedAsync` and `const isXRLayersSupported = WebXRFeaturesManager.GetAvailableFeatures().includes(WebXRFeatureName.LAYERS);`

```auto
async function createEngineForImmersiveXR(canvas: HTMLCanvasElement, isXRLayersSupported: boolean, willUseXR: boolean) : Promise<WebGPUEngine | Engine> {
    const webGPUSupported = await WebGPUEngine.IsSupportedAsync;
    // Includes XRGPUBinding projection APIs and XRGPUSubImage.getViewDescriptor.
    // @ts-ignore
    const webGPUXRSupported = WebXRSessionManager.IsWebGPUXRSupported;

    console.log(`isXRLayersSupported`, isXRLayersSupported, `willUseXR`, willUseXR, `webGPUSupported`, webGPUSupported, `webGPUXRSupported`, webGPUXRSupported);
    dialog.show(`isXRLayersSupported ${isXRLayersSupported}\nwillUseXR ${willUseXR}\nwebGPUSupported ${webGPUSupported}\nwebGPUXRSupported ${webGPUXRSupported}`);

    if (webGPUSupported && (willUseXR ? webGPUXRSupported && isXRLayersSupported : true)) {
        let engine: WebGPUEngine;
        try {
            console.log(`new WebGPU options:`, { xrCompatible: willUseXR && webGPUXRSupported && isXRLayersSupported });
            engine = new WebGPUEngine(canvas, { xrCompatible: willUseXR && webGPUXRSupported && isXRLayersSupported });
            await engine.initAsync();
            return engine;
        } catch (error) {
            // @ts-ignore
            engine?.dispose();
            console.warn("failed to initialize an XR-compatible WebGPU engine; using WebGL instead:", error);
            const msgs = errToMessages(error as ErrorLike, new Set(["failed to initialize an XR-compatible WebGPU engine"]));
            for (let msg of msgs) {
                dialog.show(msg);
            }
        }
    }

    return new Engine(canvas, true, {xrCompatible: willUseXR});
}

```

When the system supports WebGPU but not WebGL, this creates a WebGPU engine that works fine.

With this, I can create a default WebXRExperience, which runs in flat mode (and in immersive modes when a WebGL engine is selected), but when `webGPUSupported`, `webGPUXRSupported`and`isXRLayersSupported` are all true, I click the button to go into `immersive-ar` or `immersive-vr` mode, it fails and this is logged to the console:

BJS - [15:46:07]: Error: One or more required features are not supported by the device.  
logger.js:52 BJS - [15:46:07]: One or more required features are not supported by the device.

---

<div class="post-metadata">

**Author:** ![RaananW](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/raananw/32/28955_2.png) [@RaananW](https://forum.babylonjs.com/u/RaananW)\
**Post date:** [September 24, 2026, 6:43pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/9 "2026-09-24T18:43:23Z")

</div>

thanks, I will look into that!

---

<div class="post-metadata">

**Author:** ![matthargett](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/matthargett/32/32743_2.png) [@matthargett](https://forum.babylonjs.com/u/matthargett)\
**Post date:** [October 1, 2026, 7:24pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/10 "2026-10-01T19:24:15Z")

</div>

FWIW, it’s pretty tricky and it took me a few days in my BabylonNative wgpu branch to get my Factotum WebXR app launching and working in WebXR-on-WebGPU across Pico, Quest, HTC, and Apple Vision Pro. Pro tip: for lower-end Qualcomm XR2 gen 1 devices, and for AR on iPhone XR, the WebGPU feature multi-draw indirect is an absolute necessity. Even on Qualcomm XR Elite, it helps keep CPU clocks lower which helps with thermals and battery life while maintaining 72-90fps.

---

<div class="post-metadata">

**Author:** ![DougReeder](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/dougreeder/32/42469_2.png) [@DougReeder](https://forum.babylonjs.com/u/DougReeder)\
**Post date:** [October 3, 2026, 1:18pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/11 "2026-10-03T13:18:13Z")

</div>

> [@matthargett](#):
>
> WebGPU feature multi-draw indirect

Is it possible to enable that in a webapp? I can set `enableIndirectDraw` in the `WebGPUEngine` constructor arguments, but I’m not seeing that multi-draw indirect is available.

---

<div class="post-metadata">

**Author:** ![matthargett](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/matthargett/32/32743_2.png) [@matthargett](https://forum.babylonjs.com/u/matthargett)\
**Post date:** [October 14, 2026, 3:21am UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/12 "2026-10-14T03:21:10Z")

</div>

the underlying WebGPU implementation has to have the feature enabled on the given adapter. my wgpu branch of BabylonNative is building against a PR branch of wgpu itself: [use Metal's Indirect Command Buffers for true GPU-side multi draw indirect by matthargett · Pull Request #9640 · gfx-rs/wgpu · GitHub](https://github.com/gfx-rs/wgpu/pull/9640) . the nice thing with BabylonNative is that we can build beyond the edge of the current desktop browser uptake of recent standards work 🙂

---

<div class="post-metadata">

**Author:** ![withADoveInOneHand](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/withadoveinonehand/32/1243_2.png) [@withADoveInOneHand](https://forum.babylonjs.com/u/withADoveInOneHand)\
**Post date:** [October 14, 2026, 11:09pm UTC](https://forum.babylonjs.com/t/webxr-webgpu-binding/63712/13 "2026-10-14T23:09:23Z")

</div>

I notice with the browser flag for GPU bindings on, XR is working well on the latest Blink distros.  
Appreciate @RaananW et al. for that. That was my main hesitancy from Lite.
