Signal

WebGPU adapter

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

Tier 2 engine src/signals/webgpu.ts

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 26 standardised limit keys. Feature names identify optional GPU capabilities the browser has chosen to expose. Limit values describe maximum resource sizes — 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 2000 ms timeout guard to prevent hangs from unhealthy GPU processes. If the adapter is null, times out, or throws, the signal returns absent. Otherwise it assembles 27 hash parts: one features string (features: followed by sorted names joined with commas) and one string per limit key in the fixed order below. All 27 parts are joined with the pipe delimiter and hashed via xxHash64.

text
maxTextureDimension1D
maxTextureDimension2D
maxTextureDimension3D
maxTextureArrayLayers
maxBindGroups
maxBindGroupsPlusVertexBuffers
maxBindingsPerBindGroup
maxDynamicUniformBuffersPerPipelineLayout
maxDynamicStorageBuffersPerPipelineLayout
maxSampledTexturesPerShaderStage
maxSamplersPerShaderStage
maxStorageBuffersPerShaderStage
maxStorageTexturesPerShaderStage
maxUniformBuffersPerShaderStage
maxUniformBufferBindingSize
maxStorageBufferBindingSize
maxVertexBuffers
maxBufferSize
maxVertexAttributes
maxVertexBufferArrayStride
maxComputeWorkgroupStorageSize
maxComputeInvocationsPerWorkgroup
maxComputeWorkgroupSizeX
maxComputeWorkgroupSizeY
maxComputeWorkgroupSizeZ
maxComputeWorkgroupsPerDimension

All 26 limit keys, in hash order (src/signals/webgpu.ts:35-48)

Confidence rules

ConfidenceTrigger
normalAdapter obtained and data collected successfully
absentnavigator.gpu missing, requestAdapter() returns null, times out after 2000 ms, 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, maxBufferSize and maxComputeWorkgroupStorageSize 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.
  • An earlier version of this signal included compute shader timing in the hash; it was removed because timing varies by browser state and is not stable across sessions.