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

Side by Side Diff: cc/trees/remote_channel_impl.cc

Issue 1513643010: cc:: Add remote mode to the compositor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addresed comments. Created 4 years, 11 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
OLDNEW
(Empty)
1 // Copyright 2015 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/trees/remote_channel_impl.h"
6
7 #include "base/bind_helpers.h"
8 #include "base/single_thread_task_runner.h"
9 #include "cc/proto/compositor_message.pb.h"
10 #include "cc/proto/compositor_message_to_impl.pb.h"
11 #include "cc/proto/compositor_message_to_main.pb.h"
12 #include "cc/trees/layer_tree_host.h"
13 #include "cc/trees/layer_tree_settings.h"
14
15 namespace cc {
16
17 scoped_ptr<RemoteChannelImpl> RemoteChannelImpl::Create(
18 LayerTreeHost* layer_tree_host,
19 RemoteProtoChannel* remote_proto_channel,
20 TaskRunnerProvider* task_runner_provider) {
21 return make_scoped_ptr(new RemoteChannelImpl(
22 layer_tree_host, remote_proto_channel, task_runner_provider));
23 }
24
25 RemoteChannelImpl::RemoteChannelImpl(LayerTreeHost* layer_tree_host,
26 RemoteProtoChannel* remote_proto_channel,
27 TaskRunnerProvider* task_runner_provider)
28 : main_thread_vars_unsafe_(layer_tree_host, remote_proto_channel),
29 task_runner_provider_(task_runner_provider) {
30 DCHECK(task_runner_provider_->IsMainThread());
31
32 main().remote_proto_channel->SetProtoReceiver(this);
33 }
34
35 RemoteChannelImpl::~RemoteChannelImpl() {
36 DCHECK(task_runner_provider_->IsMainThread());
37 DCHECK(!main().started);
38
39 main().remote_proto_channel->SetProtoReceiver(nullptr);
40 }
41
42 scoped_ptr<ProxyImpl> RemoteChannelImpl::CreateProxyImpl(
43 ChannelImpl* channel_impl,
44 LayerTreeHost* layer_tree_host,
45 TaskRunnerProvider* task_runner_provider,
46 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
vmpstr 2016/01/11 21:50:15 Is this supported or always null for now?
Khushal 2016/01/13 02:07:12 always null for now. Added a DCHECK.
47 DCHECK(task_runner_provider_->IsImplThread());
48 return ProxyImpl::Create(channel_impl, layer_tree_host, task_runner_provider,
49 std::move(external_begin_frame_source));
50 }
51
52 void RemoteChannelImpl::OnProtoReceived(
53 scoped_ptr<proto::CompositorMessage> proto) {
54 DCHECK(task_runner_provider_->IsMainThread());
55 DCHECK(main().started);
56 DCHECK(proto->has_to_impl());
57
58 proto::CompositorMessageToImpl to_impl_proto = proto->to_impl();
vmpstr 2016/01/11 21:50:15 nit: can you move the switch to a new function cal
Khushal 2016/01/13 02:07:12 Done.
59 switch (to_impl_proto.message_type()) {
60 case proto::CompositorMessageToImpl::MainThreadHasStoppedFlingingOnImpl:
61 ImplThreadTaskRunner()->PostTask(
62 FROM_HERE, base::Bind(&ProxyImpl::MainThreadHasStoppedFlingingOnImpl,
63 proxy_impl_weak_ptr_));
64 break;
65 default:
66 // TODO(khushalsagar): Add more types here.
67 NOTIMPLEMENTED();
68 }
69 }
70
71 void RemoteChannelImpl::FinishAllRendering() {
72 NOTREACHED() << "Should be called on the server LayerTreeHost";
vmpstr 2016/01/11 21:50:15 nit: Can you change the error to be more about wha
Khushal 2016/01/13 02:07:12 Done.
73 }
74
75 bool RemoteChannelImpl::IsStarted() const {
76 DCHECK(task_runner_provider_->IsMainThread());
77 return main().started;
78 }
79
80 bool RemoteChannelImpl::CommitToActiveTree() const {
81 return false;
82 }
83
84 void RemoteChannelImpl::SetOutputSurface(OutputSurface* output_surface) {
85 DCHECK(task_runner_provider_->IsMainThread());
86 ImplThreadTaskRunner()->PostTask(
87 FROM_HERE, base::Bind(&ProxyImpl::InitializeOutputSurfaceOnImpl,
88 proxy_impl_weak_ptr_, output_surface));
89 }
90
91 void RemoteChannelImpl::ReleaseOutputSurface() {
92 DCHECK(task_runner_provider_->IsMainThread());
93 CompletionEvent completion;
94 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
95 ImplThreadTaskRunner()->PostTask(
96 FROM_HERE, base::Bind(&ProxyImpl::ReleaseOutputSurfaceOnImpl,
97 proxy_impl_weak_ptr_, &completion));
98 completion.Wait();
99 }
100
101 void RemoteChannelImpl::SetVisible(bool visible) {
102 DCHECK(task_runner_provider_->IsMainThread());
103 ImplThreadTaskRunner()->PostTask(
104 FROM_HERE,
105 base::Bind(&ProxyImpl::SetVisibleOnImpl, proxy_impl_weak_ptr_, visible));
106 }
107
108 void RemoteChannelImpl::SetThrottleFrameProduction(bool throttle) {
109 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
110 }
111
112 const RendererCapabilities& RemoteChannelImpl::GetRendererCapabilities() const {
113 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
114 return main().renderer_capabilities;
115 }
116
117 void RemoteChannelImpl::SetNeedsAnimate() {
118 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
vmpstr 2016/01/11 21:50:15 LayerTreeHost or RemoteChannelImpl?
Khushal 2016/01/13 02:07:12 Basically this call should not be made to the prox
119 }
120
121 void RemoteChannelImpl::SetNeedsUpdateLayers() {
122 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
123 }
124
125 void RemoteChannelImpl::SetNeedsCommit() {
126 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
127 }
128
129 void RemoteChannelImpl::SetNeedsRedraw(const gfx::Rect& damage_rect) {
130 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
131 }
132
133 void RemoteChannelImpl::SetNextCommitWaitsForActivation() {
134 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
135 }
136
137 void RemoteChannelImpl::NotifyInputThrottledUntilCommit() {
138 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
139 }
140
141 void RemoteChannelImpl::SetDeferCommits(bool defer_commits) {
142 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
143 }
144
145 void RemoteChannelImpl::MainThreadHasStoppedFlinging() {
146 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
147 }
148
149 bool RemoteChannelImpl::CommitRequested() const {
150 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
151 return false;
152 }
153
154 bool RemoteChannelImpl::BeginMainFrameRequested() const {
155 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
156 return false;
157 }
158
159 void RemoteChannelImpl::Start(
160 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
161 DCHECK(task_runner_provider_->IsMainThread());
162 DCHECK(!main().started);
163 DCHECK(!external_begin_frame_source);
164
165 CompletionEvent completion;
166 {
167 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
168 ImplThreadTaskRunner()->PostTask(
169 FROM_HERE, base::Bind(&RemoteChannelImpl::InitializeImplOnImpl,
170 base::Unretained(this), &completion,
171 main().layer_tree_host));
172 completion.Wait();
173 }
174 main().started = true;
175 }
176
177 void RemoteChannelImpl::Stop() {
178 DCHECK(task_runner_provider_->IsMainThread());
179 DCHECK(main().started);
180
181 {
182 CompletionEvent completion;
183 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
184 ImplThreadTaskRunner()->PostTask(
185 FROM_HERE, base::Bind(&ProxyImpl::FinishGLOnImpl, proxy_impl_weak_ptr_,
186 &completion));
187 completion.Wait();
188 }
189 {
190 CompletionEvent completion;
191 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
192 ImplThreadTaskRunner()->PostTask(
193 FROM_HERE, base::Bind(&RemoteChannelImpl::ShutdownImplOnImpl,
194 base::Unretained(this), &completion));
195 completion.Wait();
196 }
197
198 main().started = false;
199 }
200
201 bool RemoteChannelImpl::SupportsImplScrolling() const {
202 return true;
203 }
204
205 void RemoteChannelImpl::SetChildrenNeedBeginFrames(
206 bool children_need_begin_frames) {
207 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
208 }
209
210 void RemoteChannelImpl::SetAuthoritativeVSyncInterval(
211 const base::TimeDelta& interval) {
212 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
213 }
214
215 void RemoteChannelImpl::UpdateTopControlsState(TopControlsState constraints,
216 TopControlsState current,
217 bool animate) {
218 NOTREACHED() << "Should not be called on the remote client LayerTreeHost";
219 }
220
221 bool RemoteChannelImpl::MainFrameWillHappenForTesting() {
222 DCHECK(task_runner_provider_->IsMainThread());
223 bool main_frame_will_happen;
224 {
225 CompletionEvent completion;
226 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
227 ImplThreadTaskRunner()->PostTask(
228 FROM_HERE,
229 base::Bind(&ProxyImpl::MainFrameWillHappenOnImplForTesting,
230 proxy_impl_weak_ptr_, &completion, &main_frame_will_happen));
231 completion.Wait();
232 }
233 return main_frame_will_happen;
234 }
235
236 void RemoteChannelImpl::DidCompleteSwapBuffers() {}
237
238 void RemoteChannelImpl::SetRendererCapabilitiesMainCopy(
239 const RendererCapabilities& capabilities) {}
240
241 void RemoteChannelImpl::BeginMainFrameNotExpectedSoon() {}
242
243 void RemoteChannelImpl::DidCommitAndDrawFrame() {}
244
245 void RemoteChannelImpl::SetAnimationEvents(
246 scoped_ptr<AnimationEventsVector> queue) {}
247
248 void RemoteChannelImpl::DidLoseOutputSurface() {}
249
250 void RemoteChannelImpl::RequestNewOutputSurface() {}
251
252 void RemoteChannelImpl::DidInitializeOutputSurface(
253 bool success,
254 const RendererCapabilities& capabilities) {}
255
256 void RemoteChannelImpl::DidCompletePageScaleAnimation() {}
257
258 void RemoteChannelImpl::PostFrameTimingEventsOnMain(
259 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
260 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) {}
261
262 void RemoteChannelImpl::BeginMainFrame(
263 scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) {}
264
265 void RemoteChannelImpl::InitializeImplOnImpl(CompletionEvent* completion,
266 LayerTreeHost* layer_tree_host) {
267 DCHECK(task_runner_provider_->IsMainThreadBlocked());
268 DCHECK(task_runner_provider_->IsImplThread());
269
270 impl().proxy_impl =
271 CreateProxyImpl(this, layer_tree_host, task_runner_provider_, nullptr);
272 impl().proxy_impl_weak_factory = make_scoped_ptr(
273 new base::WeakPtrFactory<ProxyImpl>(impl().proxy_impl.get()));
274 proxy_impl_weak_ptr_ = impl().proxy_impl_weak_factory->GetWeakPtr();
275 completion->Signal();
276 }
277
278 void RemoteChannelImpl::ShutdownImplOnImpl(CompletionEvent* completion) {
279 DCHECK(task_runner_provider_->IsMainThreadBlocked());
280 DCHECK(task_runner_provider_->IsImplThread());
281
282 // We must invalidate the proxy_impl weak ptrs and destroy the weak ptr
283 // factory before destroying proxy_impl.
284 impl().proxy_impl_weak_factory->InvalidateWeakPtrs();
285 impl().proxy_impl_weak_factory.reset();
286
287 impl().proxy_impl.reset();
288 completion->Signal();
289 }
290
291 RemoteChannelImpl::MainThreadOnly& RemoteChannelImpl::main() {
292 DCHECK(task_runner_provider_->IsMainThread());
293 return main_thread_vars_unsafe_;
294 }
295
296 const RemoteChannelImpl::MainThreadOnly& RemoteChannelImpl::main() const {
297 DCHECK(task_runner_provider_->IsMainThread());
298 return main_thread_vars_unsafe_;
299 }
300
301 RemoteChannelImpl::CompositorThreadOnly& RemoteChannelImpl::impl() {
302 DCHECK(task_runner_provider_->IsImplThread());
303 return compositor_thread_vars_unsafe_;
304 }
305
306 const RemoteChannelImpl::CompositorThreadOnly& RemoteChannelImpl::impl() const {
307 DCHECK(task_runner_provider_->IsImplThread());
308 return compositor_thread_vars_unsafe_;
309 }
310
311 base::SingleThreadTaskRunner* RemoteChannelImpl::MainThreadTaskRunner() const {
312 return task_runner_provider_->MainThreadTaskRunner();
313 }
314
315 base::SingleThreadTaskRunner* RemoteChannelImpl::ImplThreadTaskRunner() const {
316 return task_runner_provider_->ImplThreadTaskRunner();
317 }
318
319 RemoteChannelImpl::MainThreadOnly::MainThreadOnly(
320 LayerTreeHost* layer_tree_host,
321 RemoteProtoChannel* remote_proto_channel)
322 : layer_tree_host(layer_tree_host),
323 remote_proto_channel(remote_proto_channel),
324 started(false) {
325 DCHECK(layer_tree_host);
326 DCHECK(remote_proto_channel);
327 }
328
329 RemoteChannelImpl::MainThreadOnly::~MainThreadOnly() {}
330
331 RemoteChannelImpl::CompositorThreadOnly::CompositorThreadOnly()
332 : proxy_impl(nullptr), proxy_impl_weak_factory(nullptr) {}
333
334 RemoteChannelImpl::CompositorThreadOnly::~CompositorThreadOnly() {}
335
336 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698