Source ownership: which part of CNA owns this behaviour?

CNA snapshot 009d40f5  ·  Development › Repository & Ownership  ·  source links pinned to 009d40f5

✓

Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit 009d40f5; unless a sentence says otherwise, nothing here was built or executed. Paths and symbols were read at 009d40f5; the tests named exist in the tree and are registered by CMake in the configurations that include them, but nothing was configured, built or executed. Statements marked as searched come from reading CMake files, workflows and scripts for a reference, not from running anything.

CNA records ownership in the file tree first and in class names second: a behaviour belongs to the module directory that holds its declaration, to the renderer family or platform backend directory that implements it in the selected build, and to the tests beside them. This page turns that convention into a maintainer's lookup. It shows how ownership is expressed, which files are generated rather than handwritten, where the third-party and sibling-repository boundaries run, and it answers 63 common “who owns this?” questions with owner, header, implementation, tests and the Development page that explains the internals. Every path was checked against the snapshot tree, and the symbols in the table and the prose were located in source at 009d40f5; nothing was built or run.

ℹ

The table names a starting owner, not a verdict. Where a question has several owners (a public contract, an implementation, a registration) the row shows several. The exact inventories are the generated module index, public header index, test target index and selection axes index; the layout itself is described on the repository map and the link edges on the module dependency map. A row says where to read, not that the behaviour is correct on any host.

How ownership is expressed in the tree

14 signals carry ownership, and most questions need two or three of them. Read the header for the contract, then find what selects an implementation, then find the tests that would fail.

