v146 · Web APIs · WebGPU

WebGPU compatibility mode

Chrome 146 adds WebGPU compatibility mode — a subset of WebGPU that can run on OpenGL ES 3.1 and OpenGL 4.4, in addition to the primary backends (Vulkan, Metal, D3D12). This extends WebGPU to hardware and platforms where Vulkan is not available.

concepts

  1. Compatibility Demo

    Requests a WebGPU adapter in compatibility mode using the featureLevel: 'compatibility' option, and reports which adapter was returned and what the device's limits are.

  2. Compatibility Limits

    What features are restricted in compatibility mode versus full WebGPU, why each restriction exists (OpenGL ES limits), and how to write shaders that work in both modes.

  3. Feature fallback matrix

    The full optional-feature table evaluated against your device's adapters. Switch between compatibility and core requests and see which features come back.

  4. Feature Matrix

    Full filterable table of WebGPU features versus compatibility mode — sorted by category, showing which are supported, partially limited, or unavailable. Includes a live GPU adapter probe to see which mode your device can deliver.

why it shipped

Standard WebGPU targets modern GPU APIs — Vulkan on Linux/Android, Metal on Apple, D3D12 on Windows. These are not universally available: some Android devices only support OpenGL ES, some Linux systems lack Vulkan drivers, and embedded or older hardware may not support these APIs at all. WebGPU compatibility mode maps to OpenGL ES 3.1+ (Android, embedded) and OpenGL 4.4+ (desktop Linux without Vulkan), with a small set of restrictions to stay within what these APIs support. The result: WebGPU reaches more devices.

the change

// Request a compatibility mode adapter (Chrome 146+)
const adapter = await navigator.gpu.requestAdapter({
  featureLevel: 'compatibility',  // new in Chrome 146
});

if (!adapter) {
  // Not supported — fall back to canvas 2D or WebGL
  throw new Error('No WebGPU adapter available');
}

const device = await adapter.requestDevice();

// Check if running in compatibility mode
console.log(adapter.featureLevel); // 'compatibility' or 'core'

// Compatibility mode restrictions:
// - No cube array textures
// - No separate depth/stencil aspects for textures
// - No multi-draw-indirect
// - WGSL: no sample_mask built-in
// Code that avoids these features works in both modes

references