CNA-GAP-012: On HEADLESS, TextureCube::SetData throws NotSupportedException because the headless cube renderer stores no pixels, so cube-map content cannot be loaded
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. Nothing on this page was executed unless the Evidence section says so.
HeadlessTextureCubeRenderer::SetData validates and traces the upload and returns false by design (REMED-GFX-135); TextureCube::SetData turns that into NotSupportedException, and the XNB TextureCube reader uploads through SetData.
- Identifier
CNA-GAP-012- Category
- Functional gap
- Subsystem
- Graphics & renderers
- Status
- Open
- Verified against
- CNA
009d40f5(009d40f5dd085c4e674d3479675fac84b12b3e0a) - Evidence basis
- Source-verified: read at TARGET, not executed
- Tests touching this area
- Yes: see Current tests
- Affected contract
- Microsoft::Xna::Framework::Graphics::TextureCube::SetData and ContentManager::Load<TextureCube> on HEADLESS
Expected behaviour
HEADLESS is CNA's renderer for running games and tests without a GPU; XNA content that includes cube maps should load there as it does elsewhere.
Actual behaviour at TARGET
HeadlessRenderer.hpp documents HeadlessTextureCubeRenderer::SetData as "Always false"; TextureCube.cpp throws NotSupportedException when the renderer reports it stored nothing, and TextureCubeContentTypeReader.cpp calls SetData for every face and level. Texture2D has a CPU-side store on HEADLESS; cube textures do not.
Source locations
modules/renderers/headless/include/CNA/Internal/Renderers/Headless/HeadlessRenderer.hpp— HeadlessTextureCubeRenderer::SetData and GetDatamodules/graphics/src/Xna/TextureCube.cpp— TextureCube::SetData NotSupportedException when the renderer returns falsemodules/content/src/Xnb/TextureCubeContentTypeReader.cpp— per-face SetData
Evidence
Checked by reading the named sources at 009d40f5; nothing was built or executed for this entry. The refusal is deliberate and documented in the header; the content-loading consequence is inferred from the reader.
Independent re-verification: Checked by reading the named sources at 009d40f5; nothing was built or executed for this entry. The refusal is deliberate and documented in the header. Tests: Headless_CubeVolume_GetDataContract and Headless_CubeVolume_SetDataContract pin the refusal at renderer and TextureCube level. Texture3DTextureCubeContentTypeReaderTest.TextureCubeReaderLoadsRealMonoGameFixtureEndToEnd (modules/content/tests) loads a real cube XNB through ContentManager and, on renderers without cube storage (its gate lists SDL_RENDERER, CANVAS, HTML_DOM, FREEDIRECT, HEADLESS, GDI and PORTABLEGL), asserts System::NotSupportedException, so the loading consequence is pinned by CNA's own test whenever HEADLESS is the active renderer; the HEADLESS content CI job's test filter does not select that fixture.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
Headless_CubeVolume_GetDataContract and related HEADLESS tests pin the refusal; no test loads cube content on HEADLESS.
Regression test
Either store cube faces on HEADLESS like Texture2D or document the loading limit; a test that loads a TextureCube XNB on HEADLESS would pin whichever is chosen.
Blast radius
Headless test runs and servers that load games or content containing cube maps (environment maps, skyboxes).
Workaround
Skip cube-map loading when running on HEADLESS.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Internals
- HEADLESS internals: resources
- Deep dives
- Texture data transfer: cube and volume
- Known issues
- Functional gap index