3.8 KiB
Platform Support
Dusk targets a wide range of platforms, from modern desktops to classic handheld and home consoles. New platform targets will be added over time.
Platform index
| Platform | DUSK_TARGET_SYSTEM |
Status | Reference |
|---|---|---|---|
| Linux | linux |
Supported | .claude/platform-linux.md |
| Knulli | knulli |
Supported | .claude/platform-linux.md |
| Windows | windows |
Planned | .claude/platform-windows.md |
| macOS | macos |
Planned | .claude/platform-macos.md |
| Sony PSP | psp |
Supported | .claude/platform-psp.md |
| PlayStation Vita | vita |
Supported | .claude/platform-vita.md |
| Nintendo GameCube | gamecube |
Supported | .claude/platform-dolphin.md |
| Nintendo Wii | wii |
Supported | .claude/platform-dolphin.md |
GameCube and Wii share the src/duskdolphin/ layer and are collectively
referred to as Dolphin targets throughout the codebase.
Layer structure
src/dusk/ Core -- platform-agnostic game logic and ECS
src/duskgl/ OpenGL abstraction (Linux, Knulli, PSP, Vita)
src/dusksdl2/ SDL2 window + input (Linux, Knulli, PSP, Vita)
src/dusklinux/ Linux + Knulli platform impl
src/duskpsp/ PSP platform impl
src/duskvita/ Vita platform impl
src/duskdolphin/ GameCube + Wii platform impl
Dolphin is the only target that bypasses SDL2 and OpenGL entirely -- it uses native libogc GX for rendering and PAD for input.
Capability macros
Each target sets a combination of these macros. Do not assume a capability is present without checking the appropriate macro.
| Macro | Meaning |
|---|---|
DUSK_SDL2 |
SDL2 is available |
DUSK_OPENGL |
OpenGL is available |
DUSK_OPENGL_ES |
OpenGL ES variant (Knulli) |
DUSK_OPENGL_LEGACY |
Fixed-function OpenGL (PSP, Vita) |
DUSK_INPUT_GAMEPAD |
Gamepad / controller input |
DUSK_INPUT_KEYBOARD |
Keyboard input (Linux, Knulli only) |
DUSK_INPUT_POINTER |
Mouse / pointer input (Linux, Knulli only) |
DUSK_DISPLAY_SIZE_DYNAMIC |
Window is resizable (Linux, Knulli) |
DUSK_TIME_DYNAMIC |
Dynamic timestep available (Linux, Knulli) |
DUSK_THREAD_PTHREAD |
pthreads available |
DUSK_NETWORK_IPV6 |
IPv6 supported (Linux only) |
DUSK_PLATFORM_ENDIAN_BIG |
Big-endian byte order |
DUSK_PLATFORM_ENDIAN_LITTLE |
Little-endian byte order |
DUSK_DOLPHIN |
Any Dolphin target |
DUSK_DOLPHIN_BUILD_ISO |
Dolphin DVD-ISO asset mode |
DUSK_CONSOLE_POSIX |
POSIX assert backtrace (Linux only) |
Quick comparison
| Linux | Knulli | PSP | Vita | GameCube | Wii | |
|---|---|---|---|---|---|---|
| SDL2 | yes | yes | yes | yes | no | no |
| OpenGL | desktop | ES2 | legacy | vitaGL | no | no |
| Endian | little | little | little | little | big | big |
| Dynamic resize | yes | yes | no | no | no | no |
| Dynamic timestep | yes | yes | no | no | no | no |
| Keyboard | yes | yes | no | no | no | no |
| Pointer/mouse | yes | yes | no | no | no | no |
| Network | full | full | partial | no | no | partial |
| Save storage | file | file | MS/SAVEDATA | SceIo | Mem Card | SD/NAND |
| Asset source | dsk file | dsk file | inside .pbp | inside .vpk | SD or DVD | SD or DVD |
Abstraction pattern
Platform-specific implementations are wired in via #define macros in
each platform's displayplatform.h, inputplatform.h, etc., which the
core calls through. Functions that a platform does not support are
simply left undefined -- the core guards calls with #ifdef.
Adding platform-specific code
- Put new code under
src/dusk<platform>/in the matching subsystem folder. - Gate any core call-site with
#ifdef DUSK_<PLATFORM>or the relevant capability macro. - Keep
src/dusk/free of platform#ifdefs -- delegate through the platform header macros instead.