#ifndef ASH_DISPLAY_REFRESH_RATE_CONTROLLER_H_
#define ASH_DISPLAY_REFRESH_RATE_CONTROLLER_H_
#include <vector>
#include "ash/ash_export.h"
#include "ash/display/display_performance_mode_controller.h"
#include "ash/system/power/power_status.h"
#include "base/scoped_observation.h"
#include "ui/aura/window.h"
#include "ui/aura/window_observer.h"
#include "ui/aura/window_tree_host_observer.h"
#include "ui/display/display_observer.h"
#include "ui/display/manager/display_configurator.h"
namespace ash {
class ASH_EXPORT RefreshRateController
: public PowerStatus::Observer,
public aura::WindowObserver,
public display::DisplayObserver,
public display::DisplayConfigurator::Observer,
public DisplayPerformanceModeController::Observer,
public aura::WindowTreeHostObserver {
public:
RefreshRateController(
display::DisplayConfigurator* display_configurator,
PowerStatus* power_status,
DisplayPerformanceModeController* display_performance_mode_controller);
RefreshRateController(const RefreshRateController&) = delete;
RefreshRateController& operator=(const RefreshRateController&) = delete;
~RefreshRateController() override;
void OnPowerStatusChanged() override;
void SetGameMode(aura::Window* window, bool game_mode_on);
void OnWindowAddedToRootWindow(aura::Window* window) override;
void OnWindowDestroying(aura::Window* window) override;
void OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) override;
void OnDisplayConfigurationChanged(
const display::DisplayConfigurator::DisplayStateList& displays) override;
void OnDisplayPerformanceModeChanged(
DisplayPerformanceModeController::ModeState new_state) override;
void OnSetPreferredRefreshRate(aura::WindowTreeHost* host,
float preferred_refresh_rate) override;
void StopObservingPowerStatusForTest();
void OnWindowTreeHostCreated(aura::WindowTreeHost* host);
private:
enum class ThrottleState {
kEnabled,
kDisabled,
};
void UpdateSeamlessRefreshRates(int64_t display_id);
void OnSeamlessRefreshRatesReceived(
int64_t display_id,
const std::optional<std::vector<float>>& refresh_rates);
void UpdateStates();
void RefreshOverrideState();
void RefreshVrrState();
ThrottleState GetDesiredThrottleState();
ThrottleState GetDynamicThrottleState();
display::DisplayConfigurator::RefreshRateOverrideMap GetThrottleOverrides();
raw_ptr<display::DisplayConfigurator> display_configurator_;
raw_ptr<PowerStatus> power_status_;
raw_ptr<DisplayPerformanceModeController>
display_performance_mode_controller_;
DisplayPerformanceModeController::DisplayPerformanceModeController::ModeState
current_performance_mode_ = DisplayPerformanceModeController::
DisplayPerformanceModeController::ModeState::kDefault;
bool force_throttle_ = false;
std::unordered_map<int64_t, std::vector<float>> display_refresh_rates_;
std::unordered_map<int64_t, float> refresh_rate_preferences_;
base::ScopedObservation<ash::PowerStatus, ash::PowerStatus::Observer>
power_status_observer_{this};
base::ScopedObservation<aura::Window, aura::WindowObserver>
game_window_observer_{this};
display::ScopedDisplayObserver display_observer_{this};
base::ScopedObservation<display::DisplayConfigurator,
display::DisplayConfigurator::Observer>
display_configurator_observer_{this};
base::WeakPtrFactory<RefreshRateController> weak_ptr_factory_{this};
};
}
#endif