handoff: deliver ADDITIVE, and correct the 'any blend you choose is authored' instruction

HANDOFF gets the measured table, the two controls, the three caveats that travel
with it (src=ONE is not evidence of premultiplied textures; the frames share a
draw call so ptframe4 comes free; read it as per-element facts because the
selecting field is still unknown), and the correction to the port's own
sharpener -- 'neither frame has a fully-opaque pixel' is true and is not the
discriminator, because pteff10 has none either and renders accurately.

t32-blend-mode-not-on-disc.md keeps its negative and its reach and loses its
conclusion. INDEX gets the row.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Wuu56cE8vJGTBtn1ppsk8v
This commit is contained in:
sylph-decoder
2026-08-31 06:07:36 +00:00
parent e61c60029a
commit 0af81d7549
3 changed files with 83 additions and 0 deletions

View File

@@ -25,6 +25,67 @@ delivered.
## ✅ 2026-08-31 (later) — **ADDITIVE.** Measured off the GPU. Stop authoring it.
`ptframe1`, `ptframe2` and `ptframe3` are drawn with **`RB_BLENDCONTROL0 =
0x01010101`** — src `ONE`, op `ADD`, dst `ONE`. **Additive.** Everything you
render accurately is `0x07010701` — src `ONE`, dst `1SRC_ALPHA`, alpha-over.
| blend | drawn this way |
|---|---|
| **`0x01010101` ADDITIVE** | **`ptframe1`, `ptframe2`, `ptframe3`**, `pteff20`, both rotated sweep strips |
| `0x07010701` alpha-over | `ptbase`, `pteff05`, the fade quad, `ptmsg`, `ptmsg2`, `pttitle`, every button |
| `0x00010001` opaque | the one non-UI blit that opens the frame |
Full page, both raw logs and the reference table:
[`ui-blend-mode-measured.md`](../re/structures/ui-blend-mode-measured.md) ·
[`data/ui-blend-mode-measured.txt`](../re/data/ui-blend-mode-measured.txt)
🔴 **This corrects the section below, which is still true about the disc and no
longer the right instruction.** It told you *"any blend you choose is authored and
must carry that label"*. That was right about the **disc** and wrong as guidance
about the **game**: additive is now transcribed, not authored, and it should be
labelled that way in `DECISIONS.md`.
**Your own measurement got there first and it agrees.** You solved the
composite per pixel from two backgrounds and ranked additive 34.305/28.948
against alpha-over's 65.046/71.299. This is the register the GPU was actually
handed. The two routes share nothing — a solved composite against a capture, and
a hardware state read out of the command stream — so the agreement is worth more
than either alone.
⚠️ **Three things to take with it.**
* **`src = ONE` in both states, not `SRC_ALPHA`.** The fixed-function stage
multiplies your shader's output by 1, so whatever alpha weighting happens, the
shader does it. Whether the `.t32` texels are stored premultiplied is a
*separate* question and I have not read the shader. Do not conclude
premultiplied textures from this.
* **`ptframe1` and `ptframe2` are ONE draw call**, and so are `pteff20` +
`ptframe3`. A draw call carries one blend state, so the game batches elements
that share a mode. `ptframe4` needs no separate argument: it is inside the same
additive batch as `ptframe3`.
* **Read the table as per-element facts, not as a rule.** *Which field* selects
the mode is still unknown — nothing on the disc does it, and the batching means
the choice is made before the draw. Two additive menu draws (819×720 and
691×720) are unidentified, and the **title screen was not captured**, so your
outstanding "title has frame-like elements I haven't run" is still open on my
side too.
⚠️ **Reach**: two screens, one session, one emulator. The identification is by
quad size against disc dimensions, controlled against the two sweep strips
measured at 1134/1303 px by a different tool in a different session — reproduced
exactly, on both screens. And it is a blend result rather than a shader result:
pixel shader `0xE59B2B3DA4AA9008` is used with **both** states, 12 draws additive
and 18 alpha-over, so `ptframe1` and `ptbase` run the same shader.
⚠️ **One correction to your sharpener, because it will mislead the next reader.**
You offered *"neither frame has a single fully-opaque pixel, against `ptbase`'s
99.1 %"* as what makes them special. True, and **not the discriminator**:
`pteff10` has max alpha **130**, is 100 % partial, has no opaque pixel either, and
you measure it as nearly exact. `pteff12`, `pteff20`, `pteff21``23` are the same.
The census is [`data/menu-sprite-alpha-census.txt`](../re/data/menu-sprite-alpha-census.txt).
## ❔ 2026-08-31 — your blend-mode ask: **not on the disc**. Whatever you pick is authored.
`ptframe1`/`ptframe2` carry **no blend/alpha mode** in any data I can find. Prior