Skip to content

Dreamcast

codingncaffeine edited this page Jun 6, 2026 · 2 revisions

Dreamcast (Flycast)

Status on Linux: hidden / experimental — not currently selectable. Dreamcast is hidden from the Linux UI pending performance validation. The Flycast core integrates and runs (.chd/.gdi/.cdi/.cue+.bin all load, VMU saves work, achievements unlock), but it's disabled out of caution while a sustained-framerate issue at scene changes is investigated. The console does not appear in the console picker; the handler and core remain in the backend. The notes below are kept as reference. See the Hidden set in ConsolePickerWindow.axaml.cs.

VMU Saves / "No VMU Found"

Getting battery saves to work requires satisfying five conditions simultaneously — missing any one results in "No VMU Found":

  1. RETRO_ENVIRONMENT_SET_CONTROLLER_INFO (cmd 35) must return true. Returning false causes Flycast to skip all sub-peripheral initialization.

  2. RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE (cmd 23) must supply a function pointer. Even a no-op stub works, but returning false blocks sub-peripheral setup.

  3. Core options reicast_device_portN_slot1 = "VMU" must be pre-seeded before retro_load_game. The core reads these during maple bus reconfiguration on load.

  4. retro_set_controller_port_device must be called for all 4 ports, not just port 0. This triggers full maple bus reconfiguration.

  5. The system/dc/ directory must exist, but VMU files must NOT be pre-created. Flycast auto-creates vmu_save_A1.bin etc. using its own zlib-compressed format. Pre-creating empty files → core sees them as corrupt → "No VMU Found".

All five are handled by DreamcastHandler.cs.

Note: The core option prefix is reicast_ in this build, not flycast_.

RetroAchievements

Dreamcast .chds identify and unlock achievements end-to-end (v1.6.9). The libchdr-backed cdreader handles the GD-ROM HD-area canonical-anchor rebase that Dreamcast PVDs depend on — see RetroAchievements for the implementation detail. .gdi, .cdi, and .cue+.bin continue to work through rcheevos's default reader.

Visual Upgrades

Out of the box, Dreamcast renders at native 640x480 through the OpenGL HW path (GL context → FBO → never-blocking PBO readback ring → native Wayland toplevel present, with X11/SDL fallback). The Flycast core has strong upscaling support — change these in Preferences → Cores → Flycast Options or per-game:

Option Native Upscaled (suggested)
reicast_internal_resolution 640x480 1920x1440 or 2560x1920
reicast_anisotropic_filtering 4x 16x
reicast_texupscale 1x 4x (xBRZ texture upscaling)
reicast_mipmapping enabled enabled
reicast_alpha_sorting per-triangle per-pixel (most accurate, slightly heavier)

All options take effect immediately without restarting the game.

AMD/Intel GPU note: like Dolphin, Flycast binds a non-zero FBO that some AMD/Intel GL drivers misrender. Enabling the global AMD/Intel compatibility toggle in Preferences renders to FBO 0 and disables the GL overlay path for Dreamcast (the overlay needs a separate FBO to blit from); NVIDIA users keep the fast direct-present path.

GD-ROM Loading

The Linux build sets reicast_gdrom_fast_loading = enabled by default. The core default (disabled) emulates authentic GD-ROM read speed, which makes games sit in loading/buffering scenes in real time (logged as ~5fps emu windows at every scene change, then full 60). Fast loading is the libretro docs' recommended cure and is user-overridable in Core Options.

30fps Games Running at 2x Speed

Some Dreamcast titles run at native 30fps — they advance two game frames per retro_run() and produce ~33ms of audio per call. A Stopwatch-primary loop that waits one targetFrameMs (16.7ms) between calls runs the game at 2x speed.

The fix is audio-drain waiting (the audio is delivered through an SDL3 audio stream, and pacing keys off that buffer draining at the native rate) — see Emulation Timing.

Clone this wiki locally