DEFECT 1 (logo upside down) ROOT + FIX. The publisher "SQUARE ENIX" logo
rendered vertically mirrored vs the canary oracle (white upright on black).
Measured (env-gated readback + texture-row + per-vertex dumps, all removed):
- The K8888 logo texture decodes UPRIGHT (text in the top rows 1..161; the
red dots sit at ~43% from the texture top). NOT a decoder row-order bug.
- The logo geometry is a centered QuadList whose vertices are emitted in
*clip space* (Y-UP, e.g. pos.y +0.085 top / -0.104 bottom), with the
texture V mapped top->bottom (UV v 0.001 at the top vertex, 0.090 at the
bottom). On both the Xbox 360 (D3D9) and wgpu, clip +Y maps to the
framebuffer top — so a clip-space position is portable with NO Y-flip.
- `compute_ndc_xy` unconditionally negated Y (the flip the *screen-space*
pixel path legitimately needs). For the clip-enabled logo this swapped
top<->bottom vertices while leaving the texture V unchanged, so the
sampled sub-rect read bottom-up: red dots rendered at 58% from the top
(a clean vertical mirror) instead of 43%.
FIX: keep the Y-flip only on the clip_disable (screen-space pixel) branch
where the framebuffer Y-down->wgpu Y-up flip is real; the clip-enabled
branch now passes clip-Y-up through identity. Readback after the fix: red
dots at 42% from the top (= texture's 43%) -> logo UPRIGHT, still centered.
DEFECT 2 (background) was already correct + faithful; 3Z's contradiction is
REFUTED by direct readback: the bg fill (vs 0x36660986 / ps 0xed732b5a,
fullscreen RectangleList) reads its real vertex color (raw 0x818000c7 =
-32896.5 as float) into r0, the PS exports it, and the GPUBUG-115 RB-UNORM
saturate (canary spirv_shader_translator.cc:3607) clamps it to 0 -> BLACK,
matching canary. The seed r0=(gvidx,...) does NOT show through (it's
overwritten by the color vfetch). No code change needed.
Readback of the full frame now matches canary: WHITE upright "SQUARE ENIX"
+ red dots on a BLACK field.
UI-capture-path only (`compute_ndc_xy` runs solely when frame_captures is
Some, i.e. --ui; None headless) -> deterministic core untouched, n50m
--gpu-inline --stable-digest exit 0 (DRAW_INDX 275 / K8888 decode 137,
identical across runs). cargo test --workspace green. Temp probes removed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>