// Copyright 2018 The Fuchsia 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 TOPAZ_RUNTIME_FLUTTER_RUNNER_VSYNC_RECORDER_H_
#define TOPAZ_RUNTIME_FLUTTER_RUNNER_VSYNC_RECORDER_H_

#include <optional>

#include "flutter/fml/time/time_delta.h"
#include "flutter/fml/time/time_point.h"
#include "lib/ui/scenic/cpp/session.h"

namespace flutter {

struct VsyncInfo {
  fml::TimePoint presentation_time;
  fml::TimeDelta presentation_interval;
};

class VsyncRecorder {
 public:
  static VsyncRecorder& GetInstance();

  // Retrieve the most recent |PresentationInfo| provided to us by scenic.
  // This function is safe to call from any thread.
  VsyncInfo GetCurrentVsyncInfo() const;

  // Update the current Vsync info to |presentation_info|.  This is expected
  // to be called in |scenic::Sesssion::Present| callbacks with the
  // presentation info provided by scenic.  Only the most recent vsync
  // information will be saved (in order to handle edge cases involving
  // multiple scenic sessions in the same process).  This function is safe to
  // call from any thread.
  void UpdateVsyncInfo(fuchsia::images::PresentationInfo presentation_info);

 private:
  VsyncRecorder() = default;

  std::optional<fuchsia::images::PresentationInfo> last_presentation_info_;

  // Disallow copy and assignment.
  VsyncRecorder(const VsyncRecorder&) = delete;
  VsyncRecorder& operator=(const VsyncRecorder&) = delete;
};

}  // namespace flutter

#endif  // TOPAZ_RUNTIME_FLUTTER_RUNNER_VSYNC_RECORDER_H_
