lightrec: implement clock cache clear on cycle_multiplier change
authornotaz <notasas@gmail.com>
Sat, 20 Jan 2024 19:15:28 +0000 (21:15 +0200)
committernotaz <notasas@gmail.com>
Sat, 20 Jan 2024 19:17:35 +0000 (21:17 +0200)
libretro/pcsx_rearmed#818

Makefile
libpcsxcore/lightrec/internals.c [new file with mode: 0644]
libpcsxcore/lightrec/internals.h [new file with mode: 0644]
libpcsxcore/lightrec/plugin.c

index 4786a92..bb183a4 100644 (file)
--- 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 (file)
index 0000000..e37d590
--- /dev/null
@@ -0,0 +1,16 @@
+// internals: stuff lightrec's public API doesn't provide
+#include <assert.h>
+#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 (file)
index 0000000..2748016
--- /dev/null
@@ -0,0 +1,2 @@
+struct lightrec_state;
+void lightrec_plugin_clear_block_caches(struct lightrec_state *state);
index 27fdc47..0b8e618 100644 (file)
@@ -1,4 +1,3 @@
-#include <lightrec.h>
 #include <errno.h>
 #include <stdbool.h>
 #include <stdio.h>
@@ -10,6 +9,8 @@
 #include <sys/mman.h>
 #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)