# Complete graphics fallback example Save this as `index.html`. It uses no libraries or external assets. It attempts a real WebGPU adapter/device/context, then a WebGL 2 context, then a readable Canvas 2D fallback. The selected renderer appears as text outside the canvas. Change quality to cap device-pixel ratio at 1, 1.5 or 2; the total drawing buffer also stays within four million pixels. The button and status remain ordinary responsive HTML. A successful software-rendered test does not establish physical GPU speed or headset support. The app remains usable with 2D, so an optional [app support manifest](/docs/app-support.md) should list `webgpu` and `webgl2` as optional features and omit a required graphics alternative group. Check actual API/context creation, keep failure messages readable, and adapt the fallback to your own gameplay rather than only showing an unsupported blank screen. ```html Graphics fallback

Graphics fallback

Checking renderer

``` The optional SDK 1.5.0 `markReady()` call follows the first usable rendered frame. It is the creator's readiness declaration, not proof of complete gameplay. It works without changing capability schema version 1 or the earlier saving APIs. Test portrait and landscape, zoom, high DPR, a missing GPU adapter, failed context creation, and disabled graphics APIs. The renderer is illustrative; it does not probe arbitrary Three.js materials, model decoders, compute workloads, workers or XR. For those requirements use [browser hosting](/docs/hosting.md), actual device tests and a separately authored fallback.