CNA-GAP-024: DIRECTX11 and DIRECTX12 never use DXGI exclusive full screen: SetFullscreenState is not called and exclusiveFullscreen_ is dead state
Evidence basis: source-verified at the pinned commit. 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.
Neither renderer calls IDXGISwapChain::SetFullscreenState, and exclusiveFullscreen_ is declared and read (it disables tearing) but never set. Full screen is applied by the platform window instead, so the swap chain always stays a windowed flip-model chain and never learns that the platform switched the display mode.
- Identifier
CNA-GAP-024- 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
- None
- Affected contract
- GraphicsDeviceManager.IsFullScreen / ToggleFullScreen on DIRECTX11 and DIRECTX12
Expected behaviour
XNA on Windows used exclusive full screen; DXGI exposes swap-chain-owned exclusive mode through SetFullscreenState.
Actual behaviour at TARGET
A grep of the whole tree finds no SetFullscreenState. exclusiveFullscreen_ stays false in DirectX11Renderer and DirectX12Renderer and is read only in the Present tearing condition, and both UpdatePresentationFormatEXT overrides discard isFullScreen because full screen 'has its own path'. That path is GraphicsDevice::applyPresentationParametersToWindow (and GameWindow::EndScreenDeviceChange), which ask the platform window for WindowFullscreenMode::ExclusiveFullscreen: the SDL3 window (the default backend) selects the closest real display mode to the back-buffer size, and Win32Window covers the monitor borderless and calls ChangeDisplaySettingsEx with the monitor's current size. So full screen is not always a plain borderless window; what is missing is DXGI-level exclusive ownership, and the D3D renderers never see the platform's exclusive state.
Source locations
modules/renderers/directx11/src/DirectX11Renderer.cpp— present tearing condition reading exclusiveFullscreen_modules/renderers/directx12/include/CNA/Internal/Renderers/DirectX12/DirectX12Renderer.hpp— exclusiveFullscreen_ declaration
Evidence
Checked by reading the named sources at 009d40f5; nothing was built or executed for this entry. Borderless flip-model presentation is the modern default and usually preferable; the gap matters for display-mode changes.
Independent re-verification: Checked by reading the named sources at 009d40f5; nothing was built or executed for this entry. Platform-level exclusive-mode tests exist (Sdl3WindowTests, X11ExclusiveFullscreenTests) but none exercises a D3D swap chain in full screen. Borderless flip-model presentation is the modern default and usually preferable; the residual gap is the unset swap-chain policy state and the absence of DXGI exclusive ownership, not the absence of a display-mode switch.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
No test requests exclusive mode.
Regression test
If exclusive mode is added: a native Windows test that enters and leaves it and checks the display mode.
Blast radius
Games that expect a display-mode change (resolution/refresh switch) when going full screen.
Workaround
No workaround is known.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Known issues
- Functional gap index