| // Copyright 2021 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_VIEW_TREE_VIEW_TREE_SNAPSHOTTER_H_ |
| #define SRC_UI_SCENIC_LIB_VIEW_TREE_VIEW_TREE_SNAPSHOTTER_H_ |
| |
| #include <lib/async/dispatcher.h> |
| |
| #include <vector> |
| |
| #include "src/ui/scenic/lib/scheduling/frame_scheduler.h" |
| #include "src/ui/scenic/lib/view_tree/snapshot_types.h" |
| |
| namespace view_tree { |
| |
| using SubtreeSnapshotGenerator = fit::function<SubtreeSnapshot()>; |
| |
| // Class for building and handing out snapshots of a ViewTree out of subtrees. |
| // All calls to ViewTreeSnapshotter must be made on the same thread. |
| class ViewTreeSnapshotter final : public scheduling::SessionUpdater { |
| public: |
| struct Subscriber { |
| // |on_new_view_tree| will run on |dispatcher|. |
| // |on_new_view_tree| must be safe to call repeatedly for the lifetime of ViewTreeSnapshotter |
| OnNewViewTree on_new_view_tree; |
| // |dispatcher| must outlive ViewTreeSnapshotter. |
| async_dispatcher_t* dispatcher = nullptr; |
| }; |
| |
| // Each element in |subtrees| will be called once for every call to UpdateSnapshot(). Each |
| // closure may generate any number of SubtreeSnapshots with any connectivity, but the very first |
| // received SubtreeSnapshots from the first SubtreeSnapshotGenerator *must* be the root of the |
| // full ViewTree and the combined set of all SubtreeSnapshots from all |subtrees| *must* |
| // constitute a fully connected ViewTree. |
| // Each element in |subtrees| must be safe to call repeatedly on this thread for |
| // the lifetime of ViewTreeSnapshotter. |
| // |
| // The |on_new_view_tree| closure of each subscriber in |subscribers| will be called at the |
| // end of every UpdateSnapshot() call with the new snapshot, on their individual dispatcher. |
| // All subscriber callbacks must be safe to queue on their dispatchers for the lifetime of |
| // ViewTreeSnapshotter. |
| explicit ViewTreeSnapshotter(std::vector<SubtreeSnapshotGenerator> subtrees, |
| std::vector<Subscriber> subscribers); |
| ~ViewTreeSnapshotter() = default; |
| |
| // |scheduling::SessionUpdater| |
| // Must be called after all other SessionUpdaters. |
| UpdateResults UpdateSessions( |
| const std::unordered_map<scheduling::SessionId, scheduling::PresentId>& sessions_to_update, |
| uint64_t trace_id) override { |
| UpdateSnapshot(); |
| return {}; |
| }; |
| // |scheduling::SessionUpdater| |
| void OnCpuWorkDone() override{}; |
| // |scheduling::SessionUpdater| |
| void OnFramePresented( |
| const std::unordered_map<scheduling::SessionId, std::map<scheduling::PresentId, zx::time>>& |
| latched_times, |
| scheduling::PresentTimestamps present_times) override{}; |
| |
| private: |
| // Calls each SubtreeSnapshotGenerator() in |subtree_generators_| in turn, combines the results |
| // into a snapshot and hands out the snapshot to each subscriber in |subscriber_callbacks_|. |
| void UpdateSnapshot() const; |
| |
| const std::vector<SubtreeSnapshotGenerator> subtree_generators_; |
| std::vector<OnNewViewTree> subscriber_callbacks_; |
| }; |
| |
| } // namespace view_tree |
| |
| #endif // SRC_UI_SCENIC_LIB_VIEW_TREE_VIEW_TREE_SNAPSHOTTER_H_ |