X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Flightrec%2Fplugin.c;h=7f500fd275f8497f83b488c5ffc7e35bb405212b;hb=3bf2e5ab375a0e453b64b03296c1bfaa115ee95d;hp=70d01bfedb0c5c06b54d9521956b94bd77fa3d48;hpb=ab206b0c7fd5228d09d0b0cf3183405a6960ea55;p=pcsx_rearmed.git diff --git a/libpcsxcore/lightrec/plugin.c b/libpcsxcore/lightrec/plugin.c index 70d01bfe..7f500fd2 100644 --- a/libpcsxcore/lightrec/plugin.c +++ b/libpcsxcore/lightrec/plugin.c @@ -1,4 +1,3 @@ -#include #include #include #include @@ -10,6 +9,7 @@ #include #endif +#include "lightrec.h" #include "../cdrom.h" #include "../gpu.h" #include "../gte.h" @@ -53,6 +53,14 @@ # define unlikely(x) (x) #endif +#ifndef LIGHTREC_PROG_NAME +# ifdef __linux__ +# define LIGHTREC_PROG_NAME "/proc/self/exe" +# else +# define LIGHTREC_PROG_NAME "retroarch.exe" +# endif +#endif + psxRegisters psxRegs; Rcnt rcnts[4]; @@ -60,14 +68,14 @@ void* code_buffer; static struct lightrec_state *lightrec_state; -static char *name = "retroarch.exe"; - static bool use_lightrec_interpreter; static bool use_pcsx_interpreter; static bool block_stepping; extern u32 lightrec_hacks; +extern void lightrec_code_inv(void *ptr, uint32_t len); + enum my_cp2_opcodes { OP_CP2_RTPS = 0x01, OP_CP2_NCLIP = 0x06, @@ -417,29 +425,11 @@ static bool lightrec_can_hw_direct(u32 kaddr, bool is_write, u8 size) } } -#if defined(HW_DOL) || defined(HW_RVL) -static void lightrec_code_inv(void *ptr, uint32_t len) -{ - extern void DCFlushRange(void *ptr, u32 len); - extern void ICInvalidateRange(void *ptr, u32 len); - - DCFlushRange(ptr, len); - ICInvalidateRange(ptr, len); -} -#elif defined(HW_WUP) -static void lightrec_code_inv(void *ptr, uint32_t len) -{ - wiiu_clear_cache(ptr, (void *)((uintptr_t)ptr + len)); -} -#endif - static const struct lightrec_ops lightrec_ops = { .cop2_op = cop2_op, .enable_ram = lightrec_enable_ram, .hw_direct = lightrec_can_hw_direct, -#if defined(HW_DOL) || defined(HW_RVL) || defined(HW_WUP) - .code_inv = lightrec_code_inv, -#endif + .code_inv = LIGHTREC_CODE_INV ? lightrec_code_inv : NULL, }; static int lightrec_plugin_init(void) @@ -474,7 +464,7 @@ static int lightrec_plugin_init(void) use_lightrec_interpreter = !!getenv("LIGHTREC_INTERPRETER"); - lightrec_state = lightrec_init(name, + lightrec_state = lightrec_init(LIGHTREC_PROG_NAME, lightrec_map, ARRAY_SIZE(lightrec_map), &lightrec_ops); @@ -571,7 +561,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 */ @@ -600,11 +591,18 @@ 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); + } + cycles_per_op_old = cycles_per_op; + lightrec_set_cycles_per_opcode(lightrec_state, cycles_per_op); } static void lightrec_plugin_shutdown(void)