Merge pull request #5273 from JosJuice/android-x86-64

x86-64 support on Android
This commit is contained in:
JosJuice 2017-04-18 09:54:04 +02:00 committed by GitHub
commit fd0b99be2e
10 changed files with 106 additions and 33 deletions

View File

@ -65,7 +65,7 @@ android {
externalNativeBuild { externalNativeBuild {
cmake { cmake {
arguments "-DANDROID_STL=c++_static", "-DCMAKE_BUILD_TYPE=RelWithDebInfo" // , "-DENABLE_GENERIC=ON" 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"
} }
} }
} }

View File

@ -323,6 +323,8 @@ public final class NativeLibrary
*/ */
public static native String GetUserDirectory(); public static native String GetUserDirectory();
public static native int DefaultCPUCore();
/** /**
* Begins emulation. * Begins emulation.
*/ */

View File

@ -1,5 +1,6 @@
package org.dolphinemu.dolphinemu.ui.settings; package org.dolphinemu.dolphinemu.ui.settings;
import org.dolphinemu.dolphinemu.NativeLibrary;
import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.R;
import org.dolphinemu.dolphinemu.model.settings.BooleanSetting; import org.dolphinemu.dolphinemu.model.settings.BooleanSetting;
import org.dolphinemu.dolphinemu.model.settings.IntSetting; import org.dolphinemu.dolphinemu.model.settings.IntSetting;
@ -179,8 +180,28 @@ public final class SettingsFragmentPresenter
mView.passSettingsToActivity(mSettings); mView.passSettingsToActivity(mSettings);
} }
// TODO Set default value for cpuCore based on arch. // TODO: Having different emuCoresEntries/emuCoresValues for each architecture is annoying.
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)); // 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_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 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)); sl.add(new SliderSetting(SettingsFile.KEY_OVERCLOCK_PERCENT, SettingsFile.SECTION_CORE, SettingsFile.SETTINGS_DOLPHIN, R.string.overclock_title, 0, 400, "%", 100, overclock));

View File

@ -4,19 +4,33 @@
<resources> <resources>
<!-- New UI CPU Core selection - Default --> <!-- 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>Interpreter</item>
<item>Cached Interpreter</item> <item>Cached Interpreter</item>
<item>JIT ARM64 Recompiler</item> <item>JIT ARM64 Recompiler</item>
<!--<item>JIT64 Recompiler</item>
<item>JITIL Recompiler</item>-->
</string-array> </string-array>
<integer-array name="emuCoresValues" translatable="false"> <integer-array name="emuCoresValuesARM64" translatable="false">
<item>0</item> <item>0</item>
<item>5</item> <item>5</item>
<item>4</item> <item>4</item>
<!--<item>1</item> </integer-array>
<item>2</item>--> <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> </integer-array>
<!-- Video backend selection --> <!-- Video backend selection -->

View File

@ -30,6 +30,7 @@
#include "Core/HW/WiimoteReal/WiimoteReal.h" #include "Core/HW/WiimoteReal/WiimoteReal.h"
#include "Core/Host.h" #include "Core/Host.h"
#include "Core/PowerPC/JitInterface.h" #include "Core/PowerPC/JitInterface.h"
#include "Core/PowerPC/PowerPC.h"
#include "Core/PowerPC/Profiler.h" #include "Core/PowerPC/Profiler.h"
#include "Core/State.h" #include "Core/State.h"
@ -453,6 +454,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserDirec
JNIEnv* env, jobject obj, jstring jDirectory); JNIEnv* env, jobject obj, jstring jDirectory);
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserDirectory(JNIEnv* env, jobject obj); 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, JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv* env,
jobject obj, jobject obj,
jboolean enable); 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()); 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, JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling(JNIEnv* env,
jobject obj, jobject obj,
jboolean enable) jboolean enable)

View File

@ -809,7 +809,7 @@ void SConfig::LoadDefaults()
#endif #endif
#endif #endif
iCPUCore = PowerPC::CORE_JIT64; iCPUCore = PowerPC::DefaultCPUCore();
iTimingVariance = 40; iTimingVariance = 40;
bCPUThread = false; bCPUThread = false;
bSyncGPUOnSkipIdleHack = true; bSyncGPUOnSkipIdleHack = true;

