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