mrdoob/three.js · critical · Error

THREE.WebGPUBackend: Unable to create WebGPU adapter.

Error message

THREE.WebGPUBackend: Unable to create WebGPU adapter.

What it means

Thrown by WebGPUBackend.init() when navigator.gpu.requestAdapter() resolves to null (or navigator.gpu is absent and the call is skipped). A null adapter means the browser could not provide any WebGPU-capable GPU adapter under the requested options — so there is no device to create and the backend cannot function.

Source

Thrown at src/renderers/webgpu/WebGPUBackend.js:225

		const parameters = this.parameters;

		// create the device if it is not passed with parameters

		let device;

		if ( parameters.device === undefined ) {

			const adapterOptions = {
				powerPreference: parameters.powerPreference,
				featureLevel: 'compatibility',
				xrCompatible: renderer.xr.enabled
			};

			const adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;

			if ( adapter === null ) {

				throw new Error( 'THREE.WebGPUBackend: Unable to create WebGPU adapter.' );

			}

			// feature support

			const features = Object.values( GPUFeatureName );

			const supportedFeatures = [];

			for ( const name of features ) {

				if ( adapter.features.has( name ) ) {

					supportedFeatures.push( name );

				}

			}

View on GitHub (pinned to da05705fa3)

Solutions

  1. Feature-detect WebGPU before constructing the renderer: `if (!navigator.gpu) { fall back to WebGL }`.
  2. Fall back to a WebGLRenderer (WebGLBackend) when requestAdapter returns null or throws.
  3. Relax adapterOptions (drop powerPreference/featureLevel) and retry.
  4. Ensure the browser is WebGPU-capable and GPU drivers are up to date; in tests use a GPU-enabled headless setup (e.g. HeadlessShell with SwiftShader).

Example fix

// before
const renderer = new WebGPURenderer(); // throws in init() if no adapter
await renderer.init();

// after
let renderer;
if (navigator.gpu && (await navigator.gpu.requestAdapter().catch(() => null))) {
  renderer = new WebGPURenderer();
  await renderer.init();
} else {
  renderer = new WebGLRenderer();
}
Defensive patterns

Strategy: fallback

Validate before calling

async function createRendererWithFallback(params) {
  if (navigator.gpu) {
    const adapter = await navigator.gpu.requestAdapter({ powerPreference: params.powerPreference }).catch(() => null);
    if (adapter) { const r = new THREE.WebGPURenderer(params); await r.init(); return { renderer: r, backend: 'webgpu' }; }
  }
  return { renderer: new THREE.WebGLRenderer(params), backend: 'webgl' };
}

Type guard

async function webgpuSupported() {
  return typeof navigator !== 'undefined' && !!navigator.gpu && !!(await navigator.gpu.requestAdapter().catch(() => null));
}

Try / catch

try {
  renderer = new THREE.WebGPURenderer(params);
  await renderer.init();
} catch (e) {
  if (/Unable to create WebGPU adapter/.test(e.message)) { renderer = new THREE.WebGLRenderer(params); }
  else throw e;
}

Prevention

When it happens

Trigger: Constructing WebGPURenderer/WebGPUBackend in a browser without WebGPU support, with WebGPU disabled by flags, on an outdated GPU/driver, in a headless/SSR context (no navigator.gpu), or with adapterOptions the system cannot satisfy.

Common situations: Running in Firefox/Safari without WebGPU enabled. Linux machines without proper GPU drivers. CI/headless browsers lacking GPU adapters. Over-constrained powerPreference or featureLevel options. End-user machines with blocked/unsupported GPUs.

Related errors


AI-assisted analysis of mrdoob/three.js@da05705fa3 (2026-08-12). Data as JSON: /api/errors/c4f052f6bef7088f. Report an issue: GitHub.