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