CNA-VGAP-018: No test asserts RenderPipeline's fixed post-process order; the order-named tests only count passes
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
modules/graphics-ext/src/RenderPipeline.cpp— RenderPipeline::end: the chain_.addPass sequencemodules/graphics-ext/tests/CNA/Graphics/RenderPipelineTests.cpp— the three order-named tests and UserPassesRunAfterTheBuiltInOnes assert countsmodules/graphics-ext/tests/CNA/Graphics/PassTimingTests.cpp— EachPassReportsItsOwnNameAndItsOwnTime (own chain) and ThePipelineSurfacesTheChainsTimings
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.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- User guide
- CNAEXT engine layer: contents
- Tests and validation
- Test architecture: recipes
- Known issues
- Verification gap index