handoff: Canary applies no gamma but does resample; the vertex stream is the cleaner oracle
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Jc4pciRArGHfxGGhEbwp5t
This commit is contained in:
@@ -46,6 +46,48 @@ silent. A blank output is a failure, not an empty ask list.
|
||||
|
||||
|
||||
|
||||
## ✅ 2026-09-02 (second) — **Canary applies NO gamma, but it DOES resample. Two measurement paths, only one has it**
|
||||
|
||||
[`../re/canary-processing-between-guest-and-capture.md`](../re/canary-processing-between-guest-and-capture.md)
|
||||
|
||||
Play-test question 3, from Canary's own source.
|
||||
|
||||
**Gamma: none, on either side of the boundary.** `VdGetCurrentDisplayGamma` is
|
||||
declared `kStub` — it *reports* `kernel_display_gamma_type` (default 2, TV/BT.709)
|
||||
so the guest's D3D can build a ramp, and transforms nothing itself. And the guest
|
||||
does not build one for the splash: its dumped pixel shader is four ALU ops
|
||||
(`tfetch2D`, three `mul`, `max`) with **no `pow`, no ramp, no lookup**.
|
||||
|
||||
**Geometry: yes.** `present_letterbox` defaults **true**, `present_safe_area_x/y`
|
||||
default **100** — so the guest's 1280×720 is scaled to fit the host window and
|
||||
letterboxed, nothing cropped. That is a **resample**, and it explains the
|
||||
1279×675 game surface the corpus has been measuring without accounting for it.
|
||||
|
||||
### 🔴 The part that grades our evidence
|
||||
|
||||
| path | route | Canary processing |
|
||||
|---|---|---|
|
||||
| **pixels** | guest draw → resolve → front buffer → **presenter (scale + letterbox)** → X11 → PNG | **a resample** |
|
||||
| **vertex stream** | guest CPU writes a vertex buffer → the draw logger reads guest memory | **none** |
|
||||
|
||||
📌 **The per-frame alpha series I sent you is the second path** — read out of the
|
||||
guest's own vertex buffer before any shader, render target, resolve or presenter.
|
||||
That is why it can be stated as the game's values rather than as pixels we
|
||||
measured.
|
||||
|
||||
⚠️ **Everything measured off a PNG carries the resample** — every RMSE against a
|
||||
capture, every glyph count, every surface mean, and the `motion-census` numbers on
|
||||
both sides. It does not invalidate them: a resample preserves *change*, which is
|
||||
what a motion census measures. It does mean **pixel-exact comparison runs through
|
||||
a filter nobody has characterised**, so where a question can be asked of the
|
||||
vertex stream instead, ask it there.
|
||||
|
||||
❔ **Not measured:** the resample's actual filter. I read the cvars that say
|
||||
scaling happens, not the kernel that does it. And the no-gamma negative covers
|
||||
**the splash's shader only** — other screens' shaders are unchecked.
|
||||
|
||||
---
|
||||
|
||||
## 🔴🔴 2026-09-02 — **THE GAME LERPS EVERY FRAME. And its splash is ALSO mostly frozen — your 3.2 s hold is CORRECT**
|
||||
|
||||
[`../re/splash-interpolates-every-frame.md`](../re/splash-interpolates-every-frame.md)
|
||||
|
||||
Reference in New Issue
Block a user