Compatibility Table
Feature-by-feature status based on the actual source code. Status is derived from what the implementation does, not from what the original DirectX 3 SDK specifies.
Status legend
Implemented — works as expected for the target game patterns
Partial — works for the common case; known gaps documented
Stub — compiles and returns success; performs no real work
Not supported — absent from the implementation; will not compile or link
Unknown — behavior untested or unclear from the source code
Partial — works for the common case; known gaps documented
Stub — compiles and returns success; performs no real work
Not supported — absent from the implementation; will not compile or link
Unknown — behavior untested or unclear from the source code
DirectDraw features
| Feature | Status | Notes | Used by Speedy Blupi / Planet Blupi |
|---|---|---|---|
DirectDrawCreate |
Partial | GUID ignored; always uses SDL default | Yes |
SetCooperativeLevel (DDSCL_NORMAL) |
Implemented | Creates SDL renderer in windowed mode | Yes |
SetCooperativeLevel (DDSCL_FULLSCREEN) |
Partial | Requests fullscreen via free-api; renderer still created | Yes |
SetCooperativeLevel (DDSCL_EXCLUSIVE) |
Partial | Accepted; no additional exclusive behavior beyond fullscreen | Yes |
Primary surface creation (DDSCAPS_PRIMARYSURFACE) |
Implemented | CPU pixel buffer; size from SetDisplayMode or 640×480 default | Yes |
Offscreen surface creation (DDSCAPS_OFFSCREENPLAIN) |
Implemented | Width/height/BPP from descriptor | Yes |
System-memory surface (DDSCAPS_SYSTEMMEMORY) |
Implemented | Treated as offscreen plain | Yes |
8-bit paletted surfaces (DDPF_PALETTEINDEXED8) |
Implemented | Stored as palette indices; expanded to RGBA32 on present | Yes |
32-bit RGBA surfaces (DDPF_RGB, 32-bit) |
Implemented | R, G, B, A byte order internally | Yes |
Blt — color fill (DDBLT_COLORFILL) |
Implemented | 0x00RRGGBB for 32-bit; low byte = palette index for 8-bit | Yes |
Blt — surface-to-surface copy |
Implemented | Nearest-neighbor scaling; 8→8 and 32→32 only | Yes |
Blt — source color key (DDBLT_KEYSRC) |
Implemented | Range comparison; RGB fallback for 32-bit | Yes |
Blt — wait flag (DDBLT_WAIT) |
Implemented | Accepted; no-op (no hardware synchronisation needed) | Yes |
Blt — rotation (DDBLT_ROTATIONANGLE) |
Not supported | Flag and dwRotationAngle accepted; rotation not performed | No (demo only) |
BltFast — no color key (DDBLTFAST_NOCOLORKEY) |
Implemented | All pixels copied | Yes |
BltFast — source color key (DDBLTFAST_SRCCOLORKEY) |
Implemented | Transparent pixels skipped | Yes |
Flip (primary surface present) |
Partial | Simplified present, not a real flip chain; both parameters ignored | Yes |
| Auto-present on Blt-to-primary | Implemented | Enabled when Flip has never been called; disabled once Flip is first called | Yes (Speedy Blupi pattern) |
Lock / Unlock |
Implemented | Returns pointer into CPU pixel buffer; Unlock is a no-op | Yes |
GetSurfaceDesc |
Implemented | Returns width, height, pitch, pixel format, and surface pointer | Yes |
SetColorKey (DDCKEY_SRCBLT) |
Implemented | Range-based key stored per surface | Yes |
SetColorKey (other flags) |
Not supported | Returns DDERR_UNSUPPORTED | No |
SetPalette |
Implemented | Reference-counted; used during present and GetDC | Yes |
SetClipper / CreateClipper |
Implemented | Presence triggers windowed coordinate adjustment in Blt | Yes |
IDirectDrawClipper::SetHWnd |
Partial | HWND stored; not used for clip region management | Yes |
CreatePalette / palette GetEntries / SetEntries |
Implemented | 256-entry PALETTEENTRY array; DDPCAPS_8BIT accepted | Yes |
SetDisplayMode |
Partial | Stores logical resolution; triggers fullscreen; does not change physical display | Yes |
IsLost |
Stub | Always returns DD_OK; surfaces never lose content | Yes |
Restore |
Stub | Always returns DD_OK | Yes |
GetDC |
Partial | Functional for DDColorMatch pattern; 8-bit uses RGBA temp buffer | Yes |
ReleaseDC |
Implemented | Converts RGBA back to palette indices for 8-bit surfaces | Yes |
QueryInterface (all surfaces) |
Stub | Returns DDERR_UNSUPPORTED; COM aggregation not implemented | Typically not needed |
| VSync (frame pacing) | Implemented | SDL_SetRenderVSync enabled by default; disable with FREE_DIRECT_ENABLE_VSYNC=0 | Implicit |
| Frame throttle | Implemented | Skips present if called within frame interval (default 60 FPS) | Implicit |
| Letterbox scaling | Implemented | SDL_SetRenderLogicalPresentation with LETTERBOX mode | Implicit |
| Back-buffer flip chains | Not supported | No real flip chain; Flip() is a simplified present | N/A |
| Overlays | Not supported | Not implemented | No |
| Texture surfaces / video memory | Not supported | All surfaces are CPU-side; no GPU texture creation via DirectDraw | No |
| GDI emulation via DirectDraw | Not supported | GetDC supports DDColorMatch pattern only; full GDI drawing not tested | Partial (GetDC/SetPixel pattern) |
DirectSound features
| Feature | Status | Notes | Used by Speedy Blupi / Planet Blupi |
|---|---|---|---|
DirectSoundCreate |
Implemented | Opens SDL default audio device; graceful DSERR_NODRIVER if unavailable | Yes |
SetCooperativeLevel |
Implemented | Any level accepted; always returns DS_OK | Yes |
CreateSoundBuffer |
Implemented | Allocates PCM buffer and stores PCMWAVEFORMAT | Yes |
Lock / Unlock |
Implemented | Writable pointer into internal PCM vector; wrap-around two-region supported | Yes |
Play (one-shot) |
Implemented | Feeds PCM into SDL stream; restarts if already playing | Yes |
Play (looping, DSBPLAY_LOOPING) |
Not supported | Flag accepted but ignored; buffer plays once | Unknown |
Stop |
Implemented | SDL_ClearAudioStream; immediate silence | Yes |
GetStatus |
Implemented | DSBSTATUS_PLAYING if stream has queued bytes | Yes |
SetVolume |
Implemented | Centibel to linear gain; applied via SDL_SetAudioStreamGain | Yes |
SetPan |
Partial | Stored and calculated; not yet applied to SDL output channels | Unknown |
SetCurrentPosition |
Partial | Updates play cursor; SDL stream not seekable | Unknown |
| 8-bit unsigned PCM | Implemented | SDL_AUDIO_U8; auto-converted to device format | Yes |
| 16-bit signed PCM | Implemented | SDL_AUDIO_S16LE; auto-converted to device format | Yes |
| Mono sources | Implemented | SDL3 handles mono→stereo mixing | Yes |
| Stereo sources | Implemented | Played as-is | Yes |
| Sample rate conversion | Implemented | Handled automatically by SDL3 audio stream | Implicit |
| 3D audio / positional sound | Not supported | Not implemented | No |
| Capture / recording | Not supported | Not implemented | No |
| Hardware buffer acceleration | Not supported | All buffers are software; DSBCAPS flags accepted but not negotiated | No |
DirectPlay features
| Feature | Status | Notes | Used by target games |
|---|---|---|---|
DirectPlayCreate |
Stub | Creates dummy object; no networking | Yes (optional) |
DirectPlayEnumerateA/W |
Stub | Callback never called; returns DP_OK | Yes (optional) |
EnumSessions |
Stub | No sessions found | Yes (optional) |
Open / Close |
Stub | No-op success | Yes (optional) |
CreatePlayer |
Stub | Sets player ID to 1; no real player registration | Yes (optional) |
Send / Receive |
Stub | No I/O performed | Yes (optional) |
| Real UDP/IPX networking | Not supported | No transport layer exists | N/A |
Not implemented at all
| Feature | Notes |
|---|---|
| DirectInput | No header; input handled by the free-api WinAPI layer (Win32 message queue) |
| Direct3D | 3D pipeline not needed by target games; no plans to add |
| DirectDraw overlays | Not in header or source |
| DirectDraw video capture | Not in header or source |
| DirectDraw Execute buffers | Not applicable (DX3 3D feature) |
| COM aggregation (QueryInterface) | All QueryInterface calls return DDERR_UNSUPPORTED or E_NOINTERFACE |
| DDSCAPS_VIDEOMEMORY | Accepted in flags but all surfaces are CPU-resident |