X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Flightrec%2Fplugin.c;h=0b8e618bd44ab46a90b9565065dd74e1e6f7e595;hb=7cbd2996964abf782dd4bdfe9b582fd7c8af36b2;hp=22342fef94838eaf67b22d143be450fb9e0a4f7a;hpb=909bfa63d2b065893bfaf2fa2e4491eb1410db9d;p=pcsx_rearmed.git diff --git a/libpcsxcore/lightrec/plugin.c b/libpcsxcore/lightrec/plugin.c index 22342fef..0b8e618b 100644 --- a/libpcsxcore/lightrec/plugin.c +++ b/libpcsxcore/lightrec/plugin.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -10,6 +9,8 @@ #include #endif +#include "lightrec.h" +#include "internals.h" #include "../cdrom.h" #include "../gpu.h" #include "../gte.h" @@ -335,6 +336,14 @@ static void lightrec_enable_ram(struct lightrec_state *state, bool enable) static bool lightrec_can_hw_direct(u32 kaddr, bool is_write, u8 size) { + if (is_write && size != 32) { + // force32 so must go through handlers + if (0x1f801000 <= kaddr && kaddr < 0x1f801024) + return false; + if ((kaddr & 0x1fffff80) == 0x1f801080) // dma + return false; + } + switch (size) { case 8: switch (kaddr) { @@ -563,7 +572,8 @@ static void lightrec_plugin_execute_block(enum blockExecCaller caller) static void lightrec_plugin_clear(u32 addr, u32 size) { - if (addr == 0 && size == UINT32_MAX) + if ((addr == 0 && size == UINT32_MAX) + || (lightrec_hacks & LIGHTREC_OPT_INV_DMA_ONLY)) lightrec_invalidate_all(lightrec_state); else /* size * 4: PCSX uses DMA units */ @@ -592,11 +602,19 @@ static void lightrec_plugin_notify(enum R3000Anote note, void *data) static void lightrec_plugin_apply_config() { + static u32 cycles_per_op_old; u32 cycle_mult = Config.cycle_multiplier_override && Config.cycle_multiplier == CYCLE_MULT_DEFAULT ? Config.cycle_multiplier_override : Config.cycle_multiplier; - assert(cycle_mult); + u32 cycles_per_op = cycle_mult * 1024 / 100; + assert(cycles_per_op); - lightrec_set_cycles_per_opcode(lightrec_state, cycle_mult * 1024 / 100); + if (cycles_per_op_old && cycles_per_op_old != cycles_per_op) { + SysPrintf("lightrec: reinit block cache for cycles_per_op %.2f\n", + cycles_per_op / 1024.f); + lightrec_plugin_clear_block_caches(lightrec_state); + } + cycles_per_op_old = cycles_per_op; + lightrec_set_cycles_per_opcode(lightrec_state, cycles_per_op); } static void lightrec_plugin_shutdown(void)