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, backend stability, and real-world testing against demo applications.

What's new in 2026

A snapshot of the most significant milestones landed in the current development cycle, before the remaining Phase 1 gaps are closed.

Complete

All 17 PackedVector types — 100% test coverage

Every Microsoft::Xna::Framework::Graphics::PackedVector type is implemented with a full IEEE 754 half-float engine (HalfTypeHelper) covering subnormals, ±∞, ±0, and NaN. Pack rounding matches FNA exactly. Golden-value and edge-case tests all pass (Tasks 197–199).

Complete (Advanced)

Vulkan backend — all five stock effects pixel-tested, second-most mature backend

All five XNA stock effects are real and pixel-tested on Vulkan: BasicEffect, AlphaTestEffect, DualTextureEffect, EnvironmentMapEffect, SkinnedEffect. Also landed: instancing (DrawInstancedPrimitives), MRT, MSAA 4×, custom SPIR-V ShaderEffect, and a real DepthStencilState (compare-ops and stencil ops, Task 870).

Complete

EasyGL backend — 3D House Demo in the browser

EasyGL (OpenGL ES 3.0 / WebGL 2) is CNA's primary and most heavily tested backend: it passes 188 of its 190 GPU pixel-readback tests. The House 3D Demo runs fully in the browser via Emscripten/WebGL 2, validating real-world 3D rendering end-to-end.

Complete

4,373 unit tests, 490 GPU pixel tests

The GoogleTest suite runs 4,373 unit tests (4,371 passing; 2 skipped for want of real sensor hardware). On top of that, 490 GPU pixel-readback tests run under ctest across all four backends, rendering real scenes and asserting on actual pixels.

Complete

Speedy Blupi port — real-world API validation

The full Speedy Blupi game has been ported to run on CNA, exercising the game loop, SpriteBatch, input, audio, and content loading under real game-code conditions. This validates API correctness beyond unit tests.

Live

Browser demos — House 3D Demo and CNA Demo

Both demos are playable in the browser today, compiled with Emscripten and running on WebGL 2. Full 2D and 3D rendering work in-browser with no plugins required.

Complete

Android hardware validation

CNA runs on Android via SDL3's native Android support. The CMake toolchain for the Android NDK is configured and the SDL_RENDERER backend has been validated on physical Android hardware.

Complete

SkinnedEffect — 72-bone UBO on EasyGL and Vulkan

SkinnedEffect is fully implemented using a 72-bone uniform buffer object on both the EasyGL and Vulkan backends, enabling skinned mesh animation on all primary rendering paths.

Complete

Texture2D FNA-conformance audit

A systematic audit against FNA's reference behavior found and fixed two heap-buffer-overflow bugs in SetData, added a missing FromStream overload, and verified SaveAsPng/SaveAsJpeg round-trips and the mip-level count formula. DrawUserPrimitives/DrawUserIndexedPrimitives also moved to per-device scratch buffers, removing 22 per-draw heap allocations.

63 of 86 samples ported

cna-samples — real XNA Game Studio 4.0 code running on CNA

63 of the 86 addressable Microsoft XNA Game Studio 4.0 samples now build against CNA's API, including full 2D games (CatapultWars, Platformer, MarbleMaze, RolePlayingGame), a reusable screen-management framework (GameStateManagement), AI and pathfinding demos, 3D audio, touch gestures and LAN multiplayer. The 23 that remain are almost entirely blocked on one thing: custom .fx shaders. See Showcase for details.

Complete (Advanced)

bgfx backend — full 2D+3D pixel-verified parity (Phase 72)

The bgfx backend now matches EasyGL and Vulkan for pixel-verified 2D+3D coverage: all five stock effects, render targets, MSAA, texture 3D/cube, and per-draw state are real. Two named gaps remain: custom ShaderEffect source compilation is unsupported (CreateEffectBackend returns nullptr), and OcclusionQuery Begin/End wiring is real but pixel-verified correctness can't be confirmed under this project's sandbox (software GL 2.1 driver, no dedicated-view architecture yet — Task 917).

Fixed

Vulkan SpriteBatch multi-Begin/End data loss — resolved

Issuing more than one SpriteBatch::Begin()/End() pair within a single frame used to silently discard all but the last batch on Vulkan. Fixed 2026-07-07 (Task 664): Begin() was destructively clearing the same vectors a prior End() had just populated, plus a second bug that always harvested to a hardcoded offset instead of an accumulating cursor. Fixed via a per-cycle BatchSnapshot and a real running cursor, with a new regression test.

Complete

Touch input and XACT audio — closed as gaps

Input::Touch now reaches ~98% behavior fidelity: a byte-faithful FNA gesture-pipeline port (Tap through PinchComplete), wired end-to-end and tested with a deterministic clock. Audio (XACT: AudioEngine/SoundBank/WaveBank/Cue) now reaches ~97%: a real .xgs/.xsb/.xwb parser plus SDL3_mixer playback, with category/lifecycle/3D/instance-limit/fade and continuous RPC volume/pitch curves all real. Both were previously cited as open gaps on this site — the main remaining gap is now the XNB content pipeline.

