// Copyright 2020 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 SRC_UI_SCENIC_LIB_FLATLAND_FLATLAND_PRESENTER_H_
#define SRC_UI_SCENIC_LIB_FLATLAND_FLATLAND_PRESENTER_H_

#include <unordered_map>

#include "src/ui/scenic/lib/scheduling/frame_scheduler.h"
#include "src/ui/scenic/lib/scheduling/id.h"

namespace flatland {

// Interface for Flatland instances to register user Present calls. Primarily intended to provide
// a thread-safe abstraction around a FrameScheduler.
class FlatlandPresenter {
 public:
  virtual ~FlatlandPresenter() {}

  // From scheduling::FrameScheduler::RegisterPresent():
  //
  // Registers per-present information with the frame scheduler and returns an incrementing
  // PresentId unique to that session.
  virtual scheduling::PresentId RegisterPresent(scheduling::SessionId session_id,
                                                std::vector<zx::event> release_fences) = 0;

  // From scheduling::FrameScheduler::ScheduleUpdateForSession():
  //
  // Tells the frame scheduler to schedule a frame. This is also used for updates triggered by
  // something other than a Session update i.e. an ImagePipe with a new Image to present.
  //
  // Flatland should not call this function until it has reached the acquire fences and queued an
  // UberStruct for the associated |id_pair|.
  virtual void ScheduleUpdateForSession(zx::time requested_presentation_time,
                                        scheduling::SchedulingIdPair id_pair) = 0;
};

}  // namespace flatland

#endif  // SRC_UI_SCENIC_LIB_FLATLAND_FLATLAND_PRESENTER_H_
