How it's built, patched and set up for its played test. The numbers are under Test runs.
OpenTTD 15.1 runs with its OpenGL video driver, which Walnut’s patches make start on the RSX (stock refuses on the missing single-channel texture formats). Walnut sets the 8bpp-optimized blitter as the default, which takes the benchmark savegame from 11 to about 38 to 45 frames a second.
OpenTTD 15.1 runs with the right picture through both of its video drivers: SDL’s software path and the OpenGL driver, which our patches made start on nv30. With the 8bpp-optimized blitter (our package’s default since patch 0003) and Mesa 0040’s staging pool, the 1962 benchmark savegame plays at about 52 steady fps; its OpenGL played session (2026-10-25) had a 60 fps median with clean music. The software driver plays too, but gives the frame timer nothing to measure.
Packages and settings
openttd,openttd-data(15.1-1+ps3.N, packages/openttd), replacing Debian’s, with Debian’sopenttd-opengfx,openttd-opensfx,openttd-openmsx. The release candidate is ps3.297. OpenTTD passes its 97 ctest tests on ppc64 in Debian’s build.- Stock
-v sdl-openglrefuses to start on nv30 (“Single element texture formats not supported”); our 0001 and 0002 make the OpenGL driver run on GL 2.1 (the investigation). - 0003:
support8bppdefaults tosystem, so the blitter OpenTTD picks for an 8bpp base set such as OpenGFX is 8bpp-optimized instead of 32bpp-anim. NewGRFs that ask for 32bpp (or font anti-aliasing) still switch to a 32bpp blitter, and-b 32bpp-animorblitter = 32bpp-animinopenttd.cfgbrings the old one back. An existingopenttd.cfgthat already holdssupport8bpp = no(OpenTTD writes every setting) keeps it (the investigation). - Two menu entries of ours (desktop/launchers) replace Debian’s (diverted): “OpenTTD
(OpenGL)”,
-v sdl-opengl -r 1920x1080, and “OpenTTD (software)”,-v sdlwithSDL_FRAMEBUFFER_ACCELERATION=0. - The software path needed our SDL3 fix (libsdl3 +ps3.254): SDL3’s accelerated window framebuffer was BGRA8888 on big-endian, a strong blue cast.
How it performs
The benchmark (recipe) is a real game: assets/openttd-bench.sav, a 256x256 map
played by six AIs for 12 years on the PC, then every company made a human one so no script runs (made
with assets-src), loaded with -g, 1920x1080 fullscreen, the camera on
Taningville at the normal zoom, the game at normal speed, the GL driver, sound and music on (SDL sound at
44.1 kHz, FluidSynth with the first soundfont, OpenMSX). OpenTTD has no timedemo: the vehicles drift with
the wall clock, the work per frame is the same. fps from the Gallium HUD (60 s warm-up, 120 s window).
| Configuration | Steady fps | 1% low | Gameplay stalls | Batch |
|---|---|---|---|---|
| 32bpp-anim (the old default), 9 runs | 10-14, mostly 11 | 5.5-7.5 | 22-54 s | batch 2026-10-19-ssdroot3-openttd-sound (and -buffers, -blitters) |
8bpp-optimized (blit8) |
34, 35, 43 | 13-15 | 0.3-0.5 s | batch 2026-10-19-ssdroot3-openttd-blitters |
32bpp-anim with Mesa 0040 NV30_STAGING_POOL_MB=24 |
20 (11 off) | 9.4 | 4.3 s (43 off) | batch 2026-10-19-ssdroot4-staging-pool |
| 8bpp with Mesa 0040 | 52 (34 off) | 18.4 | 0.1 s | batch 2026-10-19-ssdroot4-staging-pool |
8bpp with Mesa 0040, zoomout / scroll |
23 / 31 (7 / 7-8 without the pool) | 11.1 / 14.3 | batch 2026-10-19-ssdroot5-openttd-views |
- The blitter is the big lever (frame rate x3, the 1% low from 5.7 to 13-15) and the staging pool the second: each frame’s upload of the screen (8.3 + 2.1 MB) had taken new GART staging buffers, zeroed, faulted in page by page through lv1 and unmapped page by page, with a wait for the GPU before each (the investigation).
- The simulation is not the limit: 6000 ticks of the save run in 82.7 s with no video and no sound (about 2.2x real time) (batch 2026-10-19-ssdroot3-openttd-smoke).
- The music costs about a fifth of the frame rate (
nomusic13,nosoundandquiet14 against 11 on 32bpp-anim), FluidSynth on the PPE; effects alone cost almost nothing.hz22and larger SDL buffers don’t help by themselves: each run is either 10-12 fps with 1800-4700 underruns or 14 with 80-700, in every arm, following how much the music costs in that run (a random track; not confirmed) (batch 2026-10-19-ssdroot3-openttd-buffers). Our FluidSynth with a divide-free reverb: 35 against 34 fps; effects off (FLUIDFX=off) 40 (batch 2026-10-19-ssdroot5-fluidsynth). - The title screen (the benchmark until 2026-10-18, a lighter scene):
gl21 steady with 6.3 s of stalls (batch 2026-10-18-batch8); software with SDL3’s accelerated framebuffer 9.5, 12 with 8bpp (batch 2026-10-17-ps3rsx-249-first-boot). Its CPU profile (batch 2026-10-19-ssdroot2-gameplay-profiles, 18 fps, before Mesa 0040; a menu, not a measure of play) was half kernel, 49.5%, nearly all of it the new 8 MB staging buffer per frame for the screen upload: hash page faults on it 27.1% and its unmapping 8.4% (both booked as__replay_soft_interrupts), its zeroing (memsetunderps3rsx_gart_clear) 5.3%; then FluidSynth 10.2% and libspeq 4.2% on the audio thread andBlitter_40bppAnim::Draw8.5% (HOTPATHS.md).
Known problems
- With the OpenGL driver, water pulses to white or very bright (its palette animation; the software driver and the PC don’t): the played session.
- With the 32bpp-anim blitter the same game runs at 11 fps; NewGRFs that ask for 32bpp bring it back.
- The music still underruns (2600-4500 a run with
blit8); nobody has judged it by ear in a bench run. - Once in 13 runs with the staging pool, the kernel couldn’t back the GART (the investigation).
- Log noise:
OpenGL: Single element texture formats not supported, using luminance texturesin every GL run (nv30 lacksGL_ARB_texture_rg; our fallback works).
Investigations
- 2026-10-17 the OpenGL driver on GL 2.1: what stock refuses, 0001-0002, and SDL3’s blue cast on the software path.
- 2026-10-19 the savegame and the blitters: batch ssdroot3, why the 8bpp-optimized blitter became the default (0003).
- 2026-10-19 the staging buffer per frame (Mesa 0040).
- 2026-10-19 GART nearly full: the one kernel message new with the staging pool.
Build
| Packages | openttd, openttd-opengfx, openttd-opensfx, openttd-openmsx |
|---|---|
| Suite | in the game suite (known to run with its sound), free data |
| Game data | comes with the packages |
| Diverted | /usr/share/applications/openttd.desktop (our launchers stand for them) |
Our source packages
- openttd source
Played test
What a played session sets up (rating/test.toml); the medal comes from these sessions only.
| Process | openttd |
|---|---|
| Set aside | ~/.config/openttd, ~/.local/share/openttd, ~/.openttd (the game starts on fresh defaults) |
Investigations
- An 8 MB staging buffer every frame (2026-10-19) 2026-10-19
- OpenTTD: the 1962 savegame, and why the 8bpp-optimized blitter became the default (2026-10-19) 2026-10-19
- OpenTTD: "no memory to back the GART" with the staging pool (2026-10-19) 2026-10-19
- OpenTTD: the OpenGL driver on GL 2.1, and SDL3's blue cast (2026-10-16 to 10-18) 2026-10-17