GPU Stress Test
Renders a heavy WebGL2 Mandelbrot fragment shader every frame. Adjust iterations and resolution to load integrated or discrete GPUs. Reports live FPS, rolling average, and GPU vendor/renderer when the browser exposes them.
—
FPS (instant)
—
FPS (1s avg)
—
Min FPS
0
Frames
0.0
Elapsed (s)
Waiting to initialize WebGL2…
How to use
- Open the page in the browser you use for games or WebGL apps (Chrome, Firefox, Edge, Safari 15+).
- Confirm Vendor and Renderer under the canvas — avoid SwiftShader or llvmpipe (software rendering).
- Set Iterations (shader cost per pixel) and Resolution (canvas pixel scale) — start at 1500 / 1.0× on laptops.
- Click Start stress and watch FPS (instant), FPS (1s avg), and Min FPS while the Mandelbrot animates.
- Click Stop when done or if the tab stutters; lower settings and retry if needed.
- Use Copy results for support tickets or before/after driver comparisons on the same machine.
FAQ
Is this a real GPU stress test?
Yes when hardware acceleration is on — the fragment shader runs on your GPU. If the renderer shows SwiftShader, llvmpipe, or 'software', the browser is using CPU fallback and the FPS numbers reflect software rendering, not your graphics card.
Why does Chrome hide my GPU name?
Chrome and Firefox may redact WEBGL_debug_renderer_info as anti-fingerprinting. You may see a generic vendor/renderer string. Check chrome://gpu (Chrome) or about:support (Firefox) for the real GPU, or use the OS device manager.
Why does FPS drop after a minute on my laptop?
GPUs thermal-throttle like CPUs. Sustained Mandelbrot at high iterations heats integrated graphics quickly. A falling 1s average FPS with stable settings usually means heat or power limits — not necessarily a broken GPU.
Can I compare FPS to 3DMark or game benchmarks?
No. This is a single full-screen fragment shader in WebGL2, not a game engine. FPS is only comparable across runs on the same browser, GPU, resolution scale, and iteration count.
What settings should I use for an integrated GPU?
Start at 1500 iterations and 1.0× resolution. If FPS stays above your display refresh and the machine stays comfortable, raise iterations in steps of 500. If the tab stutters, lower resolution to 0.7× first.
Does anything leave my browser?
No. WebGL runs locally in this tab. No frames or GPU data are uploaded to our servers.
Introduction
GPU Stress Test pushes your graphics pipeline through WebGL2: every frame draws a full-screen triangle and runs a Mandelbrot set fragment shader with a configurable iteration count. More iterations and higher canvas resolution mean more GPU work per frame.
The tool reports:
- FPS (instant) — frame-to-frame rate
- FPS (1s avg) — rolling one-second average (smoother trend)
- Min FPS — lowest 1s average seen after the run warms up
- GPU vendor / renderer when the browser exposes them
- A warning when software rendering is detected (SwiftShader, llvmpipe)
Use it to verify hardware acceleration, compare driver updates, or watch FPS hold vs drop under sustained load. It is not 3DMark, FurMark, or a game benchmark — it is a browser-local WebGL stress signal.
How the test works
1. WebGL2 context
The canvas requests webgl2 with powerPreference: 'high-performance' and no antialiasing. A single fullscreen triangle (three vertices) covers the framebuffer — standard trick to avoid quad edge cases.
2. Mandelbrot fragment shader
Per pixel:
- Map
gl_FragCoordto complex plane coordinates (animated offset viau_t). - Iterate up to u_iter times (slider 100–5000, shader loop cap 5000).
- Color by escape iteration with a time-based palette.
Higher Iterations increases ALU work per pixel. Higher Resolution increases pixel count (fill rate).
3. Frame loop
requestAnimationFrame drives the loop. Each frame:
- Updates uniforms (
u_t,u_res,u_iter) - Calls
drawArrays(TRIANGLES, 0, 3) - Computes instant FPS from frame delta
- Maintains a 1-second sliding window for average FPS
- Updates Min FPS when the window has >30 samples and a new lower 1s average appears
4. GPU identification
If available, WEBGL_debug_renderer_info provides unmasked vendor/renderer; otherwise the tool falls back to VENDOR / RENDERER (often generic or redacted).
Understanding each output
FPS (instant)
What it is: 1000 / frame_delta_ms for the last frame.
How to read it: Spiky; good for seeing hitches. Vsync may cap near monitor refresh (60, 120, 144 Hz) even when the GPU could do more work.
FPS (1s avg)
What it is: Mean of instant FPS samples in the last 1000 ms.
How to read it: Best single number for sustained performance. Compare this across runs at the same settings.
| Pattern | Likely cause |
|---|---|
| Stable avg | GPU and thermals keeping up |
| Drop after 60s | Thermal or power limit |
| Very low avg, software renderer | CPU SwiftShader path |
| Sudden cliff | Tab backgrounded, driver reset, or OS GPU switch |
Min FPS
What it is: Lowest 1s average recorded after enough samples (>30 in window).
How to read it: “Worst sustained second” during the session — useful for stutter and throttle detection. Not the same as 1% low in games.
Frames / Elapsed
What it is: Total frames drawn and seconds since Start stress.
How to read it: Sanity check that the loop ran continuously. Elapsed stops increasing when you Stop.
Iterations & Resolution
Iterations: Shader loop bound — primary load knob for ALU.
Resolution: Multiplier on canvas width (container width × scale) and fixed base height (420px × scale). Shown as W×H in copy text.
Vendor / Renderer
What it is: WebGL strings identifying the GL implementation.
| Example renderer | Meaning |
|---|---|
ANGLE (NVIDIA GeForce RTX …) |
Hardware via ANGLE (common on Windows Chrome) |
Apple M2 |
Apple GPU |
SwiftShader / llvmpipe |
Software — not a hardware GPU test |
Google Inc. / generic |
May be fingerprinting protection — check OS GPU panel |
What this test measures
| Measured | How |
|---|---|
| WebGL2 fragment shader throughput (relative) | FPS at given iterations × resolution |
| Sustained vs burst GPU behavior | 1s avg over time, min FPS |
| Hardware vs software GL | Renderer string heuristics |
| Browser WebGL path | Same machine, same settings, compare runs |
What this test does NOT measure
| Not measured | Why |
|---|---|
| VRAM size or usage | WebGL does not expose full VRAM telemetry |
| GPU temperature / hotspot °C | No sensor API in browsers |
| 3DMark / game FPS | Different engines, APIs, workloads |
| Ray tracing, mesh shaders, Vulkan | WebGL2 only |
| CPU-bound game logic | GPU fragment bound here |
| Display HDR / color accuracy | Cosmetic palette only |
| Cross-machine absolute rank | Browsers and drivers differ |
| Fan speed or board power (W) | No OS hooks from the page |
Safety
- High settings on integrated graphics heat the whole package (CPU + GPU share a cooler).
- Stop if the tab freezes, artifacts spread, or the system shuts down.
- Prefer AC power and a ventilated surface for long runs.
- Reduce Resolution first if stuttering; then Iterations.
Common use cases
1. Confirm hardware acceleration is on
Goal: Make sure the browser uses your real GPU, not a software fallback.
How to run: Open the page; read Renderer before starting. Click Start stress for 20s.
Healthy: Renderer mentions Intel, AMD, NVIDIA, Apple, Qualcomm, etc. FPS is reasonable for your class of GPU.
Red flag: SwiftShader, llvmpipe, or software in the renderer string — enable hardware acceleration in browser settings and update drivers.
2. New PC or GPU — quick sanity check
Goal: Discrete or integrated GPU responds under load without immediate tab crash.
How to run: Default 1500 iterations, 1.0× resolution, 30–60s run.
Healthy: Stable Mandelbrot animation; FPS not stuck at 0; no instant tab kill.
Red flag: Black canvas, shader compile error, or single-digit FPS on a desktop GPU at low settings — driver or WebGL2 issue.
3. Driver update before / after
Goal: Same machine, same browser, same slider values — did average FPS change?
How to run: Copy results after 60s at fixed iterations/resolution; update driver; reboot; repeat.
Compare: FPS (1s avg) at elapsed 45–60s and Min FPS — not instant spikes only.
4. Laptop thermal / power throttling
Goal: See if the GPU cannot sustain frame rate when hot.
How to run: AC power, 1500–2500 iterations, 1.0–1.5× resolution, run 2–3 minutes.
Pattern: High 1s avg in the first 30–60s, then 20–40% lower sustained avg — common on thin laptops with integrated graphics.
5. Integrated vs discrete (dual-GPU laptops)
Goal: Understand which GPU the browser selected (often the integrated chip for power saving).
How to run: Check renderer string; on Windows, compare before/after assigning the browser to “High performance” in Graphics settings.
Note: The tool cannot force GPU switch — it only reports what WebGL sees.
6. Remote support — “Is WebGL working?”
Goal: User pastes Copy results with vendor, renderer, FPS, and canvas size.
How to run: 30s at moderate settings; support checks for software renderer and absurdly low FPS.
7. Browser comparison (same PC)
Goal: See if one browser throttles WebGL more (extensions, flags).
How to run: Chrome vs Firefox vs Edge, identical iteration/resolution, 60s each.
Interpretation: 10–20% FPS variance is normal; huge gap → profile, flags, or hardware acceleration setting.
Quick reference
| Goal | Iterations | Resolution | Run length |
|---|---|---|---|
| Software check | 1500 | 1.0× | 10s (read renderer) |
| Light laptop | 1000–1500 | 0.7–1.0× | 60s |
| Desktop discrete | 2500–4000 | 1.0–2.0× | 90s |
| Thermal test | 2000 | 1.2× | 120s+ |
Related tools
- CPU Stress Test — load logical CPU cores separately from GPU fragment work.
- AI GPU Test — WebGPU compute readiness vs this WebGL2 FPS stress test.
- Memory Test — tab JavaScript heap headroom before heavy web apps.
- Device Info — screen, browser, and environment context.