View File

@ -5,6 +5,7 @@
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include <cstring> #include <cstring>
#include <vector>
#include "Common/Assert.h" #include "Common/Assert.h"
#include "Common/ChunkFile.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) void Init(int cpu_core)
{ {
// NOTE: This function runs on EmuThread, not the CPU Thread. // NOTE: This function runs on EmuThread, not the CPU Thread.

View File

@ -7,6 +7,7 @@
#include <array> #include <array>
#include <cstddef> #include <cstddef>
#include <tuple> #include <tuple>
#include <vector>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
@ -20,7 +21,7 @@ class PointerWrap;
namespace PowerPC namespace PowerPC
{ {
enum enum CPUCore
{ {
CORE_INTERPRETER, CORE_INTERPRETER,
CORE_JIT64, CORE_JIT64,
@ -135,6 +136,9 @@ extern BreakPoints breakpoints;
extern MemChecks memchecks; extern MemChecks memchecks;
extern PPCDebugInterface debug_interface; extern PPCDebugInterface debug_interface;
const std::vector<CPUCore>& AvailableCPUCores();
CPUCore DefaultCPUCore();
void Init(int cpu_core); void Init(int cpu_core);
void Reset(); void Reset();
void Shutdown(); void Shutdown();

View File

@ -4,6 +4,10 @@
#include "DolphinWX/Config/GeneralConfigPane.h" #include "DolphinWX/Config/GeneralConfigPane.h"
#include <map>
#include <string>
#include <vector>
#include <wx/button.h> #include <wx/button.h>
#include <wx/checkbox.h> #include <wx/checkbox.h>
#include <wx/choice.h> #include <wx/choice.h>
@ -14,25 +18,23 @@
#include <wx/sizer.h> #include <wx/sizer.h>
#include <wx/stattext.h> #include <wx/stattext.h>
#include "Common/Common.h"
#include "Core/Analytics.h" #include "Core/Analytics.h"
#include "Core/ConfigManager.h" #include "Core/ConfigManager.h"
#include "Core/Core.h" #include "Core/Core.h"
#include "Core/PowerPC/PowerPC.h" #include "Core/PowerPC/PowerPC.h"
#include "DolphinWX/WxEventUtils.h" #include "DolphinWX/WxEventUtils.h"
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) 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
};
InitializeGUI(); InitializeGUI();
LoadGUIValues(); LoadGUIValues();
BindEvents(); BindEvents();
@ -49,8 +51,8 @@ void GeneralConfigPane::InitializeGUI()
m_throttler_array_string.Add(wxString::Format(_("%i%%"), i)); m_throttler_array_string.Add(wxString::Format(_("%i%%"), i));
} }
for (const CPUCore& cpu_core : m_cpu_cores) for (PowerPC::CPUCore cpu_core : PowerPC::AvailableCPUCores())
m_cpu_engine_array_string.Add(cpu_core.name); 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_dual_core_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Dual Core (speedup)"));
m_cheats_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Cheats")); m_cheats_checkbox = new wxCheckBox(this, wxID_ANY, _("Enable Cheats"));
@ -146,9 +148,10 @@ void GeneralConfigPane::LoadGUIValues()
if (selection < m_throttler_array_string.size()) if (selection < m_throttler_array_string.size())
m_throttler_choice->SetSelection(selection); 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); m_cpu_engine_radiobox->SetSelection(i);
} }
} }
@ -201,7 +204,7 @@ void GeneralConfigPane::OnThrottlerChoiceChanged(wxCommandEvent& event)
void GeneralConfigPane::OnCPUEngineRadioBoxChanged(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) void GeneralConfigPane::OnAnalyticsCheckBoxChanged(wxCommandEvent& event)

View File

@ -19,12 +19,6 @@ public:
GeneralConfigPane(wxWindow* parent, wxWindowID id); GeneralConfigPane(wxWindow* parent, wxWindowID id);
private: private:
struct CPUCore
{
int CPUid;
wxString name;
};
std::vector<CPUCore> m_cpu_cores;
void InitializeGUI(); void InitializeGUI();
void LoadGUIValues(); void LoadGUIValues();
void BindEvents(); void BindEvents();