| // 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_IMPELLER_TOOLKIT_ANDROID_CHOREOGRAPHER_H_ |
| #define FLUTTER_IMPELLER_TOOLKIT_ANDROID_CHOREOGRAPHER_H_ |
| |
| #include "impeller/toolkit/android/proc_table.h" |
| |
| #include <chrono> |
| #include <memory> |
| |
| namespace impeller::android { |
| |
| //------------------------------------------------------------------------------ |
| /// @brief This class describes access to the choreographer instance for |
| /// the current thread. Choreographers are only available on API |
| /// levels above 24. On levels below 24, an invalid choreographer |
| /// will be returned. |
| /// |
| /// Since choreographer need an event loop on the current thread, |
| /// one will be setup if it doesn't already exist. |
| /// |
| class Choreographer { |
| public: |
| static bool IsAvailableOnPlatform(); |
| |
| //---------------------------------------------------------------------------- |
| /// @brief Create or get the thread local instance of a choreographer. A |
| /// message loop will be setup on the calling thread if none |
| /// exists. |
| /// |
| /// @warning Choreographers are only available on API levels 24 and above. |
| /// Below this level, this will return an invalid instance. |
| /// Availability can also be checked via the |
| /// `IsAvailableOnPlatform` call. |
| /// |
| /// @return The thread local choreographer instance. If none can be setup, |
| /// an invalid object reference will be returned. See `IsValid`. |
| /// |
| static Choreographer& GetInstance(); |
| |
| ~Choreographer(); |
| |
| Choreographer(const Choreographer&) = delete; |
| |
| Choreographer& operator=(const Choreographer&) = delete; |
| |
| bool IsValid() const; |
| |
| //---------------------------------------------------------------------------- |
| /// A monotonic system clock. |
| /// |
| using FrameClock = std::chrono::steady_clock; |
| |
| //---------------------------------------------------------------------------- |
| /// A timepoint on a monotonic system clock. |
| /// |
| using FrameTimePoint = std::chrono::time_point<FrameClock>; |
| using FrameCallback = std::function<void(FrameTimePoint)>; |
| |
| //---------------------------------------------------------------------------- |
| /// @brief Posts a frame callback. The time that the frame is being |
| /// rendered will be available in the callback as an argument. |
| /// Multiple frame callbacks within the same frame interval will |
| /// receive the same argument. |
| /// |
| /// @param[in] callback The callback |
| /// |
| /// @return `true` if the frame callback could be posted. This may return |
| /// `false` if choreographers are not available on the platform. |
| /// See `IsAvailableOnPlatform`. |
| /// |
| bool PostFrameCallback(FrameCallback callback) const; |
| |
| private: |
| AChoreographer* instance_ = nullptr; |
| |
| explicit Choreographer(); |
| }; |
| |
| } // namespace impeller::android |
| |
| #endif // FLUTTER_IMPELLER_TOOLKIT_ANDROID_CHOREOGRAPHER_H_ |