SignalWhereWhat it tells you
Module directorymodules/: modules/<name>/{CMakeLists.txt, include, src, tests, examples}; 22 framework modules plus renderers/The directory is the CMake owner. modules/CMakeLists.txt fails the configure for any .cpp or .mm outside a declared module's src/, tests/, examples/ or benchmarks/ (_cna_framework_modules, _cna_renderer_modules), and for a root-level src/ or include/. Moving a file is an ownership change.
include/Microsoft/…GraphicsDevice.hppXNA 4.0 shape: Microsoft::Xna::Framework, Microsoft::Devices, Microsoft::Phone. Behaviour here is measured against XNA, and a signature change is a compatibility change that can reach the C ABI.
include/CNA/… (not Internal)GraphicsRendererSelection.hppCNA-owned surface. Every declaration that is not XNA carries CNAEXT from CNAHelper.hpp, which expands to [[deprecated]] when CNA_STRICT_XNA_API is defined.
include/CNA/Internal/…IGraphicsRenderer.hppA contract between modules, not for games. Every module publishes its whole include/ PUBLIC, so this is a naming and review convention, not a barrier.
src/ area foldersXna/, Internal/, CnaExt/ (the convention in the root CLAUDE.md); single-area modules stay flatImplementation and module-private headers. Two documented exceptions reach across: every renderer target adds modules/platform/src PRIVATE (renderers/CMakeLists.txt), and the unit-test build adds modules/audio/src (UnitTests.cmake).
Renderer familymodules/renderers/<family>cna_add_renderer() globs the family's src/*.cpp (non-recursive) into cna_renderer_<family>. One family can serve several public identities: EasyGL serves five, while OPENGL4 is a family of its own. The identity-to-family map is in RendererRegistry.cmake, and the index of families is Selection axes index.
Platform backendmodules/platform/src/<Backend>One directory per backend beside Common/. platform/CMakeLists.txt globs only the selected backend, Common/, Headless/ (always) and Terminal/ (every non-Windows target); PlatformFactory.cpp picks the default by CNA_PLATFORM_<NAME>.
Audio device and mixermodules/audio/srcPlatform/<Impl> is the device transport (Sdl3, Sdl2, Null, Alsa); Backend/<Mixer> is the mixer (Sdl3Mixer or CnaMixer). The two axes are chosen separately.
Module tests/modules/<name>/tests/ and modules/renderers/<family>/tests/GoogleTest sources mirroring the namespace path. UnitTests.cmake globs them into a per-module object group that feeds the aggregate CnaTests and a focused executable (CnaStorageTests, CnaMathTests, …). The C API's tests are the exception: own executables, filtered out of CnaTests.
Root tests/tests/Fixtures, recorded reference data, two integration sources and 15 minimal-link probes (ModuleProbes.cmake). Not the unit tests of any one module.
examples/modules/<name>/examples/, plus the loose xvfb_screenshot_demo.cppDemos and standalone pixel or contract programs (879 *_test.cpp files), registered by the owning module's own CMake, often only when a particular renderer or platform is selected. Some are ad hoc targets rather than registered tests: the loose demo is built by the EasyGL and SDL_RENDERER example files and named a test by neither. The 32 renderer-neutral parity/ programs are registered per renderer through ParityFixtures.cmake.
Oracle programstools/xna-oracleThe real-XNA scene renderer CnaOracleRender.cpp is compiled by renderer families' example files (EasyGL, DirectX9), so the program lives in tools/ while its build and its test registration live in the family. Data: tools/xna-oracle/scenes (39 scenes) and reference (39 PNGs). See Using the XNA oracle as evidence.
tools/, scripts/tools/, scripts/Generators, audits, harness sources and repository gates. Only some are CMake targets (cna-content, the CNB and glTF converters, the XNB fixture tool); the rest are run by CTest scripts, workflows or by hand.
cmake/ and per-module CMakecmake/ and each module's CMakeLists.txtSelection (PlatformSelection.cmake, AudioPlatformSelection.cmake, RendererSelection.cmake), generation, third-party setup and test registration. A module's own file says what it links and whether it is entered conditionally.
  1. Declaration. Search the include/ directories for the public symbol; the module you land in owns the contract, for example rg -n "class SoundEffect\b" modules/*/include.
  2. Selection. Ask what makes one implementation the live one: a CMake selection file, PlatformFactory, the generated renderer registry, or CreateSelectedAudioDevice. A directory that exists is not necessarily compiled.
  3. Evidence. Look for tests in the module's tests/, then the family's examples/, then the root probes, and confirm registration in the configuration you care about with ctest -N. Absence of a test is a finding.

Generated versus handwritten

Two kinds of file are called generated. Build-tree files are produced by configure or build and are never committed. Committed files are checked in but must stay derivable from a source; some have a gate that fails when they drift, some do not. Before editing either kind, find the generator, change its input, and regenerate. Editing an output by hand is the mistake every header comment warns about.

ArtifactWhere it livesGeneratorRegenerateGuard at this snapshot
<build>/generated/CnaRendererRegistry.generated.cppbuild treeRendererRegistry.cmake (cna_generate_renderer_registry) filling the templateEvery configure; the first identity listed is the build default. Compiled into cna_graphics_core.RendererIdentityRegistry; the descriptor gate cna_renderer_descriptor_gate in RendererDescriptorGate.cmake
CNA/Version.hpp in <build>/generated/includebuild treeVersion.cmake from Version.hpp.inEdit project(CNA VERSION …) and CNA_VERSION_PRERELEASE in the root CMakeLists.txt. Two copies stay hand-maintained per releasing.md: CHANGELOG.md and PROJECT_NUMBER in the root Doxyfile.VersionTests.cpp
Shared-library stub, Wayland protocol bindings, wasm export listbuild treeSharedRuntimeLibrary.cmake; wayland-scanner in PlatformWayland.cmake; generate_wasm_exports.py called from c-api/CMakeLists.txtAutomatic, and only for CNA_SHARED_LIBRARY, CNA_PLATFORM=WAYLAND and Emscripten builds of the C API respectively.the build itself
Fna3dStockEffectBlobs.hppbuild treeembed_effects.py over the vendored .fxb effect binariesAutomatic: always for FNA3D; for EasyGL, OpenGL4, Software, DirectX9, DirectX11 and DirectX12 only when the family's *_COMPILED_EFFECTS option is on.family compiled-effect tests
.sdl-prebuilt-<key>/git-ignored, in the source treeThirdPartySDL.cmake with SdlPrebuiltFingerprint.cmakeRebuilt when its fingerprint (source content, patches, configure arguments) changes; delete the reported directory to force it.CnaSdlPrebuiltFingerprint
Engine-layer Doxygen HTMLgit-ignored build/doxygen-cnaextDoxyfile.cnaextdoxygen docs/Doxyfile.cnaext. The root Doxyfile leaves INPUT empty.CNAEXT_DoxygenGroup (exit 77 without doxygen)
spirv_shaders.hpp (Vulkan, SDL_gpu)committedVulkan compile_shaders.py, SDL_gpu compile_shaders.py (libshaderc through ctypes)Run the script in its own directory, or pass --output, and commit the header with the GLSL edit.SpirvPayloadValidation checks that the payloads are valid SPIR-V (registered only when VULKAN is compiled in; exit 77 without spirv-val). No CMake file, workflow or script recompiles the GLSL and compares (searched; not executed).
DXBC and SM2 headers (hlsl_shaders.hpp, d3d9_*_shaders.hpp)committedcompile_shaders_hlsl.py, compile_shaders_sm2.py, compile_pbr_shaders.py: a MinGW-built D3DCompile helper run under WineBy hand, after a shader or compiler-flag change.verify_d3d_shaders_reproducible.sh is a manual reproducibility check; no CMake file or workflow calls it (searched).
*ShaderPackage.generated.hpp (20 headers)committedgenerate_shader_package.py over each package.json manifest and its sourcespython3 tools/shader_package/generate_shader_package.py <package.json> --output <header>; --check writes nothing and exits 77 without shaderc.18 *ShaderPackageReproducibility tests in ModuleProbes.cmake; the ShadowCaster and ModernResourceInterop packages have no registration there.
C ABI baseline, compatibility, coverage and limitation records, BoolContractSmoke.ccommittedtools/c-api: generate_abi_baseline.py, generate_compatibility_matrix.py, generate_coverage_inventory.py, generate_limitations.py, generate_bool_contract_test.pyEach takes --write or --check. The per-symbol coverage matrix is an ignored build artifact.CApiAbiBaseline, CApiCompatibilityMatrix, CApiCoverageMatrix, CApiLimitations, CApiBoolContractCurrent; five c-api-* workflows
XNB interop corpus tests/assets/xnb/cna/windows/{uncompressed,lzx}committedgenerate_interop_fixtures.cpp built as cna_tool_xnb_interop_fixtures (ToolXnbInteropFixtures.cmake)Build the tool and run it with the two corpus directories as arguments (its usage line: <output-directory> [<lzx-output-directory>]).XnbInteropCorpusTest.TheCommittedCorpusIsExactlyWhatTheGeneratorProducesToday
CNB golden byte vectorsembedded in test sourcesgen_golden_vectors.py, written from the format specification and deliberately independent of CnbWriterRun the script and update the vectors in the test.CnbGoldenVectorTests.cpp
glTF fixture corpus tests/assets/gltfcommittedtools/gltf_fixtures through regenerate-gltf-goldens.shscripts/regenerate-gltf-goldens.sh, with --check or --determinism.the glTF sanitizer workflow runs both flags
glTF rendered goldens tests/gltf-l7/<renderer>committedgltf-l7-corpus.py--update-goldens, which also requires --report-out.the same script without the update flag compares
OpenGL4's EasyGL parity listcommittedgenerate_easygl_parity_corpus.py writing EasyGLParityCorpus.cmakeRun it, or --check (exit 1 when stale).no CMake or workflow registration found (searched)
XNA Content Pipeline parity report and component referencecommittedtools/xna-pipeline-oracle: parity_report.py, component_reference.pyRegenerate, then the gates compare bytes.the XnaPipeline* tests in XnaPipelineParityGates.cmake
⚠

Two drift risks found by searching, not by running. Nothing in CMake, the workflows or scripts/ recompiles the Vulkan or SDL_gpu GLSL and compares it with the committed spirv_shaders.hpp; SpirvPayloadValidation only validates the SPIR-V. And 18 of the 20 shader-package headers have a --check registration; the ShadowCaster and ModernResourceInterop packages do not. An edit to those inputs is protected by review only.

Handwritten tables that gates hold in step

Third-party and sibling boundaries

The rule is one line: third_party/ and vendor/ are external. BuildPerformance.cmake attaches CNA's warnings, sanitizer and linker policy only to targets whose source directory is inside the repository and outside those two trees (cna_is_owned_target), so a target from a sibling checkout is excluded as well. Licence notices are collected in THIRD_PARTY_NOTICES.md, which at this snapshot does not list every vendored copy: cgltf, ENet, dr_libs, stb_image and stb_image_write are absent from it (cgltf and ENet ship a LICENSE file in their own directories).

Pinned in the repository

PathKindPinConsumed by
SDLsubmodulecbe3fbe9ThirdPartySDL.cmake: built at configure time into .sdl-prebuilt-<key>/; two upstream Vulkan-barrier patches from cmake/patches are applied to a staged copy, never to the submodule
SDL_image, SDL_mixersubmodulesfcb9d0b1, 3075d3edthe same file; SDL_mixer backs the SDL3 audio mixer
dracosubmodule1.5.7, 87867400modules/CMakeLists.txt: add_subdirectory unless CNA_ENABLE_DRACO=OFF or CNA_USE_SYSTEM_DRACO
googletestsubmodule7e2c425dUnitTests.cmake: added while CNA_BUILD_TESTS is on
third_party/enetin-tree copynot a gitlinkThirdPartyENet.cmake: only while CNA_ENABLE_NET is on (the default). Its missing-source message still tells you to run git submodule update --init third_party/enet, which does nothing for an in-tree directory
stb, dr_libs, cgltfin-tree single-header librariesnot gitlinksmodule CMake files reach them through CNA_SOURCE_DIR, for example graphics/CMakeLists.txt

Fetched at configure time

DependencyConfigured inPinUsed when
FNA3D with MojoShaderThirdPartyFNA3D.cmaketag 3240147FNA3D renderer and any family with compiled effects; 117 MojoShader patches in cmake/patches applied idempotently; override with FETCHCONTENT_SOURCE_DIR_FNA3D
PortableGLThirdPartyPortableGL.cmake63a55db7PORTABLEGL only
SDL_shadercross and SPIRV-CrossThirdPartySDLShaderCross.cmake1ff05bec; vulkan-sdk-1.4.350.0SDL_gpu when CNA_SDL_GPU_SHADERCROSS is on (default on for Windows and Apple targets, off elsewhere); one small patch
SDL2ThirdPartySDL2.cmakefa24d868 (2.30.11)CNA_PLATFORM=SDL2; CNA_SDL2_ROOT overrides
wgpu-nativeThirdPartyWebGPU.cmakev29.0.1.1 prebuilt releaseWEBGPU; SHA-256 checked by WebGPUChecksum.cmake before extraction; CNA_WEBGPU_ROOT overrides

Sibling repositories

Sibling checkouts are not submodules and CMake will not fetch them; a missing one stops the configure with a named message. The build guide says which branches to clone (Building CNA: sibling checkouts).

SiblingNeeded byHow CMake consumes it
../sharp-runtime (its next branch)every buildCMakeLists.txt calls add_subdirectory on CNA_SHARP_RUNTIME_ROOT; modules take components through cna_link_sharp_runtime in SharpRuntimeConsumption.cmake
../easy-gl and ../meta-glthe five GL identitiesRendererSelection.cmake adds ../easy-gl once; easy-gl in turn expects its own sibling ../meta-gl
../free-direct and ../free-apiFREEDIRECTthe same file adds ../free-direct, whose own CMake reaches ../free-api

Lookup table: behaviour, owner, header, implementation, tests

63 rows in five groups. Paths link to the snapshot source; symbols are plain text. Tests are files that exist in the tree and are registered by the module's own CMake or by UnitTests.cmake in the configurations that include them; naming one is not a claim that it passed, and a renderer-family or platform test exists only in a build that selects that family or platform.

Host, runtime and input

BehaviourOwnerPublic headerImplementationTestsRead next
Native window creation and adoptionplatformIPlatform.hpp
IPlatformWindow.hpp
IPlatform::CreateWindow
Sdl3Platform.cpp and one directory per backend under src/
PlatformConformanceTests.cpp
IPlatformWindowTests.cpp
Platform backends
The game-visible window object (title, client size, drop events)runtimeGameWindow.hppGameWindow.cpp GameWindow::OnClientSizeChanged
the native window itself is created by GraphicsDevice::createOrAttachWindow
GameWindowTests.cppRuntime module internals
Event pump (native events to game state)runtime
contract in platform
PlatformEvent.hppGame.cpp Game::PollEvents
SdlInputBridge.cpp defines PlatformInputBridge::ProcessEvent
GameEventSemanticsGoldenTests.cpp
golden transcript
Input internals
Keyboard and mouse stateinputKeyboard.hpp
Mouse.hpp
Keyboard.cpp Keyboard::GetState
snapshot source: IPlatformKeyboard.hpp
KeyboardInputTests.cpp
MouseInputTests.cpp
KeyCodeMatchesXnaKeysTests.cpp
Input internals
Gamepad and joystickinputGamePad.hpp
Joysticks.hpp
GamePad.cpp GamePad::GetStateGamePadTests.cpp
GamePadMappingTests.cpp
Input internals
Touch and gesturesinputTouchPanel.hppTouchPanel.cpp
GestureDetector.cpp
GestureDetectorTests.cpp
TouchEdgeCaseTests.cpp
Input internals
Clipboard (two facades over one platform service)input (CNA::Input)
devices-ext (CNA::Devices, only with CNA_DEVICES)
input Clipboard.hpp
devices-ext Clipboard.hpp
input Clipboard.cpp
devices-ext Clipboard.cpp
IPlatformClipboard is declared in IPlatformSystemServices.hpp
input ClipboardTests.cpp
devices-ext ClipboardTests.cpp
Device extensions
Text input and IME compositioninputTextInputEXT.hpp
IPlatformTextInput.hpp
TextInputEXT.cpp
Sdl3TextInputTypes.cpp
TextInputEXTTests.cpp
SdlInputBridgeTextInputTests.cpp
X11InputMethodTests.cpp
Input internals
DPI, display scale and pixel sizeplatformIPlatformWindow.hppGetDisplayScale, GetPixelSize per backend, for example Win32Window.cppWin32DpiTests.cpp
X11ContentScaleTests.cpp
Win32 platform internals
Game loop, fixed step and timingruntimeGame.hpp
GameTime.hpp
Game.cpp Game::TickGameClockFirstUpdateTests.cpp
GamePlatformTimingTests.cpp
One frame source trace
Game services and componentsruntimeGameServiceContainer.hpp
GameComponentCollection.hpp
GameServiceContainer.cpp
GameComponentCollection.cpp
GameServiceContainerTests.cpp
GameComponentCollectionTests.cpp
Component lifetime case study
Which platform is live (factory, ambient installation)platformPlatformFactory.hpp
CurrentPlatform.hpp
PlatformFactory.cpp PlatformFactory::Create
CurrentPlatform.cpp
CurrentPlatformTests.cpp
GamePlatformOwnershipTests.cpp
Startup source trace
Frames on a terminal (CPU-frame presentation)platform Terminal backendIPlatformSurfacePresenter.hppTerminalSurfacePresenter.cpp
TerminalAnsiWriter.cpp
TerminalPresenterTests.cpp
TerminalRestorationTests.cpp
Terminal platform internals

Graphics and math

BehaviourOwnerPublic headerImplementationTestsRead next
Renderer selection and latchingcore (policy)
graphics (resolution)
GraphicsRendererSelection.hpp
GraphicsRendererRegistry.hpp
GraphicsRendererSelection.cpp GraphicsRendererSelectionAccessEXT::Latch
GraphicsDevice.cpp GraphicsDevice::resolveRenderer
GraphicsRendererSelectionTests.cpp
GraphicsRendererFallbackTests.cpp
Renderer selection internals
Capability answersgraphicsGraphicsCapability.hpp
RendererCapabilityProfile.hpp
GraphicsDevice::SupportsCapability
each family's override of IGraphicsRenderer::SupportsCapability
RendererCapabilityProfile.cpp
GraphicsDeviceCapabilityTests.cpp
RendererCapabilityProfileTests.cpp
GraphicsDevice internals
Texture creation and uploadgraphicsTexture2D.hpp
IGraphicsRenderer.hpp (ITextureRenderer)
Texture2D.cpp Texture2D::SetDataTexture2DTests.cpp
Texture2DCacheReconstructionTests.cpp
Textures and render targets
Render targetsgraphicsRenderTarget2D.hppRenderTarget2D.cpp
GraphicsDevice::SetRenderTarget
RenderTargetSemanticsTests.cpp
RenderTargetBindingTests.cpp
Textures and render targets
Indexed drawgraphicsGraphicsDevice.hpp
IGraphicsRenderer.hpp
GraphicsDevice::DrawIndexedPrimitives
IGraphicsRenderer::DrawIndexedPrimitivesEx in the selected family
IndexedDrawDeferredTests.cpp
DrawUserIndexedPrimitivesTests.cpp
Indexed draw trace
Vertex buffers, index buffers and declarationsgraphicsVertexBuffer.hpp
IndexBuffer.hpp
VertexBuffer.cpp
IndexBuffer.cpp
VertexDeclaration.cpp
VertexBufferTransferContractTests.cpp
IndexBufferTransferContractTests.cpp
Indexed draw trace
Present and swapchaingraphics (call site)
renderer family (native)
platform (presenter)
IPlatformSurfacePresenter.hpp
IGraphicsRenderer::Present
GraphicsDevice::Present
VulkanRenderer.cpp VulkanRenderer::Present as one example
PresentationLifecycleTests.cpp
GraphicsDevicePresentRegionTests.cpp
GraphicsDevice internals
Shader and effect compile / intakegraphics (runtime intake)
content-pipeline (build-time compile)
Effect.hpp
ICompiledEffectRuntime.hpp
Effect.cpp
EffectCompilerService.hpp
per-family compiled-effect runtimes
EffectTests.cpp
CompiledEffectConformance.hpp
Graphics backends
SpriteBatchgraphics
batching in the family behind ISpriteBatchRenderer
SpriteBatch.hppSpriteBatch.cppSpriteBatchTests.cpp
SpriteBatchRasterizationTests.cpp
Graphics backends
Renderer descriptors and the generated registrygraphics
cmake (registry generator)
GraphicsRendererDescriptor.hppRendererRegistry.cmake
registry template
GraphicsRendererRegistryTests.cpp
CTest RendererIdentityRegistry
Renderer selection internals
One native backend (Vulkan as the example)renderers/vulkanVulkanRenderer.hppVulkanRenderer.cpp
VulkanRendererDescriptor.cpp
VulkanCompiledEffectTests.cpp
family examples/
Vulkan renderer internals
CNAEXT engine layer (post-process, clustered lights, sky)graphics-extinclude/CNA/GraphicsBloomPass.cpp
src/shaders
graphics-ext tests/
ownership note
Graphics extension internals
Vectors, matrices, quaternions, coloursmathVector3.hpp
Matrix.hpp
Vector3.cpp
Matrix.cpp
Vector3Tests.cpp
MatrixOracleTests.cpp
Math module internals
Packed vector types (split owner)math: the interface
graphics: every concrete type
IPackedVector.hpp
HalfVector4.hpp
the types are defined in their headers
PackedVectorValueContracts.cpp holds the out-of-line ToString contracts
PackedVectorTests.cpp
PackedVectorValueContractTests.cpp
Math module internals

Content

BehaviourOwnerPublic headerImplementationTestsRead next
ContentManager load, cache and unloadcontentContentManager.hpp (the Load<T> template and the cache loadedAssets_)ContentManager.cpp (ContentManager::Unload, loose-file readers)ContentManagerTexture2DXnbTests.cpp
ContentRuntimeContractTests.cpp
Content runtime internals
XNB readers (61 built-in)contentXnbBuiltInReaders.hppXnbBuiltInReaders.cpp
ContentTypeReaderManager.cpp
registered by the Game constructor (RegisterAllBuiltInXnbReaders)
XnbBuiltInReaderRegistrationTests.cpp
Xnb tests/
Content runtime internals
CNB reading and writingcontentCnbLoaderRegistry.hppcontent/src/Cnb
CnbWriter.cpp
CnbContainerTests.cpp
CnbGoldenVectorTests.cpp
Content pipeline internals
glTF import (importer is in content, the Model type in graphics)contentGltfImportCore.hppGltfImportCore.cpp
cgltf via third_party/cgltf
GltfImport tests/
RuntimeGltfModelTests.cpp
Content runtime internals
Importers, processors and writerscontent: canonical engine and XNB/CNB writers
content-pipeline: XNA facade, importers, processors
ContentPipeline.hpp
ContentImporter.hpp
ContentPipeline.cpp
content-pipeline/src/Xna
ContentPipelineCoreTests.cpp
content-pipeline tests/
Content pipeline internals
The build-time front end (cna-content)tools/content
cmake
ContentCompiler.hppcontent.cpp (the coordinator), content_main.cpp
ToolContentPipeline.cmake
ContentPipelineCliTests.cppModify the Content Pipeline
Title-content byte streamsruntimeTitleContainer.hppTitleContainer.cpp TitleContainer::OpenStreamTitleContainerTests.cppContent runtime internals

Storage, audio, media, devices and services

BehaviourOwnerPublic headerImplementationTestsRead next
Save data: storage devices and containersstorageStorageDevice.hppStorageDevice.cpp StorageDevice::EnsureStorageRootStorageDeviceTests.cppStorage internals
Path containment (shared by storage, content and playlists)corePathContainment.hppheader-only helpers in CNA::InternalPathContainmentTests.cppStorage containment case study
Logging and exception base typescoreLogger.hpp
CNAException.hpp
Logger.cpp
CNAException.cpp
LoggerTests.cppCore module internals
Sound playback and mixingaudioSoundEffect.hpp
MixerEngine.hpp
SoundEffect.cpp
Sdl3Mixer MixerEngine.cpp
CnaMixer MixerEngine.cpp
SoundEffectTests.cpp
CnaMixerTests.cpp
Audio engine internals
Audio device selection and transportaudio/src/PlatformIAudioDevice.hppAudioDeviceFactory.hpp CreateSelectedAudioDevice
AudioPlatformSelection.cmake
AudioDeviceConformanceTests.cpp
AudioPlatformSelectionTests.cpp
Audio engine internals
Microphone and recordingaudioMicrophone.hpp
IAudioRecordingDevice.hpp
Microphone.cppMicrophoneTests.cppAudio engine internals
XACT engine, wave banks and sound banksaudioAudioEngine.hppAudioEngine.cpp
XactParser.cpp
AudioEngineTests.cpp
XactParserTests.cpp
Audio engine internals
Audio decoding (WAV, ADPCM)audio/src/InternalWavDecoder.hppWavDecoder.cpp
MsAdpcmDecoder.cpp
ImaAdpcmDecoder.cpp
WavDecoderTests.cpp
WavWrapperTests.cpp
Audio engine internals
Song playback (MediaPlayer, queue)mediaMediaPlayer.hppMediaPlayer.cppMediaPlayerTests.cppMedia internals
Media library (albums, artists, pictures)mediaMediaLibrary.hppMediaLibrary.cpp
MediaLibraryIndex.cpp
MediaLibraryTests.cpp
MediaLibraryIndexTests.cpp
Media internals
Video playback (optional FFmpeg)media (API)
video-ffmpeg (backend)
VideoPlayer.hppVideoPlayer.cpp
VideoDecoder.cpp
VideoPlayerTests.cpp
VideoBackendAvailabilityTests.cpp
FFmpeg video boundary
Sensors (accelerometer, compass, gyroscope, motion)devicesAccelerometer.hppAccelerometer.cpp
PlatformSensorSubsystem.hpp
AccelerometerTests.cpp
PlatformSensorMigrationTests.cpp
Devices and sensor lifetime
Vibration and device shutdown orderingdevicesVibrateController.hpp
DevicesShutdownCoordinator.hpp
VibrateController.cpp
DevicesShutdownCoordinator.cpp
VibrateControllerTests.cpp
DevicesShutdownOrderingTests.cpp
Devices and sensor lifetime
Camera, dialogs, tray, power, locale, URL launcherdevices-extCamera.hpp
FileDialog.hpp
Camera.cpp
FileDialog.cpp
CameraTests.cpp
FileDialogTests.cpp
Device extensions
Network sessionsnet (only with CNA_ENABLE_NET)NetworkSession.hppNetworkSession.cpp
ENetBackend.cpp
ENetBackendTests.cpp
TwoProcessLoopbackTest.cpp
Network session internals
Gamer services, guide, achievements, local profilegamer-services (only with CNA_ENABLE_NET)Guide.hppGuide.cpp
LocalGamerServicesStore.cpp
GamerServicesServiceTests.cppGamer services internals
Diagnostics counters, zones and frame historydiagnosticsDiagnostics.hpp
Instrumentation.hpp
Diagnostics.cppDiagnosticsTests.cppDiagnostics internals
Inspector agent, bridge and browser UIinspector (only with CNA_BUILD_INSPECTOR)Agent.hppAgent.cpp
WebBridge.cpp
InspectorTests.cppInspector transport internals
Windows Phone application shell and push channelphone (linked only by name)PhoneApplicationService.hppPhoneApplicationService.cpp
HttpNotificationChannel.cpp
PhoneApplicationServiceTests.cppPhone compatibility internals
Framework.Design type convertersdesign (opt-in)MathTypeConverter.hppRegistration.cpp
MathTypeConverter.cpp
FrameworkDesignTests.cppDesign converter internals

C ABI, build, tests and CI

BehaviourOwnerPublic headerImplementationTestsRead next
C ABI handles, errors and versionc-apiabi.h
core.h
CnaCApiDetail.hpp HandleRegistry
CnaCApi.cpp (version and error routes)
HandleRegistryTest.cpp
ErrorSmoke.c
AbiSmoke.c
C API internals
C ABI routes for one subsystem (runtime as the example)c-apiruntime.hCnaCApiRuntime.cpp cna_game_destroyLifecycleSmoke.c
CApi_* registrations
Update the C API
Language bindings (separate repositories)outside this repository; they consume the C ABIcna.hc-api/srcc-api/tests
each binding's own tests, pinned to its own revision
C API internals
Product version stringcmake and the root CMakeLists.txtVersion.hpp.in (rendered to CNA/Version.hpp)CMakeLists.txt CNA_VERSION_PRERELEASE
Version.cmake
VersionTests.cppMake a release
Build option selection (platform, audio, renderer, SDL)cmakePlatformSelection.cmake
AudioPlatformSelection.cmake
RendererSelection.cmake
RendererIdentities.cmake
RendererCombinations.cmake
SdlAvailability.cmake
CTest RendererCombinationRegistry
check_renderer_identities.py
Selection axes index
Test registrationcmake, then each module's own CMakeUnitTests.cmakeTestHelpers.cmake cna_register_renderer_test
Harnesses.cmake
ModuleProbes.cmake
module link-closure probesTest architecture
Module target definition and the ownership gatemodules root CMakemodules/CMakeLists.txtcna_add_module, _cna_framework_modules, _cna_renderer_modulesModuleLinkClosure_* probesPhysical module dependency map
CI workflow that runs a subsystem.github/workflowsnone (workflow files)general-tests-ci.yml
platform-ci.yml
input-ci.yml
multi-renderer-ci.ymlWhat CI covers
Pinned third-party versions and patchescmakenoneThirdPartySDL.cmake
ThirdPartyFNA3D.cmake
cmake/patches
SdlPrebuiltFingerprint.cmake with CTest CnaSdlPrebuiltFingerprintCMake architecture

Where ownership is split or surprising

These are the cases where a directory name would send a reader to the wrong place. Each was read in source.

CaseWhat is actually true
Two clipboard classesCNA::Input::Clipboard in input (with primary selection) and CNA::Devices::Clipboard in devices-ext (compiled in only with CNA_DEVICES) both end at IPlatformClipboard, which has no header of its own: it is declared in IPlatformSystemServices.hpp. The C ABI reaches both: CnaCApiInputDevices.cpp uses the input class, and the clipboard-acceptance route in CnaCApiDevices.cpp uses the devices-ext one.
The input bridge has an SDL nameSdlInputBridge.cpp defines PlatformInputBridge, declared in PlatformInputBridge.hpp. The file name is historical; no input file includes an SDL header.
FrameworkDispatcherDeclared and defined in the audio module (FrameworkDispatcher.cpp) and called from Game.cpp at the end of the constructor and after the component updates in Game::Update.
Renderer identity is not renderer familyFive identities share the EasyGL family. The GDI family compiles eight software-module 2D translation units (CNA_GDI_SOFTWARE_SOURCES, gdi/CMakeLists.txt), the one documented exception to "directory is owner".
A Model has three front endsThe type lives in graphics, but the runtime glTF reader, the .cnj reader and the .cnb decoder are all in content (ContentManager.cpp).
The content compilerThe canonical engine is CNA/Content/Pipeline in content; the XNA facade is content-pipeline; cna-content is a target of ToolContentPipeline.cmake over content.cpp and content_main.cpp, and neither the module nor FreeType is in a game's link closure.
Path containmentPathContainment.hpp is in core, but storage, content, content-pipeline and media (playlists, library index) all include it: a change is a destructive-boundary change wherever it is edited.
Three unrelated version numbersThe product version (CMake), CNA_ABI_VERSION in abi.h (0.29.0, experimental) and the fixed XNA 4.0 level. Version.hpp.in says so itself.
Always-compiled platformsHeadless is compiled into every build and Terminal into every non-Windows build whatever CNA_PLATFORM says, so PlatformConformanceTests.cpp can compare several implementations in one process.

Using this page

Start from a symptom, pick the closest row, and follow its Read next page for the trace. Before editing, decide whether the row you found is the contract (a public header), the implementation (a family or backend), or the registration (CMake), and estimate the reach with Blast radius and readiness. To become the owner of one row rather than look one up, see Choose one subsystem and own it; the lifetime side of the same objects is Ownership and lifetime master map, and what to run after a change is What to test after changing X.

The same subsystem is explained at four altitudes. These are the neighbouring pages at each one.