Files
dusk/.claude/platform-vita.md
T
2026-06-16 10:15:59 -05:00

4.7 KiB

Platform -- PlayStation Vita

DUSK_TARGET_SYSTEM: vita
Source layer: src/duskvita/
Renderer: vitaGL (OpenGL-over-GXM compatibility layer)


Overview

The PlayStation Vita is an ARM-based handheld with 512 MB of RAM and a 960x544 OLED/LCD display. It uses SDL2 (ported to Vita) for input abstraction, but the graphics layer is vitaGL -- an OpenGL compatibility shim that translates OpenGL calls to Sony's native GXM API.

The distribution format is a .vpk (Vita Package) file containing the signed executable and dusk.dsk bundled as dusk.dsk at the package root, accessible at app0:/dusk.dsk at runtime.


Hardware

Attribute Value
CPU ARM Cortex-A9 quad-core, ~444 MHz
RAM 512 MB
Display 960x544
Storage Vita game card / memory card / internal flash
Endian Little-endian

Compile-time macros

Macro Set
DUSK_VITA yes
DUSK_SDL2 yes
DUSK_OPENGL yes
DUSK_OPENGL_LEGACY yes
DUSK_INPUT_GAMEPAD yes
DUSK_PLATFORM_ENDIAN_LITTLE yes
DUSK_DISPLAY_WIDTH 960
DUSK_DISPLAY_HEIGHT 544

No DUSK_DISPLAY_SIZE_DYNAMIC, no DUSK_TIME_DYNAMIC, no DUSK_INPUT_KEYBOARD, no DUSK_INPUT_POINTER, no DUSK_NETWORK_IPV6.


Display

  • Fixed 960x544 resolution.

  • vitaGL translates OpenGL calls to GXM. Some OpenGL calls are stubbed out in duskplatform.h where vitaGL does not support them:

    #define glDrawArrays(type, first, count)         ((void)0)
    #define glDepthFunc(func)                        ((void)0)
    #define glBlendFunc(sfactor, dfactor)            ((void)0)
    #define glColorTableEXT(...)                     ((void)0)
    

    These stubs mean the Vita uses the fixed-function pipeline through vitaGL. Do not rely on glDrawArrays or depth/blend state changes being applied -- use the engine's displaystate_t flags instead (see .claude/display-shader.md).

  • DUSK_OPENGL_LEGACY is set. Avoid shader-based features that are not in the fixed-function ES1 subset.

  • Texture dimensions must be powers of two.


Asset loading

dusk.dsk is bundled inside the .vpk and mounted at app0:/ by the Vita OS. The asset system opens it at the fixed path:

#define ASSET_VITA_DSK_PATH "app0:/" ASSET_FILE_NAME

No path search is needed -- the file is always at that location.


Input

Uses SDL2 with Vita button mapping. Buttons map to SDL2 gamepad constants:

Vita button SDL2 constant
Triangle SDL_CONTROLLER_BUTTON_Y
Cross SDL_CONTROLLER_BUTTON_A
Circle SDL_CONTROLLER_BUTTON_B
Square SDL_CONTROLLER_BUTTON_X
Start SDL_CONTROLLER_BUTTON_START
Select SDL_CONTROLLER_BUTTON_BACK
D-pad SDL_CONTROLLER_BUTTON_DPAD_*
L / R SDL_CONTROLLER_BUTTON_LEFTSHOULDER / RIGHTSHOULDER
L-Stick SDL_CONTROLLER_AXIS_LEFTX/Y

Vita also has L2, R2, L3, R3 and touch surfaces -- not currently wired into the input system.


Save system

Uses SceIofilemgr (Vita filesystem API) for file I/O. Save data lives in the application's sandbox on the memory card. The stream API (savestream_t) handles all serialization with automatic CRC32 and little-endian encoding (see .claude/save.md).


Network

No network implementation exists in src/duskvita/. Network functionality is not currently available on Vita.


Time

No src/duskvita/time/ directory exists -- the Vita time implementation falls back to the SDL2 time layer if available, or is not yet implemented.


Build and toolchain

Requires the VITASDK. Set VITASDK in your environment before configuring.

cmake -B build \
      -DDUSK_TARGET_SYSTEM=vita \
      -DCMAKE_TOOLCHAIN_FILE=$VITASDK/share/vita.cmake \
      -DCMAKE_BUILD_TYPE=Release
cmake --build build

Post-build output: Dusk.self (signed executable) and Dusk.vpk (installable package containing the SELF + dusk.dsk).

Title ID: DUSK00001 (configurable via VITA_TITLEID).

Dependencies: SDL2, vitaGL, mathneon, vitashark, kubridge, SceGxm, SceCtrl, SceAudio, SceTouch, SceRtc, SceAppUtil, zip, bz2, z, lzma.


Endianness

Little-endian. DUSK_PLATFORM_ENDIAN_LITTLE is set at compile time.


Gotchas

  • vitaGL stubs several OpenGL calls. Always use the engine display state API rather than calling glBlendFunc / glDepthFunc directly.
  • DUSK_TIME_DYNAMIC is not set -- all ticks are fixed-step 16 ms.
  • Threading: pthread is linked but DUSK_THREAD_PTHREAD is not explicitly defined in vita.cmake. Verify threading behaviour before relying on it.
  • The Vita implementation is less complete than Linux and PSP -- network and time platform layers are absent. Contributions welcome.