blob: 22148bd933b995d211881efbc8f36ffb8c1688b2 [file] [log] [blame]
// Copyright 2019 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_SCHEDULING_DELEGATING_FRAME_SCHEDULER_H_
#define SRC_UI_SCENIC_LIB_SCHEDULING_DELEGATING_FRAME_SCHEDULER_H_
#include <lib/fit/function.h>
#include <vector>
#include "src/lib/fxl/memory/weak_ptr.h"
#include "src/ui/scenic/lib/scheduling/frame_scheduler.h"
namespace scheduling {
// Wraps a FrameScheduler, but postpones all calls until that FrameScheduler has
// been set. When DelegatingFrameScheduler is created, the wrapped FrameScheduler
// might still be null.
class DelegatingFrameScheduler : public FrameScheduler {
public:
DelegatingFrameScheduler() = default;
DelegatingFrameScheduler(std::shared_ptr<FrameScheduler> frame_scheduler);
DelegatingFrameScheduler(const DelegatingFrameScheduler&) = delete;
DelegatingFrameScheduler(DelegatingFrameScheduler&&) = delete;
DelegatingFrameScheduler& operator=(const DelegatingFrameScheduler&) = delete;
DelegatingFrameScheduler& operator=(DelegatingFrameScheduler&&) = delete;
// |FrameScheduler|
// Calls SetFrameRenderer() immediately if a FrameScheduler has been set; otherwise defers
// the call until one has been set.
void SetFrameRenderer(fxl::WeakPtr<FrameRenderer> frame_renderer) override;
// |FrameScheduler|
// Calls AddSessionUpdater() immediately if a FrameScheduler has been set; otherwise defers
// the call until one has been set.
void AddSessionUpdater(fxl::WeakPtr<SessionUpdater> session_updater) override;
// |FrameScheduler|
// Calls SetRenderContinuously() immediately if a FrameScheduler has been set; otherwise defers
// the call until one has been set.
void SetRenderContinuously(bool render_continuously) override;
// |FrameScheduler|
// Calls SetOnUpdateFailedCallbackForSession() immediately if a FrameScheduler has been set;
// otherwise defers the call until one has been set.
void SetOnUpdateFailedCallbackForSession(
SessionId session,
FrameScheduler::OnSessionUpdateFailedCallback update_failed_callback) override;
// |FrameScheduler|
// Calls RegisterPresent() immediately if a FrameScheduler has been set, otherwise defers the call
// until one has been set. Returns a PresentId unique to the session. |present_id| should only be
// set when transferring sessions between frame schedulers.
PresentId RegisterPresent(SessionId session_id,
std::variant<OnPresentedCallback, Present2Info> present_information,
std::vector<zx::event> release_fences,
PresentId present_id = kInvalidPresentId) override;
// |FrameScheduler|
// Calls ScheduleUpdateForSession() immediately if a FrameScheduler has been set; otherwise defers
// the call until one has been set.
void ScheduleUpdateForSession(zx::time presentation_time, SchedulingIdPair id_pair) override;
// |FrameScheduler|
// Calls GetFuturePresentationInfos() immediately if a FrameScheduler has been set; otherwise
// defers the call until one has been set.
void GetFuturePresentationInfos(
zx::duration requested_prediction_span,
FrameScheduler::GetFuturePresentationInfosCallback callback) override;
// |FrameScheduler|
// Calls SetOnFramePresentedCallbackForSession() immediately if a FrameScheduler has been set;
// otherwise defers the call until one has been set.
void SetOnFramePresentedCallbackForSession(SessionId session,
OnFramePresentedCallback callback) override;
// |FrameScheduler|
// Calls RemoveSession() immediately if a FrameScheduler has been set;
// otherwise defers the call until one has been set.
void RemoveSession(SessionId session_id) override;
// Sets the frame scheduler, which triggers any pending callbacks. This method cannot be called
// twice, or called with a null pointer.
void SetFrameScheduler(const std::shared_ptr<FrameScheduler>& frame_scheduler);
private:
using OnFrameSchedulerAvailableCallback = fit::function<void(FrameScheduler*)>;
// Calls |callback| immediately if a FrameScheduler has been set; otherwise defers the call
// until one has been set.
void CallWhenFrameSchedulerAvailable(OnFrameSchedulerAvailableCallback callback);
std::shared_ptr<FrameScheduler> frame_scheduler_;
std::vector<OnFrameSchedulerAvailableCallback> call_when_frame_scheduler_available_callbacks_;
};
} // namespace scheduling
#endif // SRC_UI_SCENIC_LIB_SCHEDULING_DELEGATING_FRAME_SCHEDULER_H_