CNA-VGAP-022: No test measures presentation cadence: PresentInterval::Two against ordinary vsync

CNA snapshot 3b43bd86  ·  Known Issues › Verification 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.

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

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.

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