Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(466)

Side by Side Diff: cc/test/layer_tree_host_remote_for_testing.cc

Issue 2401703002: cc/blimp: Set up the framework for LayerTreeTests in remote mode. (Closed)
Patch Set: Rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/test/layer_tree_host_remote_for_testing.h ('k') | cc/test/layer_tree_test.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2016 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 #include "cc/test/layer_tree_host_remote_for_testing.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "cc/animation/animation_host.h"
9 #include "cc/blimp/compositor_proto_state.h"
10 #include "cc/blimp/compositor_state_deserializer.h"
11 #include "cc/blimp/remote_compositor_bridge.h"
12 #include "cc/proto/compositor_message.pb.h"
13 #include "cc/test/fake_image_serialization_processor.h"
14 #include "cc/test/remote_client_layer_factory.h"
15 #include "cc/trees/layer_tree_host_client.h"
16 #include "cc/trees/layer_tree_host_in_process.h"
17
18 namespace cc {
19
20 class LayerTreeHostRemoteForTesting::RemoteCompositorBridgeImpl
21 : public RemoteCompositorBridge {
22 public:
23 RemoteCompositorBridgeImpl(
24 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner)
25 : RemoteCompositorBridge(std::move(compositor_main_task_runner)) {}
26
27 ~RemoteCompositorBridgeImpl() override = default;
28
29 void SetRemoteHost(LayerTreeHostRemoteForTesting* layer_tree_host_remote) {
30 DCHECK(layer_tree_host_remote);
31 layer_tree_host_remote_ = layer_tree_host_remote;
32 }
33
34 // RemoteCompositorBridge implementation.
35 void BindToClient(RemoteCompositorBridgeClient* client) override {
36 DCHECK(!client_);
37 client_ = client;
38 }
39 void ScheduleMainFrame() override {
40 layer_tree_host_remote_->RemoteHostNeedsMainFrame();
41 }
42 void ProcessCompositorStateUpdate(
43 std::unique_ptr<CompositorProtoState> compositor_proto_state) override {
44 layer_tree_host_remote_->ProcessRemoteCompositorUpdate(
45 std::move(compositor_proto_state));
46 }
47
48 private:
49 LayerTreeHostRemoteForTesting* layer_tree_host_remote_ = nullptr;
50 RemoteCompositorBridgeClient* client_ = nullptr;
51 };
52
53 class LayerTreeHostRemoteForTesting::LayerTreeHostInProcessClient
54 : public LayerTreeHostClient {
55 public:
56 LayerTreeHostInProcessClient(
57 LayerTreeHostRemoteForTesting* layer_tree_host_remote)
58 : layer_tree_host_remote_(layer_tree_host_remote) {}
59
60 ~LayerTreeHostInProcessClient() override = default;
61
62 void WillBeginMainFrame() override {}
63 void BeginMainFrame(const BeginFrameArgs& args) override {
64 layer_tree_host_remote_->BeginMainFrame();
65 }
66 void BeginMainFrameNotExpectedSoon() override {}
67 void DidBeginMainFrame() override {}
68 void UpdateLayerTreeHost() override {
69 layer_tree_host_remote_->UpdateStateOnInProcessHost();
70 }
71 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
72 const gfx::Vector2dF& outer_delta,
73 const gfx::Vector2dF& elastic_overscroll_delta,
74 float page_scale,
75 float top_controls_delta) override {
76 // TODO(khushalsagar): Hook up when scroll/scale sync is added.
77 }
78 void RequestNewCompositorFrameSink() override {
79 layer_tree_host_remote_->client()->RequestNewCompositorFrameSink();
80 }
81 void DidInitializeCompositorFrameSink() override {
82 layer_tree_host_remote_->client()->DidInitializeCompositorFrameSink();
83 }
84 void DidFailToInitializeCompositorFrameSink() override {
85 layer_tree_host_remote_->client()->DidFailToInitializeCompositorFrameSink();
86 }
87 void WillCommit() override {}
88 void DidCommit() override {}
89 void DidCommitAndDrawFrame() override {
90 layer_tree_host_remote_->client()->DidCommitAndDrawFrame();
91 }
92 void DidCompleteSwapBuffers() override {
93 layer_tree_host_remote_->client()->DidCompleteSwapBuffers();
94 }
95 void DidCompletePageScaleAnimation() override {
96 NOTREACHED() << "The remote mode doesn't support sending animations";
97 }
98
99 private:
100 LayerTreeHostRemoteForTesting* layer_tree_host_remote_;
101 };
102
103 // static
104 std::unique_ptr<RemoteCompositorBridge>
105 LayerTreeHostRemoteForTesting::CreateRemoteCompositorBridge(
106 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) {
107 return base::MakeUnique<RemoteCompositorBridgeImpl>(
108 std::move(main_task_runner));
109 }
110
111 // static
112 std::unique_ptr<LayerTreeHostRemoteForTesting>
113 LayerTreeHostRemoteForTesting::Create(
114 LayerTreeHostClient* client,
115 std::unique_ptr<AnimationHost> animation_host,
116 LayerTreeSettings const* settings,
117 SharedBitmapManager* shared_bitmap_manager,
118 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
119 TaskGraphRunner* task_graph_runner,
120 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
121 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
122 std::unique_ptr<FakeImageSerializationProcessor>
123 image_serialization_processor =
124 base::MakeUnique<FakeImageSerializationProcessor>();
125
126 LayerTreeHostRemote::InitParams params;
127 params.client = client;
128 params.main_task_runner = main_task_runner;
129 params.animation_host = std::move(animation_host);
130 params.remote_compositor_bridge =
131 CreateRemoteCompositorBridge(main_task_runner);
132 params.engine_picture_cache =
133 image_serialization_processor->CreateEnginePictureCache();
134 params.settings = settings;
135
136 std::unique_ptr<LayerTreeHostRemoteForTesting> layer_tree_host =
137 base::WrapUnique(new LayerTreeHostRemoteForTesting(&params));
138 layer_tree_host->Initialize(shared_bitmap_manager, gpu_memory_buffer_manager,
139 task_graph_runner, main_task_runner,
140 impl_task_runner,
141 std::move(image_serialization_processor));
142 return layer_tree_host;
143 }
144
145 LayerTreeHostRemoteForTesting::LayerTreeHostRemoteForTesting(InitParams* params)
146 : LayerTreeHostRemote(params),
147 layer_tree_host_in_process_client_(
148 base::MakeUnique<LayerTreeHostInProcessClient>(this)) {}
149
150 LayerTreeHostRemoteForTesting::~LayerTreeHostRemoteForTesting() {
151 compositor_state_deserializer_ = nullptr;
152 layer_tree_host_in_process_ = nullptr;
153 }
154
155 void LayerTreeHostRemoteForTesting::SetVisible(bool visible) {
156 LayerTreeHostRemote::SetVisible(visible);
157
158 // We need to tell the InProcessHost about visibility changes as well.
159 layer_tree_host_in_process_->SetVisible(visible);
160 }
161
162 void LayerTreeHostRemoteForTesting::SetCompositorFrameSink(
163 std::unique_ptr<CompositorFrameSink> compositor_frame_sink) {
164 // Pass through to the InProcessHost since this should be called only in
165 // response to a request made by it.
166 layer_tree_host_in_process_->SetCompositorFrameSink(
167 std::move(compositor_frame_sink));
168 }
169
170 std::unique_ptr<CompositorFrameSink>
171 LayerTreeHostRemoteForTesting::ReleaseCompositorFrameSink() {
172 // Pass through to the InProcessHost since that holds the CompositorFrameSink.
173 return layer_tree_host_in_process_->ReleaseCompositorFrameSink();
174 }
175
176 void LayerTreeHostRemoteForTesting::SetNeedsRedraw() {
177 // Draw requests pass through to the InProcessHost.
178 layer_tree_host_in_process_->SetNeedsRedraw();
179 }
180
181 void LayerTreeHostRemoteForTesting::SetNeedsRedrawRect(
182 const gfx::Rect& damage_rect) {
183 // Draw requests pass through to the InProcessHost.
184 layer_tree_host_in_process_->SetNeedsRedrawRect(damage_rect);
185 }
186
187 void LayerTreeHostRemoteForTesting::SetNextCommitForcesRedraw() {
188 // Draw requests pass through to the InProcessHost.
189 layer_tree_host_in_process_->SetNextCommitForcesRedraw();
190 }
191
192 void LayerTreeHostRemoteForTesting::NotifyInputThrottledUntilCommit() {
193 // Pass through because the InProcessHost has the input handler.
194 layer_tree_host_in_process_->NotifyInputThrottledUntilCommit();
195 }
196
197 const base::WeakPtr<InputHandler>&
198 LayerTreeHostRemoteForTesting::GetInputHandler() const {
199 return layer_tree_host_in_process_->GetInputHandler();
200 }
201
202 void LayerTreeHostRemoteForTesting::Initialize(
203 SharedBitmapManager* shared_bitmap_manager,
204 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
205 TaskGraphRunner* task_graph_runner,
206 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
207 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
208 std::unique_ptr<FakeImageSerializationProcessor>
209 image_serialization_processor) {
210 image_serialization_processor_ = std::move(image_serialization_processor);
211 RemoteCompositorBridgeImpl* remote_compositor_bridge_impl =
212 static_cast<RemoteCompositorBridgeImpl*>(remote_compositor_bridge());
213 remote_compositor_bridge_impl->SetRemoteHost(this);
214
215 layer_tree_host_in_process_ = CreateLayerTreeHostInProcess(
216 layer_tree_host_in_process_client_.get(), shared_bitmap_manager,
217 gpu_memory_buffer_manager, task_graph_runner, GetSettings(),
218 main_task_runner, impl_task_runner);
219
220 compositor_state_deserializer_ =
221 base::MakeUnique<CompositorStateDeserializer>(
222 layer_tree_host_in_process_.get(),
223 image_serialization_processor_->CreateClientPictureCache(),
224 base::Bind(&LayerTreeHostRemoteForTesting::LayerDidScroll,
225 base::Unretained(this)),
226 this);
227
228 // Override the LayerFactory since a lot of tests rely on the fact that Layers
229 // and LayerImpls have matching ids.
230 compositor_state_deserializer_->SetLayerFactoryForTesting(
231 base::MakeUnique<RemoteClientLayerFactory>());
232
233 // Override the TaskRunnerProvider since tests may rely on accessing the impl
234 // task runner using it.
235 SetTaskRunnerProviderForTesting(
236 TaskRunnerProvider::Create(main_task_runner, impl_task_runner));
237 }
238
239 std::unique_ptr<LayerTreeHostInProcess>
240 LayerTreeHostRemoteForTesting::CreateLayerTreeHostInProcess(
241 LayerTreeHostClient* client,
242 SharedBitmapManager* shared_bitmap_manager,
243 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
244 TaskGraphRunner* task_graph_runner,
245 const LayerTreeSettings& settings,
246 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
247 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
248 LayerTreeHostInProcess::InitParams params;
249
250 params.client = client;
251 params.shared_bitmap_manager = shared_bitmap_manager;
252 params.gpu_memory_buffer_manager = gpu_memory_buffer_manager;
253 params.task_graph_runner = task_graph_runner;
254 params.settings = &settings;
255 params.main_task_runner = main_task_runner;
256 params.animation_host = AnimationHost::CreateMainInstance();
257
258 return LayerTreeHostInProcess::CreateThreaded(impl_task_runner, &params);
259 }
260
261 void LayerTreeHostRemoteForTesting::DispatchDrawAndSwapCallbacks() {
262 // Don't dispatch callbacks right after the commit on the remote host. Since
263 // tests rely on CompositorFrames being swapped on the CompositorFrameSink,
264 // we wait for these callbacks from the LayerTreeHostInProcess.
265 }
266
267 bool LayerTreeHostRemoteForTesting::ShouldRetainClientScroll(
268 int engine_layer_id,
269 const gfx::ScrollOffset& new_offset) {
270 return false;
271 }
272
273 bool LayerTreeHostRemoteForTesting::ShouldRetainClientPageScale(
274 float new_page_scale) {
275 return false;
276 }
277
278 void LayerTreeHostRemoteForTesting::LayerDidScroll(int engine_layer_id) {
279 // TODO(khushalsagar): Hook up when scroll/scale sync is added.
280 }
281
282 void LayerTreeHostRemoteForTesting::RemoteHostNeedsMainFrame() {
283 layer_tree_host_in_process_->SetNeedsAnimate();
284 }
285
286 void LayerTreeHostRemoteForTesting::ProcessRemoteCompositorUpdate(
287 std::unique_ptr<CompositorProtoState> compositor_proto_state) {
288 pending_compositor_proto_state_ = std::move(compositor_proto_state);
289 }
290
291 void LayerTreeHostRemoteForTesting::UpdateStateOnInProcessHost() {
292 // When the InProcess host asks us to update, we de-serialize the update from
293 // the remote host.
294 if (pending_compositor_proto_state_) {
295 const proto::LayerTreeHost& layer_tree_host_proto =
296 pending_compositor_proto_state_->compositor_message->layer_tree_host();
297 compositor_state_deserializer_->DeserializeCompositorUpdate(
298 layer_tree_host_proto);
299
300 pending_compositor_proto_state_ = nullptr;
301
302 // The only case where the remote host would give a compositor update is if
303 // they wanted the main frame to go till the commit pipeline stage. So
304 // request one to make sure that the in process main frame also goes till
305 // the commit step.
306 layer_tree_host_in_process_->SetNeedsCommit();
307 }
308 }
309
310 } // namespace cc
OLDNEW
« no previous file with comments | « cc/test/layer_tree_host_remote_for_testing.h ('k') | cc/test/layer_tree_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698