diff --git a/android/native/jni/android_general.h b/android/native/jni/android_general.h index 4cd71ca85f..41dbfed51e 100644 --- a/android/native/jni/android_general.h +++ b/android/native/jni/android_general.h @@ -24,6 +24,7 @@ struct saved_state { int32_t x; int32_t y; + uint64_t input_state; }; struct droid diff --git a/android/native/jni/main.c b/android/native/jni/main.c index 89e240417b..1501c152dd 100644 --- a/android/native/jni/main.c +++ b/android/native/jni/main.c @@ -296,6 +296,8 @@ static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* wind static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window) { RARCH_LOG("NativeWindowDestroyed: %p -- %p\n", activity, window); + + android_app_set_window((struct android_app*)activity->instance, NULL); } @@ -386,6 +388,13 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd) /* The window is being shown, get it ready. */ android_app->window = android_app->pendingWindow; + if (g_android.input_state & (1ULL << RARCH_REENTRANT)) + { + gfx_ctx_init(); + g_extern.audio_active = true; + g_extern.video_active = true; + } + pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); @@ -422,6 +431,17 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd) android_app->activityState = cmd; pthread_cond_broadcast(&android_app->cond); pthread_mutex_unlock(&android_app->mutex); + + /* EXEC */ + if(g_android.input_state & (1ULL << RARCH_QUIT_KEY)) { } + else + { + /* Setting reentrancy */ + RARCH_LOG("Setting up RetroArch re-entrancy...\n"); + g_android.input_state |= (1ULL << RARCH_REENTRANT); + g_extern.audio_active = false; + g_extern.video_active = false; + } break; case APP_CMD_STOP: RARCH_LOG("engine_handle_cmd: APP_CMD_STOP.\n"); @@ -449,6 +469,8 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd) /* EXEC */ /* The window is being hidden or closed, clean it up. */ /* terminate display/EGL context here */ + if(g_android.input_state & (1ULL << RARCH_REENTRANT)) + gfx_ctx_destroy(); /* POSTEXEC */ android_app->window = NULL; @@ -459,7 +481,6 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd) RARCH_LOG("engine_handle_cmd: APP_CMD_GAINED_FOCUS.\n"); /* EXEC */ - // When our app gains focus, we start monitoring the accelerometer. break; case APP_CMD_LOST_FOCUS: RARCH_LOG("engine_handle_cmd: APP_CMD_LOST_FOCUS.\n"); @@ -510,10 +531,7 @@ static void android_get_char_argv(char *argv, size_t sizeof_argv, const char *ar */ void android_main(struct android_app* state) { - rarch_main_clear_state(); - - RARCH_LOG("Native Activity started.\n"); - + memset(&g_android, 0, sizeof(g_android)); g_android.app = state; struct android_app* android_app = g_android.app; @@ -541,14 +559,30 @@ void android_main(struct android_app* state) argv[argc++] = strdup(libretro_path); argv[argc++] = strdup("-v"); - g_extern.verbose = true; if (state->savedState != NULL) { // We are starting with a previous saved state; restore from it. + RARCH_LOG("Restoring reentrant savestate.\n"); g_android.state = *(struct saved_state*)state->savedState; + g_android.input_state = g_android.state.input_state; } + bool rarch_reentrant = (g_android.input_state & (1ULL << RARCH_REENTRANT)); + + if(rarch_reentrant) + { + RARCH_LOG("Native Activity started (reentrant).\n"); + } + else + { + RARCH_LOG("Native Activity started.\n"); + rarch_main_clear_state(); + } + + + g_extern.verbose = true; + while(!(g_android.input_state & (1ULL << RARCH_WINDOW_READY))) { // Read all pending events. @@ -579,23 +613,32 @@ void android_main(struct android_app* state) } } - int init_ret; - RARCH_LOG("Initializing RetroArch...\n"); - if ((init_ret = rarch_main_init(argc, argv)) == 0) + if (rarch_reentrant) { - RARCH_LOG("Starting RetroArch...\n"); - rarch_init_msg_queue(); - while (rarch_main_iterate()); + init_ret = 0; + + /* We've done everything state-wise needed for RARCH_REENTRANT, + * get rid of it now */ + g_android.input_state |= ~(1ULL << RARCH_REENTRANT); } - else + else if ((init_ret = rarch_main_init(argc, argv)) != 0) { RARCH_LOG("Initialization failed.\n"); g_android.input_state |= (1ULL << RARCH_QUIT_KEY); g_android.input_state |= (1ULL << RARCH_KILL); } + if (init_ret == 0) + { + RARCH_LOG("Initializing succeeded.\n"); + RARCH_LOG("RetroArch started.\n"); + rarch_init_msg_queue(); + while (rarch_main_iterate()); + RARCH_LOG("RetroArch stopped.\n"); + } + if(g_android.input_state & (1ULL << RARCH_QUIT_KEY)) { RARCH_LOG("Deinitializing RetroArch...\n"); diff --git a/driver.h b/driver.h index 9c2ee0bba7..69ffcbeb8e 100644 --- a/driver.h +++ b/driver.h @@ -97,6 +97,9 @@ enum // RetroArch specific bind IDs. RARCH_KILL, RARCH_WINDOW_READY, #endif +#if defined(ANDROID) || defined(RARCH_CONSOLE) + RARCH_REENTRANT, +#endif RARCH_BIND_LIST_END, RARCH_BIND_LIST_END_NULL diff --git a/retroarch.c b/retroarch.c index 6a4fc3bad1..b5ef20cf19 100644 --- a/retroarch.c +++ b/retroarch.c @@ -254,10 +254,8 @@ static void recording_dump_frame(const void *data, unsigned width, unsigned heig static void video_frame(const void *data, unsigned width, unsigned height, size_t pitch) { -#if !defined(RARCH_PERFORMANCE_MODE) if (!g_extern.video_active) return; -#endif if (g_extern.system.pix_fmt == RETRO_PIXEL_FORMAT_0RGB1555 && data) { @@ -2555,10 +2553,6 @@ void rarch_main_clear_state(void) free(g_extern.system.environment_split); memset(&g_extern, 0, sizeof(g_extern)); -#ifdef ANDROID - memset(&g_android, 0, sizeof(g_android)); -#endif - init_state(); }