From 102cc344b366d7fca2e09b00942d23a03a71b7e9 Mon Sep 17 00:00:00 2001 From: Sylpheed RE agent Date: Tue, 18 Aug 2026 20:16:05 +0000 Subject: [PATCH] docs/re: the title paint order is build 4's, carries no depth, and is not in the file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three findings and two corrections, all against the same capture. Corrections first, because one of them invalidates numbers already written down: * **the running screen is build 4, not build 7.** `screen info` defaults to the largest build; the game runs a different one, and the two disagree on sprite sizes (ptlogo1 822x100 vs 919x113 — the capture says 915x115). Every declaration index in the previous entry was against the wrong table. The conclusions survive unchanged; the indices are restated. * **the ship capture does NOT skip these UI draws.** This entry justified a new hook partly on "it requires an f32x3 position stream, which a 2D quad does not have". These quads have one: armed on the title, xenia_ship_capture_01.log holds 1150 records of which 965 are the UI sprite shader. The new hook is still the right tool — frame brackets, submission order, texture identity — but it was justified with a wrong reason. Findings: * **no depth in the geometry.** Attribute 0 is k_32_32_32_FLOAT, so every quad carries a Z, and every Z is 0.00000. Submission order is the whole ordering. * **no ordering field in the bundle.** Every word of build 4's declaration table dumped (committed as evidence): the unknowns are constant. The placement region's per-group lead word — never read before — is 0 for all 24 groups, and the region is followed straight by the RATC child stream, so no table hides behind it. * **the batching rule**, which is what makes the order readable: a draw holds one or two quads, and a two-quad draw always holds two elements adjacent in paint order that share a texture page. The engine flushes when the page changes; it does not sort by page (pages alternate). Reproduced in an independent run — same order, same rects — which is the second observation the CONFIRMED bar asks for. --- docs/re/captures/title-build4-decl-words.txt | 54 ++++++++ docs/re/captures/title-screen-draw-order.log | 128 +++++++++--------- docs/re/captures/title-screen-paint-order.txt | 26 ++-- docs/re/ui-title-paint-order-capture.md | 85 ++++++++++++ 4 files changed, 214 insertions(+), 79 deletions(-) create mode 100644 docs/re/captures/title-build4-decl-words.txt diff --git a/docs/re/captures/title-build4-decl-words.txt b/docs/re/captures/title-build4-decl-words.txt new file mode 100644 index 00000000..b7d6e339 --- /dev/null +++ b/docs/re/captures/title-build4-decl-words.txt @@ -0,0 +1,54 @@ +count=24 header words: ['52415443', '003c0000', '0000012c', '00ed010e', '00008000', '00000018', '00000500', '000002d0'] + 0 ptlogo1.t32 00000000 ffffffff ffffffff 00000000 ffffffff 000001c3 00000032 00000000 + 1 ptlogo2.t32 00000000 ffffffff ffffffff 00000000 ffffffff 000001c1 0000002e 00000000 + 2 ptlogo1.t32 00000000 ffffffff 00000000 00000004 ffffffff 000001c3 00000032 00000000 + 3 ptlogo2.t32 00000000 ffffffff 00000001 00000004 ffffffff 000001c1 0000002e 00000000 + 4 ptlogo1.t32 00000000 ffffffff 00000000 00000004 ffffffff 000001c3 00000032 00000000 + 5 ptlogo2.t32 00000000 ffffffff 00000001 00000004 ffffffff 000001c1 0000002e 00000000 + 6 pteff01.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000140 000000a0 00000000 + 7 ptlogo_tm.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000016 0000000e 00000000 + 8 pteff00.prm 00000000 ffffffff ffffffff 00000010 ffffffff 00000280 00000168 00000000 + 9 ptbase2.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000140 000000b4 00000000 + 10 pteff04.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000280 00000168 00000000 + 11 ptloop01.rat 00000000 ffffffff ffffffff 00000000 ffffffff 000000c8 0000005a 00000000 + 12 ptloop02.rat 00000000 ffffffff ffffffff 00000000 ffffffff 000000c8 0000005a 00000000 + 13 pteff02.prm 00000000 ffffffff ffffffff 00000010 ffffffff 00000280 00000168 00000000 + 14 ptlogo_back2eff1.t32 00000000 ffffffff ffffffff 00000000 ffffffff 0000004e 0000003c 00000000 + 15 ptlogo_back2eff2.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000074 0000005b 00000000 + 16 ptlogo_back2eff3.t32 00000000 ffffffff ffffffff 00000000 ffffffff 000000aa 0000005b 00000000 + 17 ptlogo_back2eff4.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000149 0000005b 00000000 + 18 ptlogo_back2eff5.t32 00000000 ffffffff ffffffff 00000000 ffffffff 000001fb 0000007e 00000000 + 19 ptlogo_back2.t32 00000000 ffffffff ffffffff 00000000 ffffffff 000001f4 00000075 00000000 + 20 ptlogo_back2eff.t32 00000000 ffffffff ffffffff 00000000 ffffffff 000001fb 0000007e 00000000 + 21 ptcopyright.t32 00000000 ffffffff ffffffff 00000000 ffffffff 00000135 0000000a 00000000 + 22 ptlogoall_eff.t32 00000000 ffffffff ffffffff 00003000 ffffffff 00000102 00000042 00000000 + 23 ptlogoall_eff2.t32 00000000 ffffffff ffffffff 00003000 ffffffff 00000076 0000005a 00000000 + +placement region starts at 0x5c0 + group 0: element 0 frames= 8 lead=0x00000000 @0x5c0 + group 1: element 1 frames= 8 lead=0x00000000 @0x708 + group 2: element 2 frames= 7 lead=0x00000000 @0x850 + group 3: element 3 frames= 7 lead=0x00000000 @0x970 + group 4: element 4 frames= 7 lead=0x00000000 @0xa90 + group 5: element 5 frames= 7 lead=0x00000000 @0xbb0 + group 6: element 6 frames= 4 lead=0x00000000 @0xcd0 + group 7: element 7 frames= 5 lead=0x00000000 @0xd78 + group 8: element 8 frames= 4 lead=0x00000000 @0xe48 + group 9: element 9 frames= 1 lead=0x00000000 @0xef0 + group 10: element 10 frames= 1 lead=0x00000000 @0xf20 + group 11: element 11 frames= 5 lead=0x00000000 @0xf50 + group 12: element 12 frames= 5 lead=0x00000000 @0x1020 + group 13: element 13 frames= 6 lead=0x00000000 @0x10f0 + group 14: element 14 frames= 5 lead=0x00000000 @0x11e8 + group 15: element 15 frames= 5 lead=0x00000000 @0x12b8 + group 16: element 16 frames= 5 lead=0x00000000 @0x1388 + group 17: element 17 frames= 5 lead=0x00000000 @0x1458 + group 18: element 18 frames= 6 lead=0x00000000 @0x1528 + group 19: element 19 frames= 5 lead=0x00000000 @0x1620 + group 20: element 20 frames= 5 lead=0x00000000 @0x16f0 + group 21: element 21 frames= 5 lead=0x00000000 @0x17c0 + group 22: element 22 frames= 6 lead=0x00000000 @0x1890 + group 23: element 23 frames= 5 lead=0x00000000 @0x1988 + +tail at 0x1a58, 12271922 bytes left +next 48 words: 6f707420 0000000b 70746c6f 676f312e 74333200 06571854 38614400 00883000 0080a000 0000b800 0000c100 00039700 00007100 00000400 00000000 00050000 0002d000 00003c00 01c44c00 03885c00 054c6c00 00000000 00000000 00010000 00007100 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 diff --git a/docs/re/captures/title-screen-draw-order.log b/docs/re/captures/title-screen-draw-order.log index 35b9c99d..c8ffb6d3 100644 --- a/docs/re/captures/title-screen-draw-order.log +++ b/docs/re/captures/title-screen-draw-order.log @@ -1,70 +1,66 @@ -# every draw in SUBMISSION ORDER, undeduplicated, frames 2..7 +# every draw in SUBMISSION ORDER, undeduplicated, frames 0..3 # tex dimensions identify the sprite; base is the guest address - 0 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 - vb=0x14FF75B8 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [BF000000,BF000000=-0.50,-0.50] [449FF000,BF000000=1279.50,-0.50] [449FF000,4433E000=1279.50,719.50] - 1 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] - vb=0x14FF7610 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 2 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x14FF7670 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BEC6F6C7,3FCA029D=-0.39,1.58] [3E1AF152,3F8313AE=0.15,1.02] [BF3143AC,BFC97A15=-0.69,-1.57] [BF9DBDB2,BF828B25=-1.23,-1.02] [BE39CFBA,3F82E9FB=-0.18,1.02] [3E84CD83,3FE73A98=0.26,1.81] [3FECD8F3,BF82CF51=1.85,-1.02] [3FB46B9B,BFE71FED=1.41,-1.81] - 3 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B690000 1280x768 fmt=6] - vb=0x14FF7730 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 4 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] - vb=0x14FF7790 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF66999A,3F2D27D3=-0.90,0.68] [3F5E999A,3F2D27D3=0.87,0.68] [3F5E999A,BDCFA4F8=0.87,-0.10] [BF66999A,BDCFA4F8=-0.90,-0.10] [BF63CCCD,3F26C16C=-0.89,0.65] [3F5B6667,3F26C16C=0.86,0.65] [3F5B6667,BD9C71C8=0.86,-0.08] [BF63CCCD,BD9C71C8=-0.89,-0.08] - 5 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x14FF7850 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF36999A,3EEE38E4=-0.71,0.47] [3F390000,3EEE38E4=0.72,0.47] [3F390000,3E1B05B0=0.72,0.15] [BF36999A,3E1B05B0=-0.71,0.15] [3F42999A,BD471C72=0.76,-0.05] [3F516667,BD471C72=0.82,-0.05] [3F516667,BDC44444=0.82,-0.10] [3F42999A,BDC44444=0.76,-0.10] - 6 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BE30000 1280x768 fmt=6] - vb=0x14FF7910 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF496667,3E155556=-0.79,0.15] [3F436667,3E155556=0.76,0.15] [3F436667,BE127D28=0.76,-0.14] [BF496667,BE127D28=-0.79,-0.14] - 7 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x14FF7970 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF0B0000,BF516C17=-0.54,-0.82] [3F0A999A,BF516C17=0.54,-0.82] [3F0A999A,BF5FA4FB=0.54,-0.87] [BF0B0000,BF5FA4FB=-0.54,-0.87] [BECE0000,BF06C16C=-0.40,-0.53] [3ECC6666,BF06C16C=0.40,-0.53] [3ECC6666,BF2A4FA5=0.40,-0.67] [BECE0000,BF2A4FA5=-0.40,-0.67] - 8 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] - vb=0x14FF7A30 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BED7999A,BEFB05B1=-0.42,-0.49] [3ED60000,BEFB05B1=0.42,-0.49] [3ED60000,BF338E39=0.42,-0.70] [BED7999A,BF338E39=-0.42,-0.70] - 9 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] + 0 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] +--- frame 1 --- + 1 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 + vb=0x15058E58 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 2 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] + vb=0x15058EB0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000] [1.00,1.00,z=0.00000] [1.00,-1.00,z=0.00000] [-1.00,-1.00,z=0.00000] + 3 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15058F10 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [1.38,1.58,z=0.00000] [1.92,1.02,z=0.00000] [1.08,-1.57,z=0.00000] [0.54,-1.02,z=0.00000] [-2.74,1.02,z=0.00000] [-2.30,1.81,z=0.00000] [-0.71,-1.02,z=0.00000] [-1.15,-1.81,z=0.00000] + 4 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B690000 1280x768 fmt=6] + vb=0x15058FD0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000] [1.00,1.00,z=0.00000] [1.00,-1.00,z=0.00000] [-1.00,-1.00,z=0.00000] + 5 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] + vb=0x15059030 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.90,0.68,z=0.00000] [0.87,0.68,z=0.00000] [0.87,-0.10,z=0.00000] [-0.90,-0.10,z=0.00000] [-0.89,0.65,z=0.00000] [0.86,0.65,z=0.00000] [0.86,-0.08,z=0.00000] [-0.89,-0.08,z=0.00000] + 6 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x150590F0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.71,0.47,z=0.00000] [0.72,0.47,z=0.00000] [0.72,0.15,z=0.00000] [-0.71,0.15,z=0.00000] [0.76,-0.05,z=0.00000] [0.82,-0.05,z=0.00000] [0.82,-0.10,z=0.00000] [0.76,-0.10,z=0.00000] + 7 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BE30000 1280x768 fmt=6] + vb=0x150591B0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.79,0.15,z=0.00000] [0.76,0.15,z=0.00000] [0.76,-0.14,z=0.00000] [-0.79,-0.14,z=0.00000] + 8 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15059210 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.54,-0.82,z=0.00000] [0.54,-0.82,z=0.00000] [0.54,-0.87,z=0.00000] [-0.54,-0.87,z=0.00000] [-0.40,-0.53,z=0.00000] [0.40,-0.53,z=0.00000] [0.40,-0.67,z=0.00000] [-0.40,-0.67,z=0.00000] + 9 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] + vb=0x150592D0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.42,-0.49,z=0.00000] [0.42,-0.49,z=0.00000] [0.42,-0.70,z=0.00000] [-0.42,-0.70,z=0.00000] 10 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] ---- frame 3 --- - 11 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 - vb=0x15017B38 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [BF000000,BF000000=-0.50,-0.50] [449FF000,BF000000=1279.50,-0.50] [449FF000,4433E000=1279.50,719.50] - 12 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] - vb=0x15017B90 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 13 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x15017BF0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BEC3C393,3FCA029D=-0.38,1.58] [3E2157BA,3F8313AE=0.16,1.02] [BF2FAA12,BFC97A15=-0.69,-1.57] [BF9CF0E5,BF828B25=-1.23,-1.02] [BE404FBA,3F82E9FB=-0.19,1.02] [3E818D83,3FE73A98=0.25,1.81] [3FEC08F3,BF82CF51=1.84,-1.02] [3FB39B9B,BFE71FED=1.40,-1.81] - 14 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B690000 1280x768 fmt=6] - vb=0x15017CB0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 15 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] - vb=0x15017D10 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF66999A,3F2D27D3=-0.90,0.68] [3F5E999A,3F2D27D3=0.87,0.68] [3F5E999A,BDCFA4F8=0.87,-0.10] [BF66999A,BDCFA4F8=-0.90,-0.10] [BF63CCCD,3F26C16C=-0.89,0.65] [3F5B6667,3F26C16C=0.86,0.65] [3F5B6667,BD9C71C8=0.86,-0.08] [BF63CCCD,BD9C71C8=-0.89,-0.08] - 16 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x15017DD0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF36999A,3EEE38E4=-0.71,0.47] [3F390000,3EEE38E4=0.72,0.47] [3F390000,3E1B05B0=0.72,0.15] [BF36999A,3E1B05B0=-0.71,0.15] [3F42999A,BD471C72=0.76,-0.05] [3F516667,BD471C72=0.82,-0.05] [3F516667,BDC44444=0.82,-0.10] [3F42999A,BDC44444=0.76,-0.10] - 17 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BE30000 1280x768 fmt=6] - vb=0x15017E90 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF496667,3E155556=-0.79,0.15] [3F436667,3E155556=0.76,0.15] [3F436667,BE127D28=0.76,-0.14] [BF496667,BE127D28=-0.79,-0.14] - 18 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x15017EF0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF0B0000,BF516C17=-0.54,-0.82] [3F0A999A,BF516C17=0.54,-0.82] [3F0A999A,BF5FA4FB=0.54,-0.87] [BF0B0000,BF5FA4FB=-0.54,-0.87] [BECE0000,BF06C16C=-0.40,-0.53] [3ECC6666,BF06C16C=0.40,-0.53] [3ECC6666,BF2A4FA5=0.40,-0.67] [BECE0000,BF2A4FA5=-0.40,-0.67] - 19 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] - vb=0x15017FB0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BED7999A,BEFB05B1=-0.42,-0.49] [3ED60000,BEFB05B1=0.42,-0.49] [3ED60000,BF338E39=0.42,-0.70] [BED7999A,BF338E39=-0.42,-0.70] - 20 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] + 11 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] +--- frame 2 --- + 12 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 + vb=0x150793D8 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 13 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] + vb=0x15079430 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000] [1.00,1.00,z=0.00000] [1.00,-1.00,z=0.00000] [-1.00,-1.00,z=0.00000] + 14 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15079490 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [1.39,1.58,z=0.00000] [1.93,1.02,z=0.00000] [1.08,-1.57,z=0.00000] [0.54,-1.02,z=0.00000] [-2.75,1.02,z=0.00000] [-2.31,1.81,z=0.00000] [-0.71,-1.02,z=0.00000] [-1.15,-1.81,z=0.00000] + 15 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B690000 1280x768 fmt=6] + vb=0x15079550 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000] [1.00,1.00,z=0.00000] [1.00,-1.00,z=0.00000] [-1.00,-1.00,z=0.00000] + 16 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] + vb=0x150795B0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.90,0.68,z=0.00000] [0.87,0.68,z=0.00000] [0.87,-0.10,z=0.00000] [-0.90,-0.10,z=0.00000] [-0.89,0.65,z=0.00000] [0.86,0.65,z=0.00000] [0.86,-0.08,z=0.00000] [-0.89,-0.08,z=0.00000] + 17 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15079670 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.71,0.47,z=0.00000] [0.72,0.47,z=0.00000] [0.72,0.15,z=0.00000] [-0.71,0.15,z=0.00000] [0.76,-0.05,z=0.00000] [0.82,-0.05,z=0.00000] [0.82,-0.10,z=0.00000] [0.76,-0.10,z=0.00000] + 18 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BE30000 1280x768 fmt=6] + vb=0x15079730 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.79,0.15,z=0.00000] [0.76,0.15,z=0.00000] [0.76,-0.14,z=0.00000] [-0.79,-0.14,z=0.00000] + 19 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15079790 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.54,-0.82,z=0.00000] [0.54,-0.82,z=0.00000] [0.54,-0.87,z=0.00000] [-0.54,-0.87,z=0.00000] [-0.40,-0.53,z=0.00000] [0.40,-0.53,z=0.00000] [0.40,-0.67,z=0.00000] [-0.40,-0.67,z=0.00000] + 20 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] + vb=0x15079850 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.42,-0.49,z=0.00000] [0.42,-0.49,z=0.00000] [0.42,-0.70,z=0.00000] [-0.42,-0.70,z=0.00000] 21 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] ---- frame 4 --- - 22 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 - vb=0x150380B8 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [BF000000,BF000000=-0.50,-0.50] [449FF000,BF000000=1279.50,-0.50] [449FF000,4433E000=1279.50,719.50] - 23 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] - vb=0x15038110 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 24 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x15038170 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BEC229FA,3FCA029D=-0.38,1.58] [3E248AEC,3F8313AE=0.16,1.02] [BF2EDD46,BFC97A15=-0.68,-1.57] [BF9C8A7F,BF828B25=-1.22,-1.02] [BE438FBA,3F82E9FB=-0.19,1.02] [3E7FDB06,3FE73A98=0.25,1.81] [3FEBA0F3,BF82CF51=1.84,-1.02] [3FB3339B,BFE71FED=1.40,-1.81] - 25 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B690000 1280x768 fmt=6] - vb=0x15038230 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 26 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] - vb=0x15038290 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF66999A,3F2D27D3=-0.90,0.68] [3F5E999A,3F2D27D3=0.87,0.68] [3F5E999A,BDCFA4F8=0.87,-0.10] [BF66999A,BDCFA4F8=-0.90,-0.10] [BF63CCCD,3F26C16C=-0.89,0.65] [3F5B6667,3F26C16C=0.86,0.65] [3F5B6667,BD9C71C8=0.86,-0.08] [BF63CCCD,BD9C71C8=-0.89,-0.08] - 27 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x15038350 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF36999A,3EEE38E4=-0.71,0.47] [3F390000,3EEE38E4=0.72,0.47] [3F390000,3E1B05B0=0.72,0.15] [BF36999A,3E1B05B0=-0.71,0.15] [3F42999A,BD471C72=0.76,-0.05] [3F516667,BD471C72=0.82,-0.05] [3F516667,BDC44444=0.82,-0.10] [3F42999A,BDC44444=0.76,-0.10] - 28 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BE30000 1280x768 fmt=6] - vb=0x15038410 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF496667,3E155556=-0.79,0.15] [3F436667,3E155556=0.76,0.15] [3F436667,BE127D28=0.76,-0.14] [BF496667,BE127D28=-0.79,-0.14] - 29 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] - vb=0x15038470 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF0B0000,BF516C17=-0.54,-0.82] [3F0A999A,BF516C17=0.54,-0.82] [3F0A999A,BF5FA4FB=0.54,-0.87] [BF0B0000,BF5FA4FB=-0.54,-0.87] [BECE0000,BF06C16C=-0.40,-0.53] [3ECC6666,BF06C16C=0.40,-0.53] [3ECC6666,BF2A4FA5=0.40,-0.67] [BECE0000,BF2A4FA5=-0.40,-0.67] - 30 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] - vb=0x15038530 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BED7999A,BEFB05B1=-0.42,-0.49] [3ED60000,BEFB05B1=0.42,-0.49] [3ED60000,BF338E39=0.42,-0.70] [BED7999A,BF338E39=-0.42,-0.70] - 31 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] + 22 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] +--- frame 3 --- + 23 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 + vb=0x15099958 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [-0.50,-0.50,z=0.00000] [1279.50,-0.50,z=0.00000] [1279.50,719.50,z=0.00000] + 24 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] + vb=0x150999B0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000] [1.00,1.00,z=0.00000] [1.00,-1.00,z=0.00000] [-1.00,-1.00,z=0.00000] + 25 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15099A10 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [1.39,1.58,z=0.00000] [1.93,1.02,z=0.00000] [1.09,-1.57,z=0.00000] [0.55,-1.02,z=0.00000] [-2.75,1.02,z=0.00000] [-2.31,1.81,z=0.00000] [-0.72,-1.02,z=0.00000] [-1.16,-1.81,z=0.00000] + 26 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B690000 1280x768 fmt=6] + vb=0x15099AD0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-1.00,1.00,z=0.00000] [1.00,1.00,z=0.00000] [1.00,-1.00,z=0.00000] [-1.00,-1.00,z=0.00000] + 27 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] + vb=0x15099B30 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.90,0.68,z=0.00000] [0.87,0.68,z=0.00000] [0.87,-0.10,z=0.00000] [-0.90,-0.10,z=0.00000] [-0.89,0.65,z=0.00000] [0.86,0.65,z=0.00000] [0.86,-0.08,z=0.00000] [-0.89,-0.08,z=0.00000] + 28 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15099BF0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.71,0.47,z=0.00000] [0.72,0.47,z=0.00000] [0.72,0.15,z=0.00000] [-0.71,0.15,z=0.00000] [0.76,-0.05,z=0.00000] [0.82,-0.05,z=0.00000] [0.82,-0.10,z=0.00000] [0.76,-0.10,z=0.00000] + 29 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BE30000 1280x768 fmt=6] + vb=0x15099CB0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.79,0.15,z=0.00000] [0.76,0.15,z=0.00000] [0.76,-0.14,z=0.00000] [-0.79,-0.14,z=0.00000] + 30 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + vb=0x15099D10 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.54,-0.82,z=0.00000] [0.54,-0.82,z=0.00000] [0.54,-0.87,z=0.00000] [-0.54,-0.87,z=0.00000] [-0.40,-0.53,z=0.00000] [0.40,-0.53,z=0.00000] [0.40,-0.67,z=0.00000] [-0.40,-0.67,z=0.00000] + 31 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0B2C0000 1280x768 fmt=6] + vb=0x15099DD0 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [-0.42,-0.49,z=0.00000] [0.42,-0.49,z=0.00000] [0.42,-0.70,z=0.00000] [-0.42,-0.70,z=0.00000] 32 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] ---- frame 5 --- - 33 prim=8 indices=3 vs=0x0A6D1DD7767FDF27 ps=0x2E372EA28CC404B7 - vb=0x15058638 stride=28 attrs=[57@0 38@12 ] fmt0=57 v: [BF000000,BF000000=-0.50,-0.50] [449FF000,BF000000=1279.50,-0.50] [449FF000,4433E000=1279.50,719.50] - 34 prim=13 indices=4 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x0BA60000 1280x768 fmt=6] - vb=0x15058690 stride=24 attrs=[57@0 6@12 37@16 ] fmt0=57 v: [BF80199A,3F802D83=-1.00,1.00] [3F7FCCCC,3F802D83=1.00,1.00] [3F7FCCCC,BF7FA4FA=1.00,-1.00] [BF80199A,BF7FA4FA=-1.00,-1.00] - 35 prim=13 indices=8 vs=0xE0BAFB4F520FE441 ps=0xE59B2B3DA4AA9008 tex[base=0x11C30000 1280x768 fmt=6] + 33 prim=8 indices=3 vs=0x72CBCAA6A7984111 ps=0xE59B2B3DA4AA9008 tex[base=0x10000000 1x1 fmt=26] diff --git a/docs/re/captures/title-screen-paint-order.txt b/docs/re/captures/title-screen-paint-order.txt index 0c9f0ac9..2e6e68be 100644 --- a/docs/re/captures/title-screen-paint-order.txt +++ b/docs/re/captures/title-screen-paint-order.txt @@ -1,13 +1,13 @@ -frame 2 draw 0 ( 0, 0) 1280x720 → 8AX 1280x720 -frame 2 draw 1 ( 0, 0) 1280x720 → 8AX 1280x720 -frame 2 draw 2 (-147,-209) 883x1134 ROT → ? -frame 2 draw 2 ( 525,-292) 1299x1303 ROT → ? -frame 2 draw 3 ( 0, 0) 1280x720 → 8AX 1280x720 -frame 2 draw 4 ( 64, 115) 1133x281 → ptlogo_back2eff.t32 1133x280 (±1), ptlogo_back2eff5.t32 1133x280 (±1) -frame 2 draw 4 ( 70, 126) 1120x263 → ptlogo_back2.t32 1118x262 (±2) -frame 2 draw 5 ( 186, 191) 915x115 → ptlogo1.t32 919x113 (±4) -frame 2 draw 5 (1126, 378) 38x18 → ptlogo_tm.t32 37x17 (±1) -frame 2 draw 6 ( 134, 306) 992x104 → ptlogo2.t32 992x104 -frame 2 draw 7 ( 294, 655) 691x18 → ptcopyright.t32 694x20 (±3) -frame 2 draw 7 ( 384, 551) 512x50 → ptbtn00.t32 513x50 (±1) -frame 2 draw 8 ( 371, 536) 538x76 → ptbtn00f.t32 537x76 (±1) +frame 1 draw 1 ( 0, 0) 1280x720 → 8AX 1280x720 +frame 1 draw 2 ( 0, 0) 1280x720 → 8AX 1280x720 +frame 1 draw 3 ( 986,-209) 883x1134 ROT → ? +frame 1 draw 3 (-1114,-292) 1299x1303 ROT → ? +frame 1 draw 4 ( 0, 0) 1280x720 → 8AX 1280x720 +frame 1 draw 5 ( 64, 115) 1133x281 → ptlogo_back2eff.t32 1133x280 (±1), ptlogo_back2eff5.t32 1133x280 (±1) +frame 1 draw 5 ( 70, 126) 1120x263 → ptlogo_back2.t32 1118x262 (±2) +frame 1 draw 6 ( 186, 191) 915x115 → ptlogo1.t32 919x113 (±4) +frame 1 draw 6 (1126, 378) 38x18 → ptlogo_tm.t32 37x17 (±1) +frame 1 draw 7 ( 134, 306) 992x104 → ptlogo2.t32 992x104 +frame 1 draw 8 ( 294, 655) 691x18 → ptcopyright.t32 694x20 (±3) +frame 1 draw 8 ( 384, 551) 512x50 → ptbtn00.t32 513x50 (±1) +frame 1 draw 9 ( 371, 536) 538x76 → ptbtn00f.t32 537x76 (±1) diff --git a/docs/re/ui-title-paint-order-capture.md b/docs/re/ui-title-paint-order-capture.md index 6343cfb6..d1c51b45 100644 --- a/docs/re/ui-title-paint-order-capture.md +++ b/docs/re/ui-title-paint-order-capture.md @@ -128,3 +128,88 @@ scaling puts it. * **One screen only.** This is `GP_TITLE`. A rule needs a second screen with a background and overlapping foreground; the same hook now makes that a ten-minute run rather than a static argument. + +--- + +## Correction (same day, next iteration): the running screen is build **4**, not build 7 + +Everything above was matched against `GP_TITLE.pak` **build 7**, because that is +the largest build and what `screen info` defaults to. The game does not run it. + +`screen info --geometry` prints each element's *decoded sprite size*, and the two +builds disagree: + +| sprite | build 7 | build 4 (`a60fcb85`) | captured quad | +|---|---|---|---| +| `ptlogo1.t32` | 822×100 | **919×113** | 915×115 | +| `ptlogo2.t32` | 888×93 | **992×104** | 992×104 | +| `ptlogo_back2.t32` | 1000×234 | **1118×262** | 1120×263 | + +So the quads come from build 4 — a 24-element build — and the earlier index +mapping was against the wrong table. **The conclusion does not change**, only the +numbers: the paint order in build 4's declaration indices is + +``` +draw 1,2,4 full-screen layers 9 ptbase2 / 10 pteff04 (not separable — see below) +draw 3 two rotated effect quads ? +draw 5 ptlogo_back2eff(5) 18|20, then ptlogo_back2 19 +draw 6 ptlogo1 0, then ptlogo_tm 7 +draw 7 ptlogo2 1 +draw 8 ptcopyright 21, then ptbtn00 ← ptbtn00 is build 2 +draw 9 ptbtn00f ← build 2 +``` + +Declaration order is still refuted (`9` first; `0`/`1` after `18`/`19`), reverse +order still refuted (`21` second-to-last), and the two-bundle finding is +unchanged — build 2 is a one-element bundle holding `ptbtn00.rat` at rest +(383,550), against a captured (384,551). + +**Reproduced in an independent run** (fresh boot, a signed-in profile, different +frame numbers): byte-for-byte the same order and the same rects. That is the +second observation the `CONFIRMED` bar asks for. + +### The batching rule, which is what makes the order readable + +Draws carry one or two quads, and a two-quad draw always holds two elements that +are **adjacent in paint order and share a texture page**. Pages alternate +(`0B2C, 11C3, 0BE3, 11C3, 0B2C`), so this is not a sort by page: the engine +accumulates quads while the bound page stays the same and flushes when it +changes. The paint order is therefore the concatenation of the draws' quads, in +vertex order within each draw. + +## Two more orderings refuted, and one non-place to look + +**There is no depth in the geometry.** Attribute 0 of a UI quad is +`k_32_32_32_FLOAT` — a float3 — so the stream carries a Z. Every Z in the capture +is **0.00000**, on every vertex of every quad of every frame. The submission +order is the whole of the ordering; nothing is left to a depth test. + +**There is no ordering field in the bundle either.** Dumping build 4's whole +declaration table word by word (`docs/re/captures/title-build4-decl-words.txt`): +`+28` is 0 on all 24 entries, `+32` is `0xffffffff` (no parent) on all 24, `+36` +is `0xffffffff` except on the three `kind = 0x4` repeat instances where it is +0/1, `+44` is `0xffffffff` on all 24, `+56` is 0 on all 24. The placement +region's per-group lead word — the one word of that header this project had never +read — is **0 for every group**. And the region is followed immediately by the +RATC child stream (`opt ` + `ptlogo1.t32` + `T8aD`), so there is no table after +it to hold a draw order. + +So the paint order is not carried by the file. It is produced by the guest's +screen code, and settling it means reading that code (the splash path noted in +the emulator-era work — `sub_821CC7A0`, item vtable `0x820b30b4` — draws with +exactly the PS hash `E59B2B3D` this capture sees). + +## A correction to this entry's own premise + +It says the F10 ship capture "explicitly drops UI draws … it requires an `f32x3` +position attribute, which a 2D quad stream does not have". **These quads have +one.** Armed on the title screen, `xenia_ship_capture_01.log` holds 1 150 draw +records of which **965 are the UI sprite shader** (`stride=24 prim=13`, +VS `E0BAFB4F`). + +The new hook is still the right tool, for reasons that are about the record and +not the filter: the ship capture writes no frame boundaries, no submission +sequence across frames, no bound-texture identity, and de-dups on a key that +happens not to collide here only because the game rebuilds its UI vertex buffer +every frame. But "it cannot see UI draws" was wrong, and the cost of the new hook +was justified with a wrong reason.