Orange textured background

Signal

WebGPU adapter

Fingerprints the GPU adapter by collecting its supported feature names and the full set of limit values, approximately 40% of which are browser-imposed caps rather than hardware maxima.

Reviewed

Tier 2 engine

What it measures

The signal reads two things from the WebGPU adapter: the set of supported feature names (sorted for determinism) and the values of the standardised limit keys. Feature names identify optional GPU capabilities the browser has chosen to expose. Limit values describe maximum resource sizes such as texture dimensions, buffer sizes, workgroup counts, and so on.

Approximately 40% of these limits are browser-imposed caps rather than hardware maximums. Chrome, Safari, and Firefox report different feature subsets and different limit values for identical GPUs, making the combined hash engine-discriminating even when the underlying hardware is the same.

How it is collected

After confirming navigator.gpu is present, the signal calls gpu.requestAdapter() wrapped in a guard timeout against GPU-process hangs. If the adapter is null, times out, or throws, the signal returns absent. Otherwise it assembles the hash input: a features string built from the sorted feature names, plus one entry per limit key in a fixed order. The parts are joined with a delimiter and hashed via xxHash64.

Confidence rules

ConfidenceTrigger
normalAdapter obtained and data collected successfully
absentnavigator.gpu missing, requestAdapter() returns null, times out, or any top-level error

Why engine-bound

The WebGPU specification allows browsers to impose caps lower than hardware maximums for security and compatibility. Chrome, Firefox, and Safari report different feature subsets and different limit values for the same GPU. For example, buffer-size and compute-workgroup-storage limits are commonly capped differently by browser security policy. The feature set also diverges: some features are enabled in Chrome but not yet in Safari. This makes the combined hash engine-discriminating even on identical hardware.

Things worth knowing

  • Features are sorted before joining to ensure hash determinism regardless of the iteration order returned by GPUSupportedFeatures.
  • If a limit key is absent on the GPUSupportedLimits object, the hash includes an empty string for that key, correctly distinguishing a missing property from a property that reports 0.
  • Timing-based measurements are deliberately excluded from the hash because they vary by browser state and are not stable across sessions.

Last reviewed 2026-06-04