Commit 34f233c
fix(gum): store into the current slot before advancing in sceGumPushMatrix
`sceGumPushMatrix` advanced `CURRENT_MATRIX` and then stored the VFPU matrix,
so it saved into the slot above the stack pointer. `sceGumPopMatrix` decrements
and then loads, so it reads the slot below the pointer it was left at. The two
never refer to the same slot, and what pop returns is not what push saved.
`CURRENT_MATRIX` names the slot that mirrors the live matrix -- `sceGumMatrixMode`
and `sceGumUpdateMatrix` both write the VFPU matrix to `*CURRENT_MATRIX` -- so
storing before the increment is also the only ordering that works. Saving into
the slot above and having pop read that slot back is self-consistent in
isolation, but `sceGumUpdateMatrix` writes the live matrix to exactly that slot,
and `sceGumDrawArray` calls it, so the first draw after a push would overwrite
what the push saved. This matches PSPSDK's pspgum.c, which stores and then
increments.
The bug hid behind that same sync. `MATRIX_STACK` is zero initialised, so a pop
with nothing beneath it loads an all-zero matrix and collapses everything drawn
afterwards to a point; but any draw performed before the first push syncs the
correct matrix into the slot pop reads, after which push/pop pairs appear to
work. Code that drew before pushing was fine. Code whose first drawing act was
a push -- for example a model whose wheel meshes are ordered before its body
meshes -- lost every mesh after the first pop.
Adds four regression tests to ci/tests covering push/pop, nesting, a matrix
write between push and pop, and that a push leaves the working matrix alone.
Against master the first three fail with (0.0, 0.0, 0.0) against the expected
translation and the suite ends FINAL_FAILURE; with this change all four pass and
the suite ends FINAL_SUCCESS.1 parent 1ed55f8 commit 34f233c
3 files changed
Lines changed: 122 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| |||
17 | 18 | | |
18 | 19 | | |
19 | 20 | | |
| 21 | + | |
20 | 22 | | |
21 | 23 | | |
22 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
458 | 458 | | |
459 | 459 | | |
460 | 460 | | |
461 | | - | |
462 | 461 | | |
463 | 462 | | |
464 | 463 | | |
| |||
469 | 468 | | |
470 | 469 | | |
471 | 470 | | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
472 | 475 | | |
473 | 476 | | |
474 | 477 | | |
| |||
0 commit comments