mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-08-16 05:21:22 +00:00
3f52bf4b4b
This insufferable work tries to cover some holes on previous threading implementation from yuzu's team, starting with Windows and Linux reordering of priorities (NICE), reworks previous Android's threading and cpu affinity with adpf, adjust emulated clocks/gpu for better "accuracy" with their work, bumps android minSDK for all flavors, legacy will now work with AP 29 to cover A10 - A12, standard will reach A13 as base and finally the optimized build will come with API 35, mostly targeted on devices with A15 support and newer, NDK and AGP wasn't upgraded yet. The performance cost efficiency have been improved based on device power configuration; preventing overheating if certain devices tended to fall into NICE0 (not allocated threads priority, all task ran with higher priority, 11 tasks running within the limited 2 - 7 threads available on the most common configuration 1x3x4 or 1x4x3). Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4254
120 lines
3.9 KiB
C++
120 lines
3.9 KiB
C++
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include <memory>
|
|
#include <typeinfo>
|
|
#include <vector>
|
|
#include <QComboBox>
|
|
#include "common/common_types.h"
|
|
#include "common/settings.h"
|
|
#include "common/settings_enums.h"
|
|
#include "configuration/shared_widget.h"
|
|
#include "core/core.h"
|
|
#include "ui_configure_cpu.h"
|
|
#include "yuzu/configuration/configuration_shared.h"
|
|
#include "yuzu/configuration/configure_cpu.h"
|
|
|
|
ConfigureCpu::ConfigureCpu(const Core::System& system_,
|
|
std::shared_ptr<std::vector<ConfigurationShared::Tab*>> group_,
|
|
const ConfigurationShared::Builder& builder, QWidget* parent)
|
|
: Tab(group_, parent), ui{std::make_unique<Ui::ConfigureCpu>()}, system{system_},
|
|
combobox_translations(builder.ComboboxTranslations()) {
|
|
ui->setupUi(this);
|
|
|
|
Setup(builder);
|
|
|
|
SetConfiguration();
|
|
|
|
connect(accuracy_combobox, qOverload<int>(&QComboBox::currentIndexChanged), this,
|
|
&ConfigureCpu::UpdateGroup);
|
|
|
|
connect(backend_combobox, qOverload<int>(&QComboBox::currentIndexChanged), this,
|
|
&ConfigureCpu::UpdateGroup);
|
|
|
|
#ifdef HAS_NCE
|
|
ui->backend_group->setVisible(true);
|
|
#endif
|
|
}
|
|
|
|
ConfigureCpu::~ConfigureCpu() = default;
|
|
|
|
void ConfigureCpu::SetConfiguration() {}
|
|
void ConfigureCpu::Setup(const ConfigurationShared::Builder& builder) {
|
|
auto* accuracy_layout = ui->widget_accuracy->layout();
|
|
auto* backend_layout = ui->widget_backend->layout();
|
|
auto* unsafe_layout = ui->unsafe_widget->layout();
|
|
std::map<u32, QWidget*> unsafe_hold{};
|
|
|
|
std::vector<Settings::BasicSetting*> settings;
|
|
const auto push = [&](Settings::Category category) {
|
|
for (const auto setting : Settings::values.linkage.by_category[category]) {
|
|
settings.push_back(setting);
|
|
}
|
|
};
|
|
|
|
push(Settings::Category::Cpu);
|
|
push(Settings::Category::CpuUnsafe);
|
|
|
|
for (const auto setting : settings) {
|
|
auto* widget = builder.BuildWidget(setting, apply_funcs);
|
|
|
|
if (widget == nullptr) {
|
|
continue;
|
|
}
|
|
if (!widget->Valid()) {
|
|
widget->deleteLater();
|
|
continue;
|
|
}
|
|
|
|
if (setting->Id() == Settings::values.cpu_accuracy.Id()) {
|
|
// Keep track of cpu_accuracy combobox to display/hide the unsafe settings
|
|
accuracy_layout->addWidget(widget);
|
|
accuracy_combobox = widget->combobox;
|
|
} else if (setting->Id() == Settings::values.cpu_backend.Id()) {
|
|
backend_layout->addWidget(widget);
|
|
backend_combobox = widget->combobox;
|
|
} else if (setting->Id() == Settings::values.cpu_ticks.Id()) {
|
|
ui->general_layout->addWidget(widget);
|
|
} else {
|
|
// Presently, all other settings here are unsafe checkboxes
|
|
unsafe_hold.insert({setting->Id(), widget});
|
|
}
|
|
}
|
|
|
|
for (const auto& [label, widget] : unsafe_hold) {
|
|
unsafe_layout->addWidget(widget);
|
|
}
|
|
|
|
UpdateGroup();
|
|
}
|
|
|
|
void ConfigureCpu::UpdateGroup() {
|
|
const u32 accuracy = accuracy_combobox->currentIndex();
|
|
const u32 backend = backend_combobox->currentIndex();
|
|
// TODO(crueter): see if this works on NCE
|
|
ui->unsafe_group->setVisible(accuracy == (u32)Settings::CpuAccuracy::Unsafe &&
|
|
backend == (u32)Settings::CpuBackend::Dynarmic);
|
|
}
|
|
|
|
void ConfigureCpu::ApplyConfiguration() {
|
|
const bool is_powered_on = system.IsPoweredOn();
|
|
for (const auto& apply_func : apply_funcs) {
|
|
apply_func(is_powered_on);
|
|
}
|
|
}
|
|
|
|
void ConfigureCpu::changeEvent(QEvent* event) {
|
|
if (event->type() == QEvent::LanguageChange) {
|
|
RetranslateUI();
|
|
}
|
|
|
|
QWidget::changeEvent(event);
|
|
}
|
|
|
|
void ConfigureCpu::RetranslateUI() {
|
|
ui->retranslateUi(this);
|
|
}
|