a WebGL2 framebuffer reads back the same through readPixels and a pixel pack buffer
Every channel agrees between readPixels and the same framebuffer read through a pixel pack buffer. N/A without WebGL2 or when the readback cannot complete (severity: warn).
What a detector infers
WebGL2 has two ways to read a framebuffer: readPixels into an array hands the pixels straight to script, and readPixels into a PIXEL_PACK_BUFFER followed by getBufferSubData copies them through a GPU-side buffer. Both read one framebuffer at one moment, so a genuine browser returns identical bytes — measured 0 differing channels of 4096 on Chrome 153, Edge 153, Chromium 143 and Firefox 144.
The buffer route is a separate code path, and it is the one a readback perturbation tends to miss. When it does, the page is handed two different images of one framebuffer, and the unperturbed one is the real GPU output. Measured on a patched Chromium 153 with a fingerprint seed: 13 channels differ, and the pack-buffer bytes hash identically to genuine Chrome on the same GPU.
Same family as canvas-toblob-vs-todataurl and webgl-readpixels-vs-todataurl: an exit the perturbation never reaches.
How to resolve it
Apply any readback perturbation once, at the point every exit reads from, or not at all. Covering readPixels into an array but not readPixels into a pack buffer both leaks the true pixels and proves the other path was altered.
Nearby checks in Render & GPU
- one pixel reads the same through a full read and a windowed read
canvas-subrect-consistencyThe same pixels, asked for twice through different windows. A full-canvas read and an inner 16×16 read overlap on 256 pixels, and those are… - a canvas reads back the same through toDataURL and getImageData
canvas-todataurl-vs-getimagedatatoDataURL and getImageData are two exits from one canvas, and PNG is lossless, so decoding the data URL back into pixels has to reproduce… - one WebGL clear reads back as exactly one colour
webgl-readback-flat-uniformA single glClear writes one colour into every pixel of the framebuffer, so reading that framebuffer back must yield exactly one colour. - a WebGL framebuffer reads back the same through readPixels and toDataURL
webgl-readpixels-vs-todataurlreadPixels and toDataURL both read the drawing buffer of one WebGL canvas, and PNG is lossless, so decoding the data URL has to reproduce… - WebGL and WebGPU agree on whether this device clears uniformly
webgl-webgpu-readback-agreeOne clear, two GPU APIs, one adapter. WebGL paints a flat colour and reads it back with readPixels; WebGPU renders the same clear into a… - canvas measureText widths on the 1/512 sub-pixel grid
measuretext-gridChrome's 2D text metrics are quantised: advance widths are computed in fixed-point and land on a dyadic 1/512-pixel grid. - text metrics are not a uniform multiple of the engine's own grid
text-metrics-uniform-scaleThis is the sub-pixel grid check asked one question deeper. That check reports THAT widths have left Blink's 1/512-pixel grid; this one asks… - N copies of a glyph measure exactly N times one copy
text-advance-additivityThe advance width of N copies of a single glyph is exactly N times the advance of one copy.
Clearcote is a browser built for fingerprint coherence
It is a Chromium fork, maintained by the same people who wrote this reference. It ships as a compiled browser rather than as a stealth script injected into someone else's — which is a description of how it is built, and is not an argument about how it behaves on this check.
This audit takes no position on how Clearcote scores on Render & GPU checks, on this one, or anywhere else. It has no baseline corpus of other people's fingerprints to rank you against and no vendor scoreboard — nearly every check is self-referential, asking one browser the same question through two independent APIs and reporting whether both answers can be true at once. It runs identically on any browser, including ours. Run it on yours and read the result yourself.
See the other checks in Render & GPU — the family webgl2-pbo-readback-vs-readpixels belongs to.
