Skip to content

Roadmap ​

Everything that is planned or known to be missing, in one place. What already shipped is in the CHANGELOG; larger items have a design document in design/ with the details and a phased plan.

Nothing here is promised or scheduled. ABI additions keep GASM_ABI_VERSION at 0 (older runners trap only if a guest calls something they lack, see Versioning); breaking changes would bump it.

Next up ​

The suggested order, from the most benefit for the least risk:

Done recently: stack switching (gasm_run, design/stack-switching.md), cooperative threads in C, POSIX and SDL 3 (design/threads.md) and gasm:gl in the browser and headless (design/gasm-gl.md).

  1. gasm:gl natively. ANGLE in gasm-run's window (phase 3 of the plan): mostly building and shipping ANGLE for macOS, Windows and Linux. Then the Rust glow backend, then a Godot port.

Runtime and ABI ​

ItemWhat it givesStatus
Cooperative threads in Rustgasm::thread::spawn and locks on the same scheduler (the C API, POSIX threads and SDL threads are done: design/threads.md, part A). std::thread on wasm32-unknown-unknown can't be redirected.not started
Stack switching beyond JSPIBrowsers without JSPI (and Node 22) still need the Asyncify builds; wasm's stack-switching proposal would cover them too.waiting on engines
Real wasm threadsShared memory and atomics, opt-in, for guests that need parallel CPU (physics, job systems, Godot's worker pool). Not deterministic.proposal, after cooperative threads: design/threads.md (part B)
Guest memory limitA cap on linear memory growth. Today a guest can grow to the engine maximum (4 GiB for wasm32); needed before running untrusted content.not started
Capabilities manifestCustom section gasm.manifest declaring required and optional imports, network hosts and platform extensions (gasm:ext/*), so runners can check a game before running it.not started
.gasm packagesOne file bundling game.wasm, its assets and a manifest.not started
gasm:filesA file picker run by the runner: the game only sees what the player picks.not started
WIT / Component ModelMove the ABI to WIT once browsers don't need transpiling for components.waiting on browsers

Graphics ​

ItemWhat it givesStatus
gasm:gl nativelyOpenGL ES 3.0 in gasm-run's window through ANGLE (Metal, D3D11, Vulkan). The ABI, the browser runner (WebGL 2), the null GL of headless runs and the C headers are done; the native window refuses gasm:gl games until then.next: design/gasm-gl.md, phase 3
gasm:gl in Worker modeWebGL 2 on a transferred OffscreenCanvas; gasm:gl games run on the main thread for now.not started
gasm:gl for RustA glow::HasContext implementation over gasm::sys::gl_* (egui_glow and other glow code).not started
GodotA platform/gasm port on gasm:gl.after native gasm:gl
gasm:gfx render targetsRender-to-texture.not started
gasm:gfx cube maps, render bundlesSkyboxes and environment maps; cheaper repeated draws.not started
Batched gfx commandsOne call per frame for draw-heavy guests instead of one per command.not started
More of WebGPUStorage textures, compute, stencil: not in the gasm:gfx subset and not planned yet.not planned

Presentation (2D frames) ​

The filters, integer scaling, display aspect and window titles shipped in 0.6.0 (design/presentation.md). Left over:

ItemWhat it givesStatus
mmpx, scalefx filtersMore pixel-art upscalers. xbr covers the same content; both need porting from their reference sources, and ScaleFX's license needs checking.declined for now
Content hintA guest suggests a filter class ("pixel art" or "rendered") so players can pick a better default. One more small ABI addition.idea
fps counter behind a flagThe native window title shows — <n> fps always.idea

Netplay ​

ItemWhat it givesStatus
Rollback netplayRun by the runner: snapshot and restore guest memory between frames (the runner already drives frames and owns the guest's state), instead of lockstep only.not started

Games and ports ​

SDL 3 ​

What SDL 3 for gasm doesn't do yet, and what would bring it:

MissingWhat it takes
OpenGL, Vulkan, SDL_GPUgasm:gl (above) for OpenGL ES
Audio recording, camera, haptics and rumble, sensors, dialogs, tray, processes, shared objectsnot planned; each fails the way SDL fails on a platform without it

ScummVM ​

What works is in the ScummVM README. Not done yet:

MissingEffectWhat it takes
Other enginesonly the five built in: scumm, scumm_7_8, he, sky, drasculaadd them to SCUMMVM_ENGINES (+ engine data); the freeware Flight of the Amazon Queen (queen) and Lure of the Temptress (lure) are next, then Sierra (agi, sci), kyra, gob, saga, sword1/sword2, tinsel
MT-32 emulationRoland MT-32 music (many Sierra and LucasArts games sound best with it)--enable-mt32emu (built into ScummVM) and the user's MT-32 ROMs as assets
General MIDI synth (FluidSynth/fluidlite)GM music; AdLib is used insteadbuild fluidlite, ship or load a SoundFont
GUI themesthe built-in classic look ("scummremastered" and gui-icons.dat aren't embedded)embed the theme zip and icons (zlib is in now)
Translations, TTS, FreeType, fribidiEnglish GUI, no speech synthesis, no TrueType fonts (some engines need them)build the libraries, embed translations.dat
Video codecs (MPEG-2, Theora, VPX, AAC, JPEG, PNG)cutscenes and images in engines that use thembuild the libraries
3D engines (Grim Fandango, Myst III, The Longest Journey)not builtTinyGL (software 3D) now, or gasm:gl later
Cloud, LAN, networkingoffgasm:net could carry some of it
Gamepads 2–4, touch controls, virtual keyboardone gamepad; mouse and keyboard otherwisebackend work
Size in browsers without JSPIthey need the 16.1 MB Asyncify build (the run build is 10.6 MB)JSPI in more browsers

Godot ​

A platform/gasm port on gasm:gl: headless first, then the Compatibility renderer. Phase 5 of the gasm:gl plan, its own project.

Testing and tooling ​

ItemWhat it givesStatus
Filter parity in CIscripts/present-test.mjs (native vs WebGL 2 filters, golden images) skips without a GPU; CI's Linux runner would need a software Vulkan driver (lavapipe).not started

MIT licensed. The NES demo core is tetanes-core (MIT/Apache-2.0).