mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	android: jni: native: Tighten up emulation start/stop signaling.
This commit is contained in:
		@@ -61,7 +61,7 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bool IsRunning() const {
 | 
			
		||||
        return system.IsPoweredOn();
 | 
			
		||||
        return is_running.load(std::memory_order_relaxed);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const Core::PerfStatsResults& PerfStats() const {
 | 
			
		||||
@@ -95,7 +95,8 @@ public:
 | 
			
		||||
        system.GetFileSystemController().CreateFactories(*system.GetFilesystem());
 | 
			
		||||
 | 
			
		||||
        // Load the ROM.
 | 
			
		||||
        const Core::SystemResultStatus load_result{system.Load(EmulationSession::GetInstance().Window(), filepath)};
 | 
			
		||||
        const Core::SystemResultStatus load_result{
 | 
			
		||||
            system.Load(EmulationSession::GetInstance().Window(), filepath)};
 | 
			
		||||
        if (load_result != Core::SystemResultStatus::Success) {
 | 
			
		||||
            return load_result;
 | 
			
		||||
        }
 | 
			
		||||
@@ -124,19 +125,23 @@ public:
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void HaltEmulation() {
 | 
			
		||||
        is_running.store(false, std::memory_order_relaxed);
 | 
			
		||||
        cv.notify_one();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    void RunEmulation() {
 | 
			
		||||
        std::unique_lock lock(mutex);
 | 
			
		||||
 | 
			
		||||
        is_running.store(true, std::memory_order_relaxed);
 | 
			
		||||
 | 
			
		||||
        void(system.Run());
 | 
			
		||||
 | 
			
		||||
        if (system.DebuggerEnabled()) {
 | 
			
		||||
            system.InitializeDebugger();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        while (cv.wait_for(lock, std::chrono::seconds (1)) == std::cv_status::timeout) {
 | 
			
		||||
        while (!cv.wait_for(lock, std::chrono::seconds(1),
 | 
			
		||||
                            [&]() { return !is_running.load(std::memory_order_relaxed); })) {
 | 
			
		||||
            std::scoped_lock perf_stats_lock(perf_stats_mutex);
 | 
			
		||||
            perf_stats = system.GetAndResetPerfStats();
 | 
			
		||||
        }
 | 
			
		||||
@@ -157,6 +162,7 @@ private:
 | 
			
		||||
    std::unique_ptr<EmuWindow_Android> window;
 | 
			
		||||
    std::mutex mutex;
 | 
			
		||||
    std::condition_variable_any cv;
 | 
			
		||||
    std::atomic_bool is_running{};
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*static*/ EmulationSession EmulationSession::s_instance;
 | 
			
		||||
@@ -211,14 +217,14 @@ static Core::SystemResultStatus RunEmulation(const std::string& filepath) {
 | 
			
		||||
extern "C" {
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_SurfaceChanged(JNIEnv* env,
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                            jobject surf) {
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                          jobject surf) {
 | 
			
		||||
    EmulationSession::GetInstance().SetNativeWindow(ANativeWindow_fromSurface(env, surf));
 | 
			
		||||
    EmulationSession::GetInstance().SurfaceChanged();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_SurfaceDestroyed(JNIEnv* env,
 | 
			
		||||
                                                              [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    ANativeWindow_release(EmulationSession::GetInstance().NativeWindow());
 | 
			
		||||
    EmulationSession::GetInstance().SetNativeWindow(nullptr);
 | 
			
		||||
    EmulationSession::GetInstance().SurfaceChanged();
 | 
			
		||||
@@ -227,34 +233,34 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_SurfaceDestroyed(JNIEnv* env,
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_DoFrame(JNIEnv* env, [[maybe_unused]] jclass clazz) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_NotifyOrientationChange(JNIEnv* env,
 | 
			
		||||
                                                                     [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                     jint layout_option,
 | 
			
		||||
                                                                     jint rotation) {}
 | 
			
		||||
                                                                   [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                   jint layout_option,
 | 
			
		||||
                                                                   jint rotation) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetUserDirectory(
 | 
			
		||||
    [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz,
 | 
			
		||||
    [[maybe_unused]] jstring j_directory) {}
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetUserDirectory([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                            [[maybe_unused]] jstring j_directory) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_UnPauseEmulation([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                              [[maybe_unused]] jclass clazz) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_PauseEmulation([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_PauseEmulation([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_StopEmulation([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                           [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                         [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    EmulationSession::GetInstance().HaltEmulation();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_IsRunning([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                           [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                         [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    return static_cast<jboolean>(EmulationSession::GetInstance().IsRunning());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_onGamePadEvent([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                                [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                [[maybe_unused]] jstring j_device,
 | 
			
		||||
                                                                jint j_button, jint action) {
 | 
			
		||||
                                                              [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                              [[maybe_unused]] jstring j_device,
 | 
			
		||||
                                                              jint j_button, jint action) {
 | 
			
		||||
    if (EmulationSession::GetInstance().IsRunning()) {
 | 
			
		||||
        EmulationSession::GetInstance().Window().OnGamepadEvent(j_button, action != 0);
 | 
			
		||||
    }
 | 
			
		||||
@@ -262,9 +268,9 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_onGamePadEvent([[maybe_unused]] J
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_onGamePadMoveEvent([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                                    [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                    jstring j_device, jint axis,
 | 
			
		||||
                                                                    jfloat x, jfloat y) {
 | 
			
		||||
                                                                  [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                  jstring j_device, jint axis,
 | 
			
		||||
                                                                  jfloat x, jfloat y) {
 | 
			
		||||
    // Clamp joystick movement to supported minimum and maximum.
 | 
			
		||||
    x = std::clamp(x, -1.f, 1.f);
 | 
			
		||||
    y = std::clamp(-y, -1.f, 1.f);
 | 
			
		||||
@@ -284,68 +290,68 @@ jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_onGamePadMoveEvent([[maybe_unused
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_onGamePadAxisEvent([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                                    [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                    jstring j_device, jint axis_id,
 | 
			
		||||
                                                                    jfloat axis_val) {
 | 
			
		||||
                                                                  [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                  jstring j_device, jint axis_id,
 | 
			
		||||
                                                                  jfloat axis_val) {
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jboolean Java_org_yuzu_yuzu_1emu_NativeLibrary_onTouchEvent([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                              [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                              jfloat x, jfloat y,
 | 
			
		||||
                                                              jboolean pressed) {
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz, jfloat x,
 | 
			
		||||
                                                            jfloat y, jboolean pressed) {
 | 
			
		||||
    if (EmulationSession::GetInstance().IsRunning()) {
 | 
			
		||||
        return static_cast<jboolean>(EmulationSession::GetInstance().Window().OnTouchEvent(x, y, pressed));
 | 
			
		||||
        return static_cast<jboolean>(
 | 
			
		||||
            EmulationSession::GetInstance().Window().OnTouchEvent(x, y, pressed));
 | 
			
		||||
    }
 | 
			
		||||
    return static_cast<jboolean>(false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_onTouchMoved([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz, jfloat x,
 | 
			
		||||
                                                          jfloat y) {
 | 
			
		||||
                                                        [[maybe_unused]] jclass clazz, jfloat x,
 | 
			
		||||
                                                        jfloat y) {
 | 
			
		||||
    if (EmulationSession::GetInstance().IsRunning()) {
 | 
			
		||||
        EmulationSession::GetInstance().Window().OnTouchMoved(x, y);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jintArray Java_org_yuzu_yuzu_1emu_NativeLibrary_GetIcon([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                          [[maybe_unused]] jstring j_file) {
 | 
			
		||||
                                                        [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                        [[maybe_unused]] jstring j_file) {
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetTitle([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                       [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                       [[maybe_unused]] jstring j_filename) {
 | 
			
		||||
    return env->NewStringUTF("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetDescription([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                             [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                             jstring j_filename) {
 | 
			
		||||
    return j_filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetGameId([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                        [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                        jstring j_filename) {
 | 
			
		||||
    return j_filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetRegions([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                         [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                         [[maybe_unused]] jstring j_filename) {
 | 
			
		||||
    return env->NewStringUTF("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetDescription([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                               [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                               jstring j_filename) {
 | 
			
		||||
    return j_filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetGameId([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                          jstring j_filename) {
 | 
			
		||||
    return j_filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetRegions([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                           [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                           [[maybe_unused]] jstring j_filename) {
 | 
			
		||||
    return env->NewStringUTF("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetCompany([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                           [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                           [[maybe_unused]] jstring j_filename) {
 | 
			
		||||
                                                         [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                         [[maybe_unused]] jstring j_filename) {
 | 
			
		||||
    return env->NewStringUTF("");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetGitRevision([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                               [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                             [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -355,7 +361,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_CreateConfigFile
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jint Java_org_yuzu_yuzu_1emu_NativeLibrary_DefaultCPUCore([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    return {};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -364,14 +370,14 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_St
 | 
			
		||||
    [[maybe_unused]] jstring j_savestate, [[maybe_unused]] jboolean j_delete_savestate) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_ReloadSettings([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    Config{};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetUserSetting([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                               [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                               jstring j_game_id, jstring j_section,
 | 
			
		||||
                                                               jstring j_key) {
 | 
			
		||||
                                                             [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                             jstring j_game_id, jstring j_section,
 | 
			
		||||
                                                             jstring j_key) {
 | 
			
		||||
    std::string_view game_id = env->GetStringUTFChars(j_game_id, 0);
 | 
			
		||||
    std::string_view section = env->GetStringUTFChars(j_section, 0);
 | 
			
		||||
    std::string_view key = env->GetStringUTFChars(j_key, 0);
 | 
			
		||||
@@ -384,9 +390,9 @@ jstring Java_org_yuzu_yuzu_1emu_NativeLibrary_GetUserSetting([[maybe_unused]] JN
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetUserSetting([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                            [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                            jstring j_game_id, jstring j_section,
 | 
			
		||||
                                                            jstring j_key, jstring j_value) {
 | 
			
		||||
                                                          [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                          jstring j_game_id, jstring j_section,
 | 
			
		||||
                                                          jstring j_key, jstring j_value) {
 | 
			
		||||
    std::string_view game_id = env->GetStringUTFChars(j_game_id, 0);
 | 
			
		||||
    std::string_view section = env->GetStringUTFChars(j_section, 0);
 | 
			
		||||
    std::string_view key = env->GetStringUTFChars(j_key, 0);
 | 
			
		||||
@@ -399,15 +405,15 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_SetUserSetting([[maybe_unused]] JNIEn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_InitGameIni([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                         [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                         jstring j_game_id) {
 | 
			
		||||
                                                       [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                       jstring j_game_id) {
 | 
			
		||||
    std::string_view game_id = env->GetStringUTFChars(j_game_id, 0);
 | 
			
		||||
 | 
			
		||||
    env->ReleaseStringUTFChars(j_game_id, game_id.data());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
jdoubleArray Java_org_yuzu_yuzu_1emu_NativeLibrary_GetPerfStats([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                                  [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                                [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    jdoubleArray j_stats = env->NewDoubleArray(4);
 | 
			
		||||
 | 
			
		||||
    if (EmulationSession::GetInstance().IsRunning()) {
 | 
			
		||||
@@ -427,8 +433,8 @@ void Java_org_yuzu_yuzu_1emu_utils_DirectoryInitialization_SetSysDirectory(
 | 
			
		||||
    [[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jstring j_path) {}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_Run__Ljava_lang_String_2([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                                      [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                      jstring j_path) {
 | 
			
		||||
                                                                    [[maybe_unused]] jclass clazz,
 | 
			
		||||
                                                                    jstring j_path) {
 | 
			
		||||
    const std::string path = GetJString(env, j_path);
 | 
			
		||||
 | 
			
		||||
    const Core::SystemResultStatus result{RunEmulation(path)};
 | 
			
		||||
@@ -439,7 +445,7 @@ void Java_org_yuzu_yuzu_1emu_NativeLibrary_Run__Ljava_lang_String_2([[maybe_unus
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Java_org_yuzu_yuzu_1emu_NativeLibrary_LogDeviceInfo([[maybe_unused]] JNIEnv* env,
 | 
			
		||||
                                                           [[maybe_unused]] jclass clazz) {
 | 
			
		||||
                                                         [[maybe_unused]] jclass clazz) {
 | 
			
		||||
    LOG_INFO(Frontend, "yuzu Version: {}-{}", Common::g_scm_branch, Common::g_scm_desc);
 | 
			
		||||
    LOG_INFO(Frontend, "Host OS: Android API level {}", android_get_device_api_level());
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user