-
Notifications
You must be signed in to change notification settings - Fork 6k
Embedder API Support for display settings #21355
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // Use of this source code is governed by a BSD-style license that can be | ||
| // found in the LICENSE file. | ||
|
|
||
| #ifndef FLUTTER_SHELL_COMMON_DISPLAY_H_ | ||
| #define FLUTTER_SHELL_COMMON_DISPLAY_H_ | ||
|
|
||
| #include <optional> | ||
|
|
||
| namespace flutter { | ||
|
|
||
| /// Unique ID per display that is stable until the Flutter application restarts. | ||
| /// See also: `flutter::Display` | ||
| typedef uint64_t DisplayId; | ||
|
|
||
| /// To be used when the display refresh rate is unknown. | ||
| static constexpr double kUnknownDisplayRefreshRate = 0; | ||
|
|
||
| /// Display refers to a graphics hardware system consisting of a framebuffer, | ||
| /// typically a monitor or a screen. This class holds the various display | ||
| /// settings. | ||
| class Display { | ||
| public: | ||
| //------------------------------------------------------------------------------ | ||
| /// @brief Construct a new Display object in case where the display id of the | ||
| /// display is known. In cases where there is more than one display, every | ||
| /// display is expected to have a display id. | ||
| /// | ||
| Display(DisplayId display_id, double refresh_rate) | ||
| : display_id_(display_id), refresh_rate_(refresh_rate) {} | ||
iskakaushik marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| //------------------------------------------------------------------------------ | ||
| /// @brief Construct a new Display object when there is only a single display. | ||
| /// When there are multiple displays, every display must have a display id. | ||
| /// | ||
| explicit Display(double refresh_rate) | ||
| : display_id_({}), refresh_rate_(refresh_rate) {} | ||
|
|
||
| ~Display() = default; | ||
|
|
||
| // Get the display's maximum refresh rate in the unit of frame per second. | ||
| // Return `kUnknownDisplayRefreshRate` if the refresh rate is unknown. | ||
| double GetRefreshRate() const { return refresh_rate_; } | ||
|
|
||
| /// Returns the `DisplayId` of the display. | ||
| std::optional<DisplayId> GetDisplayId() const { return display_id_; } | ||
|
|
||
| private: | ||
| std::optional<DisplayId> display_id_; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Nice use of There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. thanks! |
||
| double refresh_rate_; | ||
| }; | ||
|
|
||
| } // namespace flutter | ||
|
|
||
| #endif // FLUTTER_SHELL_COMMON_DISPLAY_H_ | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,49 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // Use of this source code is governed by a BSD-style license that can be | ||
| // found in the LICENSE file. | ||
|
|
||
| #include "flutter/shell/common/display_manager.h" | ||
|
|
||
| #include "flutter/fml/logging.h" | ||
| #include "flutter/fml/macros.h" | ||
|
|
||
| namespace flutter { | ||
|
|
||
| DisplayManager::DisplayManager() = default; | ||
|
|
||
| DisplayManager::~DisplayManager() = default; | ||
|
|
||
| double DisplayManager::GetMainDisplayRefreshRate() const { | ||
| std::scoped_lock lock(displays_mutex_); | ||
| if (displays_.empty()) { | ||
| return kUnknownDisplayRefreshRate; | ||
| } else { | ||
| return displays_[0].GetRefreshRate(); | ||
| } | ||
| } | ||
|
|
||
| void DisplayManager::HandleDisplayUpdates(DisplayUpdateType update_type, | ||
| std::vector<Display> displays) { | ||
| std::scoped_lock lock(displays_mutex_); | ||
| CheckDisplayConfiguration(displays); | ||
| switch (update_type) { | ||
| case DisplayUpdateType::kStartup: | ||
| FML_CHECK(displays_.empty()); | ||
| displays_ = displays; | ||
| return; | ||
| default: | ||
| FML_CHECK(false) << "Unknown DisplayUpdateType."; | ||
| } | ||
| } | ||
|
|
||
| void DisplayManager::CheckDisplayConfiguration( | ||
| std::vector<Display> displays) const { | ||
| FML_CHECK(!displays.empty()); | ||
| if (displays.size() > 1) { | ||
| for (auto& display : displays) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If the displays list changes while you're iterating over it, the iterator will be invalidated. Assuming that's a distinct possibility, since accesses are protected by a lock elsewhere. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good call, acquiring lock before this call as well. |
||
| FML_CHECK(display.GetDisplayId().has_value()); | ||
| } | ||
| } | ||
| } | ||
|
|
||
| } // namespace flutter | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,59 @@ | ||
| // Copyright 2013 The Flutter Authors. All rights reserved. | ||
| // Use of this source code is governed by a BSD-style license that can be | ||
| // found in the LICENSE file. | ||
|
|
||
| #ifndef FLUTTER_SHELL_COMMON_DISPLAY_MANAGER_H_ | ||
| #define FLUTTER_SHELL_COMMON_DISPLAY_MANAGER_H_ | ||
|
|
||
| #include <mutex> | ||
| #include <vector> | ||
|
|
||
| #include "flutter/shell/common/display.h" | ||
|
|
||
| namespace flutter { | ||
|
|
||
| /// The update type parameter that is passed to | ||
| /// `DisplayManager::HandleDisplayUpdates`. | ||
| enum class DisplayUpdateType { | ||
| /// `flutter::Display`s that were active during start-up. A display is | ||
| /// considered active if: | ||
| /// 1. The frame buffer hardware is connected. | ||
| /// 2. The display is drawable, e.g. it isn't being mirrored from another | ||
| /// connected display or sleeping. | ||
| kStartup | ||
| }; | ||
|
|
||
| /// Manages lifecycle of the connected displays. This class is thread-safe. | ||
| class DisplayManager { | ||
iskakaushik marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| public: | ||
| DisplayManager(); | ||
|
|
||
| ~DisplayManager(); | ||
|
|
||
| /// Returns the display refresh rate of the main display. In cases where there | ||
| /// is only one display connected, it will return that. We do not yet support | ||
| /// cases where there are multiple displays. | ||
| /// | ||
| /// When there are no registered displays, it returns | ||
| /// `kUnknownDisplayRefreshRate`. | ||
| double GetMainDisplayRefreshRate() const; | ||
|
|
||
| /// Handles the display updates. | ||
| void HandleDisplayUpdates(DisplayUpdateType update_type, | ||
| std::vector<Display> displays); | ||
|
|
||
| private: | ||
| /// Guards `displays_` vector. | ||
| mutable std::mutex displays_mutex_; | ||
| std::vector<Display> displays_; | ||
|
|
||
| /// Checks that the provided display configuration is valid. Currently this | ||
| /// ensures that all the displays have an id in the case there are multiple | ||
| /// displays. In case where there is a single display, it is valid for the | ||
| /// display to not have an id. | ||
| void CheckDisplayConfiguration(std::vector<Display> displays) const; | ||
| }; | ||
|
|
||
| } // namespace flutter | ||
|
|
||
| #endif // FLUTTER_SHELL_COMMON_DISPLAY_MANAGER_H_ | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -30,6 +30,7 @@ | |
| #include "flutter/runtime/dart_vm_lifecycle.h" | ||
| #include "flutter/runtime/service_protocol.h" | ||
| #include "flutter/shell/common/animator.h" | ||
| #include "flutter/shell/common/display_manager.h" | ||
| #include "flutter/shell/common/engine.h" | ||
| #include "flutter/shell/common/platform_view.h" | ||
| #include "flutter/shell/common/rasterizer.h" | ||
|
|
@@ -369,6 +370,17 @@ class Shell final : public PlatformView::Delegate, | |
| /// | ||
| DartVM* GetDartVM(); | ||
|
|
||
| //---------------------------------------------------------------------------- | ||
| /// @brief Notifies the display manager of the updates. | ||
| /// | ||
| void OnDisplayUpdates(DisplayUpdateType update_type, | ||
| std::vector<Display> displays); | ||
|
|
||
| //---------------------------------------------------------------------------- | ||
| /// @brief Queries the `DisplayManager` for the main display refresh rate. | ||
| /// | ||
| double GetMainDisplayRefreshRate(); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Make There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. done |
||
|
|
||
| private: | ||
| using ServiceProtocolHandler = | ||
| std::function<bool(const ServiceProtocol::Handler::ServiceProtocolMap&, | ||
|
|
@@ -418,12 +430,9 @@ class Shell final : public PlatformView::Delegate, | |
| // here for easier conversions to Dart objects. | ||
| std::vector<int64_t> unreported_timings_; | ||
|
|
||
| // A cache of `Engine::GetDisplayRefreshRate` (only callable in the UI thread) | ||
| // so we can access it from `Rasterizer` (in the raster thread). | ||
| // | ||
| // The atomic is for extra thread safety as this is written in the UI thread | ||
| // and read from the raster thread. | ||
| std::atomic<float> display_refresh_rate_ = 0.0f; | ||
| /// Manages the displays. This class is thread safe, can be accessed from any | ||
| /// of the threads. | ||
| std::unique_ptr<DisplayManager> display_manager_; | ||
|
|
||
| // protects expected_frame_size_ which is set on platform thread and read on | ||
| // raster thread | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.