CNA-GAP-012: On HEADLESS, TextureCube::SetData throws NotSupportedException because the headless cube renderer stores no pixels, so cube-map content cannot be loaded

CNA snapshot 009d40f5  ·  Known Issues › Functional gaps  ·  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. 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

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.

The same subject is explained at several altitudes. These are the neighbouring pages at each one.