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 CC_MOJO_EMBEDDER_ASYNC_LAYER_TREE_FRAME_SINK_H_ 6 #define CC_MOJO_EMBEDDER_ASYNC_LAYER_TREE_FRAME_SINK_H_ 7 8 #include <memory> 9 #include <string> 10 #include <vector> 11 12 #include "base/memory/read_only_shared_memory_region.h" 13 #include "base/memory/weak_ptr.h" 14 #include "base/single_thread_task_runner.h" 15 #include "cc/mojo_embedder/mojo_embedder_export.h" 16 #include "cc/trees/layer_tree_frame_sink.h" 17 #include "components/viz/common/frame_sinks/begin_frame_source.h" 18 #include "components/viz/common/frame_timing_details_map.h" 19 #include "components/viz/common/gpu/context_provider.h" 20 #include "components/viz/common/surfaces/parent_local_surface_id_allocator.h" 21 #include "components/viz/common/surfaces/surface_id.h" 22 #include "mojo/public/cpp/bindings/associated_remote.h" 23 #include "mojo/public/cpp/bindings/pending_associated_remote.h" 24 #include "mojo/public/cpp/bindings/pending_receiver.h" 25 #include "mojo/public/cpp/bindings/pending_remote.h" 26 #include "mojo/public/cpp/bindings/receiver.h" 27 #include "mojo/public/cpp/bindings/remote.h" 28 #include "services/viz/public/mojom/compositing/compositor_frame_sink.mojom.h" 29 30 namespace cc { 31 namespace mojo_embedder { 32 33 // A mojo-based implementation of LayerTreeFrameSink. The typically-used 34 // implementation for cc instances that do not share a process with the viz 35 // display compositor. 36 class CC_MOJO_EMBEDDER_EXPORT AsyncLayerTreeFrameSink 37 : public LayerTreeFrameSink, 38 public viz::mojom::CompositorFrameSinkClient, 39 public viz::ExternalBeginFrameSourceClient { 40 public: 41 struct CC_MOJO_EMBEDDER_EXPORT UnboundMessagePipes { 42 UnboundMessagePipes(); 43 ~UnboundMessagePipes(); 44 UnboundMessagePipes(UnboundMessagePipes&& other); 45 46 bool HasUnbound() const; 47 48 // Only one of |compositor_frame_sink_remote| or 49 // |compositor_frame_sink_associated_remote| should be set. 50 mojo::PendingRemote<viz::mojom::CompositorFrameSink> 51 compositor_frame_sink_remote; 52 mojo::PendingAssociatedRemote<viz::mojom::CompositorFrameSink> 53 compositor_frame_sink_associated_remote; 54 mojo::PendingReceiver<viz::mojom::CompositorFrameSinkClient> 55 client_receiver; 56 }; 57 58 struct CC_MOJO_EMBEDDER_EXPORT InitParams { 59 InitParams(); 60 ~InitParams(); 61 62 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner; 63 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager = nullptr; 64 std::unique_ptr<viz::SyntheticBeginFrameSource> 65 synthetic_begin_frame_source; 66 UnboundMessagePipes pipes; 67 bool wants_animate_only_begin_frames = false; 68 const char* client_name = nullptr; 69 }; 70 71 AsyncLayerTreeFrameSink( 72 scoped_refptr<viz::ContextProvider> context_provider, 73 scoped_refptr<viz::RasterContextProvider> worker_context_provider, 74 InitParams* params); 75 AsyncLayerTreeFrameSink(const AsyncLayerTreeFrameSink&) = delete; 76 ~AsyncLayerTreeFrameSink() override; 77 78 AsyncLayerTreeFrameSink& operator=(const AsyncLayerTreeFrameSink&) = delete; 79 local_surface_id()80 const viz::LocalSurfaceId& local_surface_id() const { 81 return local_surface_id_; 82 } 83 84 // LayerTreeFrameSink implementation. 85 bool BindToClient(LayerTreeFrameSinkClient* client) override; 86 void DetachFromClient() override; 87 void SetLocalSurfaceId(const viz::LocalSurfaceId& local_surface_id) override; 88 void SubmitCompositorFrame(viz::CompositorFrame frame, 89 bool hit_test_data_changed, 90 bool show_hit_test_borders) override; 91 void DidNotProduceFrame(const viz::BeginFrameAck& ack) override; 92 void DidAllocateSharedBitmap(base::ReadOnlySharedMemoryRegion region, 93 const viz::SharedBitmapId& id) override; 94 void DidDeleteSharedBitmap(const viz::SharedBitmapId& id) override; 95 get_last_hit_test_data_for_testing()96 const viz::HitTestRegionList& get_last_hit_test_data_for_testing() const { 97 return last_hit_test_data_; 98 } 99 100 private: 101 // mojom::CompositorFrameSinkClient implementation: 102 void DidReceiveCompositorFrameAck( 103 const std::vector<viz::ReturnedResource>& resources) override; 104 void OnBeginFrame(const viz::BeginFrameArgs& begin_frame_args, 105 const viz::FrameTimingDetailsMap& timing_details) override; 106 void OnBeginFramePausedChanged(bool paused) override; 107 void ReclaimResources( 108 const std::vector<viz::ReturnedResource>& resources) override; 109 110 // ExternalBeginFrameSourceClient implementation. 111 void OnNeedsBeginFrames(bool needs_begin_frames) override; 112 113 void OnMojoConnectionError(uint32_t custom_reason, 114 const std::string& description); 115 116 bool begin_frames_paused_ = false; 117 bool needs_begin_frames_ = false; 118 viz::LocalSurfaceId local_surface_id_; 119 std::unique_ptr<viz::ExternalBeginFrameSource> begin_frame_source_; 120 std::unique_ptr<viz::SyntheticBeginFrameSource> synthetic_begin_frame_source_; 121 122 // Message pipes that will be bound when BindToClient() is called. 123 UnboundMessagePipes pipes_; 124 125 // One of |compositor_frame_sink_| or |compositor_frame_sink_associated_| will 126 // be bound after calling BindToClient(). |compositor_frame_sink_ptr_| will 127 // point to message pipe we want to use. 128 viz::mojom::CompositorFrameSink* compositor_frame_sink_ptr_ = nullptr; 129 mojo::Remote<viz::mojom::CompositorFrameSink> compositor_frame_sink_; 130 mojo::AssociatedRemote<viz::mojom::CompositorFrameSink> 131 compositor_frame_sink_associated_; 132 mojo::Receiver<viz::mojom::CompositorFrameSinkClient> client_receiver_{this}; 133 134 THREAD_CHECKER(thread_checker_); 135 const bool wants_animate_only_begin_frames_; 136 137 viz::HitTestRegionList last_hit_test_data_; 138 139 viz::LocalSurfaceId last_submitted_local_surface_id_; 140 float last_submitted_device_scale_factor_ = 1.f; 141 gfx::Size last_submitted_size_in_pixels_; 142 143 base::WeakPtrFactory<AsyncLayerTreeFrameSink> weak_factory_{this}; 144 }; 145 146 } // namespace mojo_embedder 147 } // namespace cc 148 149 #endif // CC_MOJO_EMBEDDER_ASYNC_LAYER_TREE_FRAME_SINK_H_ 150