New

GamerServices, Net, and Avatar — full port

Beyond graphics, CNA now ports the XNA 4.0 GamerServices and Net namespaces. GamerServices covers the full Xbox-LIVE-era API surface (Gamer, SignedInGamer, GamerProfile, FriendCollection, leaderboards, Guide, achievements) with local/synthetic semantics, matching how FNA itself handles this namespace. Net's NetworkSession has a complete API surface (5 enums + 18 classes) with real networking for SystemLink sessions, backed by ENet (reliable UDP) — verified across four platforms: Linux (native, 2-process loopback), Windows (WinSock2 under Wine), Web/Emscripten (real ENet-over-WebSocket), and Android NDK (native ENet/UDP on a real emulator). Within GamerServices, Avatar (AvatarAnimation/AvatarDescription/AvatarRenderer) is ported from a decompiled real Microsoft XNA 4.0 reference assembly — FNA never implemented Avatar at all.

New

Windows — real supported platform

Windows is now a real target via the SDL_RENDERER backend (MSVC 2022, clang-cl, or MinGW-w64), cross-compiled with MinGW-w64 from Linux and verified running under Wine. GitHub Actions CI now also covers the Input and Devices/Sensors subsystems (input-ci.yml, devices-tests.yml); Graphics, Audio, and Net are still verified via manual local ctest runs, not yet gated by CI.

XNA 4.0 API in C++ — nearly done

The goal of this phase was comprehensive coverage of the XNA 4.0 public API in native C++23. That is now substantially done: 227 of the 245 public XNA 4.0 types are implemented, including every type in Graphics, Audio, Input, Media, Storage and the math namespace. What remains is not breadth but depth — the .xnb content pipeline and compiled .fx shaders, both deliberately deferred.

Complete

Core game loop infrastructure

Game, GameTime, GameComponent, GameComponentCollection, DrawableGameComponent, GameServiceContainer, GameWindow, FrameworkDispatcher.

Complete

Math types library

Full math library: Vector2, Vector3, Vector4, Matrix, Quaternion, Color, Rectangle, Point, BoundingBox, BoundingSphere, BoundingFrustum, Plane, Ray, MathHelper, Curve, CurveKey, CurveKeyCollection. 100% tested.

Complete

SDL3 platform foundation

SDL3 windowing, SDL3_image texture loading, SDL3_mixer audio initialisation. All three vendored as submodules - no system packages needed.

Complete

SDL_Renderer backend — 2D

GraphicsDevice, SpriteBatch, Texture2D fully working. Most portable 2D path, validated on Linux. Default for Windows builds.

Complete

EasyGL (OpenGL ES 3.0) backend — 2D & 3D

Full 2D and 3D rendering via easy-gl. Four shader variants by vertex stride, depth/blend/cull wired, matrix uploads. Runs natively on Linux and via WebGL 2 in the browser.

Complete

Full input system

Keyboard (full key set), Mouse, GamePad (all 4 players, axes, D-pad, triggers, dead-zone), TouchPanel with gesture recognition (Tap, FreeDrag, Flick), TextInputEXT.

Complete

Audio system

SoundEffect, SoundEffectInstance, DynamicSoundEffectInstance, SoundBank/WaveBank (XACT parsing), MediaPlayer/Song — all on SDL3_mixer.

Complete

Content system & asset loaders

Extensible ContentManager with readers for Texture2D, SpriteFont, Model, Effect, SoundEffect, Song, Video. JSON descriptor format instead of XNB.

Complete

Effects, Model, SpriteFont, RenderTarget2D

BasicEffect, AlphaTestEffect, DualTextureEffect, EnvironmentMapEffect, SkinnedEffect, SpriteEffect. Model::Draw with bone transforms. SpriteFont with DrawString. RenderTarget2D with FBO support. All five stock effects pixel-tested on EasyGL across all shader variants (Tasks 101–109).

Complete

All 17 PackedVector types — full IEEE 754 precision

Every Microsoft::Xna::Framework::Graphics::PackedVector type implemented: Alpha8, Bgr565, Bgra4444, Bgra5551, Byte4, HalfSingle, HalfVector2, HalfVector4, NormalizedByte2, NormalizedByte4, NormalizedShort2, NormalizedShort4, Rg32, Rgba1010102, Rgba64, Short2, Short4. HalfTypeHelper implements the full IEEE 754 half-float algorithm including subnormals, ±∞, ±0, and NaN. Pack rounding matches FNA exactly. Golden-value and edge-case tests all pass (Tasks 197–199).

Complete

Emscripten / WebGL 2

