controller.cpp 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2019 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <array>
  6. #include <utility>
  7. #include "common/logging/log.h"
  8. #include "core/core_timing.h"
  9. #include "core/hle/service/apm/controller.h"
  10. #include "core/settings.h"
  11. namespace Service::APM {
  12. constexpr auto DEFAULT_PERFORMANCE_CONFIGURATION = PerformanceConfiguration::Config7;
  13. Controller::Controller(Core::Timing::CoreTiming& core_timing)
  14. : core_timing{core_timing}, configs{
  15. {PerformanceMode::Handheld, DEFAULT_PERFORMANCE_CONFIGURATION},
  16. {PerformanceMode::Docked, DEFAULT_PERFORMANCE_CONFIGURATION},
  17. } {}
  18. Controller::~Controller() = default;
  19. void Controller::SetPerformanceConfiguration(PerformanceMode mode,
  20. PerformanceConfiguration config) {
  21. static constexpr std::array<std::pair<PerformanceConfiguration, u32>, 16> config_to_speed{{
  22. {PerformanceConfiguration::Config1, 1020},
  23. {PerformanceConfiguration::Config2, 1020},
  24. {PerformanceConfiguration::Config3, 1224},
  25. {PerformanceConfiguration::Config4, 1020},
  26. {PerformanceConfiguration::Config5, 1020},
  27. {PerformanceConfiguration::Config6, 1224},
  28. {PerformanceConfiguration::Config7, 1020},
  29. {PerformanceConfiguration::Config8, 1020},
  30. {PerformanceConfiguration::Config9, 1020},
  31. {PerformanceConfiguration::Config10, 1020},
  32. {PerformanceConfiguration::Config11, 1020},
  33. {PerformanceConfiguration::Config12, 1020},
  34. {PerformanceConfiguration::Config13, 1785},
  35. {PerformanceConfiguration::Config14, 1785},
  36. {PerformanceConfiguration::Config15, 1020},
  37. {PerformanceConfiguration::Config16, 1020},
  38. }};
  39. const auto iter = std::find_if(config_to_speed.cbegin(), config_to_speed.cend(),
  40. [config](const auto& entry) { return entry.first == config; });
  41. if (iter == config_to_speed.cend()) {
  42. LOG_ERROR(Service_APM, "Invalid performance configuration value provided: {}",
  43. static_cast<u32>(config));
  44. return;
  45. }
  46. SetClockSpeed(iter->second);
  47. configs.insert_or_assign(mode, config);
  48. }
  49. void Controller::SetFromCpuBoostMode(CpuBoostMode mode) {
  50. constexpr std::array<PerformanceConfiguration, 3> BOOST_MODE_TO_CONFIG_MAP{{
  51. PerformanceConfiguration::Config7,
  52. PerformanceConfiguration::Config13,
  53. PerformanceConfiguration::Config15,
  54. }};
  55. SetPerformanceConfiguration(PerformanceMode::Docked,
  56. BOOST_MODE_TO_CONFIG_MAP.at(static_cast<u32>(mode)));
  57. }
  58. PerformanceMode Controller::GetCurrentPerformanceMode() const {
  59. return Settings::values.use_docked_mode ? PerformanceMode::Docked : PerformanceMode::Handheld;
  60. }
  61. PerformanceConfiguration Controller::GetCurrentPerformanceConfiguration(PerformanceMode mode) {
  62. if (configs.find(mode) == configs.end()) {
  63. configs.insert_or_assign(mode, DEFAULT_PERFORMANCE_CONFIGURATION);
  64. }
  65. return configs[mode];
  66. }
  67. void Controller::SetClockSpeed(u32 mhz) {
  68. LOG_INFO(Service_APM, "called, mhz={:08X}", mhz);
  69. // TODO(DarkLordZach): Actually signal core_timing to change clock speed.
  70. // TODO(Rodrigo): Remove [[maybe_unused]] when core_timing is used.
  71. }
  72. } // namespace Service::APM