v139 · Web APIs · WebGPU

WebGPU compatibility mode

Chrome 139 starts an origin trial for 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. Adapter Feature Explorer

    Probe both featureLevel: 'core' and featureLevel: 'compatibility' on the current device. Side-by-side tables of every relevant feature and limit, with a Δ pill on each delta.

  4. Cross-Platform Renderer

    Requests both a standard and a featureLevel: 'compatibility' adapter and renders a triangle to two side-by-side canvases. Shows backend, adapter name, and a "feature diff" panel listing what's available in core but restricted in compat mode. Includes a platform compatibility table and a "who should use compat mode?" decision tree.

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
const adapter = await navigator.gpu.requestAdapter({
  featureLevel: 'compatibility',
});

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