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 {
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"
}
}
}

View File

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

View File

@ -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));

View File

@ -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 -->

View File

@ -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)

View File

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

View File

@ -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.

View File

@ -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();

View File

@ -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)

View File

@ -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();