1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
android_webview / browser / gfx / display_scheduler_webview.h [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ANDROID_WEBVIEW_BROWSER_GFX_DISPLAY_SCHEDULER_WEBVIEW_H_
#define ANDROID_WEBVIEW_BROWSER_GFX_DISPLAY_SCHEDULER_WEBVIEW_H_
#include <map>
#include "base/memory/raw_ptr.h"
#include "base/scoped_observation.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread_checker.h"
#include "components/viz/service/display/display_scheduler.h"
#include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
#include "components/viz/service/frame_sinks/frame_sink_observer.h"
#include "components/viz/service/surfaces/surface_manager.h"
#include "components/viz/service/surfaces/surface_observer.h"
namespace android_webview {
class RootFrameSink;
class OverlaysInfoProvider {
public:
virtual bool IsFrameSinkOverlayed(viz::FrameSinkId frame_sink_id) = 0;
};
// Lifetime: WebView
class DisplaySchedulerWebView : public viz::DisplaySchedulerBase,
public viz::SurfaceObserver,
public viz::FrameSinkObserver {
public:
DisplaySchedulerWebView(RootFrameSink* root_frame_sink,
OverlaysInfoProvider* overlays_info_provider);
~DisplaySchedulerWebView() override;
// DisplaySchedulerBase implementation.
void SetVisible(bool visible) override {}
void ForceImmediateSwapIfPossible() override;
void SetNeedsOneBeginFrame(bool needs_draw) override;
void DidSwapBuffers() override;
void DidReceiveSwapBuffersAck() override {}
void OutputSurfaceLost() override;
void ReportFrameTime(
base::TimeDelta frame_time,
base::flat_set<base::PlatformThreadId> animation_thread_ids,
base::flat_set<base::PlatformThreadId> renderer_main_thread_ids,
base::TimeTicks draw_start,
viz::HintSession::BoostType boost_type) override {}
// DisplayDamageTracker::Delegate implementation.
void OnDisplayDamaged(viz::SurfaceId surface_id) override;
void OnRootFrameMissing(bool missing) override {}
void OnPendingSurfacesChanged() override {}
// SurfaceObserver implementation.
void OnSurfaceHasNewUncommittedFrame(
const viz::SurfaceId& surface_id) override;
// FrameSinkObserver implementation.
void OnCaptureStarted(const viz::FrameSinkId& frame_sink_id) override;
private:
bool IsFrameSinkOverlayed(viz::FrameSinkId frame_sink_id);
const raw_ptr<RootFrameSink> root_frame_sink_;
// This count how many times specific sink damaged display. It's incremented
// in OnDisplayDamaged and decremented in DidSwapBuffers.
std::map<viz::FrameSinkId, int> damaged_frames_;
// Due to destruction order in viz::Display this might be not safe to use in
// destructor of this class.
const raw_ptr<OverlaysInfoProvider, DanglingUntriaged>
overlays_info_provider_;
base::ScopedObservation<viz::SurfaceManager, viz::SurfaceObserver>
surface_manager_observation_{this};
base::ScopedObservation<viz::FrameSinkManagerImpl, viz::FrameSinkObserver>
frame_sink_manager_observation_{this};
const bool use_new_invalidate_heuristic_;
THREAD_CHECKER(thread_checker_);
};
} // namespace android_webview
#endif // ANDROID_WEBVIEW_BROWSER_GFX_DISPLAY_SCHEDULER_WEBVIEW_H_