mirror of
https://github.com/open-goal/jak-project
synced 2026-07-24 05:59:27 -04:00
[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:
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user