From be27c4f8770e8acc600ac6d2bdf1605ff720f9b2 Mon Sep 17 00:00:00 2001 From: mitaclaw <140017135+mitaclaw@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:09:01 -0700 Subject: NativeLibrary: Create displayToastMsg Method --- .../main/java/org/dolphinemu/dolphinemu/NativeLibrary.java | 12 +++++++++--- Source/Android/jni/AndroidCommon/IDCache.cpp | 8 ++++++++ Source/Android/jni/AndroidCommon/IDCache.h | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) (limited to 'Source/Android') diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index b83a489256..a3d02e31ee 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -454,6 +454,14 @@ public final class NativeLibrary private static native String GetCurrentTitleDescriptionUnchecked(); + @Keep + public static void displayToastMsg(final String text, final boolean long_length) + { + final int length = long_length ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT; + new Handler(Looper.getMainLooper()) + .post(() -> Toast.makeText(DolphinApplication.getAppContext(), text, length).show()); + } + @Keep public static boolean displayAlertMsg(final String caption, final String text, final boolean yesNo, final boolean isWarning, final boolean nonBlocking) @@ -466,9 +474,7 @@ public final class NativeLibrary // and are allowed to block. As a fallback, we can use toasts. if (emulationActivity == null || nonBlocking) { - new Handler(Looper.getMainLooper()).post( - () -> Toast.makeText(DolphinApplication.getAppContext(), text, Toast.LENGTH_LONG) - .show()); + displayToastMsg(text, true); } else { diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp index a19423d67c..5fe151278f 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.cpp +++ b/Source/Android/jni/AndroidCommon/IDCache.cpp @@ -12,6 +12,7 @@ static JavaVM* s_java_vm; static jclass s_string_class; static jclass s_native_library_class; +static jmethodID s_display_toast_msg; static jmethodID s_display_alert_msg; static jmethodID s_update_touch_pointer; static jmethodID s_on_title_changed; @@ -146,6 +147,11 @@ jclass GetNativeLibraryClass() return s_native_library_class; } +jmethodID GetDisplayToastMsg() +{ + return s_display_toast_msg; +} + jmethodID GetDisplayAlertMsg() { return s_display_alert_msg; @@ -528,6 +534,8 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) const jclass native_library_class = env->FindClass("org/dolphinemu/dolphinemu/NativeLibrary"); s_native_library_class = reinterpret_cast(env->NewGlobalRef(native_library_class)); + s_display_toast_msg = + env->GetStaticMethodID(s_native_library_class, "displayToastMsg", "(Ljava/lang/String;Z)V"); s_display_alert_msg = env->GetStaticMethodID(s_native_library_class, "displayAlertMsg", "(Ljava/lang/String;Ljava/lang/String;ZZZ)Z"); s_update_touch_pointer = diff --git a/Source/Android/jni/AndroidCommon/IDCache.h b/Source/Android/jni/AndroidCommon/IDCache.h index 604b68e38e..c324b6cb19 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.h +++ b/Source/Android/jni/AndroidCommon/IDCache.h @@ -12,6 +12,7 @@ JNIEnv* GetEnvForThread(); jclass GetStringClass(); jclass GetNativeLibraryClass(); +jmethodID GetDisplayToastMsg(); jmethodID GetDisplayAlertMsg(); jmethodID GetUpdateTouchPointer(); jmethodID GetOnTitleChanged(); -- cgit v1.2.3 From ee8bcf2cccfcc822aea9288df3da8a345ae67467 Mon Sep 17 00:00:00 2001 From: mitaclaw <140017135+mitaclaw@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:21:10 -0700 Subject: JitCache: Software Profiling Restoration Rekindle software JIT profiling with a std::chrono conversion and a config connection. --- .../org/dolphinemu/dolphinemu/NativeLibrary.java | 11 +----- Source/Android/jni/MainAndroid.cpp | 43 +++++++++++++--------- 2 files changed, 28 insertions(+), 26 deletions(-) (limited to 'Source/Android') diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index a3d02e31ee..8abec6927b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -385,16 +385,9 @@ public final class NativeLibrary public static native boolean IsRunningAndUnpaused(); /** - * Enables or disables CPU block profiling - * - * @param enable - */ - public static native void SetProfiling(boolean enable); - - /** - * Writes out the block profile results + * Writes out the JitBlock Cache log dump */ - public static native void WriteProfileResults(); + public static native void WriteJitBlockLogDump(); /** * Native EGL functions not exposed by Java bindings diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index e07b1bd275..389bb815fc 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -22,6 +23,7 @@ #include "Common/Event.h" #include "Common/FileUtil.h" #include "Common/Flag.h" +#include "Common/IOFile.h" #include "Common/IniFile.h" #include "Common/Logging/LogManager.h" #include "Common/MsgHandler.h" @@ -42,7 +44,6 @@ #include "Core/Host.h" #include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/PowerPC.h" -#include "Core/PowerPC/Profiler.h" #include "Core/State.h" #include "Core/System.h" @@ -404,26 +405,34 @@ JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetMaxLogLev return static_cast(Common::Log::MAX_LOGLEVEL); } -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv*, jclass, - jboolean enable) +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteJitBlockLogDump( + JNIEnv* env, jclass native_library_class) { HostThreadLock guard; auto& system = Core::System::GetInstance(); auto& jit_interface = system.GetJitInterface(); - const Core::CPUThreadGuard cpu_guard(system); - jit_interface.ClearCache(cpu_guard); - jit_interface.SetProfilingState(enable ? JitInterface::ProfilingState::Enabled : - JitInterface::ProfilingState::Disabled); -} - -JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfileResults(JNIEnv*, - jclass) -{ - HostThreadLock guard; - std::string filename = File::GetUserPath(D_DUMP_IDX) + "Debug/profiler.txt"; - File::CreateFullPath(filename); - auto& jit_interface = Core::System::GetInstance().GetJitInterface(); - jit_interface.WriteProfileResults(filename); + if (jit_interface.GetCore() == nullptr) + { + env->CallStaticVoidMethod(native_library_class, IDCache::GetDisplayToastMsg(), + ToJString(env, Common::GetStringT("JIT is not active")), + static_cast(false)); + return; + } + const std::string filename = fmt::format("{}{}.txt", File::GetUserPath(D_DUMPDEBUG_JITBLOCKS_IDX), + SConfig::GetInstance().GetGameID()); + File::IOFile f(filename, "w"); + if (!f) + { + env->CallStaticVoidMethod( + native_library_class, IDCache::GetDisplayToastMsg(), + ToJString(env, Common::FmtFormatT("Failed to open \"{0}\" for writing.", filename)), + static_cast(false)); + return; + } + jit_interface.JitBlockLogDump(Core::CPUThreadGuard{system}, f.GetHandle()); + env->CallStaticVoidMethod(native_library_class, IDCache::GetDisplayToastMsg(), + ToJString(env, Common::FmtFormatT("Wrote to \"{0}\".", filename)), + static_cast(false)); } // Surface Handling -- cgit v1.2.3 From 94712ea06f694d02e8490efe7664054a037a9c75 Mon Sep 17 00:00:00 2001 From: mitaclaw <140017135+mitaclaw@users.noreply.github.com> Date: Sat, 6 Apr 2024 09:14:15 -0700 Subject: Android: Access Software JIT Profiling --- .../features/settings/model/BooleanSetting.kt | 6 ++++++ .../settings/ui/SettingsFragmentPresenter.kt | 20 ++++++++++++++++++++ Source/Android/app/src/main/res/values/strings.xml | 3 +++ 3 files changed, 29 insertions(+) (limited to 'Source/Android') diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt index 6fddbe6b43..331ad7fa09 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/BooleanSetting.kt @@ -214,6 +214,12 @@ enum class BooleanSetting( "JitRegisterCacheOff", false ), + MAIN_DEBUG_JIT_ENABLE_PROFILING( + Settings.FILE_DOLPHIN, + Settings.SECTION_DEBUG, + "JitEnableProfiling", + false + ), MAIN_EMULATE_SKYLANDER_PORTAL( Settings.FILE_DOLPHIN, Settings.SECTION_EMULATED_USB_DEVICES, diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt index a3ec018b46..6de39ed1e9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.kt @@ -1978,6 +1978,26 @@ class SettingsFragmentPresenter( ) ) + sl.add(HeaderSetting(context, R.string.debug_jit_profiling_header, 0)) + sl.add( + SwitchSetting( + context, + BooleanSetting.MAIN_DEBUG_JIT_ENABLE_PROFILING, + R.string.debug_jit_enable_block_profiling, + 0 + ) + ) + sl.add( + RunRunnable( + context, + R.string.debug_jit_write_block_log_dump, + 0, + 0, + 0, + true + ) { NativeLibrary.WriteJitBlockLogDump() } + ) + sl.add(HeaderSetting(context, R.string.debug_jit_header, 0)) sl.add( SwitchSetting( diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 5dde637d7d..360e5006a0 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -406,6 +406,9 @@ Disable Fastmem Disable Fastmem Arena Disable Large Entry Points Map + Jit Profiling + Enable Jit Block Profiling + Write Jit Block Log Dump Jit Jit Disabled Jit Load Store Disabled -- cgit v1.2.3