CNA-VGAP-018: No test asserts RenderPipeline's fixed post-process order; the order-named tests only count passes

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.

RenderPipeline::end() adds up to fourteen built-in passes and the user passes in a deliberate order, but the three tests named after that order assert only getLastFramePassCount(), so any permutation passes.

Identifier
CNA-VGAP-018
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
Built-in pass order of CNA::Graphics::RenderPipeline::end() (CNAEXT engine layer)

Expected behaviour

The order is a stated contract in RenderPipeline::end() ("Fixed order, and the order is the point"): SSAO, SSR, volumetric fog, light shafts, height fog, motion blur, depth of field, lens flare, bloom, tonemap, colour grade, chromatic aberration, FXAA, film grain, then user passes, each position justified in a comment.

Actual behaviour at TARGET

TheFixedPassOrderIsSsaoThenBloomThenTonemapThenFxaa, SsrSitsBetweenSsaoAndBloom and DepthOfFieldSitsBeforeBloomBecauseItBelongsToTheLens enable a set of passes, run one frame and assert getLastFramePassCount() (5, 5 and 3), plus, in the first, that a user pass ran once; they pass with the passes in any order. UserPassesRunAfterTheBuiltInOnes also only counts. The one ordered assertion on pass names, PassTimingTest.EachPassReportsItsOwnNameAndItsOwnTime, builds its own two-pass PostProcessChain (Tonemap, FXAA) instead of asking the pipeline. Nothing observes the positions of volumetric fog, light shafts, height fog, motion blur, lens flare, colour grade, chromatic aberration or film grain.

Source locations

Evidence

Checked by reading at 009d40f5; not executed. The pipeline already exposes what an ordering test needs on renderers with a GPU timer: with timing on, getPassTimingsEXT() reports one named entry per pass in chain order (ThePipelineSurfacesTheChainsTimings prints the names but asserts only that samples exist).

Focused reproduction

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

Current tests

RenderPipelineTests.cpp, PassTimingTests.cpp and each pass's own suite (LensPassesTests.cpp, VolumetricFogPassTests.cpp, ColorGradePassTests.cpp and others), which test a pass in isolation.

Regression test

One RenderPipelineTests case that enables every built-in pass, turns GPU timing on, runs a few presented frames and compares the names from getPassTimingsEXT() with the documented sequence (skipping where no GPU timer exists), or a test-only accessor for the chain's pass list after end().

Blast radius

Engine-layer maintainers: a reordering of the addPass calls in RenderPipeline::end(), which changes the image (for example tonemapping before bloom), passes the suite. Runtime behaviour at TARGET is unaffected.

Workaround

No workaround is known.

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

Tests and validation
Test architecture: recipes