JitCache: Add WipeBlockProfilingData Function
Accessible from DolphinQt and Android.
This commit is contained in:
parent
9b8df48d84
commit
ff9be97ea1
|
@ -391,6 +391,11 @@ public final class NativeLibrary
|
||||||
*/
|
*/
|
||||||
public static native boolean IsUninitialized();
|
public static native boolean IsUninitialized();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-initialize software JitBlock profiling data
|
||||||
|
*/
|
||||||
|
public static native void WipeJitBlockProfilingData();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes out the JitBlock Cache log dump
|
* Writes out the JitBlock Cache log dump
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -2013,6 +2013,16 @@ class SettingsFragmentPresenter(
|
||||||
0
|
0
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
sl.add(
|
||||||
|
RunRunnable(
|
||||||
|
context,
|
||||||
|
R.string.debug_jit_wipe_block_profiling_data,
|
||||||
|
0,
|
||||||
|
R.string.debug_jit_wipe_block_profiling_data_alert,
|
||||||
|
0,
|
||||||
|
true
|
||||||
|
) { NativeLibrary.WipeJitBlockProfilingData() }
|
||||||
|
)
|
||||||
sl.add(
|
sl.add(
|
||||||
RunRunnable(
|
RunRunnable(
|
||||||
context,
|
context,
|
||||||
|
|
|
@ -412,6 +412,8 @@
|
||||||
<string name="debug_large_entry_points_map">Disable Large Entry Points Map</string>
|
<string name="debug_large_entry_points_map">Disable Large Entry Points Map</string>
|
||||||
<string name="debug_jit_profiling_header">Jit Profiling</string>
|
<string name="debug_jit_profiling_header">Jit Profiling</string>
|
||||||
<string name="debug_jit_enable_block_profiling">Enable Jit Block Profiling</string>
|
<string name="debug_jit_enable_block_profiling">Enable Jit Block Profiling</string>
|
||||||
|
<string name="debug_jit_wipe_block_profiling_data">Wipe Jit Block Profiling Data</string>
|
||||||
|
<string name="debug_jit_wipe_block_profiling_data_alert">Re-initialize JIT block profiling data?</string>
|
||||||
<string name="debug_jit_write_block_log_dump">Write Jit Block Log Dump</string>
|
<string name="debug_jit_write_block_log_dump">Write Jit Block Log Dump</string>
|
||||||
<string name="debug_jit_header">Jit</string>
|
<string name="debug_jit_header">Jit</string>
|
||||||
<string name="debug_jitoff">Jit Disabled</string>
|
<string name="debug_jitoff">Jit Disabled</string>
|
||||||
|
|
|
@ -410,6 +410,22 @@ JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetMaxLogLev
|
||||||
return static_cast<jint>(Common::Log::MAX_LOGLEVEL);
|
return static_cast<jint>(Common::Log::MAX_LOGLEVEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WipeJitBlockProfilingData(
|
||||||
|
JNIEnv* env, jclass native_library_class)
|
||||||
|
{
|
||||||
|
HostThreadLock guard;
|
||||||
|
auto& system = Core::System::GetInstance();
|
||||||
|
auto& jit_interface = system.GetJitInterface();
|
||||||
|
const Core::CPUThreadGuard cpu_guard(system);
|
||||||
|
if (jit_interface.GetCore() == nullptr)
|
||||||
|
{
|
||||||
|
env->CallStaticVoidMethod(native_library_class, IDCache::GetDisplayToastMsg(),
|
||||||
|
ToJString(env, Common::GetStringT("JIT is not active")), JNI_FALSE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
jit_interface.WipeBlockProfilingData(cpu_guard);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteJitBlockLogDump(
|
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteJitBlockLogDump(
|
||||||
JNIEnv* env, jclass native_library_class)
|
JNIEnv* env, jclass native_library_class)
|
||||||
{
|
{
|
||||||
|
|
|
@ -117,6 +117,15 @@ void JitBaseBlockCache::RunOnBlocks(const Core::CPUThreadGuard&,
|
||||||
f(e.second);
|
f(e.second);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitBaseBlockCache::WipeBlockProfilingData(const Core::CPUThreadGuard&)
|
||||||
|
{
|
||||||
|
for (const auto& kv : block_map)
|
||||||
|
{
|
||||||
|
if (JitBlock::ProfileData* const profile_data = kv.second.profile_data.get())
|
||||||
|
*profile_data = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
JitBlock* JitBaseBlockCache::AllocateBlock(u32 em_address)
|
JitBlock* JitBaseBlockCache::AllocateBlock(u32 em_address)
|
||||||
{
|
{
|
||||||
const u32 physical_address = m_jit.m_mmu.JitCache_TranslateAddress(em_address).address;
|
const u32 physical_address = m_jit.m_mmu.JitCache_TranslateAddress(em_address).address;
|
||||||
|
|
|
@ -161,6 +161,7 @@ public:
|
||||||
u8** GetEntryPoints();
|
u8** GetEntryPoints();
|
||||||
JitBlock** GetFastBlockMapFallback();
|
JitBlock** GetFastBlockMapFallback();
|
||||||
void RunOnBlocks(const Core::CPUThreadGuard& guard, std::function<void(const JitBlock&)> f) const;
|
void RunOnBlocks(const Core::CPUThreadGuard& guard, std::function<void(const JitBlock&)> f) const;
|
||||||
|
void WipeBlockProfilingData(const Core::CPUThreadGuard& guard);
|
||||||
|
|
||||||
JitBlock* AllocateBlock(u32 em_address);
|
JitBlock* AllocateBlock(u32 em_address);
|
||||||
void FinalizeBlock(JitBlock& block, bool block_link, const std::set<u32>& physical_addresses);
|
void FinalizeBlock(JitBlock& block, bool block_link, const std::set<u32>& physical_addresses);
|
||||||
|
|
|
@ -182,6 +182,12 @@ void JitInterface::JitBlockLogDump(const Core::CPUThreadGuard& guard, std::FILE*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void JitInterface::WipeBlockProfilingData(const Core::CPUThreadGuard& guard)
|
||||||
|
{
|
||||||
|
if (m_jit)
|
||||||
|
m_jit->GetBlockCache()->WipeBlockProfilingData(guard);
|
||||||
|
}
|
||||||
|
|
||||||
std::variant<JitInterface::GetHostCodeError, JitInterface::GetHostCodeResult>
|
std::variant<JitInterface::GetHostCodeError, JitInterface::GetHostCodeResult>
|
||||||
JitInterface::GetHostCode(u32 address) const
|
JitInterface::GetHostCode(u32 address) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,6 +57,7 @@ public:
|
||||||
|
|
||||||
void UpdateMembase();
|
void UpdateMembase();
|
||||||
void JitBlockLogDump(const Core::CPUThreadGuard& guard, std::FILE* file) const;
|
void JitBlockLogDump(const Core::CPUThreadGuard& guard, std::FILE* file) const;
|
||||||
|
void WipeBlockProfilingData(const Core::CPUThreadGuard& guard);
|
||||||
std::variant<GetHostCodeError, GetHostCodeResult> GetHostCode(u32 address) const;
|
std::variant<GetHostCodeError, GetHostCodeResult> GetHostCode(u32 address) const;
|
||||||
|
|
||||||
// Memory Utilities
|
// Memory Utilities
|
||||||
|
|
|
@ -155,7 +155,8 @@ void MenuBar::OnEmulationStateChanged(Core::State state)
|
||||||
m_jit_clear_cache->setEnabled(running);
|
m_jit_clear_cache->setEnabled(running);
|
||||||
m_jit_log_coverage->setEnabled(!running);
|
m_jit_log_coverage->setEnabled(!running);
|
||||||
m_jit_search_instruction->setEnabled(running);
|
m_jit_search_instruction->setEnabled(running);
|
||||||
m_jit_write_cache_log_dump->setEnabled(running && jit_exists);
|
m_jit_wipe_profiling_data->setEnabled(jit_exists);
|
||||||
|
m_jit_write_cache_log_dump->setEnabled(jit_exists);
|
||||||
|
|
||||||
// Symbols
|
// Symbols
|
||||||
m_symbols->setEnabled(running);
|
m_symbols->setEnabled(running);
|
||||||
|
@ -196,6 +197,12 @@ void MenuBar::OnDebugModeToggled(bool enabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MenuBar::OnWipeJitBlockProfilingData()
|
||||||
|
{
|
||||||
|
auto& system = Core::System::GetInstance();
|
||||||
|
system.GetJitInterface().WipeBlockProfilingData(Core::CPUThreadGuard{system});
|
||||||
|
}
|
||||||
|
|
||||||
void MenuBar::OnWriteJitBlockLogDump()
|
void MenuBar::OnWriteJitBlockLogDump()
|
||||||
{
|
{
|
||||||
const std::string filename = fmt::format("{}{}.txt", File::GetUserPath(D_DUMPDEBUG_JITBLOCKS_IDX),
|
const std::string filename = fmt::format("{}{}.txt", File::GetUserPath(D_DUMPDEBUG_JITBLOCKS_IDX),
|
||||||
|
@ -922,6 +929,8 @@ void MenuBar::AddJITMenu()
|
||||||
connect(m_jit_profile_blocks, &QAction::toggled, [](bool enabled) {
|
connect(m_jit_profile_blocks, &QAction::toggled, [](bool enabled) {
|
||||||
Config::SetBaseOrCurrent(Config::MAIN_DEBUG_JIT_ENABLE_PROFILING, enabled);
|
Config::SetBaseOrCurrent(Config::MAIN_DEBUG_JIT_ENABLE_PROFILING, enabled);
|
||||||
});
|
});
|
||||||
|
m_jit_wipe_profiling_data = m_jit->addAction(tr("Wipe JIT Block Profiling Data"), this,
|
||||||
|
&MenuBar::OnWipeJitBlockProfilingData);
|
||||||
m_jit_write_cache_log_dump =
|
m_jit_write_cache_log_dump =
|
||||||
m_jit->addAction(tr("Write JIT Block Log Dump"), this, &MenuBar::OnWriteJitBlockLogDump);
|
m_jit->addAction(tr("Write JIT Block Log Dump"), this, &MenuBar::OnWriteJitBlockLogDump);
|
||||||
|
|
||||||
|
|
|
@ -185,6 +185,7 @@ private:
|
||||||
void OnRecordingStatusChanged(bool recording);
|
void OnRecordingStatusChanged(bool recording);
|
||||||
void OnReadOnlyModeChanged(bool read_only);
|
void OnReadOnlyModeChanged(bool read_only);
|
||||||
void OnDebugModeToggled(bool enabled);
|
void OnDebugModeToggled(bool enabled);
|
||||||
|
void OnWipeJitBlockProfilingData();
|
||||||
void OnWriteJitBlockLogDump();
|
void OnWriteJitBlockLogDump();
|
||||||
|
|
||||||
QString GetSignatureSelector() const;
|
QString GetSignatureSelector() const;
|
||||||
|
@ -270,6 +271,7 @@ private:
|
||||||
QAction* m_jit_log_coverage;
|
QAction* m_jit_log_coverage;
|
||||||
QAction* m_jit_search_instruction;
|
QAction* m_jit_search_instruction;
|
||||||
QAction* m_jit_profile_blocks;
|
QAction* m_jit_profile_blocks;
|
||||||
|
QAction* m_jit_wipe_profiling_data;
|
||||||
QAction* m_jit_write_cache_log_dump;
|
QAction* m_jit_write_cache_log_dump;
|
||||||
QAction* m_jit_off;
|
QAction* m_jit_off;
|
||||||
QAction* m_jit_loadstore_off;
|
QAction* m_jit_loadstore_off;
|
||||||
|
|
Loading…
Reference in New Issue