Detailed Roadmap

What has shipped, what is genuinely incomplete, and what nobody has started

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.

RendererStateNotes
EasyGLProduction-readyFive GL-profile identities with the stock effects, lighting, instancing, queries, anisotropy, fog and context-loss recovery.
VulkanFunctionalSPIR-V pipeline with MRT handling, device-queried depth formats, stencil, MSAA resolve and mip blits.
DIRECTX9FunctionalWindows-only SM2/SM3 path with device-lost recovery and capability-validated MRT; target of the pixel-exact XNA oracle corpus.
SDL_GPUFunctionalDeferred/retained design with stock effects, stencil and MSAA resolve; Vulkan device layer in alpha.1.
DIRECTX11FunctionalWindows-only state-object caching, MRT with deferred resolve, instancing and runtime shader compilation.
SoftwareFunctionalCPU rasterizer with a Z-buffer and perspective-correct interpolation; TriangleList only and no GPU required.
FreeDirectFunctionalCross-platform, 2D-only DirectDraw-shaped CPU compositor over the sibling free-direct project.
SDL_RendererProduction-ready within its 2D scope2D renderer with explicit capability boundaries; 3D calls throw by design.
CanvasBrowser-onlyEmscripten-only 2D family with 17 statically discoverable GoogleTest-family definitions; execute the browser configuration before claiming pixel results.
bgfxPartialChecked-in 3D shaders cover GL/GLES/Vulkan/WebGPU, not D3D or Metal.
DIRECTX12PartialPSO/root-signature caches and barrier tracking exist, with important state and MRT gaps listed below.
WebGPUExperimentalBackbuffer-only forward renderer in alpha.1.
HeadlessTest harnessDeliberately renders nothing; ReadBackbuffer returns the last clear colour. Useful for fast game-logic CI.

Content and rendering features

  • The read-side XNB loader. ContentManager has 50 built-in readers with FFmpeg and 49 without it, LZX decompression, shared-resource resolution, video, typed external references and a real compiled-effect EffectReader. Custom readers can be registered explicitly; reflection-based discovery and XNB writing are absent.
  • Six XNA stock effectsBasicEffect, AlphaTestEffect, DualTextureEffect, EnvironmentMapEffect, SkinnedEffect, SpriteEffect — implemented natively in C++ rather than translated from bytecode.
  • PBR effects (CNAEXT): PbrEffect and SkinnedPbrEffect, plus RenderPipelineSettings, PbrMaterial, TonemappingMode and ShadowQuality.
  • Skeletal animation (CNAEXT): SkinnedModelEXT with AnimationPlayer, AnimationClipEXT, BoneTrackEXT and KeyframeEXT, plus MorphTargetEXT blend shapes.
  • cna_tool_gltf_to_cnj, an offline glTF 2.0 → .cnj Model/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 0 against CNA's DIRECTX9 output.
  • FNA differential testing against a real running FNA build, via tools/fna-reference/ and scripts/compare-fna-reference.py.
  • The CNAEXT purity check — 1,289 tagged declarations, turned into [[deprecated]] warnings under -Werror so 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.

ItemStateWhat 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.