1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CC_SLIM_DELAYED_SCHEDULER_H_
6 #define CC_SLIM_DELAYED_SCHEDULER_H_
8 #include "base/component_export.h"
9 #include "base/memory/raw_ptr.h"
10 #include "cc/slim/scheduler.h"
11 #include "components/viz/common/frame_sinks/begin_frame_args.h"
15 // DelayedScheduler is optimized specifically for the case of renderer-driven
16 // scrolling of browser controls in the browser compositor on Android.
17 // The design aims to immediately submit frame whenever scroll offset arrives
19 // * Expect `MaybeCompositeNow` to be called when scroll offset from renderer
21 // * Cache BeginFrameArgs from `OnBeginFrameFromViz` and wait until either
22 // `MaybeCompositeNow` or until the next `OnBeginFrameFromViz`. This increases
23 // the latency for other cases that does not call `MaybeCompositeNow` by one
25 // * If `MaybeCompositeNow` is blocked from producing a frame due to some
26 // condition, immediately attempt producing from again if the condition
28 // TODO(boliu): Move this to //content after slim is enabled for browser
29 // compositor on android.
30 class COMPONENT_EXPORT(CC_SLIM) DelayedScheduler : public Scheduler {
33 ~DelayedScheduler() override;
35 void Initialize(SchedulerClient* client) override;
36 void OnBeginFrameFromViz(
37 const viz::BeginFrameArgs& begin_frame_args) override;
38 void OnBeginFramePausedChanged(bool paused) override;
39 void SetNeedsBeginFrame(bool needs_begin_frame) override;
40 void SetIsSwapThrottled(bool is_swap_throttled) override;
41 void MaybeCompositeNow() override;
44 void BeginFrameAndResetArgs(viz::BeginFrameArgs& args);
45 void SendDidNotProduceFrameAndResetArgs(viz::BeginFrameArgs& args);
47 raw_ptr<SchedulerClient> client_ = nullptr;
49 viz::BeginFrameArgs unused_args_;
50 bool needs_begin_frame_ = false;
51 bool is_swap_throttled_ = false;
52 bool missed_composite_now_ = false;
55 } // namespace cc::slim
57 #endif // CC_SLIM_DELAYED_SCHEDULER_H_