Honest timeline note: CNA is a long-term open-source project maintained in spare time. There are no fixed release dates. Milestones are goals, not commitments. Progress is incremental and driven by API coverage, renderer stability, and real-world testing against ported games.

Where CNA actually is

0.1.0-alpha.1 is CNA's first tagged pre-release. It resolves to commit 1bb2145d99ed572dd4eb15009c34e2e5f410fcf0 and follows Semantic Versioning. 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. These are source facts, not a universal pass count; APIs may still change before 1.0.

Read that as: breadth is largely done, depth is not. The sections below separate what has shipped from what is genuinely partial and what nobody has started.

What is done and verified

Everything in this list exists in the source tree today and was confirmed by audit rather than by changelog.

Complete

50 renderer identities, single or multi-renderer builds Shipped

A normal build selects one identity 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. Platform gates and dependency costs still apply.

Production-ready

EasyGL renderer — the most mature path Shipped

EasyGL implements CNA's five GL-profile identities and is the Linux default through OPENGLES3. It covers the stock effect families, lighting, instancing, occlusion queries, anisotropy, fog and GL context-loss recovery. Use the renderer capability report for the exact profile and feature boundary.

Complete — was listed here as "planned, not started"

Direct3D 9 renderer — functional, and the pixel-exact XNA oracle target Shipped

This page previously described DIRECTX9 as a possible future renderer. That is out of date: it is a Windows-only implementation with SM2/SM3 shaders, device-lost recovery and capability-validated MRT. It is also the renderer used for CNA's 39-scene pixel-exact XNA oracle comparison at --tolerance 0.

Complete

Vulkan renderer Shipped

A functional SPIR-V renderer with MRT handling, device-queried depth formats, stencil state, MSAA resolve and mip blit cascades. Compiled XNA effects are an independent opt-in build feature.

New

SDL_GPU renderer Shipped

A deferred/retained renderer with SPIR-V shaders, the stock effect families, stencil and MSAA resolve. Its device layer is Vulkan-only in alpha.1; compiled XNA effects are an independent opt-in feature.

New

FreeDirect renderer — the best 2D fidelity in the project Shipped

A 2D-only DirectDraw-shaped renderer fronting the sibling free-direct project: a CPU compositor with bilinear filtering, distinct blend formulas and Wrap/Mirror addressing. It is cross-platform despite the name.

New

ASCII effect Migrated

The former ASCII renderer was deliberately removed and its logic promoted to a CNAEXT post-process effect, CNA::Graphics::AsciiPostProcessEffect. Because it now works through the public Texture2D::GetData() and SpriteBatch API, it applies on any renderer and to 3D-rendered sources — which the old renderer could not do. Requires -DCNA_CNAEXT=ON.

Shipped, narrow

Canvas renderer (Emscripten) Configuration-specific

The Canvas renderer is a browser-only 2D identity with 17 statically discoverable GoogleTest-family definitions in its module. That source count is useful inventory, not proof of pixel behavior in every browser; execute the Emscripten configuration you intend to ship.

Complete

The .xnb content pipeline Shipped

A real read-side XNB loader is wired into ContentManager: 50 built-in readers with FFmpeg, 49 without it, covering primitives, math, textures, fonts, audio, video, stock and compiled effects, and models on top of LZX decompression and shared-resource resolution. Typed external references and explicit custom-reader registration are present. Call RegisterAllBuiltInXnbReaders() once at startup; reflection-based discovery and XNB writing are not provided.

Complete

PBR effects and skeletal animation Shipped

Beyond the six XNA stock effects (all implemented natively in C++, not translated from bytecode), CNA ships non-XNA PbrEffect and SkinnedPbrEffect, plus RenderPipelineSettings, PbrMaterial, TonemappingMode and ShadowQuality. Skeletal animation is real: SkinnedModelEXT with AnimationPlayer, AnimationClipEXT, BoneTrackEXT and KeyframeEXT, plus MorphTargetEXT blend shapes. All of it sits behind the CNAEXT boundary, so it is visible at compile time as non-XNA surface.

Complete

Pixel-exact verification against the real XNA runtime Shipped

39 scenes under tools/xna-oracle/, rendered by a real C#/XNA reference renderer and diffed byte-for-byte against CNA's DIRECTX9 output at --tolerance 0. Alongside it: differential testing against a real running FNA build (tools/fna-reference/), and a compile-time CNAEXT purity check that turns all 1,289 non-XNA declarations into [[deprecated]] warnings under -Werror.

Complete

A real Input, Audio, Net and Storage core Shipped

Input has zero stubs and a SDL3 GamePad bridge. XACT is a real parser and player, not a facade — a real binary parser for the XGS/XWB/XSB formats with FACT's actual volume formula. Net is real ENet over genuine UDP with real LAN discovery. Storage is real std::filesystem IO with correct player namespacing. See XNA Compatibility for the per-namespace breakdown.

