CNA-VGAP-022: No test measures presentation cadence: PresentInterval::Two against ordinary vsync
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.
The registered interval tests on EasyGL, SOFTWARE, SDL_GPU and WEBGPU and the shared forwarding contract check storage, forwarding and the selected present mode, not the resulting frame timing.
- Identifier
CNA-VGAP-022- Category
- Verification gap
- Subsystem
- Testing & evidence
- 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
- PresentationParameters.PresentationInterval (One, Two, Immediate) and the renderers' swap-interval / present-mode mapping
Expected behaviour
PresentInterval::Two means presenting every second vertical retrace (half refresh rate). Only a timing measurement shows that a renderer really does it.
Actual behaviour at TARGET
The interval tests - easygl_present_interval_test.cpp (also registered for SOFTWARE), sdlgpu_presentation_surface_test.cpp, webgpu_present_mode_test.cpp and swap_interval_forwarding_contract_test.cpp (also run on SDL_GPU as a cross-family program) - assert what was requested, forwarded, recorded or which present mode was chosen. None times presents; the shared PresentInterval test says so itself (actual VSync timing is a display effect that cannot be verified headlessly). SDL_GPU cannot produce half rate through its API: it applies ordinary one-vblank vsync for Two and records the fallback (GetAppliedSwapIntervalEXT, pinned by sdlgpu_presentation_surface_test). A timing record would verify half rate only for the renderers that hand 2 to the driver, such as EasyGL and DIRECTX9 (D3DPRESENT_INTERVAL_TWO).
Source locations
modules/renderers/easygl/examples/easygl_present_interval_test.cpp— storage and forwarding; registered for EasyGL and SOFTWAREmodules/renderers/sdl-gpu/examples/sdlgpu_presentation_surface_test.cpp— Two records the one-vblank fallbackmodules/graphics/examples/swap_interval_forwarding_contract_test.cpp— forwarding contract only
Evidence
Checked by reading the named sources at 3b43bd86; nothing was built or executed for this entry. Timing depends on the display, compositor and driver, which is why CNA avoids asserting it; the gap is that no recorded measurement exists either. The DIRECTX9 and FNA3D renderers register no interval test of their own.
Re-verified at c6dec91f: the interval tests of the renderers retired on 2026-10-13 and 2026-10-14 went with them, including the one renderer whose late-frame present mode this entry also covered.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
As listed above: storage, forwarding and mode selection only.
Regression test
A manual or opt-in measurement harness that records present-to-present intervals for One and Two on real displays per renderer, with the results written down (not a CI assertion).
Blast radius
Games that use PresentInterval::Two for 30 Hz pacing; on SDL_GPU the request is approximated by ordinary vsync.
Workaround
Pace frames with IsFixedTimeStep and TargetElapsedTime instead of PresentInterval::Two.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Known issues
- Verification gap index