Seatext library / BotRefund evidence
How to Test Whether Your Browser Passes WebGL Texture Constraint Detection
You can test your browser's WebGL texture constraints using browser developer tools or online fingerprinting tools like BrowserLeaks. The test checks whether your GPU's reported texture limits match what a normal browser on your...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
To test whether your browser passes WebGL texture constraint detection, open your browser's developer tools (F12), go to the Console tab, and run a small WebGL snippet that reads MAX_TEXTURE_SIZE, MAX_CUBE_MAP_TEXTURE_SIZE, MAX_RENDERBUFFER_SIZE, and MAX_TEXTURE_IMAGE_UNITS. Compare the returned values against the typical limits for your GPU and operating system. For a quicker, no-code check, visit BrowserLeaks WebGL report — it displays the same parameters in a readable table and highlights values that fall outside common ranges.
What WebGL Texture Constraint Detection Is
WebGL texture constraint detection examines the texture-related limits your browser reports through the WebGL API. These limits — maximum texture dimensions, cube-map sizes, renderbuffer sizes, and texture image units — are determined by your GPU driver and browser implementation. A normal browser on a given hardware/OS combination reports a consistent set of values. Bot-detection systems like BotRefund use this signal as one of 106 independent checks to spot mismatches between the device a browser claims to be and the graphics capabilities it actually exposes.
According to BotRefund, "A normal browser reports hardware, graphics, fonts, and operating-system details that naturally fit together for that device. The WebGL Texture Constraint check looks for a mismatch that a real browsing session does not normally create." Virtual machines, spoofed user-agent strings, and headless automation frameworks often fail to replicate the exact texture limits of the device they imitate.
Why Test Your Own Browser's WebGL Fingerprint
- Privacy awareness: Knowing what your browser reveals helps you understand how identifiable you are.
- Development debugging: If you build WebGL applications, you need to know the real limits on your users' devices.
- Bot-detection readiness: Ad-fraud platforms treat texture-limit anomalies as evidence — not a verdict — but a clean fingerprint reduces false positives.
- Tool validation: Privacy extensions, VPNs, and anti-fingerprinting tools sometimes alter WebGL output; testing confirms whether they work as advertised.
Prerequisites Before You Test
- A desktop or laptop browser with WebGL 1.0 or 2.0 support (Chrome, Firefox, Edge, Safari).
- Hardware acceleration enabled in browser settings (usually on by default).
- No active privacy extensions that spoof WebGL — or know which ones are running so you can interpret results correctly.
- Your GPU model and driver version (check via
chrome://gpu,about:supportin Firefox, or system settings).
Step-by-Step Test Procedure (Readiness Checklist)
- Open the WebGL context. In DevTools Console, paste:
const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('webgl2'); if (!gl) { console.log('WebGL not supported'); } - Query the texture limits. Run:
const limits = { maxTextureSize: gl.getParameter(gl.MAX_TEXTURE_SIZE), maxCubeMapTextureSize: gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE), maxRenderbufferSize: gl.getParameter(gl.MAX_RENDERBUFFER_SIZE), maxTextureImageUnits: gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS), maxVertexTextureImageUnits: gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS), maxCombinedTextureImageUnits: gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS), }; console.table(limits); - Record the renderer string. Run:
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info'); if (debugInfo) { console.log('Unmasked renderer:', gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL)); console.log('Unmasked vendor:', gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL)); } - Compare against reference values. Search for your GPU model + "MAX_TEXTURE_SIZE" or check the BrowserLeaks report for your browser version. Typical modern discrete GPUs report 16384 or 32768 for
MAX_TEXTURE_SIZE; integrated graphics often report 8192 or 16384. - Run the BrowserLeaks cross-check. Visit browserleaks.com/webgl and verify the table matches your console output. The site also shows a "fingerprint hash" — note it for later comparison.
- Test with privacy tools on/off. If you use a fingerprinting blocker (CanvasBlocker, Trace, etc.), repeat steps 1–5 with the extension enabled and disabled. Differences indicate what the tool modifies.
- Document anomalies. Any value that deviates significantly from the reference for your GPU/OS is an anomaly. A single anomaly is not a bot verdict — BotRefund notes that "privacy tools, travel, corporate networks, and unusual devices can produce unexpected behavior for genuine people."
Interpreting Results
| Result Pattern | Likely Cause | Action |
|---|---|---|
| All limits match reference for your GPU/OS | Normal browser, no spoofing | No action needed |
| Renderer string shows "SwiftShader", "llvmpipe", or "Mesa" on known discrete GPU | Software rendering fallback (driver issue, VM, headless) | Update GPU drivers; check VM GPU passthrough |
| MAX_TEXTURE_SIZE far below expected (e.g., 2048 on modern GPU) | WebGL context limited by iframe sandbox, content-security-policy, or headless flag | Test in top-level window; check CSP headers |
| Values change between runs with same browser | Fingerprint randomizer extension active | Expected if you use anti-fingerprinting tool |
| Unmasked vendor/renderer missing | Browser or extension blocks WEBGL_debug_renderer_info | Normal for Safari; on Chrome/Firefox indicates blocker |
Common Issues and Limitations
- No universal pass/fail threshold: Texture limits vary by GPU generation, driver version, and OS. A value that looks low on a desktop RTX 4080 may be normal for a 2015 MacBook Air.
- Single signal is not a verdict: BotRefund emphasizes that "a single anomaly is not a bot verdict" and cross-checks this signal against independent browser, network, device, and behavior data.
- Privacy tools create intentional anomalies: Extensions that randomize WebGL output will make your fingerprint fail a strict comparison — that's their job.
- Headless browsers often fail: Chrome Headless, Puppeteer, and Playwright without GPU acceleration typically report software renderers and reduced limits.
- Mobile browsers differ: Mobile GPUs (Adreno, Mali, Apple GPU) have different limit profiles; compare only against same-device references.
- WebGL 2 adds more limits:
MAX_3D_TEXTURE_SIZE,MAX_ARRAY_TEXTURE_LAYERS, etc. Test both contexts if your application uses WebGL 2.
Key Facts
| Fact | Detail |
|---|---|
| Signal role | One of 106 independent checks used by BotRefund to build a reliable picture of whether a visit is human or automated |
| What it detects | Mismatch between claimed device and actual graphics capabilities (texture limits, renderer string) |
| Normal behavior | Browser reports hardware, graphics, fonts, and OS details that naturally fit together for that device |
| Anomaly sources | Virtual machines, spoofed profiles, headless automation, privacy tools, corporate networks, unusual devices |
| Decision weight | Evidence — not a verdict; cross-checked against independent browser, network, device, and behavior data |
| BotRefund accuracy claim | 99% accuracy from corroboration across all signals, not from any single browser tell |
Terminology Quick Reference
- MAX_TEXTURE_SIZE: Maximum width/height of a 2D texture in pixels.
- MAX_CUBE_MAP_TEXTURE_SIZE: Maximum dimension of a cube-map texture face.
- MAX_RENDERBUFFER_SIZE: Maximum width/height of a renderbuffer (offscreen render target).
- MAX_TEXTURE_IMAGE_UNITS: Number of texture units available to fragment shaders.
- MAX_VERTEX_TEXTURE_IMAGE_UNITS: Texture units available to vertex shaders.
- MAX_COMBINED_TEXTURE_IMAGE_UNITS: Total texture units across all shader stages.
- Unmasked renderer/vendor: Actual GPU driver strings exposed via
WEBGL_debug_renderer_infoextension, bypassing the generic strings some browsers return. - Software renderer: CPU-based fallback (e.g., SwiftShader, llvmpipe) used when GPU acceleration is unavailable.
Frequently Asked Questions
What does it mean if my MAX_TEXTURE_SIZE is 8192?
That's normal for many integrated GPUs (Intel UHD, AMD Vega mobile, Apple M-series base models). Compare against your specific GPU model — 8192 would be low for a modern discrete NVIDIA/AMD card but expected for integrated graphics.
Can I "pass" the test by changing my user-agent string?
No. User-agent strings don't affect WebGL texture limits. The limits come from the GPU driver and browser's WebGL implementation. Spoofing the user-agent without matching the underlying hardware creates the mismatch this test is designed to catch.
Why does BrowserLeaks show a different renderer string than my DevTools console?
BrowserLeaks may use the WEBGL_debug_renderer_info extension to get unmasked strings, while gl.getParameter(gl.RENDERER) returns the masked/generic string in some browsers. Both are correct — they're just different levels of detail.
Does disabling hardware acceleration help me pass?
It usually makes things worse. Disabling hardware acceleration forces a software renderer (SwiftShader on Chrome, llvmpipe on Linux), which reports very different limits and a telltale renderer string — a stronger anomaly than a slightly unusual hardware limit.
How often do texture limits change for the same browser/GPU?
Only when you update GPU drivers, browser version, or OS. They don't change per session unless a privacy extension randomizes them intentionally.
Is this test enough to know if I'll be flagged as a bot?
No. BotRefund uses 106 signals and weighs the complete pattern. A clean WebGL fingerprint helps, but network reputation, behavioral signals, and other browser fingerprints also factor in. The company states: "Accuracy comes from corroboration, not one browser tell."
Can I automate this test in CI/CD for my web app?
Yes. Run the same WebGL context creation and parameter queries in a headless browser with GPU acceleration enabled (Chrome --use-gl=desktop --enable-gpu). Capture the limits and compare against your known-good baseline for each supported browser/OS combination.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
How BotRefund can help
BotRefund uses WebGL texture constraint detection as one of 106 signals to identify automated traffic clicking your ads. The system doesn't block visitors on this signal alone — it treats each anomaly as evidence and cross-checks it against network, device, and behavioral data before scoring a visit. If bot clicks are draining your Google or Meta budget, BotRefund captures video proof of each invalid click, files refund disputes with the ad platforms, and suppresses future bot conversions so your pixel trains on real customers. Setup takes about one minute with no credit card required.