mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-10 08:09:26 +01:00
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 {
|
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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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));
|
||||||
|
@ -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 -->
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
@ -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.
|
||||||
|
@ -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();
|
||||||
|
@ -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)
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user