# 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/` in the matching subsystem folder. - Gate any core call-site with `#ifdef DUSK_` or the relevant capability macro. - Keep `src/dusk/` free of platform `#ifdef`s -- delegate through the platform header macros instead.