Partial, and known to be partial

These exist and work in part. The gaps below are specific and audited, not vague.

Partial

DIRECTX12 — missing scissor, viewport, stencil and blend factor Partial

The core has PSO and root-signature caches plus a barrier tracker. In alpha.1 there is no scissor, viewport, stencil or blend factor, and MRT clears without drawing. Its verification surface is especially narrow.

Partial

WebGPU — no render targets at all Partial

In alpha.1 this is a backbuffer-only forward renderer: no render targets, MSAA, cube or 3D textures, queries or instancing, with a non-functional stencil path. Render-target support is the gating item.

Partial

bgfx — no D3D or Metal shader blobs Partial

Its checked-in shader set targets GL, GLES, Vulkan and WebGPU, not D3D or Metal. The consequence is worth stating plainly: on bgfx's default Windows and macOS renderers, 3D silently draws nothing. Separately, CreateIndexBuffer32 is never overridden, so DrawUserIndexedPrimitives uploads 32-bit indices into a 16-bit buffer and corrupts geometry.

Thin

Continuous integration Partial

The tag contains 21 workflow files covering Linux, Apple, Emscripten, platform abstraction, multi-renderer selection and five declared C API gates. The intended unfiltered general job and two Input rows still select the removed EASYGL value and fail at configure time; the C API's final target separately fails its 49-versus-50 renderer-map assertion; Windows D3D/GDI lanes remain manual. The remaining working lanes provide useful scoped evidence, but not exhaustive coverage across 50 identities, graphics drivers, physical iOS devices or the complete GPU pixel/oracle matrix.

Open

Truthful capability reporting Partial

The base explicitly opts out of multi-stream input and compiled effects and delegates stencil, but returns true for its remaining capability entries. DIRECTX9, DIRECTX11, DIRECTX12 and SDL_GPU never override SupportsCapability() at all — so they advertise MSAA, MRT, occlusion queries, custom effects and instancing without necessarily querying the device. Several other renderers advertise features whose implementation throws or silently does nothing. A true therefore means "not contradicted", not "verified".

Work that remains before 1.0

Highest impact

Compiled effects beyond qualified builds Partial

XNA/FNA D3D9 Effect Framework binaries now load through Effect and XNB EffectReader on FNA3D, or on explicitly enabled EasyGL-family, SDL_GPU and Vulkan builds. HLSL .fx source, DXBC and MGFX remain different unsupported inputs, and most renderer families report no compiled-effect capability.

Planned

Consistent surface-format coverage Renderer-dependent

Public Texture2D format admission is renderer-qualified: Skia exposes the broad promoted set, IGL promotes verified Rg32 and Single, and the other families defer to the framework's Color-only public rule even when an internal renderer layer knows additional native formats. The remaining task is a truthful, tested per-renderer contract for every format a game intends to use.

Planned

ReflectiveReader for custom XNB types Not started

The XNB loader has 50 built-in readers with FFmpeg and 49 without it. Video, typed external references and compiled effects are represented, and custom readers can be registered explicitly. What remains absent is reflection-based discovery: user and closed-generic types require deliberate registration.

Planned

A GamerServices service renderer Not started

All 52 types are present with complete member signatures. There is no online service behind them — no Steam, no Xbox Live, no HTTP — but CNA does not stop at FNA's no-op shim: achievements and leaderboard entries are genuinely persisted as JSON under SDL_GetPrefPath() and reload in a later process, and LeaderboardWriter/LeaderboardReader implement real sorting, ranking and paging. Guide's message-box and keyboard-input paths are real implementations with overlay rendering. What genuinely does nothing is the remaining fifteen Guide::Show* overlay entry points, and the XNA-faithful AvatarRenderer::Draw() — the working avatar path is the CNAEXT DrawRealEXT().

Planned

Media portability and codec coverage Platform-dependent

The Media catalogue layer, playback, and FFmpeg-backed video paths are implemented. Remaining boundaries are platform and codec specific: video is not compiled into every target, and SDL_mixer does not provide AAC decoding for .m4a/.aac. Expand only with explicit build and runtime evidence.

Planned

Deeper tests for Media, Storage and Canvas Open

Coverage is uneven rather than absent: Storage has five GoogleTest-family definitions, Media 286, and the Canvas renderer 17. Those source counts still leave many runtime paths and platform combinations without execution evidence.

Long term

Public stable release (v1.0) Long term

The project is now versioned, but alpha.1 is deliberately pre-1.0. Reaching 1.0 requires an explicit compatibility policy, stable public APIs, clearer renderer capability contracts, reproducible configuration-scoped verification and production evidence on the platforms CNA intends to support.

🚀

Contributing: high-value work includes closing named renderer gaps, improving capability accuracy, expanding configuration-specific runtime evidence, and testing alpha.1's new platform, multi-renderer, compiled-effect and C API boundaries. See the GitHub repository and the detailed roadmap.