CNA-VGAP-022: No test measures presentation cadence: PresentInterval::Two against ordinary vsync, or Vulkan's FIFO_RELAXED late-frame behaviour

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

The registered interval tests on EasyGL, SDL_RENDERER, SDL_GPU, VULKAN 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 009d40f5 (009d40f5dd085c4e674d3479675fac84b12b3e0a)
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); FIFO_RELAXED lets a late frame tear instead of waiting. Only a timing measurement shows that a renderer really does either.

Actual behaviour at TARGET

The interval tests - easygl_present_interval_test.cpp (also registered for VULKAN, SOFTWARE, OPENGL4 and, through DirectXParityTests.cmake, DIRECTX11 and DIRECTX12), sdlrenderer_presentinterval_test.cpp, sdlgpu_presentation_surface_test.cpp, vulkan_swap_interval_test.cpp, webgpu_present_mode_test.cpp and swap_interval_forwarding_contract_test.cpp (also registered for DIRECTX11/12 and OPENGL4) - 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). Two renderers cannot produce half rate through their API: SDL_GPU applies ordinary one-vblank vsync for Two (documented in SdlGpuRenderer.hpp and pinned by sdlgpu_presentation_surface_test), and Vulkan requests FIFO_RELAXED, which the Vulkan specification does not define as half rate, while VulkanRenderer::SetSwapInterval's comment still says 2 = half-rate. A timing record there would characterise an approximation; it would verify half rate only for the renderers that hand 2 to the driver (EasyGL, SDL_RENDERER, Direct3D).

Source locations

Evidence

Checked by reading the named sources at 009d40f5; 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.

Independent re-verification: Checked by reading the named sources at 009d40f5; 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 Direct3D renderers do register the shared PresentInterval and SwapIntervalForwarding fixtures, but only their manual Windows workflow runs them (CNA-VGAP-026).

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 some renderers the request may be approximated (SDL_RENDERER falls back to 1 when the driver rejects 2).

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.