In September 2026, caniuse.com 3,038 puts WebGPU at 87.35% of global usage (85.72% full plus 1.63% partial), while MDN 102 still labels it Limited availability rather than Baseline, because Firefox 555 and Safari 10 do not enable it everywhere.
| Browser | On by default since | Where |
|---|---|---|
| Chrome 1 , Edge | 113 (2023) | Windows, macOS, ChromeOS; Android from 121 |
| Chrome on Linux | 144 | Intel Gen12+ GPUs; NVIDIA on Wayland from 147 |
| Safari | 26 (September 2025) | macOS 26, iOS, iPadOS and visionOS 26 |
| Firefox | 141 (July 2025) | Windows; Apple Silicon Macs from 145 |
WebGPU exists only in secure contexts (HTTPS or localhost), on the main thread and in workers. Detect it in two steps, because navigator.gpu can exist while requestAdapter() returns null on a blocklisted GPU:
<style>body { display: flex; gap: 16px } pre { font-size: 15px }</style>
<canvas id="swatch" width="110" height="110"></canvas>
<pre id="report"></pre>
<script type="module">
let text = 'WebGPU: not available, fall back to WebGL 2';
const adapter = navigator.gpu && await navigator.gpu.requestAdapter();
if (navigator.gpu && !adapter) text = 'WebGPU: no usable adapter, fall back';
if (adapter) {
const device = await adapter.requestDevice();
const context = swatch.getContext('webgpu');
const format = navigator.gpu.getPreferredCanvasFormat();
context.configure({ device, format });
const encoder = device.createCommandEncoder();
const view = context.getCurrentTexture().createView();
encoder.beginRenderPass({ colorAttachments: [{ view, loadOp: 'clear', storeOp: 'store',
clearValue: [0.08, 0.40, 0.75, 1] }] }).end();
device.queue.submit([encoder.finish()]);
await device.queue.onSubmittedWorkDone();
text = `WebGPU: available\nGPU: ${adapter.info.vendor}, ${adapter.info.architecture}\n`
+ `Canvas format: ${format}\nOptional features: ${adapter.features.size}`;
}
report.textContent = text;
window.__done = true;
</script>
The blue square is a real render pass on this book's GTX 1650.