From 7cbd2996964abf782dd4bdfe9b582fd7c8af36b2 Mon Sep 17 00:00:00 2001 From: notaz Date: Sat, 20 Jan 2024 21:15:28 +0200 Subject: [PATCH] lightrec: implement clock cache clear on cycle_multiplier change libretro/pcsx_rearmed#818 --- Makefile | 3 ++- libpcsxcore/lightrec/internals.c | 16 ++++++++++++++++ libpcsxcore/lightrec/internals.h | 2 ++ libpcsxcore/lightrec/plugin.c | 15 ++++++++++++--- 4 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 libpcsxcore/lightrec/internals.c create mode 100644 libpcsxcore/lightrec/internals.h diff --git a/Makefile b/Makefile index 4786a922..bb183a42 100644 --- a/Makefile +++ b/Makefile @@ -119,7 +119,8 @@ OBJS += deps/lightrec/recompiler.o \ deps/lightrec/reaper.o endif OBJS += deps/lightrec/tlsf/tlsf.o -OBJS += libpcsxcore/lightrec/plugin.o +OBJS += libpcsxcore/lightrec/plugin.o \ + libpcsxcore/lightrec/internals.o OBJS += deps/lightning/lib/jit_disasm.o \ deps/lightning/lib/jit_memory.o \ deps/lightning/lib/jit_names.o \ diff --git a/libpcsxcore/lightrec/internals.c b/libpcsxcore/lightrec/internals.c new file mode 100644 index 00000000..e37d5905 --- /dev/null +++ b/libpcsxcore/lightrec/internals.c @@ -0,0 +1,16 @@ +// internals: stuff lightrec's public API doesn't provide +#include +#include "lightrec-private.h" +#include "blockcache.h" +#include "internals.h" + +void lightrec_plugin_clear_block_caches(struct lightrec_state *state) +{ + if (state == NULL) + return; + + lightrec_invalidate_all(state); + lightrec_free_block_cache(state->block_cache); + state->block_cache = lightrec_blockcache_init(state); + assert(state->block_cache); +} diff --git a/libpcsxcore/lightrec/internals.h b/libpcsxcore/lightrec/internals.h new file mode 100644 index 00000000..27480168 --- /dev/null +++ b/libpcsxcore/lightrec/internals.h @@ -0,0 +1,2 @@ +struct lightrec_state; +void lightrec_plugin_clear_block_caches(struct lightrec_state *state); diff --git a/libpcsxcore/lightrec/plugin.c b/libpcsxcore/lightrec/plugin.c index 27fdc476..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" @@ -601,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) -- 2.39.5