CNA-GAP-076: WEBGPU and DIRECTX9 refuse a RenderTargetCube face in a multiple-render-target set, although both report MultipleRenderTargets

CNA snapshot 3b43bd86  ·  Known Issues › Functional gaps  ·  source links pinned to 3b43bd86

✓

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 3b43bd86; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.

SetRenderTargets with a cube face among two or more bindings throws NotSupportedException on WEBGPU and DIRECTX9, while XNA's HiDef profile accepts it and SDL_GPU binds it since 51fb39d5a; a single cube face and sets of 2D targets work.

Identifier
CNA-GAP-076
Category
Functional gap
Subsystem
Graphics & renderers
Status
Open
Verified against
CNA 3b43bd86 (3b43bd8687ed46523d873f9bec4b32bd8481dcb5)
Evidence basis
Source-verified: read at TARGET, not executed
Tests touching this area
Yes: see Current tests
Affected contract
GraphicsDevice::SetRenderTargets with a RenderTargetBinding for a RenderTargetCube face among several bindings (HiDef), on WEBGPU and DIRECTX9

Expected behaviour

XNA 4.0's HiDef profile accepts a RenderTargetCube face in any slot of a multiple-render-target set and refuses only the sets it names (the same cube twice, different sample counts or sizes). CNA's conformance program cube_mrt_binding_test.cpp checks that each face slot receives its own pixel-shader output and that the refused sets are refused.

Actual behaviour at TARGET

WebGPURenderer.cpp's SetRenderTargets throws System::NotSupportedException (“WebGPU: a RenderTargetCube face cannot be bound in a multiple-render-target set ... Bind up to 4 RenderTarget2D targets instead”) for any cube face in a set of two or more, and DirectX9Renderer.cpp's does the same (“cube faces in a multi-target set are not implemented by this CNA renderer”), while both report GraphicsCapability::MultipleRenderTargets. A single bound cube face and sets of RenderTarget2D targets work on both. handoff.md section 5.3 records it as a capability boundary: cube_mrt_binding M1-M4 and the plural cube-face RenderTargetSemantics cases skip on the refusal there, and HEADLESS accepts such sets. SDL_GPU binds a cube face in any slot since 51fb39d5a (CNA-DEMOS DC-R1).

Source locations

Evidence

Read at 3b43bd86: both refusals and the conformance program. That the M-legs skip on the refusal on WEBGPU and DIRECTX9 is CNA's record (handoff.md); nothing was built or executed for this entry, and DIRECTX9 runs only under Wine. An earlier pin's review did not list the boundary as an entry while SDL_GPU refused it too.

Focused reproduction

No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.

Current tests

cube_mrt_binding_test.cpp (registered through the parity fixture list; on SDL_GPU SdlGpu_Conformance_cube_mrt_binding) asserts the face slots where a renderer binds them and skips where the binding is refused; nothing requires WEBGPU or DIRECTX9 to bind them.

Regression test

cube_mrt_binding M1-M4 passing on WEBGPU and DIRECTX9 instead of skipping.

Blast radius

HiDef games that render into cube faces together with other targets in one pass (for example a dynamic environment map with a second output) on WEBGPU or DIRECTX9. Single cube-face rendering, 2D multiple render targets and SDL_GPU, EasyGL and SOFTWARE are unaffected.

Workaround

Render each cube face in its own pass, or bind 2D targets and copy the results into the cube.

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

User guide
Render targets