[jak2] fix generic crashes (#2505)

Fixes crashes when killing the big spider, killing predator metal heads,
and watching the end cutscene. The presursor guy is the wrong color, but
I don't have time to look into this today.
This commit is contained in:
water111
2023-04-16 22:55:18 -04:00
committed by GitHub
parent a27083f4ee
commit 40c30cc0ab
2 changed files with 35 additions and 29 deletions
@@ -172,6 +172,9 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
init_bucket_renderer<Merc2>(
fmt::format("merc-l{}-water", i), BucketCategory::MERC,
GET_BUCKET_ID_FOR_LIST(BucketId::MERC_L0_WATER, BucketId::MERC_L1_WATER, i));
init_bucket_renderer<Generic2>(
fmt::format("gmerc-l{}-water", i), BucketCategory::GENERIC,
GET_BUCKET_ID_FOR_LIST(BucketId::GMERC_L0_WATER, BucketId::GMERC_L1_WATER, i));
init_bucket_renderer<TFragment>(
fmt::format("tfrag-w-l{}-alpha", i), BucketCategory::TFRAG,
GET_BUCKET_ID_FOR_LIST(BucketId::TFRAG_W_L0_WATER, BucketId::TFRAG_W_L1_WATER, i),
+32 -29
View File
@@ -2184,6 +2184,9 @@ struct Cache {
} cache;
u64 execute(void* ctxt) {
u32 qwc = 0;
u32 madr = 0;
u32 sadr = 0;
auto* c = (ExecutionContext*)ctxt;
bool bc = false;
u32 call_addr = 0;
@@ -2244,41 +2247,45 @@ u64 execute(void* ctxt) {
c->lui(a2, 4096); // lui a2, 4096
c->lwu(a1, 60, at); // lwu a1, 60(at)
c->ori(a2, a2, 53248); // ori a2, a2, 53248
c->lw(t1, 0, a2); // lw t1, 0(a2)
// c->lw(t1, 0, a2); // lw t1, 0(a2)
// nop // sll r0, r0, 0
c->daddiu(t0, at, 92); // daddiu t0, at, 92
c->andi(a3, a3, 16383); // andi a3, a3, 16383
c->andi(t1, t1, 256); // andi t1, t1, 256
// nop // sll r0, r0, 0
bc = c->sgpr64(t1) == 0; // beq t1, r0, L78
// nop // sll r0, r0, 0
if (bc) {goto block_7;} // branch non-likely
// bc = c->sgpr64(t1) == 0; // beq t1, r0, L78
// // nop // sll r0, r0, 0
// if (bc) {goto block_7;} // branch non-likely
//
// c->mov64(t1, a2); // or t1, a2, r0
// // nop // sll r0, r0, 0
//
// block_5:
// c->lw(t2, 0, t0); // lw t2, 0(t0)
// // nop // sll r0, r0, 0
// c->lw(t3, 0, t1); // lw t3, 0(t1)
// // nop // sll r0, r0, 0
// c->andi(t3, t3, 256); // andi t3, t3, 256
// c->daddiu(t2, t2, 1); // daddiu t2, t2, 1
// bc = c->sgpr64(t3) != 0; // bne t3, r0, L77
// c->sw(t2, 0, t0); // sw t2, 0(t0)
// if (bc) {goto block_5;} // branch non-likely
//
// c->gprs[t0].du64[0] = 0; // or t0, r0, r0
c->mov64(t1, a2); // or t1, a2, r0
// nop // sll r0, r0, 0
block_5:
c->lw(t2, 0, t0); // lw t2, 0(t0)
// nop // sll r0, r0, 0
c->lw(t3, 0, t1); // lw t3, 0(t1)
// nop // sll r0, r0, 0
c->andi(t3, t3, 256); // andi t3, t3, 256
c->daddiu(t2, t2, 1); // daddiu t2, t2, 1
bc = c->sgpr64(t3) != 0; // bne t3, r0, L77
c->sw(t2, 0, t0); // sw t2, 0(t0)
if (bc) {goto block_5;} // branch non-likely
c->gprs[t0].du64[0] = 0; // or t0, r0, r0
block_7:
// block_7:
c->dsll(t0, a0, 4); // dsll t0, a0, 4
c->sw(a3, 128, a2); // sw a3, 128(a2)
// c->sw(a3, 128, a2); // sw a3, 128(a2)
sadr = c->sgpr64(a3);
// nop // sll r0, r0, 0
c->sw(a1, 16, a2); // sw a1, 16(a2)
// c->sw(a1, 16, a2); // sw a1, 16(a2)
madr = c->sgpr64(a1);
c->addiu(a3, r0, 256); // addiu a3, r0, 256
c->sw(a0, 32, a2); // sw a0, 32(a2)
// c->sw(a0, 32, a2); // sw a0, 32(a2)
qwc = c->sgpr64(a0);
c->daddu(a0, a1, t0); // daddu a0, a1, t0
c->sw(a3, 0, a2); // sw a3, 0(a2)
// c->sw(a3, 0, a2); // sw a3, 0(a2)
spad_from_dma_no_sadr_off(cache.fake_scratchpad_data, madr, sadr, qwc);
// nop // sll r0, r0, 0
c->sw(a0, 60, at); // sw a0, 60(at)
c->gprs[a0].du64[0] = 0; // or a0, r0, r0
@@ -3242,8 +3249,6 @@ u64 execute(void* ctxt) {
// c->mov64(t1, a2); // or t1, a2, r0
// nop // sll r0, r0, 0
block_74:
// c->lw(t2, 0, t0); // lw t2, 0(t0)
// // nop // sll r0, r0, 0
// c->lw(t3, 0, t1); // lw t3, 0(t1)
@@ -3256,7 +3261,6 @@ u64 execute(void* ctxt) {
c->gprs[t0].du64[0] = 0; // or t0, r0, r0
block_76:
c->dsll(t0, a0, 4); // dsll t0, a0, 4
// c->sw(a3, 128, a2); // sw a3, 128(a2)
sadr = c->sgpr64(a3);
@@ -3331,7 +3335,6 @@ u64 execute(void* ctxt) {
//
// c->gprs[t0].du64[0] = 0; // or t0, r0, r0
block_81:
c->dsll(t0, a0, 4); // dsll t0, a0, 4
// c->sw(a3, 128, a2); // sw a3, 128(a2)
sadr = c->sgpr64(a3);