Merge pull request #5273 from JosJuice/android-x86-64
x86-64 support on Android
This commit is contained in:
commit
fd0b99be2e
|
@ -65,7 +65,7 @@ android {
|
|||
externalNativeBuild {
|
||||
cmake {
|
||||
arguments "-DANDROID_STL=c++_static", "-DCMAKE_BUILD_TYPE=RelWithDebInfo" // , "-DENABLE_GENERIC=ON"
|
||||
abiFilters "arm64-v8a" //, "armeabi-v7a", "x86_64", "x86"
|
||||
abiFilters "arm64-v8a", "x86_64" //, "armeabi-v7a", "x86"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -323,6 +323,8 @@ public final class NativeLibrary
|
|||
*/
|
||||
public static native String GetUserDirectory();
|
||||
|
||||
public static native int DefaultCPUCore();
|
||||
|
||||
/**
|
||||
* Begins emulation.
|
||||
*/
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package org.dolphinemu.dolphinemu.ui.settings;
|
||||
|
||||
import org.dolphinemu.dolphinemu.NativeLibrary;
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.model.settings.BooleanSetting;
|
||||
import org.dolphinemu.dolphinemu.model.settings.IntSetting;
|
||||
|
@ -179,8 +180,28 @@ public final class SettingsFragmentPresenter
|
|||
mView.passSettingsToActivity(mSettings);
|
||||
}
|
||||
|
||||
// TODO Set default value for cpuCore based on arch.
|
||||
sl.add(new SingleChoiceSetting(SettingsFile.KEY_CPU_CORE, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_DOLPHIN, R.string.cpu_core, 0, R.array.emuCoresEntries, R.array.emuCoresValues, 4, cpuCore));
|
||||
// TODO: Having different emuCoresEntries/emuCoresValues for each architecture is annoying.
|
||||
// The proper solution would be to have one emuCoresEntries and one emuCoresValues
|
||||
// and exclude the values that aren't present in PowerPC::AvailableCPUCores().
|
||||
int defaultCpuCore = NativeLibrary.DefaultCPUCore();
|
||||
int emuCoresEntries;
|
||||
int emuCoresValues;
|
||||
if (defaultCpuCore == 1) // x86-64
|
||||
{
|
||||
emuCoresEntries = R.array.emuCoresEntriesX86_64;
|
||||
emuCoresValues = R.array.emuCoresValuesX86_64;
|
||||
}
|
||||
else if (defaultCpuCore == 4) // AArch64
|
||||
{
|
||||
emuCoresEntries = R.array.emuCoresEntriesARM64;
|
||||
emuCoresValues = R.array.emuCoresValuesARM64;
|
||||
}
|
||||
else
|
||||
{
|
||||
emuCoresEntries = R.array.emuCoresEntriesGeneric;
|
||||
emuCoresValues = R.array.emuCoresValuesGeneric;
|
||||
}
|
||||
sl.add(new SingleChoiceSetting(SettingsFile.KEY_CPU_CORE, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_DOLPHIN, R.string.cpu_core, 0, emuCoresEntries, emuCoresValues, defaultCpuCore, cpuCore));
|
||||
sl.add(new CheckBoxSetting(SettingsFile.KEY_DUAL_CORE, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_DOLPHIN, R.string.dual_core, R.string.dual_core_descrip, true, dualCore));
|
||||
sl.add(new CheckBoxSetting(SettingsFile.KEY_OVERCLOCK_ENABLE, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_DOLPHIN, R.string.overclock_enable, R.string.overclock_enable_description, false, overclockEnable));
|
||||
sl.add(new SliderSetting(SettingsFile.KEY_OVERCLOCK_PERCENT, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_DOLPHIN, R.string.overclock_title, 0, 400, "%", 100, overclock));
|
||||
|
|
|
@ -4,19 +4,33 @@
|
|||
<resources>
|
||||
|
||||
<!-- New UI CPU Core selection - Default -->
|
||||
<string-array name="emuCoresEntries" translatable="false">
|
||||
<string-array name="emuCoresEntriesX86_64" translatable="false">
|
||||
<item>Interpreter</item>
|
||||
<item>Cached Interpreter</item>
|
||||
<item>JIT Recompiler</item>
|
||||
</string-array>
|
||||
<integer-array name="emuCoresValuesX86_64" translatable="false">
|
||||
<item>0</item>
|
||||
<item>5</item>
|
||||
<item>1</item>
|
||||
</integer-array>
|
||||
<string-array name="emuCoresEntriesARM64" translatable="false">
|
||||
<item>Interpreter</item>
|
||||
<item>Cached Interpreter</item>
|
||||
<item>JIT ARM64 Recompiler</item>
|
||||
<!--<item>JIT64 Recompiler</item>
|
||||
<item>JITIL Recompiler</item>-->
|
||||
</string-array>
|
||||
<integer-array name="emuCoresValues" translatable="false">
|
||||
<integer-array name="emuCoresValuesARM64" translatable="false">
|
||||
<item>0</item>
|
||||
<item>5</item>
|
||||
<item>4</item>
|
||||
<!--<item>1</item>
|
||||
<item>2</item>-->
|
||||
</integer-array>
|
||||
<string-array name="emuCoresEntriesGeneric" translatable="false">
|
||||
<item>Interpreter</item>
|
||||
<item>Cached Interpreter</item>
|
||||
</string-array>
|
||||
<integer-array name="emuCoresValuesGeneric" translatable="false">
|
||||
<item>0</item>
|
||||
<item>5</item>
|
||||
</integer-array>
|
||||
|
||||
<!-- Video backend selection -->
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include "Core/HW/WiimoteReal/WiimoteReal.h"
|
||||
#include "Core/Host.h"
|
||||
#include "Core/PowerPC/JitInterface.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "Core/PowerPC/Profiler.h"
|
||||
#include "Core/State.h"
|
||||
|
||||
|
@ -453,6 +454,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserDirec
|
|||
JNIEnv* env, jobject obj, jstring jDirectory);
|
||||
JNIEXPORT jstring JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDirectory(JNIEnv* env, jobject obj);
|
||||
JNIEXPORT jint JNICALL
|
||||
Java_org_dolphinemu_dolphinemu_NativeLibrary_DefaultCPUCore(JNIEnv* env, jobject obj);
|
||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv* env,
|
||||
jobject obj,
|
||||
jboolean enable);
|
||||
|
@ -689,6 +692,12 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDi
|
|||
return env->NewStringUTF(File::GetUserPath(D_USER_IDX).c_str());
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_DefaultCPUCore(JNIEnv* env,
|
||||
jobject obj)
|
||||
{
|
||||
return PowerPC::DefaultCPUCore();
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv* env,
|
||||
jobject obj,
|
||||
jboolean enable)
|
||||
|
|
|
@ -809,7 +809,7 @@ void SConfig::LoadDefaults()
|
|||
#endif
|
||||
#endif
|
||||
|
||||
iCPUCore = PowerPC::CORE_JIT64;
|
||||
iCPUCore = PowerPC::DefaultCPUCore();
|
||||
iTimingVariance = 40;
|
||||
bCPUThread = false;
|
||||
bSyncGPUOnSkipIdleHack = true;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "Core/PowerPC/PowerPC.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <vector>
|
||||
|
||||
#include "Common/Assert.h"
|
||||
#include "Common/ChunkFile.h"
|
||||
|
@ -180,6 +181,31 @@ static void InitializeCPUCore(int cpu_core)
|
|||
}
|
||||
}
|
||||
|
||||
const std::vector<CPUCore>& AvailableCPUCores()
|
||||
{
|
||||
static const std::vector<CPUCore> cpu_cores = {
|
||||
CORE_INTERPRETER, CORE_CACHEDINTERPRETER,
|
||||
#ifdef _M_X86_64
|
||||
CORE_JIT64, CORE_JITIL64,
|
||||
#elif defined(_M_ARM_64)
|
||||
CORE_JITARM64,
|
||||
#endif
|
||||
};
|
||||
|
||||
return cpu_cores;
|
||||
}
|
||||
|
||||
CPUCore DefaultCPUCore()
|
||||
{
|
||||
#ifdef _M_X86_64
|
||||
return CORE_JIT64;
|
||||
#elif defined(_M_ARM_64)
|
||||
return CORE_JITARM64;
|
||||
#else
|
||||
return CORE_CACHEDINTERPRETER;
|
||||
#endif
|
||||
}
|
||||
|
||||
void Init(int cpu_core)
|
||||
{
|
||||
// NOTE: This function runs on EmuThread, not the CPU Thread.
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
|
||||
#include "Common/CommonTypes.h"
|
||||
|
||||
|
@ -20,7 +21,7 @@ class PointerWrap;
|
|||
|
||||
namespace PowerPC
|
||||
{
|
||||
enum
|
||||
enum CPUCore
|
||||
{
|
||||
CORE_INTERPRETER,
|
||||
CORE_JIT64,
|
||||
|
@ -135,6 +136,9 @@ extern BreakPoints breakpoints;
|
|||
extern MemChecks memchecks;
|
||||
extern PPCDebugInterface debug_interface;
|
||||
|
||||
const std::vector<CPUCore>& AvailableCPUCores();
|
||||
CPUCore DefaultCPUCore();
|
||||
|
||||
void Init(int cpu_core);
|
||||
void Reset();
|
||||
void Shutdown();
|
||||
|
|
|
@ -4,6 +4,10 @@
|
|||
|
||||
#include "DolphinWX/Config/GeneralConfigPane.h"
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <wx/button.h>
|
||||
#include <wx/checkbox.h>
|
||||
#include <wx/choice.h>
|
||||
|
@ -14,25 +18,23 @@
|
|||
#include <wx/sizer.h>
|
||||
#include <wx/stattext.h>
|
||||
|
||||
#include "Common/Common.h"
|
||||
#include "Core/Analytics.h"
|
||||
#include "Core/ConfigManager.h"
|
||||
#include "Core/Core.h"
|
||||
#include "Core/PowerPC/PowerPC.h"
|
||||
#include "DolphinWX/WxEventUtils.h"
|
||||
|
||||
GeneralConfigPane::GeneralConfigPane(wxWindow* parent, wxWindowID id) : wxPanel(parent, id)
|
||||
{
|
||||
m_cpu_cores = {
|
||||
{PowerPC::CORE_INTERPRETER, _("Interpreter (slowest)")},
|
||||
{PowerPC::CORE_CACHEDINTERPRETER, _("Cached Interpreter (slower)")},
|
||||
#ifdef _M_X86_64
|
||||
{PowerPC::CORE_JIT64, _("JIT Recompiler (recommended)")},
|
||||
{PowerPC::CORE_JITIL64, _("JITIL Recompiler (slow, experimental)")},
|
||||
#elif defined(_M_ARM_64)
|
||||
{PowerPC::CORE_JITARM64, _("JIT Arm64 (experimental)")},
|
||||
#endif
|
||||
static const std::map<PowerPC::CPUCore, std::string> CPU_CORE_NAMES = {
|
||||
{PowerPC::CORE_INTERPRETER, _trans("Interpreter (slowest)")},
|
||||
{PowerPC::CORE_CACHEDINTERPRETER, _trans("Cached Interpreter (slower)")},
|
||||
{PowerPC::CORE_JIT64, _trans("JIT Recompiler (recommended)")},
|
||||
{PowerPC::CORE_JITIL64, _trans("JITIL Recompiler (slow, experimental)")},
|
||||
{PowerPC::CORE_JITARM64, _trans("JIT Arm64 (experimental)")},
|
||||
};
|
||||
|
||||
GeneralConfigPane::GeneralConfigPane(wxWindow* parent, wxWindowID id) : wxPanel(parent, id)
|
||||
{
|
||||
InitializeGUI();
|
||||
LoadGUIValues();
|
||||
BindEvents();
|
||||
|
@ -49,8 +51,8 @@ void GeneralConfigPane::InitializeGUI()
|
|||
m_throttler_array_string.Add(wxString::Format(_("%i%%"), i));
|
||||
}
|
||||
|
||||
for (const CPUCore& cpu_core : m_cpu_cores)
|
||||
m_cpu_engine_array_string.Add(cpu_core.name);
|
||||
for (PowerPC::CPUCore cpu_core : PowerPC::AvailableCPUCores())
|
||||
m_cpu_engine_array_string.Add(wxGetTranslation(CPU_CORE_NAMES.at(cpu_core)));
|
||||
|
||||
m_dual_core_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Dual Core (speedup)"));
|
||||
m_cheats_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Cheats"));
|
||||
|
@ -146,9 +148,10 @@ void GeneralConfigPane::LoadGUIValues()
|
|||
if (selection < m_throttler_array_string.size())
|
||||
m_throttler_choice->SetSelection(selection);
|
||||
|
||||
for (size_t i = 0; i < m_cpu_cores.size(); ++i)
|
||||
const std::vector<PowerPC::CPUCore>& cpu_cores = PowerPC::AvailableCPUCores();
|
||||
for (size_t i = 0; i < cpu_cores.size(); ++i)
|
||||
{
|
||||
if (m_cpu_cores[i].CPUid == startup_params.iCPUCore)
|
||||
if (cpu_cores[i] == startup_params.iCPUCore)
|
||||
m_cpu_engine_radiobox->SetSelection(i);
|
||||
}
|
||||
}
|
||||
|
@ -201,7 +204,7 @@ void GeneralConfigPane::OnThrottlerChoiceChanged(wxCommandEvent& event)
|
|||
|
||||
void GeneralConfigPane::OnCPUEngineRadioBoxChanged(wxCommandEvent& event)
|
||||
{
|
||||
SConfig::GetInstance().iCPUCore = m_cpu_cores.at(event.GetSelection()).CPUid;
|
||||
SConfig::GetInstance().iCPUCore = PowerPC::AvailableCPUCores()[event.GetSelection()];
|
||||
}
|
||||
|
||||
void GeneralConfigPane::OnAnalyticsCheckBoxChanged(wxCommandEvent& event)
|
||||
|
|
|
@ -19,12 +19,6 @@ public:
|
|||
GeneralConfigPane(wxWindow* parent, wxWindowID id);
|
||||
|
||||
private:
|
||||
struct CPUCore
|
||||
{
|
||||
int CPUid;
|
||||
wxString name;
|
||||
};
|
||||
std::vector<CPUCore> m_cpu_cores;
|
||||
void InitializeGUI();
|
||||
void LoadGUIValues();
|
||||
void BindEvents();
|
||||
|
|
Loading…
Reference in New Issue