1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_ROOT_COMPOSITOR_FRAME_SINK_IMPL_H_
6 #define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_ROOT_COMPOSITOR_FRAME_SINK_IMPL_H_
7 
8 #include <memory>
9 #include <vector>
10 
11 #include "base/macros.h"
12 #include "base/memory/read_only_shared_memory_region.h"
13 #include "build/build_config.h"
14 #include "components/viz/common/surfaces/frame_sink_id.h"
15 #include "components/viz/common/surfaces/local_surface_id.h"
16 #include "components/viz/service/display/display_client.h"
17 #include "components/viz/service/display/frame_rate_decider.h"
18 #include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
19 #include "mojo/public/cpp/bindings/associated_receiver.h"
20 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
21 #include "mojo/public/cpp/bindings/pending_remote.h"
22 #include "mojo/public/cpp/bindings/remote.h"
23 #include "services/viz/privileged/mojom/compositing/display_private.mojom.h"
24 #include "services/viz/privileged/mojom/compositing/frame_sink_manager.mojom.h"
25 #include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h"
26 
27 namespace viz {
28 
29 class Display;
30 class OutputSurfaceProvider;
31 class ExternalBeginFrameSource;
32 class FrameSinkManagerImpl;
33 class SyntheticBeginFrameSource;
34 class VSyncParameterListener;
35 
36 // The viz portion of a root CompositorFrameSink. Holds the Binding/InterfacePtr
37 // for the mojom::CompositorFrameSink interface and owns the Display.
38 class RootCompositorFrameSinkImpl : public mojom::CompositorFrameSink,
39                                     public mojom::DisplayPrivate,
40                                     public DisplayClient {
41  public:
42   // Creates a new RootCompositorFrameSinkImpl.
43   static std::unique_ptr<RootCompositorFrameSinkImpl> Create(
44       mojom::RootCompositorFrameSinkParamsPtr params,
45       FrameSinkManagerImpl* frame_sink_manager,
46       OutputSurfaceProvider* output_surface_provider,
47       uint32_t restart_id,
48       bool run_all_compositor_stages_before_draw,
49       const DebugRendererSettings* debug_settings);
50 
51   ~RootCompositorFrameSinkImpl() override;
52 
53   // mojom::DisplayPrivate:
54   void SetDisplayVisible(bool visible) override;
55 #if defined(OS_WIN)
56   void DisableSwapUntilResize(DisableSwapUntilResizeCallback callback) override;
57 #endif
58   void Resize(const gfx::Size& size) override;
59   void SetDisplayColorMatrix(const gfx::Transform& color_matrix) override;
60   void SetDisplayColorSpaces(
61       const gfx::DisplayColorSpaces& display_color_spaces) override;
62   void SetOutputIsSecure(bool secure) override;
63   void SetDisplayVSyncParameters(base::TimeTicks timebase,
64                                  base::TimeDelta interval) override;
65   void ForceImmediateDrawAndSwapIfPossible() override;
66 #if defined(OS_ANDROID)
67   void SetVSyncPaused(bool paused) override;
68   void UpdateRefreshRate(float refresh_rate) override;
69   void SetSupportedRefreshRates(
70       const std::vector<float>& supported_refresh_rates) override;
71 #endif
72   void AddVSyncParameterObserver(
73       mojo::PendingRemote<mojom::VSyncParameterObserver> observer) override;
74 
75   void SetDelegatedInkPointRenderer(
76       mojo::PendingReceiver<mojom::DelegatedInkPointRenderer> receiver)
77       override;
78 
79   // mojom::CompositorFrameSink:
80   void SetNeedsBeginFrame(bool needs_begin_frame) override;
81   void SetWantsAnimateOnlyBeginFrames() override;
82   void SubmitCompositorFrame(
83       const LocalSurfaceId& local_surface_id,
84       CompositorFrame frame,
85       base::Optional<HitTestRegionList> hit_test_region_list,
86       uint64_t submit_time) override;
87   void DidNotProduceFrame(const BeginFrameAck& begin_frame_ack) override;
88   void DidAllocateSharedBitmap(base::ReadOnlySharedMemoryRegion region,
89                                const SharedBitmapId& id) override;
90   void DidDeleteSharedBitmap(const SharedBitmapId& id) override;
91   void SubmitCompositorFrameSync(
92       const LocalSurfaceId& local_surface_id,
93       CompositorFrame frame,
94       base::Optional<HitTestRegionList> hit_test_region_list,
95       uint64_t submit_time,
96       SubmitCompositorFrameSyncCallback callback) override;
97   void InitializeCompositorFrameSinkType(
98       mojom::CompositorFrameSinkType type) override;
99 
100   base::ScopedClosureRunner GetCacheBackBufferCb();
101 
102  private:
103   RootCompositorFrameSinkImpl(
104       FrameSinkManagerImpl* frame_sink_manager,
105       const FrameSinkId& frame_sink_id,
106       mojo::PendingAssociatedReceiver<mojom::CompositorFrameSink>
107           frame_sink_receiver,
108       mojo::PendingRemote<mojom::CompositorFrameSinkClient> frame_sink_client,
109       mojo::PendingAssociatedReceiver<mojom::DisplayPrivate> display_receiver,
110       mojo::Remote<mojom::DisplayClient> display_client,
111       std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source,
112       std::unique_ptr<ExternalBeginFrameSource> external_begin_frame_source,
113       std::unique_ptr<Display> display,
114       bool use_preferred_interval_for_video,
115       bool hw_support_for_multiple_refresh_rates,
116       size_t num_of_frames_to_toggle_interval);
117 
118   // DisplayClient:
119   void DisplayOutputSurfaceLost() override;
120   void DisplayWillDrawAndSwap(bool will_draw_and_swap,
121                               AggregatedRenderPassList* render_passes) override;
122   void DisplayDidDrawAndSwap() override;
123   void DisplayDidReceiveCALayerParams(
124       const gfx::CALayerParams& ca_layer_params) override;
125   void DisplayDidCompleteSwapWithSize(const gfx::Size& pixel_size) override;
126   void SetWideColorEnabled(bool enabled) override;
127   void SetPreferredFrameInterval(base::TimeDelta interval) override;
128   base::TimeDelta GetPreferredFrameIntervalForFrameSinkId(
129       const FrameSinkId& id,
130       mojom::CompositorFrameSinkType* type) override;
131 
132   void UpdateVSyncParameters();
133   BeginFrameSource* begin_frame_source();
134 
135   mojo::Remote<mojom::CompositorFrameSinkClient> compositor_frame_sink_client_;
136   mojo::AssociatedReceiver<mojom::CompositorFrameSink>
137       compositor_frame_sink_receiver_;
138   // |display_client_| may be NullRemote on platforms that do not use it.
139   mojo::Remote<mojom::DisplayClient> display_client_;
140   mojo::AssociatedReceiver<mojom::DisplayPrivate> display_private_receiver_;
141 
142   std::unique_ptr<VSyncParameterListener> vsync_listener_;
143 
144   // Must be destroyed before |compositor_frame_sink_client_|. This must never
145   // change for the lifetime of RootCompositorFrameSinkImpl.
146   const std::unique_ptr<CompositorFrameSinkSupport> support_;
147 
148   // RootCompositorFrameSinkImpl holds a Display and a BeginFrameSource if it
149   // was created with a non-null gpu::SurfaceHandle. The source can either be a
150   // |synthetic_begin_frame_source_| or an |external_begin_frame_source_|.
151   std::unique_ptr<SyntheticBeginFrameSource> synthetic_begin_frame_source_;
152   // If non-null, |synthetic_begin_frame_source_| will not exist.
153   std::unique_ptr<ExternalBeginFrameSource> external_begin_frame_source_;
154   // Should be destroyed before begin frame sources since it can issue callbacks
155   // to the BFS.
156   std::unique_ptr<Display> display_;
157 
158   // |use_preferred_interval_| indicates if we should use the preferred interval
159   // from FrameRateDecider to tick.
160   bool use_preferred_interval_ = false;
161   base::TimeTicks display_frame_timebase_;
162   base::TimeDelta display_frame_interval_ = BeginFrameArgs::DefaultInterval();
163   base::TimeDelta preferred_frame_interval_ =
164       FrameRateDecider::UnspecifiedFrameInterval();
165 
166 #if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_BSD)
167   gfx::Size last_swap_pixel_size_;
168 #endif
169 
170   DISALLOW_COPY_AND_ASSIGN(RootCompositorFrameSinkImpl);
171 };
172 
173 }  // namespace viz
174 
175 #endif  // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_ROOT_COMPOSITOR_FRAME_SINK_IMPL_H_
176