Repository navigation
Expand file tree
/
Copy pathroadmap.html
More file actions
390 lines (334 loc) · 40.7 KB
/
Copy pathroadmap.html
File metadata and controls
390 lines (334 loc) · 40.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Roadmap - CNA</title>
<meta name="description" content="CNA roadmap: what shipped since the alpha.1 tag, the verified boundaries of development snapshot c1c316b9, and the path toward 1.0.">
<meta property="og:type" content="website">
<meta property="og:site_name" content="CNA">
<meta property="og:url" content="https://libcna.com/roadmap.html">
<meta property="og:title" content="Roadmap - CNA">
<meta property="og:description" content="CNA roadmap: what shipped since the alpha.1 tag, the verified boundaries of development snapshot c1c316b9, and the path toward 1.0.">
<link rel="stylesheet" href="css/style.css">
<link rel="icon" href="favicon.svg" type="image/svg+xml">
<link rel="canonical" href="https://libcna.com/roadmap.html">
<link rel="stylesheet" href="css/prism-tomorrow.min.css">
<script>(function(){try{var t=localStorage.getItem("cna-theme");if(t==="light"||t==="dark")document.documentElement.setAttribute("data-theme",t);}catch(e){}})();</script>
</head>
<body>
<a class="skip-link" href="#main-content">Skip to content</a>
<nav class="nav">
<div class="nav-container">
<a href="index.html" class="nav-brand">CNA</a>
<button class="nav-toggle" aria-label="Toggle navigation" aria-expanded="false">
<span></span><span></span><span></span>
</button>
<div class="nav-menu">
<a href="index.html" class="nav-link">Home</a>
<a href="about.html" class="nav-link">About</a>
<a href="features.html" class="nav-link">Features</a>
<a href="architecture.html" class="nav-link">Architecture</a>
<a href="documentation.html" class="nav-link">Documentation</a>
<a href="development/index.html" class="nav-link">Development</a>
<a href="deep-dives/index.html" class="nav-link">Deep Dives</a>
<a href="tutorials.html" class="nav-link">Tutorials</a>
<a href="demos.html" class="nav-link">Demos</a>
<a href="showcase.html" class="nav-link">Showcase</a>
<a href="videos.html" class="nav-link">Videos</a>
<a href="roadmap.html" class="nav-link">Roadmap</a>
<a href="contact.html" class="nav-link">Contact</a>
<a href="network.html" class="nav-link">Network</a>
<a href="search.html" class="nav-link">Search</a>
<a href="https://github.com/libcna/cna" class="nav-link nav-link--github" target="_blank" rel="noopener">GitHub</a><a href="https://blog.libcna.com/" class="nav-link nav-link--blog" target="_blank" rel="noopener">Blog</a>
<a href="https://www.youtube.com/@libcna" class="nav-link nav-link--youtube" target="_blank" rel="noopener">YouTube</a>
<a href="https://discord.gg/vrnc4n6DaE" class="nav-link nav-link--discord" target="_blank" rel="noopener">Discord</a>
</div>
<button class="theme-toggle" type="button" aria-label="Switch to light theme" title="Switch to light theme">
<svg class="theme-icon-light" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M12 17a5 5 0 1 1 0-10 5 5 0 0 1 0 10zm0-2a3 3 0 1 0 0-6 3 3 0 0 0 0 6zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.5 4.9l1.4-1.4 2.1 2.1-1.4 1.4L3.5 4.9zm13.5 13.5l1.4-1.4 2.1 2.1-1.4 1.4-2.1-2.1zM19.1 3.5l1.4 1.4-2.1 2.1-1.4-1.4 2.1-2.1zM5.6 17l1.4 1.4-2.1 2.1-1.4-1.4L5.6 17zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></svg>
<svg class="theme-icon-dark" viewBox="0 0 24 24" aria-hidden="true" focusable="false"><path d="M12.3 22a10 10 0 0 1-1.6-19.9c.6-.1 1 .5.8 1a7.9 7.9 0 0 0 9.7 10.6c.5-.2 1 .3.9.8A10 10 0 0 1 12.3 22z"/></svg>
</button>
</div>
</nav>
<main id="main-content">
<div class="page-header">
<div class="container">
<span class="section-label">Roadmap</span>
<h1>Development Roadmap</h1>
<p>CNA is a long-term project developed incrementally. This page describes the honest current state and the path forward - no overpromising, no fake ETAs.</p>
</div>
</div>
<section class="section">
<div class="container">
<div class="callout callout--warn">
<span class="callout-icon">⚠</span>
<p><strong>Honest timeline note:</strong> CNA is a long-term open-source project maintained in spare time. There are no fixed release dates. Milestones are goals, not commitments, and items marked "Open" below are gaps that have been identified, not work that has been scheduled. Progress is incremental and driven by API coverage, renderer stability, and real-world testing against ported games.</p>
</div>
<!-- Current state -->
<span class="section-label">Current State</span>
<h2>Where CNA actually is</h2>
<p><strong>0.1.0-alpha.1 is CNA's first tagged pre-release.</strong> It resolves to commit <code>1bb2145d99ed572dd4eb15009c34e2e5f410fcf0</code> (20 August 2026) and follows Semantic Versioning. This page tracks the development snapshot <code>c1c316b9</code> (9 October 2026, branch <code>apple/m4-stabilization</code>), which is 3,687 commits later; its product version string is still <code>0.1.0-alpha.1</code> and no newer tag exists (see <a href="docs/releases.html">Releases & Versioning</a>). At this snapshot CNA represents every one of the 331 documented XNA 4.0 runtime types and 3,627 documented members — representation, not behaviour — exposes 14 renderer identities across 12 implementation families (alpha.1: 50 across 46), and has 813 C++ test sources with 11,380 statically discoverable GoogleTest-family definitions. These are source facts, not a universal pass count; APIs may still change before 1.0.</p>
<p>Read that as: breadth is largely done, depth is not. The sections below separate what has shipped since alpha.1 from what is genuinely partial and what remains open.</p>
<!-- Shipped -->
<span class="section-label">Shipped</span>
<h2>What is done and verified</h2>
<p>Everything in this list exists in the source tree of snapshot <code>c1c316b9</code> and was confirmed by audit rather than by changelog. Items labelled "New" arrived after the alpha.1 tag.</p>
<div class="timeline mt-3 mb-4">
<div class="timeline-item done">
<div class="timeline-label">Complete</div>
<h3>14 renderer identities, single or multi-renderer builds <span class="status-badge status-done">Shipped</span></h3>
<p>A normal build selects one identity with <code>CNA_GRAPHICS_RENDERER</code>. An opt-in <code>CNA_GRAPHICS_RENDERERS</code> list links several compatible families and selects one before the first device through <code>GraphicsRendererSelection</code>; fallback is explicit and the choice latches once the first renderer has been created successfully. Platform gates and dependency costs still apply. Since alpha.1 the set has been deliberately curated from 50 identities over 46 implementation families to 14 over 12: a name outside the 14 is a configure-time error, never a silent fallback, and no surviving identity was renumbered in the C ABI. See <a href="docs/rendering-backends.html">Graphics Renderers</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Production-ready</div>
<h3>EasyGL renderer — the most mature path <span class="status-badge status-done">Shipped</span></h3>
<p>EasyGL implements CNA's three GL-profile identities — <code>OPENGLES3</code>, <code>OPENGL33</code> and the browser's <code>WEBGL2</code> — and is the Linux default through <code>OPENGLES3</code>. It covers the stock effect families, lighting and GL context-loss recovery, instancing, occlusion queries, anisotropy, multiple render targets and 3D textures. Use the renderer capability report for the exact profile and feature boundary.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Complete — was listed here as "planned, not started"</div>
<h3>Direct3D 9 renderer — functional, and the pixel-exact XNA oracle target <span class="status-badge status-done">Shipped</span></h3>
<p>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 MRT bounded by the graphics profile. It is also the renderer used for CNA's 39-scene pixel-exact XNA oracle comparison at <code>--tolerance 0</code>: the references come from the genuine XNA 4.0 runtime under Wine and DXVK on Linux, the result is recorded as 39 of 39 (the last consolidated dated report covers 31 scenes; later per-scene notes record the rest), and the check is manual and not run in CI. Compiled XNA effects are an opt-in build feature.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Complete</div>
<h3>Vulkan renderer <span class="status-badge status-done">Shipped</span></h3>
<p>A functional SPIR-V renderer with MRT handling, device-queried depth formats, stencil state, MSAA resolve and mip blit cascades. Its modern-graphics campaign added compute and storage buffers, indirect and base-instance draws, GPU timers, float and half-float render targets, and shadow-map and image-based-lighting sampling. Compiled XNA effects are an independent opt-in build feature.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>SDL_GPU renderer <span class="status-badge status-done">Shipped</span></h3>
<p>A deferred/retained renderer with SPIR-V shaders, the stock effect families, stencil and MSAA resolve. It is no longer Vulkan-only: with <code>CNA_SDL_GPU_SHADERCROSS</code> (on by default on Windows and Apple) SDL's Direct3D 12 and Metal devices are reached by translating the SPIR-V through SDL_shadercross. The modern-graphics campaign added compute, indirect draw, float targets and shadow and IBL sampling; the renderer reports no occlusion queries. Compiled XNA effects are an independent opt-in feature.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>ASCII effect <span class="status-badge status-done">Shipped</span></h3>
<p>A CNAEXT post-process effect, <code>CNA::Graphics::AsciiPostProcessEffect</code>, renders any finished frame as ASCII art. Because it works through the public <code>Texture2D::GetData()</code> and <code>SpriteBatch</code> API, it applies on any renderer and to 3D-rendered sources. Requires <code>-DCNA_CNAEXT=ON</code>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Complete</div>
<h3>The <code>.xnb</code> content pipeline <span class="status-badge status-done">Shipped</span></h3>
<p>A real XNB loader is wired into <code>ContentManager</code>: <strong>61 built-in readers (60 without native 128-bit integers)</strong>, 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, <code>ReflectiveTypeReaderBuilder</code> registers custom types from a declared field list, and a <code>Game</code> registers the built-in readers itself. Since alpha.1 CNA also <strong>writes</strong> content: the build-time <code>cna-content</code> tool turns source assets into <code>.cnb</code> (the default) or <code>.xnb</code>, including LZX compression, and <code>ContentManager</code> resolves <code>.xnb</code>, then <code>.cnb</code>, then loose files. CNA reports that its XNB output loads in a genuine XNA 4.0 runtime under Wine; that has not been re-run for this page. See <a href="docs/content-pipeline-xnb.html">XNB Content Pipeline</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>Build-time Content Pipeline and the CNB format <span class="status-badge status-done">Shipped</span></h3>
<p>The XNA-shaped <code>Microsoft::Xna::Framework::Content::Pipeline</code> API is represented (128 of 128 types, 705 of 705 members, 10 importers, 12 processors) and driven by <code>cna-content</code>, which imports images, audio, video, fonts, glTF, <code>.fbx</code>, <code>.x</code> and existing <code>.xnb</code> and compiles <code>.fx</code> sources through an external legacy <code>fxc</code> (that route's verification against a genuine Microsoft <code>fxc</code> is not established). CNB is CNA's own deterministic container: a 64-byte header, CRC-32C per structure and chunk, and schemas for textures, models, animation clips, sounds and more. The pipeline has no C ABI export. See <a href="docs/content-pipeline.html">Content Pipeline</a>, <a href="docs/cnb-format.html">CNB Format</a> and <a href="docs/tools.html">Command-Line Tools</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Complete</div>
<h3>PBR effects and skeletal animation <span class="status-badge status-done">Shipped</span></h3>
<p>Beyond the five XNA stock effects and <code>SpriteEffect</code> (all implemented natively in C++, not translated from bytecode), CNA ships non-XNA <code>PbrEffect</code> and <code>SkinnedPbrEffect</code>, with shadow-map and image-based-lighting inputs. Skeletal animation is real: <code>SkinningData</code> on <code>Model::Tag</code> with <code>AnimationPlayer</code>, <code>AnimationClipEXT</code>, <code>BoneTrackEXT</code> and <code>KeyframeEXT</code> (the Avatar path has its own <code>SkinnedModelEXT</code>), plus <code>MorphTargetEXT</code> blend shapes. All of it sits behind the <code>CNAEXT</code> boundary, so it is visible at compile time as non-XNA surface. PBR draws are implemented on the GL family, Vulkan, SDL_GPU, WebGPU, Direct3D 9/11 and Metal (Software as a reduced CPU cross-check); FNA3D refuses them.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Complete</div>
<h3>Pixel-exact verification against the real XNA runtime <span class="status-badge status-done">Shipped</span></h3>
<p>39 scenes under <code>tools/xna-oracle/</code>, rendered by the genuine Microsoft XNA 4.0 runtime under Wine and DXVK on Linux and diffed byte-for-byte against CNA's DIRECTX9 output at <code>--tolerance 0</code> — recorded in the repository as matching all 39, run manually rather than in CI, and not yet repeated on native Windows. Alongside it: differential testing against a real running FNA build (<code>tools/fna-reference/</code>, also manual), and a compile-time <code>CNAEXT</code> purity check: defining <code>CNA_STRICT_XNA_API</code> turns <code>CNAEXT</code> declarations into <code>[[deprecated]]</code> warnings that <code>-Werror</code> promotes to errors, though the repository's own harness for it covers only <code>Microsoft::Devices</code> and its sensors.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">Complete</div>
<h3>A real Input, Audio, Net and Storage core <span class="status-badge status-done">Shipped</span></h3>
<p><code>Input</code> 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. <code>Net</code> is real ENet over genuine UDP with real LAN discovery and best-effort host migration; <code>PlayerMatch</code>, <code>Ranked</code> and <code>JoinInvited</code> are refused with <code>GamerServicesNotAvailableException</code> rather than pretending. <code>Storage</code> is real <code>std::filesystem</code> IO with correct player namespacing and path-containment checks. See <a href="docs/xna-compatibility.html">XNA Compatibility</a> for the per-namespace breakdown.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>XNA API representation closed: 331 of 331 types, 3,627 of 3,627 members <span class="status-badge status-done">Shipped</span></h3>
<p>Every documented type and member of the ten XNA 4.0 runtime assemblies now has a matching C++ declaration (the first census found 3,463), measured by <code>tools/audit_xna_runtime_surface.py</code> against Microsoft's own XML documentation and DLL metadata. That includes the previously missing <code>Microsoft.Xna.Framework.Design</code> namespace: thirteen type converters in the opt-in <code>CNA::Design</code> module (see <a href="docs/design-converters.html">Framework.Design</a>). This is representation, not behaviour: behaviour is verified only for the subsets on the <a href="docs/verification.html">Verification</a> page, and the census is a manual script, not a CI gate.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>Windows, X11 and Wayland through one SDL3 platform <span class="status-badge status-done">Shipped</span></h3>
<p><code>CNA_PLATFORM</code> selects one of three implementations: <code>SDL3</code> (the default and the one windowing platform), <code>HEADLESS</code> and <code>TERMINAL</code>. SDL3 reaches Windows, X11 and Wayland through SDL’s own video drivers, and a game can still read the native handles (<code>HWND</code>, the X11 display and window, the Wayland display and surface) through <code>GameWindow::GetNativeWindowHandleEXT()</code>. <code>CNA_ENABLE_SDL=OFF</code> builds a windowless tree without SDL. CI runs the SDL3 window suite on SDL’s <code>x11</code> driver under Xvfb and on its <code>wayland</code> driver under a headless Weston, and builds and runs it natively on Windows by manual dispatch. See <a href="docs/native-platforms.html">Windows, X11 and Wayland</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>ALSA audio and optional FFmpeg <span class="status-badge status-done">Shipped</span></h3>
<p><code>CNA_AUDIO_PLATFORM=ALSA</code> plays and records through ALSA (<code>libasound</code> is loaded at run time) with CNA's own mixer and vendored WAV, Ogg Vorbis, MP3 and FLAC decoders, so SDL-free Linux builds have XNA audio. FFmpeg video is now optional (<code>CNA_ENABLE_VIDEO=AUTO|ON|OFF</code>): the <code>Video</code> types link everywhere and throw <code>NotSupportedException</code> when no backend was built.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>Compiled XNA effects on 11 renderer identities <span class="status-badge status-done">Shipped</span></h3>
<p><code>Effect(GraphicsDevice&, bytes)</code> and the XNB <code>EffectReader</code> load XNA Effect Framework bytecode on FNA3D (always) and, behind default-OFF build options, on the EasyGL family, Vulkan, WebGPU, Software, Direct3D 9 and 11, SDL_GPU and Metal. A default configure reports the capability on FNA3D only. Runtime HLSL <code>.fx</code> compilation, DXBC and MGFX remain unsupported.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>Modern-graphics campaigns: SDL_GPU, WebGPU, Vulkan and Direct3D 11 <span class="status-badge status-done">Shipped</span></h3>
<p>Base-instance draws, float and half-float render targets, shadow-map and image-based-lighting sampling, and renderer-internal compute and indirect-draw support landed on the renderers whose code and tests support them; WebGPU and Vulkan draw paths were made several times faster on a real street scene. <code>GraphicsCapability</code> grew from 14 to 19 members and the new <code>RendererCapabilityProfile</code> API reports 32 features, 22 limits and per-format usage. 32 cross-renderer parity fixtures are registered for EasyGL, WebGPU, SDL_GPU and Direct3D 11, against the fixtures' own assertions — not against real XNA.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New, opt-in</div>
<h3>CNAEXT extensions <span class="status-badge status-partial">Opt-in, not in CI</span></h3>
<p>The opt-in <code>CNA::Graphics</code> module holds three retro post-processing effects (CRT, colour-depth reduction, ASCII), a debug-drawing helper and portable shader packages. It needs <code>-DCNA_CNAEXT=ON</code> (default OFF); no workflow builds it. See <a href="docs/cnaext-extensions.html">CNAEXT Extensions</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New, opt-in</div>
<h3>Diagnostics and Inspector <span class="status-badge status-partial">Opt-in, not in CI</span></h3>
<p><code>CNA_DIAGNOSTICS=OFF|STATS|FULL</code> (default OFF) adds counters, gauges, per-frame counters, CPU profiler zones, bounded recording and Chrome-trace export, with built-in instrumentation for frames, draw calls and audio voices. <code>CNA_BUILD_INSPECTOR</code> adds an in-process agent (authenticated TCP) and the <code>cna-inspector</code> bridge that serves an offline browser UI; it is view-only and desktop-only, and no renderer supplies a resource-preview provider yet. No workflow configures either. See <a href="docs/diagnostics.html">Diagnostics</a> and <a href="docs/inspector.html">Inspector</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>C# through CNA.NET <span class="status-badge status-partial">Beta, source-first</span></h3>
<p>The C# binding builds on the C ABI: <code>CNA.XnaCompat</code> exposes the <code>Microsoft.Xna.Framework</code> API over the native C++ runtime, so XNA 4.0 C# game source compiles and runs without being rewritten. Its public metadata matches the selected XNA 4.0 runtime profile, it pairs with exactly C ABI 0.46.0, and a <code>dotnet new</code> template creates games with desktop, browser and Android heads. Qualified on Linux x86_64, in headless Chromium and on the x86_64 Android emulator; on a physical Mac mini M4 (osx-arm64) it builds, passes its managed suites and package acceptance, and smoke-runs its 84 samples on <code>SOFTWARE</code> and <code>METAL</code>, as local evidence without a CI leg, signing or notarization. See <a href="docs/cna-net.html">C# with CNA.NET</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>XNA 4.0 samples in C++, in the browser and in original C# <span class="status-badge status-done">Practically complete</span></h3>
<p>91 of Microsoft’s XNA 4.0 samples and games have complete C++ ports (cna-samples <code>5db32e6</code>); 8 relevant C# programs remain, and the rest of the 153-entry audit list are not port targets. 90 C++ builds are playable at <a href="https://samples.libcna.com/" target="_blank" rel="noopener">samples.libcna.com</a>; the Racing Game Kit is ported but not hosted. 84 original C# sample programs run unchanged through CNA.NET (cna-dotnet-samples <code>1e6d763</code>). See <a href="showcase.html#xna-samples">the Showcase</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>Gamer Services, Guide, avatars and online sessions <span class="status-badge status-partial">Linux; macOS recorded</span></h3>
<p>Players are local profiles by default; configured outside game code, the same XNA APIs connect to the self-hosted <a href="https://github.com/libcna/cna-gamer-services-server" target="_blank" rel="noopener">CNA Gamer Services server</a> for accounts, friends, presence, pictures, leaderboards and relayed PlayerMatch and Ranked sessions with invites and host migration. Avatars draw with CNA’s own art. Qualification is on Linux, with a CNA-recorded run on one physical Mac mini M4; there is no public server instance, and achievements and scores are client claims without anti-cheat. See <a href="docs/gamer-services.html">Gamer Services & Avatars</a>.</p>
</div>
<div class="timeline-item done">
<div class="timeline-label">New</div>
<h3>Save persistence on the web <span class="status-badge status-done">Shipped</span></h3>
<p>WebAssembly builds mount the browser’s IndexedDB for <code>StorageDevice</code> and isolated storage and restore it before <code>main()</code>, so saves survive a page reload; threaded builds need <code>CNA_EMSCRIPTEN_USE_WASMFS=OFF</code> for this. The GamerServices local profile store is not yet inside these mounts.</p>
</div>
</div>
<!-- In progress -->
<span class="section-label">In Progress</span>
<h2>Partial, and known to be partial</h2>
<p>These exist and work in part. The gaps below are specific and audited, not vague.</p>
<div class="timeline mt-3 mb-4">
<div class="timeline-item active">
<div class="timeline-label">Partial</div>
<h3>WebGPU — formerly no render targets at all <span class="status-badge status-wip">Partial</span></h3>
<p>In alpha.1 this was a backbuffer-only forward renderer: no render targets, MSAA, cube or 3D textures, queries or instancing, with a non-functional stencil path. It now reports real MRT (two to four targets), occlusion queries, wireframe, multi-stream input, instancing, probed MSAA, probed float render targets and compute, and it gained a browser route through the Emscripten <code>emdawnwebgpu</code> port and opt-in compiled effects. CNA still declares it Experimental, half-float linear filtering is false, and the only workflow that builds it is the Emscripten one, which builds and inspects a browser bundle without running it.</p>
</div>
<div class="timeline-item active">
<div class="timeline-label">Partial</div>
<h3>Metal — supported on a physical Mac, not yet primary-production <span class="status-badge status-wip">Partial</span></h3>
<p>Since CNA's Mac mini M4 campaign Metal implements MSAA, multiple render targets, occlusion queries, instancing and multi-stream input, float, packed and DXT formats, cube and volume textures, full PBR and SpriteBatch-scoped MSL custom effects, with compiled XNA effects behind <code>CNA_METAL_COMPILED_EFFECTS</code> (off by default); it runs on macOS and, with Simulator evidence only, on iOS. On a physical Mac mini M4 its full test suite and its 261 Metal tests under the validation layers pass. CNA declares it Supported but not primary-production: compiled effects are off by default, on-screen presentation was never observed, no physical iOS device has run it and no soak run has bounded its caches; the hosted macOS lane runs only the Metal tests, on a paravirtual GPU.</p>
</div>
<div class="timeline-item active">
<div class="timeline-label">Thin</div>
<h3>Continuous integration <span class="status-badge status-wip">Partial</span></h3>
<p>The snapshot contains 18 workflow files (24 jobs; 16 of the files trigger automatically on pushes and pull requests, and 21 of the jobs run that way) covering Linux, Apple (macOS and iOS, on <code>macos-26</code> runners), Emscripten, the <code>SDL3</code>, <code>HEADLESS</code> and <code>TERMINAL</code> platform implementations (SDL3 on SDL’s <code>x11</code> and <code>wayland</code> drivers), multi-renderer selection and five build-free C API gates. The alpha.1 defect in which the general job and two Input rows selected a removed renderer value and failed at configure time is fixed. Still absent: any workflow for Android, building the C API library or running the oracle corpus; the Windows lanes remain manual; and nothing builds the CNAEXT extensions, Diagnostics or the Inspector. Every lane now checks out the sharp-runtime branch that CNA’s sibling script chooses; no green hosted run of the Apple or Metal workflow is recorded after the Mac mini M4 campaign, whose own full-suite runs are local evidence rather than CI. The working lanes provide useful scoped evidence, but not exhaustive coverage across 14 identities, graphics drivers, physical iOS devices or the complete GPU pixel/oracle matrix.</p>
</div>
<div class="timeline-item active">
<div class="timeline-label">Open</div>
<h3>Truthful capability reporting <span class="status-badge status-wip">Partial</span></h3>
<p>Six <code>GraphicsCapability</code> answers — compiled effects, float and half-float render targets, half-float linear filtering, compute and indirect draw — are now derived from dedicated renderer hooks that default to false, and multiple render targets are capped by the <code>GraphicsProfile</code>. The remaining entries still fall through to the renderer's own switch, whose shared default is permissive. <code>DIRECTX11</code> and <code>SDL_GPU</code> now override <code>SupportsCapability()</code>, but <code>DIRECTX9</code> still never does — so it advertises MSAA, occlusion queries, custom effects and instancing without necessarily querying the device. The new <code>RendererCapabilityProfile</code> adds device-probed answers, but a <code>true</code> from the older capability API still means "not contradicted", not "verified".</p>
</div>
<div class="timeline-item active">
<div class="timeline-label">Experimental</div>
<h3>Experimental C API — release gate "Not ready" <span class="status-badge status-wip">Partial</span></h3>
<p>The C ABI is at 0.46.0 (alpha.1: 0.7.0) with 60 headers, 3,210 routes and 197 recorded struct layouts. Its committed release report records one unmet criterion: 631 in-scope public C++ declarations still lack C mappings (8,142 inventoried: 7,053 implemented, 15 partial, 631 planned, 443 not applicable). No CNA CI job builds the library; it has been built and tested on a physical Mac mini M4 (a Mach-O <code>libcna_c_api.dylib</code> exporting exactly the 3,210 routes, a static archive and an installed-package test), and CNA.NET builds and uses it on Linux and, as local evidence, on macOS. ABI 0.x is experimental and several minor steps since alpha.1 were incompatible. The C# binding CNA.NET pairs with exactly 0.46.0; the Common Lisp, Go, Java, Python, Ruby, Rust, Swift and TypeScript bindings are <a href="docs/c-api.html#archived-bindings">archived</a> and will not follow new ABI versions. See <a href="docs/c-api.html">Experimental Native C API</a>.</p>
</div>
</div>
<!-- Remaining boundaries -->
<span class="section-label">Remaining boundaries</span>
<h2>Work that remains before 1.0</h2>
<div class="timeline mt-3 mb-4">
<div class="timeline-item planned">
<div class="timeline-label">Highest impact</div>
<h3>Compiled effects beyond qualified builds <span class="status-badge status-partial">Partial</span></h3>
<p>XNA/FNA D3D9 Effect Framework binaries now load through <code>Effect</code> and XNB <code>EffectReader</code> on 11 of the 14 identities: FNA3D always, and ten more behind default-OFF build options, <code>METAL</code>'s among them since the Mac mini M4 campaign. What remains open is the 2D-only and no-pixel renderers, and the default configure, which reports the capability on FNA3D only. HLSL <code>.fx</code> source, DXBC and MGFX remain unsupported at run time; <code>.fx</code> sources compile only at build time through an external legacy <code>fxc</code>, which was not exercised on macOS.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Planned</div>
<h3>Consistent surface-format coverage <span class="status-badge status-partial">Renderer-dependent</span></h3>
<p>Public <code>Texture2D</code> format admission is renderer-qualified: eight renderer families (SDL_GPU, Vulkan, WebGPU, Direct3D 11, Metal, FNA3D, EasyGL and Software) classify formats themselves, while the others defer to the framework's <code>Color</code>-only public rule even when an internal renderer layer knows additional native formats. The default Reach profile additionally refuses the eleven HiDef-only formats. The remaining task is a truthful, tested per-renderer contract for every format a game intends to use.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Partly done</div>
<h3><code>ReflectiveReader</code> for custom XNB types <span class="status-badge status-partial">Partial</span></h3>
<p>The XNB loader has 61 built-in readers. Video, typed external references and compiled effects are represented, and custom readers can be registered explicitly, either as a <code>ContentTypeReader<T></code> or, since alpha.1, through <code>ReflectiveTypeReaderBuilder</code> and <code>EnumTypeReader</code> from a declared field list. What remains absent is runtime reflection-based discovery, which C++ does not offer: user and closed-generic types still require deliberate registration.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Planned</div>
<h3>Gamer Services beyond Linux <span class="status-badge status-planned">Open</span></h3>
<p>The service client, relay and server are qualified on Linux; on macOS, CNA’s Apple campaign records them on one physical Mac mini M4, with online play needing a WebSocket-capable libcurl rather than Apple’s system one. Open: Windows (credential storage is sealed with DPAPI but has run only under Wine; the server has not run natively), a real wide-area network, browser builds (where the service, relay and voice are absent), iOS (built without networking) and avatar pixels on Direct3D and Metal, and no public server instance is operated. Offline leaderboards drop stream columns, and online sessions refuse guests.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Planned</div>
<h3>Media portability and codec coverage <span class="status-badge status-partial">Platform-dependent</span></h3>
<p>The Media catalogue layer, playback, and FFmpeg-backed video paths are implemented. Remaining boundaries are platform and codec specific: the <code>Video</code> types exist in every build, but file-backed decoding needs the optional FFmpeg backend, which is built only on Linux and macOS, so elsewhere it throws <code>NotSupportedException</code>; on macOS a binary linked against Homebrew’s FFmpeg starts only on the macOS that FFmpeg was built for. SDL_mixer does not provide AAC decoding for <code>.m4a</code>/<code>.aac</code>; CNA's own ALSA mixer decodes WAV, Ogg Vorbis, MP3 and FLAC, and Opus, WMA and XMA are not decoded. Expand only with explicit build and runtime evidence.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Planned</div>
<h3>Deeper tests for Media and Storage <span class="status-badge status-planned">Open</span></h3>
<p>Coverage is uneven rather than absent: Storage has 14 GoogleTest-family definitions (path safety, not read/write round trips) and Media 304. Those source counts still leave many runtime paths and platform combinations without execution evidence.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Open</div>
<h3>Android and oracle checks in CI <span class="status-badge status-planned">Open</span></h3>
<p>Android has code, an SDL entry point and a demo Gradle project, but no workflow builds for Android. The 39-scene XNA oracle diff is a CTest only in a DIRECTX9 plus Wine cross-build tree and is in no workflow; the last consolidated dated DIRECTX9 report covers 31 scenes (later per-scene notes record the rest) and a native-Windows re-run is open; EasyGL and Software have a CTest on two line scenes only (the EasyGL test fails on any pixel difference; the Software test only if a scene does not render). Software has been measured at 18 of 39 scenes byte-exact.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Planned</div>
<h3>CNA.NET on Windows and iOS, and on macOS beyond local evidence <span class="status-badge status-planned">Future qualification</span></h3>
<p>CNA.NET’s runtime qualification covers Linux x86_64, headless Chromium and the x86_64 Android emulator and, as local evidence on a physical Mac mini M4, macOS on Apple silicon (osx-arm64): its managed suites, package acceptance, the template and a smoke run of all 84 samples on <code>SOFTWARE</code> and <code>METAL</code>, without a CI leg, signing or notarization (its <code>SDL_RENDERER</code> integration suite is still open there). Windows has documented build steps but nothing has been run on it; iOS is planned through static linking. Interactive browsers, hardware GPUs in the browser, physical Android devices and a macOS CI leg are the next evidence to collect.</p>
</div>
<div class="timeline-item planned">
<div class="timeline-label">Long term</div>
<h3>Public stable release (v1.0) <span class="status-badge status-planned">Long term</span></h3>
<p>The project is versioned, but this snapshot is deliberately pre-1.0: its version string is still <code>0.1.0-alpha.1</code> and nothing newer has been tagged. Reaching 1.0 requires an explicit compatibility policy, stable public APIs (the C ABI is 0.x and has taken incompatible steps recently), clearer renderer capability contracts, reproducible configuration-scoped verification and production evidence on the platforms CNA intends to support.</p>
</div>
</div>
<!-- Contribute -->
<div class="callout callout--note">
<span class="callout-icon">🚀</span>
<p><strong>Contributing:</strong> high-value work includes closing named renderer gaps, improving capability accuracy, expanding configuration-specific runtime evidence, and testing this snapshot's new platform, content-pipeline, compiled-effect and C API boundaries. See the <a href="https://github.com/libcna/cna" target="_blank" rel="noopener">GitHub repository</a> (the documented snapshot is on its <a href="https://github.com/libcna/cna/tree/next" target="_blank" rel="noopener"><code>next</code> branch</a>) and <a href="docs/roadmap.html">the detailed roadmap</a>.</p>
</div>
</div>
</section>
</main>
<footer>
<div class="footer-inner">
<div class="footer-top">
<div class="footer-brand">
<div class="footer-brand-name">CNA</div>
<p>Documentation snapshot for CNA commit c1c316b9 (9 October 2026), a post-alpha.1 development snapshot. CNA exposes 14 renderer identities across 12 implementation families; APIs may change before 1.0.</p>
</div>
<div class="footer-col">
<h4>Project</h4>
<ul>
<li><a href="about.html">About</a></li>
<li><a href="features.html">Features</a></li>
<li><a href="architecture.html">Architecture</a></li>
<li><a href="roadmap.html">Roadmap</a></li>
<li><a href="network.html">CNA Network</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Docs</h4>
<ul>
<li><a href="docs/getting-started.html">Getting Started</a></li>
<li><a href="docs/building.html">Building</a></li>
<li><a href="docs/platforms.html">Platforms</a></li>
<li><a href="docs/rendering-backends.html">Renderers</a></li>
<li><a href="docs/faq.html">FAQ</a></li>
<li><a href="deep-dives/index.html">Deep Dives</a></li>
<li><a href="known-issues/index.html">Known Issues</a></li>
</ul>
</div>
<div class="footer-col">
<h4>Community</h4>
<ul>
<li><a href="https://github.com/libcna/cna" target="_blank" rel="noopener">GitHub</a></li>
<li><a href="https://discord.gg/vrnc4n6DaE" target="_blank" rel="noopener">Discord</a></li>
<li><a href="demos.html">Demos</a></li>
<li><a href="videos.html">Videos</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</div>
</div>
<div class="footer-bottom">
<p>CNA is not affiliated with or endorsed by Microsoft Corporation. XNA is a trademark of Microsoft. Licensed under the Microsoft Public License (Ms-PL).</p>
<div class="footer-links">
<a href="https://github.com/libcna/cna/blob/c1c316b9c7a846ce8002809c151fcd1af14942c9/LICENSE" target="_blank" rel="noopener">License</a>
<a href="contact.html">Contact</a>
</div>
</div>
</div>
</footer>
<script src="js/main.js"></script>
<script src="js/prism/prism.min.js" defer></script>
<script src="js/prism/prism-cpp.min.js" defer></script>
<script src="js/prism/prism-glsl.min.js" defer></script>
<script src="js/prism/prism-json.min.js" defer></script>
<script src="js/prism/prism-bash.min.js" defer></script>
<script src="js/prism/prism-cmake.min.js" defer></script>
</body>
</html>