configure_cpu.cpp 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright 2020 yuzu Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <QComboBox>
  5. #include <QMessageBox>
  6. #include "common/common_types.h"
  7. #include "common/logging/log.h"
  8. #include "common/settings.h"
  9. #include "core/core.h"
  10. #include "ui_configure_cpu.h"
  11. #include "yuzu/configuration/configuration_shared.h"
  12. #include "yuzu/configuration/configure_cpu.h"
  13. ConfigureCpu::ConfigureCpu(QWidget* parent) : QWidget(parent), ui(new Ui::ConfigureCpu) {
  14. ui->setupUi(this);
  15. SetupPerGameUI();
  16. SetConfiguration();
  17. connect(ui->accuracy, qOverload<int>(&QComboBox::activated), this,
  18. &ConfigureCpu::AccuracyUpdated);
  19. connect(ui->accuracy, qOverload<int>(&QComboBox::currentIndexChanged), this,
  20. &ConfigureCpu::UpdateGroup);
  21. }
  22. ConfigureCpu::~ConfigureCpu() = default;
  23. void ConfigureCpu::SetConfiguration() {
  24. const bool runtime_lock = !Core::System::GetInstance().IsPoweredOn();
  25. ui->accuracy->setEnabled(runtime_lock);
  26. ui->cpuopt_unsafe_unfuse_fma->setEnabled(runtime_lock);
  27. ui->cpuopt_unsafe_reduce_fp_error->setEnabled(runtime_lock);
  28. ui->cpuopt_unsafe_ignore_standard_fpcr->setEnabled(runtime_lock);
  29. ui->cpuopt_unsafe_inaccurate_nan->setEnabled(runtime_lock);
  30. ui->cpuopt_unsafe_fastmem_check->setEnabled(runtime_lock);
  31. ui->cpuopt_unsafe_unfuse_fma->setChecked(Settings::values.cpuopt_unsafe_unfuse_fma.GetValue());
  32. ui->cpuopt_unsafe_reduce_fp_error->setChecked(
  33. Settings::values.cpuopt_unsafe_reduce_fp_error.GetValue());
  34. ui->cpuopt_unsafe_ignore_standard_fpcr->setChecked(
  35. Settings::values.cpuopt_unsafe_ignore_standard_fpcr.GetValue());
  36. ui->cpuopt_unsafe_inaccurate_nan->setChecked(
  37. Settings::values.cpuopt_unsafe_inaccurate_nan.GetValue());
  38. ui->cpuopt_unsafe_fastmem_check->setChecked(
  39. Settings::values.cpuopt_unsafe_fastmem_check.GetValue());
  40. if (Settings::IsConfiguringGlobal()) {
  41. ui->accuracy->setCurrentIndex(static_cast<int>(Settings::values.cpu_accuracy.GetValue()));
  42. } else {
  43. ConfigurationShared::SetPerGameSetting(ui->accuracy, &Settings::values.cpu_accuracy);
  44. ConfigurationShared::SetHighlight(ui->widget_accuracy,
  45. !Settings::values.cpu_accuracy.UsingGlobal());
  46. }
  47. UpdateGroup(ui->accuracy->currentIndex());
  48. }
  49. void ConfigureCpu::AccuracyUpdated(int index) {
  50. if (Settings::IsConfiguringGlobal() &&
  51. static_cast<Settings::CPUAccuracy>(index) == Settings::CPUAccuracy::DebugMode) {
  52. const auto result = QMessageBox::warning(this, tr("Setting CPU to Debug Mode"),
  53. tr("CPU Debug Mode is only intended for developer "
  54. "use. Are you sure you want to enable this?"),
  55. QMessageBox::Yes | QMessageBox::No);
  56. if (result == QMessageBox::No) {
  57. ui->accuracy->setCurrentIndex(static_cast<int>(Settings::CPUAccuracy::Accurate));
  58. UpdateGroup(static_cast<int>(Settings::CPUAccuracy::Accurate));
  59. }
  60. }
  61. }
  62. void ConfigureCpu::UpdateGroup(int index) {
  63. if (!Settings::IsConfiguringGlobal()) {
  64. index -= ConfigurationShared::USE_GLOBAL_OFFSET;
  65. }
  66. const auto accuracy = static_cast<Settings::CPUAccuracy>(index);
  67. ui->unsafe_group->setVisible(accuracy == Settings::CPUAccuracy::Unsafe);
  68. }
  69. void ConfigureCpu::ApplyConfiguration() {
  70. ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_unfuse_fma,
  71. ui->cpuopt_unsafe_unfuse_fma,
  72. cpuopt_unsafe_unfuse_fma);
  73. ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_reduce_fp_error,
  74. ui->cpuopt_unsafe_reduce_fp_error,
  75. cpuopt_unsafe_reduce_fp_error);
  76. ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_ignore_standard_fpcr,
  77. ui->cpuopt_unsafe_ignore_standard_fpcr,
  78. cpuopt_unsafe_ignore_standard_fpcr);
  79. ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_inaccurate_nan,
  80. ui->cpuopt_unsafe_inaccurate_nan,
  81. cpuopt_unsafe_inaccurate_nan);
  82. ConfigurationShared::ApplyPerGameSetting(&Settings::values.cpuopt_unsafe_fastmem_check,
  83. ui->cpuopt_unsafe_fastmem_check,
  84. cpuopt_unsafe_fastmem_check);
  85. if (Settings::IsConfiguringGlobal()) {
  86. // Guard if during game and set to game-specific value
  87. if (Settings::values.cpu_accuracy.UsingGlobal()) {
  88. Settings::values.cpu_accuracy.SetValue(
  89. static_cast<Settings::CPUAccuracy>(ui->accuracy->currentIndex()));
  90. }
  91. } else {
  92. if (ui->accuracy->currentIndex() == ConfigurationShared::USE_GLOBAL_INDEX) {
  93. Settings::values.cpu_accuracy.SetGlobal(true);
  94. } else {
  95. Settings::values.cpu_accuracy.SetGlobal(false);
  96. Settings::values.cpu_accuracy.SetValue(static_cast<Settings::CPUAccuracy>(
  97. ui->accuracy->currentIndex() - ConfigurationShared::USE_GLOBAL_OFFSET));
  98. }
  99. }
  100. }
  101. void ConfigureCpu::changeEvent(QEvent* event) {
  102. if (event->type() == QEvent::LanguageChange) {
  103. RetranslateUI();
  104. }
  105. QWidget::changeEvent(event);
  106. }
  107. void ConfigureCpu::RetranslateUI() {
  108. ui->retranslateUi(this);
  109. }
  110. void ConfigureCpu::SetupPerGameUI() {
  111. if (Settings::IsConfiguringGlobal()) {
  112. return;
  113. }
  114. ConfigurationShared::SetColoredComboBox(
  115. ui->accuracy, ui->widget_accuracy,
  116. static_cast<u32>(Settings::values.cpu_accuracy.GetValue(true)));
  117. ui->accuracy->removeItem(static_cast<u32>(Settings::CPUAccuracy::DebugMode) +
  118. ConfigurationShared::USE_GLOBAL_OFFSET);
  119. ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_unfuse_fma,
  120. Settings::values.cpuopt_unsafe_unfuse_fma,
  121. cpuopt_unsafe_unfuse_fma);
  122. ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_reduce_fp_error,
  123. Settings::values.cpuopt_unsafe_reduce_fp_error,
  124. cpuopt_unsafe_reduce_fp_error);
  125. ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_ignore_standard_fpcr,
  126. Settings::values.cpuopt_unsafe_ignore_standard_fpcr,
  127. cpuopt_unsafe_ignore_standard_fpcr);
  128. ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_inaccurate_nan,
  129. Settings::values.cpuopt_unsafe_inaccurate_nan,
  130. cpuopt_unsafe_inaccurate_nan);
  131. ConfigurationShared::SetColoredTristate(ui->cpuopt_unsafe_fastmem_check,
  132. Settings::values.cpuopt_unsafe_fastmem_check,
  133. cpuopt_unsafe_fastmem_check);
  134. }