| // 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::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|. |
| // |
| // This function should be called from Flatland instance worker threads. |
| virtual void ScheduleUpdateForSession(zx::time requested_presentation_time, |
| scheduling::SchedulingIdPair id_pair, bool squashable, |
| std::vector<zx::event> release_fences) = 0; |
| |
| // From scheduling::FrameScheduler::GetFuturePresentationInfos(): |
| // Gets the predicted latch points and presentation times for the frames at or before the next |
| // |requested_prediction_span| time span. Uses the FramePredictor to do so. |
| // |
| // The callback is guaranteed to run on the calling thread. |
| virtual std::vector<scheduling::FuturePresentationInfo> GetFuturePresentationInfos() = 0; |
| |
| // From scheduling::FrameScheduler::RemoveSession(): |
| // |
| // Removes all references to |session_id| and schedules a new frame to clean up any leftovers. |
| // |
| // This function should be called from Flatland instance worker threads. Final clean-up is posted |
| // back on the main thread, so state may still exist after this method returns. |
| // |
| // `release_fence` provides the caller with a way to know that the effects of removing the session |
| // have (roughly) "appeared on screen", so that it is safe to e.g. release any client images that |
| // are now known not be be in use by Vulkan or the display controller. |
| virtual void RemoveSession(scheduling::SessionId session_id, |
| std::optional<zx::event> release_fence) = 0; |
| }; |
| |
| } // namespace flatland |
| |
| #endif // SRC_UI_SCENIC_LIB_FLATLAND_FLATLAND_PRESENTER_H_ |