Detailed Roadmap
CNA is a long-term open-source project. There are no fixed release dates. Progress is incremental. This roadmap describes goals and current priorities, not commitments.
Current state
0.1.0-alpha.1 is CNA's first tagged pre-release, resolved here to 1bb2145d99ed572dd4eb15009c34e2e5f410fcf0. CNA covers the public XNA namespace surface except Framework.Design, exposes 50 renderer identities across 46 implementation families, and has 568 C++ test sources with 8,263 statically discoverable GoogleTest-family definitions. Those are source-inventory facts, not a universal pass count; APIs may change before 1.0.
Remaining work is therefore depth, not breadth. The list below is drawn from an audit of the source tree, not from a wish list.
Shipped
Renderers — 50 identities, 46 families
The default mode selects one with CNA_GRAPHICS_RENDERER. An opt-in CNA_GRAPHICS_RENDERERS list links several compatible families and selects one before the first device through GraphicsRendererSelection; fallback is explicit and the choice latches. The table below is representative, not the full inventory — use the renderer reference for all 50.
| Renderer | State | Notes |
|---|---|---|
| EasyGL | Production-ready | Five GL-profile identities with the stock effects, lighting, instancing, queries, anisotropy, fog and context-loss recovery. |
| Vulkan | Functional | SPIR-V pipeline with MRT handling, device-queried depth formats, stencil, MSAA resolve and mip blits. |
| DIRECTX9 | Functional | Windows-only SM2/SM3 path with device-lost recovery and capability-validated MRT; target of the pixel-exact XNA oracle corpus. |
| SDL_GPU | Functional | Deferred/retained design with stock effects, stencil and MSAA resolve; Vulkan device layer in alpha.1. |
| DIRECTX11 | Functional | Windows-only state-object caching, MRT with deferred resolve, instancing and runtime shader compilation. |
| Software | Functional | CPU rasterizer with a Z-buffer and perspective-correct interpolation; TriangleList only and no GPU required. |
| FreeDirect | Functional | Cross-platform, 2D-only DirectDraw-shaped CPU compositor over the sibling free-direct project. |
| SDL_Renderer | Production-ready within its 2D scope | 2D renderer with explicit capability boundaries; 3D calls throw by design. |
| Canvas | Browser-only | Emscripten-only 2D family with 17 statically discoverable GoogleTest-family definitions; execute the browser configuration before claiming pixel results. |
| bgfx | Partial | Checked-in 3D shaders cover GL/GLES/Vulkan/WebGPU, not D3D or Metal. |
| DIRECTX12 | Partial | PSO/root-signature caches and barrier tracking exist, with important state and MRT gaps listed below. |
| WebGPU | Experimental | Backbuffer-only forward renderer in alpha.1. |
| Headless | Test harness | Deliberately renders nothing; ReadBackbuffer returns the last clear colour. Useful for fast game-logic CI. |
Content and rendering features
- The read-side XNB loader.
ContentManagerhas 50 built-in readers with FFmpeg and 49 without it, LZX decompression, shared-resource resolution, video, typed external references and a real compiled-effectEffectReader. Custom readers can be registered explicitly; reflection-based discovery and XNB writing are absent. - Six XNA stock effects —
BasicEffect,AlphaTestEffect,DualTextureEffect,EnvironmentMapEffect,SkinnedEffect,SpriteEffect— implemented natively in C++ rather than translated from bytecode. - PBR effects (CNAEXT):
PbrEffectandSkinnedPbrEffect, plusRenderPipelineSettings,PbrMaterial,TonemappingModeandShadowQuality. - Skeletal animation (CNAEXT):
SkinnedModelEXTwithAnimationPlayer,AnimationClipEXT,BoneTrackEXTandKeyframeEXT, plusMorphTargetEXTblend shapes. cna_tool_gltf_to_cnj, an offline glTF 2.0 →.cnjModel/AnimationClip converter, built unconditionally. This is CNA's actual content path for models.
Verification infrastructure
- The XNA 4.0 oracle corpus — 39 scenes under
tools/xna-oracle/, rendered by a real C#/XNA reference renderer and diffed at--tolerance 0against CNA's DIRECTX9 output. - FNA differential testing against a real running FNA build, via
tools/fna-reference/andscripts/compare-fna-reference.py. - The CNAEXT purity check — 1,289 tagged declarations, turned into
[[deprecated]]warnings under-Werrorso the XNA-only surface is proven to stand alone.
Remaining work
Every item below is a real, audited gap, ordered roughly by how much it costs a porting project.
| Item | State | What it would take |
|---|---|---|
| Compiled effects beyond qualified builds | Partial | XNA/FNA D3D9 Effect Framework binaries load on FNA3D or explicitly enabled EasyGL-family, SDL_GPU and Vulkan builds. HLSL .fx source, DXBC and MGFX are different unsupported inputs; most renderer families report no compiled-effect capability. |
| Consistent surface-format coverage | Renderer-dependent | Skia exposes the broad public promoted set and IGL promotes verified Rg32/Single; other families still defer to the framework's Color-only public gate even when native mappings exist internally. A truthful per-renderer contract and configuration tests remain. |
ReflectiveReader for custom XNB types |
Not started | C++ has no reflective discovery. Explicit custom-reader and type-creator registration works, and video, typed external references and compiled effects are present, but user and closed-generic types must be registered deliberately. |
| DIRECTX12: scissor, viewport, stencil, blend factor | In progress | The core has PSO and root-signature caches plus a barrier tracker, but these four state paths are absent, MRT clears without ever drawing, and verification is especially narrow. |
| WebGPU render targets | In progress | Today it is a backbuffer-only forward renderer: no render targets at all, no MSAA, no cube or 3D textures, no queries, no instancing, non-functional stencil. |
| bgfx D3D and Metal shader coverage | In progress | 108 shader blobs exist for GL, GLES, Vulkan and WebGPU only. On bgfx's default Windows and macOS renderers, 3D silently draws nothing. Also open on bgfx: CreateIndexBuffer32 is never overridden, so DrawUserIndexedPrimitives uploads 32-bit indices into a 16-bit buffer and corrupts geometry. |
A GamerServices service renderer |
Not started | All 52 types are present with complete signatures. There is no online service — no Steam, no Xbox Live, no HTTP — but achievements and leaderboards are genuinely persisted as JSON under SDL_GetPrefPath() and reload in a later process, and Guide's message-box and keyboard-input paths are real implementations. Fifteen other Guide::Show* entry points remain documented no-ops. |
| Media platform and codec coverage | Platform-dependent | The catalogue, playback and FFmpeg-backed video paths are implemented. Video is not compiled into every target, and SDL_mixer has no AAC decoder for .m4a/.aac. |
| Deeper tests for Media, Storage and Canvas | Uneven | Storage has five statically discoverable GoogleTest-family definitions, Media 286, and Canvas 17. Those counts still leave significant runtime and platform-specific behavior unverified. |
| Broader CI | In progress | Alpha.1 has 21 workflow files, including Linux, Apple, Emscripten, platform-abstraction, multi-renderer and five declared C API gates. The C API implementation is still compile-blocked, Windows D3D/GDI lanes are manual, and the inventory does not exhaust every renderer/driver/platform combination. |
Truthful SupportsCapability() |
In progress | The base returns false for multi-stream input and compiled effects, delegates stencil and returns true for the remaining entries. Four renderers — DIRECTX9, DIRECTX11, DIRECTX12 and SDL_GPU — never override it. Several capability claims therefore remain permissive rather than verified. Draw offsets (startIndex/baseVertex) are also ignored on DIRECTX11. |
Toward a public stable release
The project is now versioned, but alpha.1 deliberately makes no 1.0 stability promise. Reaching 1.0 plausibly requires:
- A stable public API and explicit compatibility policy.
- Clear renderer-qualified contracts for effects, formats and capabilities.
- Reproducible test results for supported configurations rather than tree-wide counts alone.
- Production evidence on the platforms CNA intends to support.
Contributing to the roadmap
The highest-value contributions right now are the unglamorous ones:
- Deepening Media, Storage and Canvas runtime coverage.
- Closing the named renderer gaps — DIRECTX12 state paths, WebGPU render targets, bgfx D3D/Metal shaders and the 32-bit index buffer bug.
- Making
SupportsCapability()truthful, renderer by renderer. - Expanding automatic Windows and platform-combination coverage.
- Porting games to CNA to expose API gaps that an audit cannot find.
Open issues and TODO markers in the source are the best starting points. See the GitHub repository.