diff options
Diffstat (limited to 'kernel/gsp_phys_booter.c')
| -rw-r--r-- | kernel/gsp_phys_booter.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index 5c1941a..a28aec0 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -24485,7 +24485,7 @@ gr_page_unmapped: * from guest RAM (`20020825 [0,04400200]`, * `20020855 [0,04400000]`). */ - if (nfin + 6u <= 40u) { + if (nfin + 10u <= 40u) { in[nfin++] = 0x20000000u | (2u << 16) | (0x2094u >> 2); in[nfin++] = (u32)((fam + 0x200u) >> 32) & 0xffu; @@ -24494,6 +24494,33 @@ gr_page_unmapped: (0x2154u >> 2); in[nfin++] = (u32)(fam >> 32) & 0xffu; in[nfin++] = (u32)fam & 0xfffffffcu; + /* + * SESSION 153-CONTINUED-88: the per-slot + * SET_PIPELINE_SHADER(j) TYPE state. The + * client's init push writes it once per + * channel (init-push image: `20010810 + * 00000011` = SET_PIPELINE_SHADER(1) <- + * ENABLE|TYPE=VTG); the captured per-frame + * windows carry only the program-address + * pairs, so the replay context's stage + * registers for the synthesized binds would + * stay unset. Emit them for the two + * synthesized slots with the known types + * (j=2 TESS_CONTROL -> 2, j=5 PIXEL -> 5). + */ + in[nfin++] = 0x20000000u | (1u << 16) | + (0x2080u >> 2); + in[nfin++] = 1u | (2u << 4); + in[nfin++] = 0x20000000u | (1u << 16) | + (0x2140u >> 2); + in[nfin++] = 1u | (5u << 4); + /* + * nrun counts only the two ADDRESS-bearing + * binds above: the guard below matches it + * against the relocation pass's + * relocated-pair count, and the constant + * type runs can never be relocated. + */ nrun += 2; } orel = gsp_phys_rmcall_gr_3d_patch_window( |
