Record three-path temporal quality and spatial references
Native and manual checks / native (ubuntu-24.04) (push) Failing after 39s
Native and manual checks / manual (push) Successful in 31s
Windows editor and software Vulkan / windows-graphics (push) Canceled after 0s
Native and manual checks / native (windows-2025) (push) Canceled after 0s
@@ -7,7 +7,7 @@ These files preserve bounded checks and their inputs. Each record states its sou
|
||||
- [P2 GPU visibility Linux evidence](p2-gpu-visibility-2026-09-23/README.md): Debug/Release GPU acceptance, lavapipe functional checks, relocated Player exports, and explicit platform/performance limits.
|
||||
- [P2 pinned SwiftShader compatibility](p2-swiftshader-2026-09-23/README.md): the Windows CI regression, shader capability fix, independent review closure, final native CI and relocated Player evidence.
|
||||
- [P3 lighting and shadows](p3-lighting-2026-09-24/README.md): implementation, Forward+ A/B and image parity, acceptance matrix, bounded Linux evidence, and remaining Windows/platform checks; temporal reconstruction is tracked separately.
|
||||
- [P3 temporal reconstruction](p3-temporal-2026-09-24/README.md): Off/TAA/Upscale source captures, edge and reveal measurements, and bounded 720p costs.
|
||||
- [P3 temporal reconstruction](p3-temporal-2026-09-24/README.md): Off/TAA/Upscale source captures, three-path image-quality matrix, edge and reveal measurements, and bounded 720p costs.
|
||||
- [Windows software Vulkan](windows-software-vulkan-2026-09-18/README.md): fresh native build, 35 tests, launcher/window/MCP workflows and both relocated Release games on SwiftShader.
|
||||
- [Checkpoint 5 Linux acceptance](checkpoint5-linux-2026-09-18/README.md): clean offline source build, first Editor launch, exact-candidate standalone games and live Blender checks.
|
||||
- [Final Linux source checks](final-linux-2026-09-18/README.md): `4cb8255` integrated test results and both Release games after the asset-relocation correction, including package manifests and standalone captures.
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
# P3 temporal reconstruction: image quality and cost, 2026-09-24
|
||||
|
||||
This record covers Faset's first-generation, opt-in TAA and temporal upscaler.
|
||||
The temporal shader source under test is
|
||||
The 370-frame Direct captures and 720p cost profile below were executed from
|
||||
`1a1f69f7e88b3ea69986931dfcf6baf9b43a431c` on
|
||||
`feat/p3-temporal-integration`; the combined integration source revision is
|
||||
`4a3453e`. Final CI results are tracked with that integration branch. The
|
||||
physical Vulkan device was an
|
||||
NVIDIA GeForce RTX 2080 Ti with proprietary driver 595.84 on Linux. Both
|
||||
fixtures requested Vulkan validation and every recorded frame reported zero
|
||||
`feat/p3-temporal-integration`. The later [three-path quality matrix](matrix/README.md)
|
||||
was executed from `fe3a589174f8fe8e35ee231fe74fe938f4dd3cbd` before the
|
||||
pixel-diagnostics shader merge. The combined P1+P3 performance sweep at
|
||||
`4a3453e` is a different run, not the source of these images. The physical
|
||||
Vulkan device was an NVIDIA GeForce RTX 2080 Ti with proprietary driver 595.84
|
||||
on Linux. Both original Direct fixtures requested Vulkan validation and every
|
||||
recorded frame reported zero
|
||||
validation errors. These observations do not establish physical Windows GPU
|
||||
behavior or high-end reconstruction quality.
|
||||
|
||||
@@ -31,7 +33,8 @@ behavior or high-end reconstruction quality.
|
||||
is the same-jitter unobstructed reference.
|
||||
`tools/analyze_temporal_quality.py` converts the raw PPM output of
|
||||
`faset_render_temporal_acceptance_tests --capture-quality DIR` to PNG
|
||||
losslessly and computes the metrics. It needs Python with NumPy and Pillow.
|
||||
losslessly and computes the metrics. It needs the pinned NumPy and Pillow
|
||||
versions in `tools/requirements-temporal-quality.txt`.
|
||||
- [720p raw profile](profile-720p-debug.csv) contains 30 measured frames per
|
||||
Off/TAA/Upscale mode after 10 warm-up frames, with rotating mode order.
|
||||
`faset_render_temporal_acceptance_tests --profile-720p CSV` reproduces this
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
# P3 temporal image-quality matrix: branch checkpoint
|
||||
|
||||
This is a functional and image-quality capture from
|
||||
`fe3a589174f8fe8e35ee231fe74fe938f4dd3cbd` on
|
||||
`feat/p3-temporal-integration`, before the later pixel-diagnostics shader was
|
||||
merged into the combined P1+P3 branch. It is separate from the earlier Direct
|
||||
capture at `1a1f69f` and from the combined lighting performance sweep at
|
||||
`4a3453e`. Repeating this matrix on the final combined source is necessary
|
||||
before claiming its exact images as integrated release evidence.
|
||||
|
||||
The run used Linux Debug, NVIDIA GeForce RTX 2080 Ti, proprietary driver
|
||||
595.84, 160×120 output except the 319×241 resize scene and 320×240 spatial
|
||||
source. The [raw frame CSV](branch-fe3a589/frames.csv) contains 1,386 linked
|
||||
lossless PNGs, requested and effective visibility, actual Vulkan validation
|
||||
activation, per-frame reset/history fields, extents and timings. The
|
||||
[metric JSON](branch-fe3a589/metrics.json) contains fixed ROIs and per-frame
|
||||
measurements. Vulkan validation was **enabled** on all frames and reported zero
|
||||
errors. Both GPU paths remained effective; neither silently fell back to
|
||||
Direct. The capture is a small deterministic scene test, not a real-game
|
||||
benchmark.
|
||||
|
||||
## Matrix and references
|
||||
|
||||
For each Direct, GPU-frustum and GPU-occlusion path, the same sequences were
|
||||
captured with Off, jittered current-only TAA, accumulated TAA, current-only
|
||||
Upscale at 0.67 and accumulated Upscale at 0.67. Current-only uses the same
|
||||
jitter/internal extent but cuts history every frame. Sequences are a 16-phase
|
||||
thin static wire, 16-phase slow pan, 16-frame moving cube, 16-frame
|
||||
unobstructed door background, door closed for two frames then open for eight,
|
||||
and two-frame cut, teleport, changed projection, changed view ID, resize and
|
||||
transparency/sprite/UI cases. Every visibility path also has a 320×240 Off
|
||||
source for wire and pan, downsampled to 160×120 by a 2×2 box in
|
||||
display-encoded RGB. That four-sample spatial result is a bounded reference,
|
||||
not ground truth or an HDR comparison.
|
||||
|
||||
The [wire/pan comparison](branch-fe3a589/spatial-reference.png) shows the
|
||||
Direct phase-15 outputs and the downsampled reference. The
|
||||
[door trail sheet](branch-fe3a589/door-trail-nearest-4x.png) enlarges the same
|
||||
30×35 Direct crop fourfold with nearest-neighbor sampling over all eight
|
||||
post-open frames. The other P2 images are linked individually by the raw CSV.
|
||||
|
||||
| 160×120 Direct wire ROI | Off | Current-only | TAA | Upscale current-only | Upscale |
|
||||
| --- | ---: | ---: | ---: | ---: | ---: |
|
||||
| Mean frame-to-frame RGB delta, phases 5–15 | 0.000 | 0.388 | 0.360 | 0.439 | 0.412 |
|
||||
| Mean RGB error to same-phase 2× box reference, phases 4–15 | 0.257 | 0.296 | 0.270 | 0.368 | 0.341 |
|
||||
|
||||
TAA and Upscale reduce shimmer relative to their own jittered current-only
|
||||
controls by 7.2% and 6.1% in this wire ROI. The unjittered Off result is
|
||||
closer to this particular 2× spatial reference than TAA, and full-resolution
|
||||
outputs are closer than the 0.67 Upscale outputs. During the pan, TAA's
|
||||
same-phase reference error is 0.298 versus Off's 0.241; temporal accumulation
|
||||
barely changes pan frame delta. The fixture therefore supports a narrow
|
||||
stationary-edge benefit, not a general image-quality ranking.
|
||||
|
||||
For the open door, pixels in the 30×35 edge ROI whose channel error exceeds 8
|
||||
against the same-phase unobstructed temporal background count:
|
||||
|
||||
| Open frame | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|
||||
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
||||
| TAA | 121 | 17 | 3 | 3 | 3 | 0 | 0 | 0 |
|
||||
| Upscale | 176 | 28 | 28 | 28 | 0 | 0 | 0 | 0 |
|
||||
|
||||
The old-door ROI had zero red foreground pixels across all eight open frames.
|
||||
The newly exposed center matches current-only immediately. Both paths met the
|
||||
fixed edge gate (at most 32 pixels above 8 and mean RGB error at most 0.75)
|
||||
from open frame 1 onward, though enlarged Upscale images still show a
|
||||
phase-dependent one-pixel dark edge on some later phases. This threshold is a
|
||||
bounded trail measure, not proof of visually perfect convergence. Cut,
|
||||
unmarked teleport, changed projection, changed view ID and resize phase 1
|
||||
matched current-only exactly in their fixed reset ROI for TAA and Upscale.
|
||||
|
||||
Across all 430 ordinary frames per P2 path (the five modes and eleven
|
||||
sequences, excluding 2× sources), GPU-frustum and GPU-occlusion captures were
|
||||
pixel-identical to Direct on this GPU: mean and maximum channel differences
|
||||
were zero. That establishes parity for these small scenes, not for arbitrary
|
||||
geometry or platforms.
|
||||
|
||||
## Reproduce without overwriting committed evidence
|
||||
|
||||
From this source revision and a configured Linux Debug build:
|
||||
|
||||
```sh
|
||||
cmake --build build/linux-debug --target faset_render_temporal_acceptance_tests --parallel 2
|
||||
ctest --test-dir build/linux-debug --no-tests=error -R '^render_temporal_quality_matrix$' --output-on-failure
|
||||
build/linux-debug/faset_render_temporal_acceptance_tests --list-quality-runs
|
||||
build/linux-debug/faset_render_temporal_acceptance_tests \
|
||||
--capture-quality /tmp/faset-p3-matrix-fe3a589
|
||||
python3 -m venv .cache/temporal-quality-venv
|
||||
.cache/temporal-quality-venv/bin/python -m pip install \
|
||||
-r tools/requirements-temporal-quality.txt
|
||||
.cache/temporal-quality-venv/bin/python tools/analyze_temporal_quality_matrix.py \
|
||||
--input /tmp/faset-p3-matrix-fe3a589 \
|
||||
--output /tmp/faset-p3-matrix-report-fe3a589 \
|
||||
--revision fe3a589174f8fe8e35ee231fe74fe938f4dd3cbd \
|
||||
--driver 'NVIDIA proprietary 595.84'
|
||||
```
|
||||
|
||||
The analyzer refuses an existing output directory so old evidence cannot be
|
||||
silently overwritten. Choose fresh input and output directories for each
|
||||
revision. The 720p cost profile remains in the parent validation record; the
|
||||
12-second matrix run was for correctness and captures, not quiet profiling.
|
||||
|
||||
A separate [90-row 720p Debug profile](profile-720p-branch-5cb818f.csv) was
|
||||
captured from `5cb818f0cc6e6b1a435515deb7dfd7001df4d2c7`, whose profile
|
||||
CSV adds the actual `validation_enabled` field. It recorded `1` and zero
|
||||
errors on every measured frame. Its timings were not taken in a reserved quiet
|
||||
window, so use the parent record's methodology and a final integrated rerun
|
||||
for performance decisions. Reproduce this CSV from that code revision with:
|
||||
|
||||
```sh
|
||||
build/linux-debug/faset_render_temporal_acceptance_tests \
|
||||
--profile-720p /tmp/faset-p3-720p-5cb818f.csv
|
||||
```
|
||||
|
After Width: | Height: | Size: 185 B |
|
After Width: | Height: | Size: 278 B |
|
After Width: | Height: | Size: 185 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 185 B |
|
After Width: | Height: | Size: 278 B |
|
After Width: | Height: | Size: 185 B |
|
After Width: | Height: | Size: 247 B |
|
After Width: | Height: | Size: 185 B |
|
After Width: | Height: | Size: 247 B |
|
After Width: | Height: | Size: 209 B |
|
After Width: | Height: | Size: 205 B |
|
After Width: | Height: | Size: 214 B |
|
After Width: | Height: | Size: 210 B |
|
After Width: | Height: | Size: 210 B |
|
After Width: | Height: | Size: 207 B |
|
After Width: | Height: | Size: 209 B |
|
After Width: | Height: | Size: 213 B |
|
After Width: | Height: | Size: 214 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 209 B |
|
After Width: | Height: | Size: 211 B |
|
After Width: | Height: | Size: 209 B |
|
After Width: | Height: | Size: 205 B |
|
After Width: | Height: | Size: 215 B |
|
After Width: | Height: | Size: 205 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 208 B |
|
After Width: | Height: | Size: 209 B |
|
After Width: | Height: | Size: 237 B |
|
After Width: | Height: | Size: 250 B |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 251 B |
|
After Width: | Height: | Size: 253 B |
|
After Width: | Height: | Size: 261 B |
|
After Width: | Height: | Size: 253 B |
|
After Width: | Height: | Size: 255 B |
|
After Width: | Height: | Size: 254 B |
|
After Width: | Height: | Size: 248 B |
|
After Width: | Height: | Size: 242 B |
|
After Width: | Height: | Size: 260 B |
|
After Width: | Height: | Size: 242 B |
|
After Width: | Height: | Size: 258 B |
|
After Width: | Height: | Size: 262 B |
|
After Width: | Height: | Size: 205 B |
|
After Width: | Height: | Size: 244 B |
|
After Width: | Height: | Size: 274 B |
|
After Width: | Height: | Size: 264 B |
|
After Width: | Height: | Size: 257 B |
|
After Width: | Height: | Size: 255 B |
|
After Width: | Height: | Size: 271 B |
|
After Width: | Height: | Size: 261 B |
|
After Width: | Height: | Size: 246 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 286 B |
|
After Width: | Height: | Size: 257 B |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 261 B |
|
After Width: | Height: | Size: 252 B |
|
After Width: | Height: | Size: 276 B |
|
After Width: | Height: | Size: 205 B |
|
After Width: | Height: | Size: 199 B |
|
After Width: | Height: | Size: 198 B |
|
After Width: | Height: | Size: 203 B |
|
After Width: | Height: | Size: 200 B |
|
After Width: | Height: | Size: 204 B |
|
After Width: | Height: | Size: 201 B |
|
After Width: | Height: | Size: 203 B |
|
After Width: | Height: | Size: 202 B |
|
After Width: | Height: | Size: 204 B |
|
After Width: | Height: | Size: 200 B |
|
After Width: | Height: | Size: 204 B |
|
After Width: | Height: | Size: 201 B |
|
After Width: | Height: | Size: 202 B |
|
After Width: | Height: | Size: 198 B |
|
After Width: | Height: | Size: 199 B |
|
After Width: | Height: | Size: 263 B |
|
After Width: | Height: | Size: 267 B |
|
After Width: | Height: | Size: 291 B |
|
After Width: | Height: | Size: 297 B |
|
After Width: | Height: | Size: 287 B |
|
After Width: | Height: | Size: 294 B |
|
After Width: | Height: | Size: 293 B |