Mobile GPU string with software/desktop-level vertex or fragment uniform capacity

br.mobile_gpu_uniforms_software  ·  convicts

browserlayer
coherencecategory

What it catches

Closes the LOW-END-GPU evasion of the mobile GPU-caps checks. br.mobile_gpu_caps_mismatch + br.webgl_maxtexture_unallocatable key on the 16384 HIGH-end texture floor, so a source-fork claiming a LOW-END mobile GPU string (e.g. 'Adreno 505', real MAX_TEXTURE_SIZE 8192) over the SwiftShader backend EVADES them — SwiftShader's 8192 maxTexture coincides with a genuine low-end phone GPU (GROUNDED: KS_RENDERER='Adreno 505' fires none of mobile_gpu_not_mobile / mobile_gpu_caps_mismatch / webgl_maxtexture_unallocatable / webgl_software). But SwiftShader ALSO reports MAX_VERTEX_UNIFORM_VECTORS = MAX_FRAGMENT_UNIFORM_VECTORS = 4096, a SOFTWARE/desktop value: real mobile GPUs report 256-1024 (Adreno on a Nexus 5 = 256 vectors / 1024 components per the Qualcomm developer docs; mobile WebGL is 256-1024, desktop up to 1024, software 4096). So a renderer STRING naming ANY mobile GPU family (Adreno/Mali/Immortalis/PowerVR/Xclipse) whose vertex OR fragment uniform capacity exceeds 2048 is a software backend wearing a mobile-GPU name. CONVICTING (w0.6). FP-SAFE: no real mobile GPU reaches 2048 (the 256-1024 band leaves wide margin, and values are power-of-two-quantised so the next step above 1024 is 2048 which mobile does not use); a real DESKTOP reporting 4096 uniforms carries a desktop renderer string, OUT of the mobile-family scope; SwiftShader/llvmpipe naming THEMSELVES are caught by webgl_software. CALIBRATION CAVEAT (2026-07-02 FP audit, prompted by the mobile_gpu_caps_mismatch 16384-assumption fix): the 256-1024 mobile band is grounded on the Nexus-5 data point + the GLES-3.0 spec-min 256 + mobile GPUs' register constraint, but a MODERN-FLAGSHIP's exact vu is UNVERIFIED in-sandbox — if any real flagship reports vu > 2048 this convicting arm needs real-device recalibration. The FP-SAFE BACKSTOP is br.gpu_uniform_underreport (the actual-shader-compile probe), which assumes NO constant (a shader exceeding the CLAIMED uniform count links only if the real backend exceeds the claim), and w0.6 EXPERIMENTAL keeps this value-arm CORROBORATING, not solely-convicting, pending that calibration. EXPERIMENTAL. GROUNDED LIVE: KS_RENDERER='Adreno 505' (a low-end mobile string over SwiftShader's vu/fu 4096) FIRES mobile_gpu_uniforms_software while ALL the texture-floor GPU rungs stay silent — catching the low-end source-fork none of them see. RED counter (spoof the uniform caps DOWN to 256) is the next-level tell: an actual-shader-compile probe (a vertex shader using > the claimed uniform count still links on the real 4096 backend) — unspoofable, follow-up rung.

Signals it reads

browser.mobile_gpu_uniforms_software

How it fires

present

Bypassed by 10

Frontier evaders that reach the detector uncaught (scored only suspicious, defeating every convicting tell) — this check is not one that stops them. The red-team frontier this detection still has to convict.

← all detections