All notable changes to CNA are documented in this file.
The format follows Keep a Changelog, and this project
adheres to Semantic Versioning. While the major version is
0, the public API may change in any release — see the pre-1.0 note in
docs/releasing.md.
0.1.0-alpha.1 — 2026-08-20
First tagged release. CNA has been developed continuously since 2025-02-22; this tag names a
state of develop rather than introducing new work, so the entries below describe what the
release contains, not what changed since a previous tag.
- XNA 4.0 API surface. 227 of the 245 public FNA types are present (
Graphics,Audio,Input/TouchandStoragecomplete);ContentandMediaare the known gaps. Seedocs/xna-4-api-coverage.md. - Graphics. Every one of the ~26 major
Microsoft::Xna::Framework::Graphicsclasses is implemented and test-covered, at a qualified ~90% XNA/FNA behavioural compatibility. - 49 renderer identities selected at compile time through
CNA_GRAPHICS_RENDERER, plus the opt-in multi-renderer build that chooses between several at runtime (docs/runtime-renderer-selection.md).VULKAN,BGFX,FNA3D,OPENGL4and the EasyGL-backed GL family (OPENGLES3,OPENGL33,WEBGL1,WEBGL2,OPENGLES2) are the mature ones;WEBGPU,SKIA,SOKOL,DILIGENT,IGL,PIXIJSand the legacy DirectX identities carry documented, narrower capability boundaries. - Platform abstraction.
CNA::Platform::IPlatformwithSDL3,SDL2,HEADLESSandTERMINALimplementations, on independent CMake axes from the renderer and audio choices (docs/platform-abstraction.md). - Audio, input, media, storage, networking and device extensions as physical modules under
modules/(docs/physical-modules.md). - Compiled XNA effects — XNB
EffectReaderand Direct3D 9 Effect Framework bytecode execution on theFNA3Drenderer. - Experimental native C ABI (
CNA_BUILD_C_API, ABI version 0.7.0), versioned independently of this product version. CNA/Version.hpp— the release identity generated from the build's single source of truth, exposingCNA::getVersionString()and theCNA_VERSION_*macros.
Third-party dependencies are pinned by this repository: the submodules
(third_party/SDL cbe3fbe9f, third_party/SDL_image fcb9d0b15, third_party/SDL_mixer
3075d3eda, third_party/draco 8786740086, vendor/googletest 7e2c425db) through their
gitlinks, and the FetchContent dependencies through the GIT_TAG values in
cmake/ThirdParty*.cmake and cmake/RendererSelection.cmake. Checking out this tag therefore
selects them.
sharp-runtime is the exception and is not pinned by the build. It is a sibling checkout
consumed with add_subdirectory from ../sharp-runtime (overridable with
-DCNA_SHARP_RUNTIME_ROOT), so a build takes whatever revision that checkout happens to be on.
This release was developed and verified against:
sharp-runtime 625476d5b5fff5fa89f392c3c9af8638ff237692 (develop, 2026-08-19)
https://github.com/openeggbert/sharp-runtime
Recording the revision here is a stopgap — it documents the pin without enforcing it. A real mechanism (a configure-time check against a recorded pin, or a submodule) is planned.
- Pre-release quality: interfaces are expected to change before 1.0, and renderer coverage is
uneven by design — each renderer's boundary is documented in
docs/<renderer>-renderer.md. - Per-renderer bugs and gaps that are known and tracked are listed in
NEXT.md§5. Contenthas no general.xnbreader by design, and 14 of theMediatypes are shells.