Merge pull request #4294 from MerryMage/cpu-opt-settings
configuration: Add settings to enable/disable specific CPU optimizations
This commit is contained in:
commit
e2730372b8
|
@ -1 +1 @@
|
||||||
Subproject commit 4f967387c07365b7ea35d2fa3e19b7df8872a09b
|
Subproject commit 82417da7803e2cf18efc28a1cd3f3d0a4b6045ae
|
|
@ -142,10 +142,32 @@ std::shared_ptr<Dynarmic::A32::Jit> ARM_Dynarmic_32::MakeJit(Common::PageTable&
|
||||||
// Timing
|
// Timing
|
||||||
config.wall_clock_cntpct = uses_wall_clock;
|
config.wall_clock_cntpct = uses_wall_clock;
|
||||||
|
|
||||||
// Optimizations
|
// Safe optimizations
|
||||||
if (Settings::values.disable_cpu_opt) {
|
if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) {
|
||||||
config.enable_optimizations = false;
|
if (!Settings::values.cpuopt_page_tables) {
|
||||||
config.enable_fast_dispatch = false;
|
config.page_table = nullptr;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_block_linking) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_return_stack_buffer) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_fast_dispatcher) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_context_elimination) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_const_prop) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_misc_ir) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_reduce_misalign_checks) {
|
||||||
|
config.only_detect_misalignment_via_page_table_on_page_boundary = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return std::make_unique<Dynarmic::A32::Jit>(config);
|
return std::make_unique<Dynarmic::A32::Jit>(config);
|
||||||
|
|
|
@ -191,15 +191,37 @@ std::shared_ptr<Dynarmic::A64::Jit> ARM_Dynarmic_64::MakeJit(Common::PageTable&
|
||||||
// Unpredictable instructions
|
// Unpredictable instructions
|
||||||
config.define_unpredictable_behaviour = true;
|
config.define_unpredictable_behaviour = true;
|
||||||
|
|
||||||
// Optimizations
|
|
||||||
if (Settings::values.disable_cpu_opt) {
|
|
||||||
config.enable_optimizations = false;
|
|
||||||
config.enable_fast_dispatch = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Timing
|
// Timing
|
||||||
config.wall_clock_cntpct = uses_wall_clock;
|
config.wall_clock_cntpct = uses_wall_clock;
|
||||||
|
|
||||||
|
// Safe optimizations
|
||||||
|
if (Settings::values.cpu_accuracy != Settings::CPUAccuracy::Accurate) {
|
||||||
|
if (!Settings::values.cpuopt_page_tables) {
|
||||||
|
config.page_table = nullptr;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_block_linking) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::BlockLinking;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_return_stack_buffer) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::ReturnStackBuffer;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_fast_dispatcher) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::FastDispatch;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_context_elimination) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::GetSetElimination;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_const_prop) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::ConstProp;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_misc_ir) {
|
||||||
|
config.optimizations &= ~Dynarmic::OptimizationFlag::MiscIROpt;
|
||||||
|
}
|
||||||
|
if (!Settings::values.cpuopt_reduce_misalign_checks) {
|
||||||
|
config.only_detect_misalignment_via_page_table_on_page_boundary = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return std::make_shared<Dynarmic::A64::Jit>(config);
|
return std::make_shared<Dynarmic::A64::Jit>(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -357,6 +357,11 @@ enum class GPUAccuracy : u32 {
|
||||||
Extreme = 2,
|
Extreme = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class CPUAccuracy {
|
||||||
|
Accurate = 0,
|
||||||
|
DebugMode = 1,
|
||||||
|
};
|
||||||
|
|
||||||
extern bool configuring_global;
|
extern bool configuring_global;
|
||||||
|
|
||||||
template <typename Type>
|
template <typename Type>
|
||||||
|
@ -402,6 +407,18 @@ struct Values {
|
||||||
// Core
|
// Core
|
||||||
Setting<bool> use_multi_core;
|
Setting<bool> use_multi_core;
|
||||||
|
|
||||||
|
// Cpu
|
||||||
|
CPUAccuracy cpu_accuracy;
|
||||||
|
|
||||||
|
bool cpuopt_page_tables;
|
||||||
|
bool cpuopt_block_linking;
|
||||||
|
bool cpuopt_return_stack_buffer;
|
||||||
|
bool cpuopt_fast_dispatcher;
|
||||||
|
bool cpuopt_context_elimination;
|
||||||
|
bool cpuopt_const_prop;
|
||||||
|
bool cpuopt_misc_ir;
|
||||||
|
bool cpuopt_reduce_misalign_checks;
|
||||||
|
|
||||||
// Renderer
|
// Renderer
|
||||||
Setting<RendererBackend> renderer_backend;
|
Setting<RendererBackend> renderer_backend;
|
||||||
bool renderer_debug;
|
bool renderer_debug;
|
||||||
|
@ -476,7 +493,6 @@ struct Values {
|
||||||
bool dump_nso;
|
bool dump_nso;
|
||||||
bool reporting_services;
|
bool reporting_services;
|
||||||
bool quest_flag;
|
bool quest_flag;
|
||||||
bool disable_cpu_opt;
|
|
||||||
bool disable_macro_jit;
|
bool disable_macro_jit;
|
||||||
|
|
||||||
// Misceallaneous
|
// Misceallaneous
|
||||||
|
|
|
@ -30,6 +30,12 @@ add_executable(yuzu
|
||||||
configuration/configure_audio.cpp
|
configuration/configure_audio.cpp
|
||||||
configuration/configure_audio.h
|
configuration/configure_audio.h
|
||||||
configuration/configure_audio.ui
|
configuration/configure_audio.ui
|
||||||
|
configuration/configure_cpu.cpp
|
||||||
|
configuration/configure_cpu.h
|
||||||
|
configuration/configure_cpu.ui
|
||||||
|
configuration/configure_cpu_debug.cpp
|
||||||
|
configuration/configure_cpu_debug.h
|
||||||
|
configuration/configure_cpu_debug.ui
|
||||||
configuration/configure_debug.cpp
|
configuration/configure_debug.cpp
|
||||||
configuration/configure_debug.h
|
configuration/configure_debug.h
|
||||||
configuration/configure_debug.ui
|
configuration/configure_debug.ui
|
||||||
|
|
|
@ -524,8 +524,6 @@ void Config::ReadDebuggingValues() {
|
||||||
Settings::values.reporting_services =
|
Settings::values.reporting_services =
|
||||||
ReadSetting(QStringLiteral("reporting_services"), false).toBool();
|
ReadSetting(QStringLiteral("reporting_services"), false).toBool();
|
||||||
Settings::values.quest_flag = ReadSetting(QStringLiteral("quest_flag"), false).toBool();
|
Settings::values.quest_flag = ReadSetting(QStringLiteral("quest_flag"), false).toBool();
|
||||||
Settings::values.disable_cpu_opt =
|
|
||||||
ReadSetting(QStringLiteral("disable_cpu_opt"), false).toBool();
|
|
||||||
Settings::values.disable_macro_jit =
|
Settings::values.disable_macro_jit =
|
||||||
ReadSetting(QStringLiteral("disable_macro_jit"), false).toBool();
|
ReadSetting(QStringLiteral("disable_macro_jit"), false).toBool();
|
||||||
|
|
||||||
|
@ -617,6 +615,34 @@ void Config::ReadPathValues() {
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Config::ReadCpuValues() {
|
||||||
|
qt_config->beginGroup(QStringLiteral("Cpu"));
|
||||||
|
|
||||||
|
if (global) {
|
||||||
|
Settings::values.cpu_accuracy = static_cast<Settings::CPUAccuracy>(
|
||||||
|
ReadSetting(QStringLiteral("cpu_accuracy"), 0).toInt());
|
||||||
|
|
||||||
|
Settings::values.cpuopt_page_tables =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_page_tables"), true).toBool();
|
||||||
|
Settings::values.cpuopt_block_linking =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_block_linking"), true).toBool();
|
||||||
|
Settings::values.cpuopt_return_stack_buffer =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_return_stack_buffer"), true).toBool();
|
||||||
|
Settings::values.cpuopt_fast_dispatcher =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_fast_dispatcher"), true).toBool();
|
||||||
|
Settings::values.cpuopt_context_elimination =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_context_elimination"), true).toBool();
|
||||||
|
Settings::values.cpuopt_const_prop =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_const_prop"), true).toBool();
|
||||||
|
Settings::values.cpuopt_misc_ir =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_misc_ir"), true).toBool();
|
||||||
|
Settings::values.cpuopt_reduce_misalign_checks =
|
||||||
|
ReadSetting(QStringLiteral("cpuopt_reduce_misalign_checks"), true).toBool();
|
||||||
|
}
|
||||||
|
|
||||||
|
qt_config->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
void Config::ReadRendererValues() {
|
void Config::ReadRendererValues() {
|
||||||
qt_config->beginGroup(QStringLiteral("Renderer"));
|
qt_config->beginGroup(QStringLiteral("Renderer"));
|
||||||
|
|
||||||
|
@ -813,6 +839,7 @@ void Config::ReadValues() {
|
||||||
ReadMiscellaneousValues();
|
ReadMiscellaneousValues();
|
||||||
}
|
}
|
||||||
ReadCoreValues();
|
ReadCoreValues();
|
||||||
|
ReadCpuValues();
|
||||||
ReadRendererValues();
|
ReadRendererValues();
|
||||||
ReadAudioValues();
|
ReadAudioValues();
|
||||||
ReadSystemValues();
|
ReadSystemValues();
|
||||||
|
@ -913,6 +940,7 @@ void Config::SaveValues() {
|
||||||
SaveMiscellaneousValues();
|
SaveMiscellaneousValues();
|
||||||
}
|
}
|
||||||
SaveCoreValues();
|
SaveCoreValues();
|
||||||
|
SaveCpuValues();
|
||||||
SaveRendererValues();
|
SaveRendererValues();
|
||||||
SaveAudioValues();
|
SaveAudioValues();
|
||||||
SaveSystemValues();
|
SaveSystemValues();
|
||||||
|
@ -1006,7 +1034,6 @@ void Config::SaveDebuggingValues() {
|
||||||
WriteSetting(QStringLiteral("dump_exefs"), Settings::values.dump_exefs, false);
|
WriteSetting(QStringLiteral("dump_exefs"), Settings::values.dump_exefs, false);
|
||||||
WriteSetting(QStringLiteral("dump_nso"), Settings::values.dump_nso, false);
|
WriteSetting(QStringLiteral("dump_nso"), Settings::values.dump_nso, false);
|
||||||
WriteSetting(QStringLiteral("quest_flag"), Settings::values.quest_flag, false);
|
WriteSetting(QStringLiteral("quest_flag"), Settings::values.quest_flag, false);
|
||||||
WriteSetting(QStringLiteral("disable_cpu_opt"), Settings::values.disable_cpu_opt, false);
|
|
||||||
WriteSetting(QStringLiteral("disable_macro_jit"), Settings::values.disable_macro_jit, false);
|
WriteSetting(QStringLiteral("disable_macro_jit"), Settings::values.disable_macro_jit, false);
|
||||||
|
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
|
@ -1070,6 +1097,32 @@ void Config::SavePathValues() {
|
||||||
qt_config->endGroup();
|
qt_config->endGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Config::SaveCpuValues() {
|
||||||
|
qt_config->beginGroup(QStringLiteral("Cpu"));
|
||||||
|
|
||||||
|
if (global) {
|
||||||
|
WriteSetting(QStringLiteral("cpu_accuracy"),
|
||||||
|
static_cast<int>(Settings::values.cpu_accuracy), 0);
|
||||||
|
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_page_tables"), Settings::values.cpuopt_page_tables,
|
||||||
|
true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_block_linking"), Settings::values.cpuopt_block_linking,
|
||||||
|
true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_return_stack_buffer"),
|
||||||
|
Settings::values.cpuopt_return_stack_buffer, true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_fast_dispatcher"),
|
||||||
|
Settings::values.cpuopt_fast_dispatcher, true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_context_elimination"),
|
||||||
|
Settings::values.cpuopt_context_elimination, true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_const_prop"), Settings::values.cpuopt_const_prop, true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_misc_ir"), Settings::values.cpuopt_misc_ir, true);
|
||||||
|
WriteSetting(QStringLiteral("cpuopt_reduce_misalign_checks"),
|
||||||
|
Settings::values.cpuopt_reduce_misalign_checks, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
qt_config->endGroup();
|
||||||
|
}
|
||||||
|
|
||||||
void Config::SaveRendererValues() {
|
void Config::SaveRendererValues() {
|
||||||
qt_config->beginGroup(QStringLiteral("Renderer"));
|
qt_config->beginGroup(QStringLiteral("Renderer"));
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ private:
|
||||||
void ReadDisabledAddOnValues();
|
void ReadDisabledAddOnValues();
|
||||||
void ReadMiscellaneousValues();
|
void ReadMiscellaneousValues();
|
||||||
void ReadPathValues();
|
void ReadPathValues();
|
||||||
|
void ReadCpuValues();
|
||||||
void ReadRendererValues();
|
void ReadRendererValues();
|
||||||
void ReadShortcutValues();
|
void ReadShortcutValues();
|
||||||
void ReadSystemValues();
|
void ReadSystemValues();
|
||||||
|
@ -73,6 +74,7 @@ private:
|
||||||
void SaveDisabledAddOnValues();
|
void SaveDisabledAddOnValues();
|
||||||
void SaveMiscellaneousValues();
|
void SaveMiscellaneousValues();
|
||||||
void SavePathValues();
|
void SavePathValues();
|
||||||
|
void SaveCpuValues();
|
||||||
void SaveRendererValues();
|
void SaveRendererValues();
|
||||||
void SaveShortcutValues();
|
void SaveShortcutValues();
|
||||||
void SaveSystemValues();
|
void SaveSystemValues();
|
||||||
|
|
|
@ -78,6 +78,16 @@
|
||||||
<string>Hotkeys</string>
|
<string>Hotkeys</string>
|
||||||
</attribute>
|
</attribute>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="ConfigureCpu" name="cpuTab">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>CPU</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
<widget class="ConfigureCpuDebug" name="cpuDebugTab">
|
||||||
|
<attribute name="title">
|
||||||
|
<string>Debug</string>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
<widget class="ConfigureGraphics" name="graphicsTab">
|
<widget class="ConfigureGraphics" name="graphicsTab">
|
||||||
<attribute name="title">
|
<attribute name="title">
|
||||||
<string>Graphics</string>
|
<string>Graphics</string>
|
||||||
|
@ -158,6 +168,18 @@
|
||||||
<header>configuration/configure_debug.h</header>
|
<header>configuration/configure_debug.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>ConfigureCpu</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>configuration/configure_cpu.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>ConfigureCpuDebug</class>
|
||||||
|
<extends>QWidget</extends>
|
||||||
|
<header>configuration/configure_cpu_debug.h</header>
|
||||||
|
<container>1</container>
|
||||||
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>ConfigureGraphics</class>
|
<class>ConfigureGraphics</class>
|
||||||
<extends>QWidget</extends>
|
<extends>QWidget</extends>
|
||||||
|
|
|
@ -0,0 +1,61 @@
|
||||||
|
// Copyright 2020 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/settings.h"
|
||||||
|
#include "ui_configure_cpu.h"
|
||||||
|
#include "yuzu/configuration/configure_cpu.h"
|
||||||
|
|
||||||
|
ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureCpu) {
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
SetConfiguration();
|
||||||
|
|
||||||
|
connect(ui->accuracy, qOverload<int>(&QComboBox::activated), this,
|
||||||
|
&ConfigureCpu::AccuracyUpdated);
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigureCpu::~ConfigureCpu() = default;
|
||||||
|
|
||||||
|
void ConfigureCpu::SetConfiguration() {
|
||||||
|
const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
|
||||||
|
|
||||||
|
ui->accuracy->setEnabled(runtime_lock);
|
||||||
|
ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpu::AccuracyUpdated(int index) {
|
||||||
|
if (static_cast<Settings::CPUAccuracy>(index) == Settings::CPUAccuracy::DebugMode) {
|
||||||
|
const auto result = QMessageBox::warning(this, tr("Setting CPU to Debug Mode"),
|
||||||
|
tr("CPU Debug Mode is only intended for developer "
|
||||||
|
"use. Are you sure you want to enable this?"),
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if (result == QMessageBox::No) {
|
||||||
|
ui->accuracy->setCurrentIndex(static_cast<int>(Settings::CPUAccuracy::Accurate));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpu::ApplyConfiguration() {
|
||||||
|
Settings::values.cpu_accuracy =
|
||||||
|
static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpu::changeEvent(QEvent* event) {
|
||||||
|
if (event->type() == QEvent::LanguageChange) {
|
||||||
|
RetranslateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget::changeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpu::RetranslateUI() {
|
||||||
|
ui->retranslateUi(this);
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
// Copyright 2020 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <QWidget>
|
||||||
|
#include "core/settings.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class ConfigureCpu;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConfigureCpu : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ConfigureCpu(QWidget* parent = nullptr);
|
||||||
|
~ConfigureCpu() override;
|
||||||
|
|
||||||
|
void ApplyConfiguration();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void changeEvent(QEvent* event) override;
|
||||||
|
void RetranslateUI();
|
||||||
|
|
||||||
|
void AccuracyUpdated(int index);
|
||||||
|
|
||||||
|
void SetConfiguration();
|
||||||
|
|
||||||
|
std::unique_ptr<Ui::ConfigureCpu> ui;
|
||||||
|
};
|
|
@ -0,0 +1,92 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ConfigureCpu</class>
|
||||||
|
<widget class="QWidget" name="ConfigureCpu">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>321</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>General</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel">
|
||||||
|
<property name="text">
|
||||||
|
<string>Accuracy:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="accuracy">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Accurate</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable Debug Mode</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel">
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>1</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>We recommend setting accuracy to "Accurate".</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_disable_info">
|
||||||
|
<property name="text">
|
||||||
|
<string>CPU settings are available only when game is not running.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
|
@ -0,0 +1,65 @@
|
||||||
|
// Copyright 2020 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <QComboBox>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/settings.h"
|
||||||
|
#include "ui_configure_cpu_debug.h"
|
||||||
|
#include "yuzu/configuration/configure_cpu_debug.h"
|
||||||
|
|
||||||
|
ConfigureCpuDebug::ConfigureCpuDebug(QWidget* parent)
|
||||||
|
: QWidget(parent), ui(new Ui::ConfigureCpuDebug) {
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
SetConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
ConfigureCpuDebug::~ConfigureCpuDebug() = default;
|
||||||
|
|
||||||
|
void ConfigureCpuDebug::SetConfiguration() {
|
||||||
|
const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
|
||||||
|
|
||||||
|
ui->cpuopt_page_tables->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_page_tables->setChecked(Settings::values.cpuopt_page_tables);
|
||||||
|
ui->cpuopt_block_linking->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_block_linking->setChecked(Settings::values.cpuopt_block_linking);
|
||||||
|
ui->cpuopt_return_stack_buffer->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_return_stack_buffer->setChecked(Settings::values.cpuopt_return_stack_buffer);
|
||||||
|
ui->cpuopt_fast_dispatcher->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_fast_dispatcher->setChecked(Settings::values.cpuopt_fast_dispatcher);
|
||||||
|
ui->cpuopt_context_elimination->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_context_elimination->setChecked(Settings::values.cpuopt_context_elimination);
|
||||||
|
ui->cpuopt_const_prop->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_const_prop->setChecked(Settings::values.cpuopt_const_prop);
|
||||||
|
ui->cpuopt_misc_ir->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_misc_ir->setChecked(Settings::values.cpuopt_misc_ir);
|
||||||
|
ui->cpuopt_reduce_misalign_checks->setEnabled(runtime_lock);
|
||||||
|
ui->cpuopt_reduce_misalign_checks->setChecked(Settings::values.cpuopt_reduce_misalign_checks);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpuDebug::ApplyConfiguration() {
|
||||||
|
Settings::values.cpuopt_page_tables = ui->cpuopt_page_tables->isChecked();
|
||||||
|
Settings::values.cpuopt_block_linking = ui->cpuopt_block_linking->isChecked();
|
||||||
|
Settings::values.cpuopt_return_stack_buffer = ui->cpuopt_return_stack_buffer->isChecked();
|
||||||
|
Settings::values.cpuopt_fast_dispatcher = ui->cpuopt_fast_dispatcher->isChecked();
|
||||||
|
Settings::values.cpuopt_context_elimination = ui->cpuopt_context_elimination->isChecked();
|
||||||
|
Settings::values.cpuopt_const_prop = ui->cpuopt_const_prop->isChecked();
|
||||||
|
Settings::values.cpuopt_misc_ir = ui->cpuopt_misc_ir->isChecked();
|
||||||
|
Settings::values.cpuopt_reduce_misalign_checks = ui->cpuopt_reduce_misalign_checks->isChecked();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpuDebug::changeEvent(QEvent* event) {
|
||||||
|
if (event->type() == QEvent::LanguageChange) {
|
||||||
|
RetranslateUI();
|
||||||
|
}
|
||||||
|
|
||||||
|
QWidget::changeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConfigureCpuDebug::RetranslateUI() {
|
||||||
|
ui->retranslateUi(this);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright 2020 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <QWidget>
|
||||||
|
#include "core/settings.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class ConfigureCpuDebug;
|
||||||
|
}
|
||||||
|
|
||||||
|
class ConfigureCpuDebug : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ConfigureCpuDebug(QWidget* parent = nullptr);
|
||||||
|
~ConfigureCpuDebug() override;
|
||||||
|
|
||||||
|
void ApplyConfiguration();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void changeEvent(QEvent* event) override;
|
||||||
|
void RetranslateUI();
|
||||||
|
|
||||||
|
void SetConfiguration();
|
||||||
|
|
||||||
|
std::unique_ptr<Ui::ConfigureCpuDebug> ui;
|
||||||
|
};
|
|
@ -0,0 +1,174 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ConfigureCpuDebug</class>
|
||||||
|
<widget class="QWidget" name="ConfigureCpuDebug">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>321</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox">
|
||||||
|
<property name="title">
|
||||||
|
<string>Toggle CPU Optimizations</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel">
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>1</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>
|
||||||
|
<div>
|
||||||
|
<b>For debugging only.</b>
|
||||||
|
<br>
|
||||||
|
If you're not sure what these do, keep all of these enabled.
|
||||||
|
<br>
|
||||||
|
These settings only take effect when CPU Accuracy is "Debug Mode".
|
||||||
|
</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_page_tables">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable inline page tables</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div style="white-space: nowrap">This optimization speeds up memory accesses by the guest program.</div>
|
||||||
|
<div style="white-space: nowrap">Enabling it inlines accesses to PageTable::pointers into emitted code.</div>
|
||||||
|
<div style="white-space: nowrap">Disabling this forces all memory accesses to go through the Memory::Read/Memory::Write functions.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_block_linking">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable block linking</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>This optimization avoids dispatcher lookups by allowing emitted basic blocks to jump directly to other basic blocks if the destination PC is static.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_return_stack_buffer">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable return stack buffer</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>This optimization avoids dispatcher lookups by keeping track potential return addresses of BL instructions. This approximates what happens with a return stack buffer on a real CPU.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_fast_dispatcher">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable fast dispatcher</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>Enable a two-tiered dispatch system. A faster dispatcher written in assembly has a small MRU cache of jump destinations is used first. If that fails, dispatch falls back to the slower C++ dispatcher.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_context_elimination">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable context elimination</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>Enables an IR optimization that reduces unnecessary accesses to the CPU context structure.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_const_prop">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable constant propagation</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>Enables IR optimizations that involve constant propagation.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_misc_ir">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable miscellaneous optimizations</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div>Enables miscellaneous IR optimizations.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="cpuopt_reduce_misalign_checks">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable misalignment check reduction</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>
|
||||||
|
<div style="white-space: nowrap">When enabled, a misalignment is only triggered when an access crosses a page boundary.</div>
|
||||||
|
<div style="white-space: nowrap">When disabled, a misalignment is triggered on all misaligned accesses.</div>
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_disable_info">
|
||||||
|
<property name="text">
|
||||||
|
<string>CPU settings are available only when game is not running.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
|
@ -36,7 +36,6 @@ void ConfigureDebug::SetConfiguration() {
|
||||||
ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args));
|
ui->homebrew_args_edit->setText(QString::fromStdString(Settings::values.program_args));
|
||||||
ui->reporting_services->setChecked(Settings::values.reporting_services);
|
ui->reporting_services->setChecked(Settings::values.reporting_services);
|
||||||
ui->quest_flag->setChecked(Settings::values.quest_flag);
|
ui->quest_flag->setChecked(Settings::values.quest_flag);
|
||||||
ui->disable_cpu_opt->setChecked(Settings::values.disable_cpu_opt);
|
|
||||||
ui->enable_graphics_debugging->setEnabled(!Core::System::GetInstance().IsPoweredOn());
|
ui->enable_graphics_debugging->setEnabled(!Core::System::GetInstance().IsPoweredOn());
|
||||||
ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug);
|
ui->enable_graphics_debugging->setChecked(Settings::values.renderer_debug);
|
||||||
ui->disable_macro_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn());
|
ui->disable_macro_jit->setEnabled(!Core::System::GetInstance().IsPoweredOn());
|
||||||
|
@ -51,7 +50,6 @@ void ConfigureDebug::ApplyConfiguration() {
|
||||||
Settings::values.program_args = ui->homebrew_args_edit->text().toStdString();
|
Settings::values.program_args = ui->homebrew_args_edit->text().toStdString();
|
||||||
Settings::values.reporting_services = ui->reporting_services->isChecked();
|
Settings::values.reporting_services = ui->reporting_services->isChecked();
|
||||||
Settings::values.quest_flag = ui->quest_flag->isChecked();
|
Settings::values.quest_flag = ui->quest_flag->isChecked();
|
||||||
Settings::values.disable_cpu_opt = ui->disable_cpu_opt->isChecked();
|
|
||||||
Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();
|
Settings::values.renderer_debug = ui->enable_graphics_debugging->isChecked();
|
||||||
Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked();
|
Settings::values.disable_macro_jit = ui->disable_macro_jit->isChecked();
|
||||||
Debugger::ToggleConsole();
|
Debugger::ToggleConsole();
|
||||||
|
|
|
@ -228,13 +228,6 @@
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QCheckBox" name="disable_cpu_opt">
|
|
||||||
<property name="text">
|
|
||||||
<string>Disable CPU JIT optimizations</string>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -42,6 +42,8 @@ void ConfigureDialog::ApplyConfiguration() {
|
||||||
ui->filesystemTab->applyConfiguration();
|
ui->filesystemTab->applyConfiguration();
|
||||||
ui->inputTab->ApplyConfiguration();
|
ui->inputTab->ApplyConfiguration();
|
||||||
ui->hotkeysTab->ApplyConfiguration(registry);
|
ui->hotkeysTab->ApplyConfiguration(registry);
|
||||||
|
ui->cpuTab->ApplyConfiguration();
|
||||||
|
ui->cpuDebugTab->ApplyConfiguration();
|
||||||
ui->graphicsTab->ApplyConfiguration();
|
ui->graphicsTab->ApplyConfiguration();
|
||||||
ui->graphicsAdvancedTab->ApplyConfiguration();
|
ui->graphicsAdvancedTab->ApplyConfiguration();
|
||||||
ui->audioTab->ApplyConfiguration();
|
ui->audioTab->ApplyConfiguration();
|
||||||
|
@ -76,9 +78,10 @@ void ConfigureDialog::RetranslateUI() {
|
||||||
Q_DECLARE_METATYPE(QList<QWidget*>);
|
Q_DECLARE_METATYPE(QList<QWidget*>);
|
||||||
|
|
||||||
void ConfigureDialog::PopulateSelectionList() {
|
void ConfigureDialog::PopulateSelectionList() {
|
||||||
const std::array<std::pair<QString, QList<QWidget*>>, 5> items{
|
const std::array<std::pair<QString, QList<QWidget*>>, 6> items{
|
||||||
{{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}},
|
{{tr("General"), {ui->generalTab, ui->webTab, ui->debugTab, ui->uiTab}},
|
||||||
{tr("System"), {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab}},
|
{tr("System"), {ui->systemTab, ui->profileManagerTab, ui->serviceTab, ui->filesystemTab}},
|
||||||
|
{tr("CPU"), {ui->cpuTab, ui->cpuDebugTab}},
|
||||||
{tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}},
|
{tr("Graphics"), {ui->graphicsTab, ui->graphicsAdvancedTab}},
|
||||||
{tr("Audio"), {ui->audioTab}},
|
{tr("Audio"), {ui->audioTab}},
|
||||||
{tr("Controls"), {ui->inputTab, ui->hotkeysTab}}},
|
{tr("Controls"), {ui->inputTab, ui->hotkeysTab}}},
|
||||||
|
@ -107,6 +110,8 @@ void ConfigureDialog::UpdateVisibleTabs() {
|
||||||
{ui->profileManagerTab, tr("Profiles")},
|
{ui->profileManagerTab, tr("Profiles")},
|
||||||
{ui->inputTab, tr("Input")},
|
{ui->inputTab, tr("Input")},
|
||||||
{ui->hotkeysTab, tr("Hotkeys")},
|
{ui->hotkeysTab, tr("Hotkeys")},
|
||||||
|
{ui->cpuTab, tr("CPU")},
|
||||||
|
{ui->cpuDebugTab, tr("Debug")},
|
||||||
{ui->graphicsTab, tr("Graphics")},
|
{ui->graphicsTab, tr("Graphics")},
|
||||||
{ui->graphicsAdvancedTab, tr("Advanced")},
|
{ui->graphicsAdvancedTab, tr("Advanced")},
|
||||||
{ui->audioTab, tr("Audio")},
|
{ui->audioTab, tr("Audio")},
|
||||||
|
|
|
@ -428,8 +428,6 @@ void Config::ReadValues() {
|
||||||
Settings::values.reporting_services =
|
Settings::values.reporting_services =
|
||||||
sdl2_config->GetBoolean("Debugging", "reporting_services", false);
|
sdl2_config->GetBoolean("Debugging", "reporting_services", false);
|
||||||
Settings::values.quest_flag = sdl2_config->GetBoolean("Debugging", "quest_flag", false);
|
Settings::values.quest_flag = sdl2_config->GetBoolean("Debugging", "quest_flag", false);
|
||||||
Settings::values.disable_cpu_opt =
|
|
||||||
sdl2_config->GetBoolean("Debugging", "disable_cpu_opt", false);
|
|
||||||
Settings::values.disable_macro_jit =
|
Settings::values.disable_macro_jit =
|
||||||
sdl2_config->GetBoolean("Debugging", "disable_macro_jit", false);
|
sdl2_config->GetBoolean("Debugging", "disable_macro_jit", false);
|
||||||
|
|
||||||
|
|
|
@ -97,6 +97,39 @@ udp_pad_index=
|
||||||
# 0 (default): Disabled, 1: Enabled
|
# 0 (default): Disabled, 1: Enabled
|
||||||
use_multi_core=
|
use_multi_core=
|
||||||
|
|
||||||
|
[Cpu]
|
||||||
|
# Enable inline page tables optimization (faster guest memory access)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_page_tables =
|
||||||
|
|
||||||
|
# Enable block linking CPU optimization (reduce block dispatcher use during predictable jumps)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_block_linking =
|
||||||
|
|
||||||
|
# Enable return stack buffer CPU optimization (reduce block dispatcher use during predictable returns)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_return_stack_buffer =
|
||||||
|
|
||||||
|
# Enable fast dispatcher CPU optimization (use a two-tiered dispatcher architecture)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_fast_dispatcher =
|
||||||
|
|
||||||
|
# Enable context elimination CPU Optimization (reduce host memory use for guest context)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_context_elimination =
|
||||||
|
|
||||||
|
# Enable constant propagation CPU optimization (basic IR optimization)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_const_prop =
|
||||||
|
|
||||||
|
# Enable miscellaneous CPU optimizations (basic IR optimization)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_misc_ir =
|
||||||
|
|
||||||
|
# Enable reduction of memory misalignment checks (reduce memory fallbacks for misaligned access)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_reduce_misalign_checks =
|
||||||
|
|
||||||
[Renderer]
|
[Renderer]
|
||||||
# Which backend API to use.
|
# Which backend API to use.
|
||||||
# 0 (default): OpenGL, 1: Vulkan
|
# 0 (default): OpenGL, 1: Vulkan
|
||||||
|
@ -283,9 +316,6 @@ dump_nso=false
|
||||||
# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode
|
# Determines whether or not yuzu will report to the game that the emulated console is in Kiosk Mode
|
||||||
# false: Retail/Normal Mode (default), true: Kiosk Mode
|
# false: Retail/Normal Mode (default), true: Kiosk Mode
|
||||||
quest_flag =
|
quest_flag =
|
||||||
# Determines whether or not JIT CPU optimizations are enabled
|
|
||||||
# false: Optimizations Enabled, true: Optimizations Disabled
|
|
||||||
disable_cpu_opt =
|
|
||||||
# Enables/Disables the macro JIT compiler
|
# Enables/Disables the macro JIT compiler
|
||||||
disable_macro_jit=false
|
disable_macro_jit=false
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,39 @@ const char* sdl2_config_file = R"(
|
||||||
# 0 (default): Disabled, 1: Enabled
|
# 0 (default): Disabled, 1: Enabled
|
||||||
use_multi_core=
|
use_multi_core=
|
||||||
|
|
||||||
|
[Cpu]
|
||||||
|
# Enable inline page tables optimization (faster guest memory access)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_page_tables =
|
||||||
|
|
||||||
|
# Enable block linking CPU optimization (reduce block dispatcher use during predictable jumps)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_block_linking =
|
||||||
|
|
||||||
|
# Enable return stack buffer CPU optimization (reduce block dispatcher use during predictable returns)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_return_stack_buffer =
|
||||||
|
|
||||||
|
# Enable fast dispatcher CPU optimization (use a two-tiered dispatcher architecture)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_fast_dispatcher =
|
||||||
|
|
||||||
|
# Enable context elimination CPU Optimization (reduce host memory use for guest context)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_context_elimination =
|
||||||
|
|
||||||
|
# Enable constant propagation CPU optimization (basic IR optimization)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_const_prop =
|
||||||
|
|
||||||
|
# Enable miscellaneous CPU optimizations (basic IR optimization)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_misc_ir =
|
||||||
|
|
||||||
|
# Enable reduction of memory misalignment checks (reduce memory fallbacks for misaligned access)
|
||||||
|
# 0: Disabled, 1 (default): Enabled
|
||||||
|
cpuopt_reduce_misalign_checks =
|
||||||
|
|
||||||
[Renderer]
|
[Renderer]
|
||||||
# Whether to use software or hardware rendering.
|
# Whether to use software or hardware rendering.
|
||||||
# 0: Software, 1 (default): Hardware
|
# 0: Software, 1 (default): Hardware
|
||||||
|
|
Loading…
Reference in New Issue