summaryrefslogtreecommitdiff
path: root/libretro.c
diff options
context:
space:
mode:
authorDavid Guillen Fandos2021-03-17 21:05:49 +0100
committerDavid Guillen Fandos2021-03-17 21:05:49 +0100
commiteab44b9e0b9dcb5cf7fa7b6851fa5454041da930 (patch)
tree71351b6aa15bf47c525cf11402c4d4b06fa6d2e4 /libretro.c
parentfb7ca09b019248b9a0aba481ea55386f71053d73 (diff)
downloadpicogpsp-eab44b9e0b9dcb5cf7fa7b6851fa5454041da930.tar.gz
picogpsp-eab44b9e0b9dcb5cf7fa7b6851fa5454041da930.tar.bz2
picogpsp-eab44b9e0b9dcb5cf7fa7b6851fa5454041da930.zip
Enable runtime dynarec enable/disable
Added a more thorough cache cleanup for reset/mode-change too. Fixed the mmap initialization that ends up leaking memory. Minor x86 asm fixes for Android.
Diffstat (limited to 'libretro.c')
-rw-r--r--libretro.c63
1 files changed, 21 insertions, 42 deletions
diff --git a/libretro.c b/libretro.c
index 178b466..bc61977 100644
--- a/libretro.c
+++ b/libretro.c
@@ -408,7 +408,13 @@ void retro_get_system_av_info(struct retro_system_av_info* info)
void retro_init(void)
{
-#if defined(_3DS) && defined(HAVE_DYNAREC)
+#if defined(HAVE_DYNAREC)
+ #if defined(HAVE_MMAP)
+ rom_translation_cache = mmap(NULL, ROM_TRANSLATION_CACHE_SIZE,
+ PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
+ ram_translation_cache = mmap(NULL, RAM_TRANSLATION_CACHE_SIZE,
+ PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
+ #elif defined(_3DS)
if (__ctr_svchax && !translation_caches_inited)
{
uint32_t currentHandle;
@@ -430,10 +436,8 @@ void retro_init(void)
ctr_flush_invalidate_cache();
translation_caches_inited = 1;
}
-#endif
-
-#if defined(VITA) && defined(HAVE_DYNAREC)
- if(!translation_caches_inited){
+ #elif defined(VITA)
+ if(!translation_caches_inited){
void* currentHandle;
sceBlock = getVMBlock();
@@ -456,8 +460,8 @@ void retro_init(void)
ram_translation_ptr = ram_translation_cache;
sceKernelOpenVMDomain();
translation_caches_inited = 1;
-}
-
+ }
+ #endif
#endif
if (!gamepak_rom)
@@ -641,16 +645,19 @@ static void check_variables(int started_from_load)
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
{
- if (started_from_load)
- {
- if (strcmp(var.value, "disabled") == 0)
- dynarec_enable = 0;
- else if (strcmp(var.value, "enabled") == 0)
- dynarec_enable = 1;
- }
+ int prevvalue = dynarec_enable;
+ if (strcmp(var.value, "disabled") == 0)
+ dynarec_enable = 0;
+ else if (strcmp(var.value, "enabled") == 0)
+ dynarec_enable = 1;
+
+ if (dynarec_enable != prevvalue)
+ wipe_caches();
}
else
dynarec_enable = 1;
+#else
+ dynarec_enable = 0;
#endif
var.key = "gpsp_frameskip";
@@ -779,34 +786,6 @@ bool retro_load_game(const struct retro_game_info* info)
check_variables(1);
set_input_descriptors();
-#if defined(HAVE_DYNAREC)
- if (dynarec_enable)
- {
-#if defined(HAVE_MMAP)
-
- rom_translation_cache = mmap(NULL, ROM_TRANSLATION_CACHE_SIZE,
- PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
- ram_translation_cache = mmap(NULL, RAM_TRANSLATION_CACHE_SIZE,
- PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0);
-
- rom_translation_ptr = rom_translation_cache;
- ram_translation_ptr = ram_translation_cache;
-#elif defined(_3DS)
- dynarec_enable = __ctr_svchax;
- rom_translation_ptr = rom_translation_cache;
- ram_translation_ptr = ram_translation_cache;
-#elif defined(PSP) || defined(VITA)
- dynarec_enable = 1;
- rom_translation_ptr = rom_translation_cache;
- ram_translation_ptr = ram_translation_cache;
-#endif
- }
- else
- dynarec_enable = 0;
-#else
- dynarec_enable = 0;
-#endif
-
char filename_bios[MAX_PATH];
const char* dir = NULL;