diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index f9d3d9e2bd..450b3b6ea8 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -172,6 +172,9 @@ void OpenGLRenderer::init_bucket_renderers_jak2() { init_bucket_renderer( 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( + 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( 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), diff --git a/game/mips2c/jak2_functions/generic_merc.cpp b/game/mips2c/jak2_functions/generic_merc.cpp index 24f36e2da3..e7d73059aa 100644 --- a/game/mips2c/jak2_functions/generic_merc.cpp +++ b/game/mips2c/jak2_functions/generic_merc.cpp @@ -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);