EasyGL backend builds and runs via WebAssembly. The House 3D Demo and CNA Demo are playable in the browser. Full 2D and 3D rendering work. FFmpeg video excluded on this target.

Complete

Android

CNA runs on Android via SDL3's native Android support. CMake toolchain for the Android NDK is configured and validated on Android hardware with the SDL_RENDERER backend.

Complete (Advanced)

Vulkan backend — full 2D and 3D pipeline, second-most mature backend

All five stock effects are real and pixel-tested on Vulkan: BasicEffect, AlphaTestEffect, DualTextureEffect, EnvironmentMapEffect, SkinnedEffect (72-bone UBO). Also supported: custom ShaderEffect (SPIR-V, pixel-tested), DrawInstancedPrimitives (VK_VERTEX_INPUT_RATE_INSTANCE), RenderTarget2D / RenderTargetCube / MRT, FillMode::WireFrame, MSAA 4×, per-slot SamplerState (16 slots), Texture3D / TextureCube, a real DepthStencilState (compare-ops and stencil ops), GetBackBufferData, and debug labels.

Fixed: issuing more than one SpriteBatch::Begin()/End() pair within a single frame used to discard all but the last batch on Vulkan — fixed 2026-07-07 (Task 664). Also tracked: EasyGL_MRT_TwoAttachments and EasyGL_GraphicsDevice_ReferenceStencil are pre-existing failures in the 168-test EasyGL integration suite (separate from the 4,373 core unit tests, which all pass); a third, easy-gl-resource-smoke-tests, is a vendored easy-gl Mesa/llvmpipe environment quirk, not a CNA bug.

Complete (Advanced)

bgfx backend — full 2D+3D pixel-verified parity (Phase 72)

The bgfx backend now matches EasyGL and Vulkan for pixel-verified 2D+3D coverage. Working: 2D SpriteBatch, all five stock effects (BasicEffect, AlphaTestEffect, DualTextureEffect, EnvironmentMapEffect, SkinnedEffect), DrawInstancedPrimitives, RenderTarget2D/Cube/MRT with MSAA, Texture3D/TextureCube, FillMode::WireFrame. Two named gaps remain: custom ShaderEffect source compilation is unsupported (CreateEffectBackend returns nullptr), and OcclusionQuery Begin/End wiring is real but pixel-verified correctness can't be confirmed under this project's sandbox (software GL 2.1 driver).

Planned

Remaining XNA API gaps

The XNB binary content pipeline is now the primary remaining gap (CNA uses a custom JSON content descriptor format instead). Touch input and XACT audio are closed as of this cycle. Also remaining: additional Sensors hardening (Gyroscope, Compass) and MediaLibrary.

Compatibility, platform expansion, and real-world validation

This phase validated CNA against real game code and expanded platform coverage. The Speedy Blupi game port, Android, Emscripten/Web, and basic Windows support are all done. Remaining work is native Windows CI and backend completion.

Complete

Speedy Blupi full port

The Speedy Blupi game has been ported to run on CNA, validating real-world API coverage and semantic fidelity of the XNA game loop, SpriteBatch, input, audio, and content loading.

Complete

Android platform support

CNA runs on Android via SDL3's native Android support. CMake toolchain for the Android NDK is configured and validated on Android hardware.

Complete

Emscripten / WebAssembly

EasyGL + WebGL 2 builds and runs in the browser. The House 3D Demo and CNA Demo are playable in the browser today. Full 2D and 3D rendering work via WebAssembly.

In Progress

Windows platform validation

Windows is now a real supported target via the SDL_RENDERER backend (MSVC 2022, clang-cl, or MinGW-w64) — cross-compiled with MinGW-w64 from Linux and verified running under Wine. Still planned: full CI validation on native Windows hardware, and the other backends that are meaningful on Windows passing the test suite there too.

Planned

Expanded test suite

Broader GoogleTest coverage for math types, game loop semantics, rendering output verification, and cross-backend consistency.

Stabilization and platform expansion

The long-term goal is a stable, well-tested, versioned CNA release that other projects can safely depend on.

Done (EasyGL, Vulkan)

3D rendering capabilities

Full 3D rendering — geometry, materials (BasicEffect and friends), vertex/index buffers, depth, blend, cull — is implemented across EasyGL, Vulkan, and bgfx, and runs in the browser. Remaining gaps: Vulkan's BlendState custom blend modes and OcclusionQuery, and bgfx's custom ShaderEffect support.

Long Term

Public stable release (v1.0)

A versioned, stable release of CNA suitable for other projects to depend on. This requires full Phase 1 + Phase 2 completion and a stable API contract that community projects can build on.

🚀

Contributing: CNA is open source (Ms-PL). The highest-value contributions at this stage are: implementing missing XNA API classes, improving backend feature parity, writing tests, and testing on platforms (especially Windows and Android). See the GitHub repository for open issues and the TODO list.