blob: a4b781df8535f6943f644796cfd3bb38941c0997 [file] [log] [blame]
// 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_