OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/android/synchronous_compositor_host.h" | 5 #include "content/browser/android/synchronous_compositor_host.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 RenderWidgetHostViewAndroid* rwhva, | 64 RenderWidgetHostViewAndroid* rwhva, |
65 SynchronousCompositorClient* client, | 65 SynchronousCompositorClient* client, |
66 bool use_in_proc_software_draw) | 66 bool use_in_proc_software_draw) |
67 : rwhva_(rwhva), | 67 : rwhva_(rwhva), |
68 client_(client), | 68 client_(client), |
69 ui_task_runner_( | 69 ui_task_runner_( |
70 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), | 70 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), |
71 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), | 71 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), |
72 sender_(rwhva_->GetRenderWidgetHost()), | 72 sender_(rwhva_->GetRenderWidgetHost()), |
73 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), | 73 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), |
74 is_active_(false), | |
75 bytes_limit_(0u), | 74 bytes_limit_(0u), |
76 renderer_param_version_(0u), | 75 renderer_param_version_(0u), |
77 need_animate_scroll_(false), | 76 need_animate_scroll_(false), |
78 need_invalidate_count_(0u), | 77 need_invalidate_count_(0u), |
79 need_begin_frame_(false), | 78 did_activate_pending_tree_count_(0u) { |
80 did_activate_pending_tree_count_(0u), | |
81 weak_ptr_factory_(this) { | |
82 client_->DidInitializeCompositor(this); | 79 client_->DidInitializeCompositor(this); |
83 } | 80 } |
84 | 81 |
85 SynchronousCompositorHost::~SynchronousCompositorHost() { | 82 SynchronousCompositorHost::~SynchronousCompositorHost() { |
86 client_->DidDestroyCompositor(this); | 83 client_->DidDestroyCompositor(this); |
87 if (weak_ptr_factory_.HasWeakPtrs()) | |
88 UpdateStateTask(); | |
89 } | 84 } |
90 | 85 |
91 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { | 86 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { |
92 bool handled = true; | 87 bool handled = true; |
93 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) | 88 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) |
94 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated, | 89 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OutputSurfaceCreated, |
95 OutputSurfaceCreated) | 90 OutputSurfaceCreated) |
96 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) | 91 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) |
97 IPC_MESSAGE_UNHANDLED(handled = false) | 92 IPC_MESSAGE_UNHANDLED(handled = false) |
98 IPC_END_MESSAGE_MAP() | 93 IPC_END_MESSAGE_MAP() |
99 return handled; | 94 return handled; |
100 } | 95 } |
101 | 96 |
102 void SynchronousCompositorHost::DidBecomeCurrent() { | 97 void SynchronousCompositorHost::DidBecomeCurrent() { |
103 client_->DidBecomeCurrent(this); | 98 client_->DidBecomeCurrent(this); |
104 } | 99 } |
105 | 100 |
106 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( | 101 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( |
107 const gfx::Size& surface_size, | 102 const gfx::Size& surface_size, |
108 const gfx::Transform& transform, | 103 const gfx::Transform& transform, |
109 const gfx::Rect& viewport, | 104 const gfx::Rect& viewport, |
110 const gfx::Rect& clip, | 105 const gfx::Rect& clip, |
111 const gfx::Rect& viewport_rect_for_tile_priority, | 106 const gfx::Rect& viewport_rect_for_tile_priority, |
112 const gfx::Transform& transform_for_tile_priority) { | 107 const gfx::Transform& transform_for_tile_priority) { |
113 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, | 108 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, |
114 clip, viewport_rect_for_tile_priority, | 109 clip, viewport_rect_for_tile_priority, |
115 transform_for_tile_priority); | 110 transform_for_tile_priority); |
116 SynchronousCompositor::Frame frame; | 111 SynchronousCompositor::Frame frame; |
117 frame.frame.reset(new cc::CompositorFrame); | 112 frame.frame.reset(new cc::CompositorFrame); |
118 SyncCompositorCommonBrowserParams common_browser_params; | |
119 PopulateCommonParams(&common_browser_params); | |
120 SyncCompositorCommonRendererParams common_renderer_params; | 113 SyncCompositorCommonRendererParams common_renderer_params; |
121 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( | 114 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( |
122 routing_id_, common_browser_params, params, &common_renderer_params, | 115 routing_id_, params, &common_renderer_params, |
123 &frame.output_surface_id, frame.frame.get()))) { | 116 &frame.output_surface_id, frame.frame.get()))) { |
124 return SynchronousCompositor::Frame(); | 117 return SynchronousCompositor::Frame(); |
125 } | 118 } |
126 ProcessCommonParams(common_renderer_params); | 119 ProcessCommonParams(common_renderer_params); |
127 if (!frame.frame->delegated_frame_data) { | 120 if (!frame.frame->delegated_frame_data) { |
128 // This can happen if compositor did not swap in this draw. | 121 // This can happen if compositor did not swap in this draw. |
129 frame.frame.reset(); | 122 frame.frame.reset(); |
130 } | 123 } |
131 if (frame.frame) { | 124 if (frame.frame) { |
132 UpdateFrameMetaData(frame.frame->metadata); | 125 UpdateFrameMetaData(frame.frame->metadata); |
(...skipping 18 matching lines...) Expand all Loading... |
151 SynchronousCompositorSetSkCanvas(nullptr); | 144 SynchronousCompositorSetSkCanvas(nullptr); |
152 } | 145 } |
153 | 146 |
154 private: | 147 private: |
155 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas); | 148 DISALLOW_COPY_AND_ASSIGN(ScopedSetSkCanvas); |
156 }; | 149 }; |
157 | 150 |
158 } | 151 } |
159 | 152 |
160 bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) { | 153 bool SynchronousCompositorHost::DemandDrawSwInProc(SkCanvas* canvas) { |
161 SyncCompositorCommonBrowserParams common_browser_params; | |
162 PopulateCommonParams(&common_browser_params); | |
163 SyncCompositorCommonRendererParams common_renderer_params; | 154 SyncCompositorCommonRendererParams common_renderer_params; |
164 bool success = false; | 155 bool success = false; |
165 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 156 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
166 ScopedSetSkCanvas set_sk_canvas(canvas); | 157 ScopedSetSkCanvas set_sk_canvas(canvas); |
167 SyncCompositorDemandDrawSwParams params; // Unused. | 158 SyncCompositorDemandDrawSwParams params; // Unused. |
168 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( | 159 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( |
169 routing_id_, common_browser_params, params, &success, | 160 routing_id_, params, &success, &common_renderer_params, |
170 &common_renderer_params, frame.get()))) { | 161 frame.get()))) { |
171 return false; | 162 return false; |
172 } | 163 } |
173 if (!success) | 164 if (!success) |
174 return false; | 165 return false; |
175 ProcessCommonParams(common_renderer_params); | 166 ProcessCommonParams(common_renderer_params); |
176 UpdateFrameMetaData(frame->metadata); | 167 UpdateFrameMetaData(frame->metadata); |
177 return true; | 168 return true; |
178 } | 169 } |
179 | 170 |
180 class SynchronousCompositorHost::ScopedSendZeroMemory { | 171 class SynchronousCompositorHost::ScopedSendZeroMemory { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 size_t stride = info.minRowBytes(); | 211 size_t stride = info.minRowBytes(); |
221 size_t buffer_size = info.getSafeSize(stride); | 212 size_t buffer_size = info.getSafeSize(stride); |
222 if (!buffer_size) | 213 if (!buffer_size) |
223 return false; // Overflow. | 214 return false; // Overflow. |
224 | 215 |
225 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); | 216 SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); |
226 if (!software_draw_shm_) | 217 if (!software_draw_shm_) |
227 return false; | 218 return false; |
228 | 219 |
229 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 220 std::unique_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
230 SyncCompositorCommonBrowserParams common_browser_params; | |
231 PopulateCommonParams(&common_browser_params); | |
232 SyncCompositorCommonRendererParams common_renderer_params; | 221 SyncCompositorCommonRendererParams common_renderer_params; |
233 bool success = false; | 222 bool success = false; |
234 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( | 223 if (!sender_->Send(new SyncCompositorMsg_DemandDrawSw( |
235 routing_id_, common_browser_params, params, &success, | 224 routing_id_, params, &success, &common_renderer_params, |
236 &common_renderer_params, frame.get()))) { | 225 frame.get()))) { |
237 return false; | 226 return false; |
238 } | 227 } |
239 ScopedSendZeroMemory send_zero_memory(this); | 228 ScopedSendZeroMemory send_zero_memory(this); |
240 if (!success) | 229 if (!success) |
241 return false; | 230 return false; |
242 | 231 |
243 ProcessCommonParams(common_renderer_params); | 232 ProcessCommonParams(common_renderer_params); |
244 UpdateFrameMetaData(frame->metadata); | 233 UpdateFrameMetaData(frame->metadata); |
245 | 234 |
246 SkBitmap bitmap; | 235 SkBitmap bitmap; |
(...skipping 28 matching lines...) Expand all Loading... |
275 | 264 |
276 SyncCompositorSetSharedMemoryParams set_shm_params; | 265 SyncCompositorSetSharedMemoryParams set_shm_params; |
277 set_shm_params.buffer_size = buffer_size; | 266 set_shm_params.buffer_size = buffer_size; |
278 base::ProcessHandle renderer_process_handle = | 267 base::ProcessHandle renderer_process_handle = |
279 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); | 268 rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); |
280 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, | 269 if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, |
281 &set_shm_params.shm_handle)) { | 270 &set_shm_params.shm_handle)) { |
282 return; | 271 return; |
283 } | 272 } |
284 | 273 |
285 SyncCompositorCommonBrowserParams common_browser_params; | |
286 PopulateCommonParams(&common_browser_params); | |
287 bool success = false; | 274 bool success = false; |
288 SyncCompositorCommonRendererParams common_renderer_params; | 275 SyncCompositorCommonRendererParams common_renderer_params; |
289 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( | 276 if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( |
290 routing_id_, common_browser_params, set_shm_params, &success, | 277 routing_id_, set_shm_params, &success, &common_renderer_params)) || |
291 &common_renderer_params)) || | |
292 !success) { | 278 !success) { |
293 return; | 279 return; |
294 } | 280 } |
295 software_draw_shm_ = std::move(software_draw_shm); | 281 software_draw_shm_ = std::move(software_draw_shm); |
296 ProcessCommonParams(common_renderer_params); | 282 ProcessCommonParams(common_renderer_params); |
297 } | 283 } |
298 | 284 |
299 void SynchronousCompositorHost::SendZeroMemory() { | 285 void SynchronousCompositorHost::SendZeroMemory() { |
300 // No need to check return value. | 286 // No need to check return value. |
301 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); | 287 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); |
(...skipping 19 matching lines...) Expand all Loading... |
321 | 307 |
322 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset( | 308 void SynchronousCompositorHost::DidChangeRootLayerScrollOffset( |
323 const gfx::ScrollOffset& root_offset) { | 309 const gfx::ScrollOffset& root_offset) { |
324 if (root_scroll_offset_ == root_offset) | 310 if (root_scroll_offset_ == root_offset) |
325 return; | 311 return; |
326 root_scroll_offset_ = root_offset; | 312 root_scroll_offset_ = root_offset; |
327 sender_->Send( | 313 sender_->Send( |
328 new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_)); | 314 new SyncCompositorMsg_SetScroll(routing_id_, root_scroll_offset_)); |
329 } | 315 } |
330 | 316 |
331 void SynchronousCompositorHost::SendAsyncCompositorStateIfNeeded() { | |
332 if (weak_ptr_factory_.HasWeakPtrs()) | |
333 return; | |
334 | |
335 ui_task_runner_->PostTask( | |
336 FROM_HERE, base::Bind(&SynchronousCompositorHost::UpdateStateTask, | |
337 weak_ptr_factory_.GetWeakPtr())); | |
338 } | |
339 | |
340 void SynchronousCompositorHost::UpdateStateTask() { | |
341 SyncCompositorCommonBrowserParams common_browser_params; | |
342 PopulateCommonParams(&common_browser_params); | |
343 sender_->Send( | |
344 new SyncCompositorMsg_UpdateState(routing_id_, common_browser_params)); | |
345 DCHECK(!weak_ptr_factory_.HasWeakPtrs()); | |
346 } | |
347 | |
348 void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta, | 317 void SynchronousCompositorHost::SynchronouslyZoomBy(float zoom_delta, |
349 const gfx::Point& anchor) { | 318 const gfx::Point& anchor) { |
350 SyncCompositorCommonBrowserParams common_browser_params; | |
351 PopulateCommonParams(&common_browser_params); | |
352 SyncCompositorCommonRendererParams common_renderer_params; | 319 SyncCompositorCommonRendererParams common_renderer_params; |
353 if (!sender_->Send(new SyncCompositorMsg_ZoomBy( | 320 if (!sender_->Send(new SyncCompositorMsg_ZoomBy( |
354 routing_id_, common_browser_params, zoom_delta, anchor, | 321 routing_id_, zoom_delta, anchor, &common_renderer_params))) { |
355 &common_renderer_params))) { | |
356 return; | 322 return; |
357 } | 323 } |
358 ProcessCommonParams(common_renderer_params); | 324 ProcessCommonParams(common_renderer_params); |
359 } | 325 } |
360 | 326 |
361 void SynchronousCompositorHost::SetIsActive(bool is_active) { | |
362 if (is_active_ == is_active) | |
363 return; | |
364 is_active_ = is_active; | |
365 UpdateNeedsBeginFrames(); | |
366 SendAsyncCompositorStateIfNeeded(); | |
367 } | |
368 | |
369 void SynchronousCompositorHost::OnComputeScroll( | 327 void SynchronousCompositorHost::OnComputeScroll( |
370 base::TimeTicks animation_time) { | 328 base::TimeTicks animation_time) { |
371 if (!need_animate_scroll_) | 329 if (!need_animate_scroll_) |
372 return; | 330 return; |
373 need_animate_scroll_ = false; | 331 need_animate_scroll_ = false; |
374 | 332 |
375 SyncCompositorCommonBrowserParams common_browser_params; | |
376 PopulateCommonParams(&common_browser_params); | |
377 SyncCompositorCommonRendererParams common_renderer_params; | 333 SyncCompositorCommonRendererParams common_renderer_params; |
378 sender_->Send(new SyncCompositorMsg_ComputeScroll( | 334 sender_->Send( |
379 routing_id_, common_browser_params, animation_time)); | 335 new SyncCompositorMsg_ComputeScroll(routing_id_, animation_time)); |
380 } | 336 } |
381 | 337 |
382 void SynchronousCompositorHost::DidOverscroll( | 338 void SynchronousCompositorHost::DidOverscroll( |
383 const DidOverscrollParams& over_scroll_params) { | 339 const DidOverscrollParams& over_scroll_params) { |
384 client_->DidOverscroll(over_scroll_params.accumulated_overscroll, | 340 client_->DidOverscroll(over_scroll_params.accumulated_overscroll, |
385 over_scroll_params.latest_overscroll_delta, | 341 over_scroll_params.latest_overscroll_delta, |
386 over_scroll_params.current_fling_velocity); | 342 over_scroll_params.current_fling_velocity); |
387 } | 343 } |
388 | 344 |
389 void SynchronousCompositorHost::BeginFrame(const cc::BeginFrameArgs& args) { | 345 void SynchronousCompositorHost::DidSendBeginFrame() { |
390 if (!is_active_) | |
391 return; | |
392 | |
393 SyncCompositorCommonBrowserParams common_browser_params; | |
394 PopulateCommonParams(&common_browser_params); | |
395 SyncCompositorCommonRendererParams common_renderer_params; | 346 SyncCompositorCommonRendererParams common_renderer_params; |
396 if (!sender_->Send( | 347 if (!sender_->Send(new SyncCompositorMsg_SynchronizeRendererState( |
397 new SyncCompositorMsg_BeginFrame(routing_id_, common_browser_params, | 348 routing_id_, &common_renderer_params))) { |
398 args, &common_renderer_params))) { | |
399 return; | 349 return; |
400 } | 350 } |
401 ProcessCommonParams(common_renderer_params); | 351 ProcessCommonParams(common_renderer_params); |
402 } | 352 } |
403 | 353 |
404 void SynchronousCompositorHost::OutputSurfaceCreated() { | 354 void SynchronousCompositorHost::OutputSurfaceCreated() { |
405 // New output surface is not aware of state from Browser side. So need to | 355 // New output surface is not aware of state from Browser side. So need to |
406 // re-send all browser side state here. | 356 // re-send all browser side state here. |
407 sender_->Send( | 357 sender_->Send( |
408 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); | 358 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); |
409 } | 359 } |
410 | 360 |
411 void SynchronousCompositorHost::PopulateCommonParams( | |
412 SyncCompositorCommonBrowserParams* params) { | |
413 DCHECK(params); | |
414 params->begin_frame_source_paused = !is_active_; | |
415 | |
416 weak_ptr_factory_.InvalidateWeakPtrs(); | |
417 } | |
418 | |
419 void SynchronousCompositorHost::ProcessCommonParams( | 361 void SynchronousCompositorHost::ProcessCommonParams( |
420 const SyncCompositorCommonRendererParams& params) { | 362 const SyncCompositorCommonRendererParams& params) { |
421 // Ignore if |renderer_param_version_| is newer than |params.version|. This | 363 // Ignore if |renderer_param_version_| is newer than |params.version|. This |
422 // comparison takes into account when the unsigned int wraps. | 364 // comparison takes into account when the unsigned int wraps. |
423 if ((renderer_param_version_ - params.version) < 0x80000000) { | 365 if ((renderer_param_version_ - params.version) < 0x80000000) { |
424 return; | 366 return; |
425 } | 367 } |
426 renderer_param_version_ = params.version; | 368 renderer_param_version_ = params.version; |
427 need_animate_scroll_ = params.need_animate_scroll; | 369 need_animate_scroll_ = params.need_animate_scroll; |
428 if (need_begin_frame_ != params.need_begin_frame) { | |
429 need_begin_frame_ = params.need_begin_frame; | |
430 UpdateNeedsBeginFrames(); | |
431 } | |
432 root_scroll_offset_ = params.total_scroll_offset; | 370 root_scroll_offset_ = params.total_scroll_offset; |
433 | 371 |
434 if (need_invalidate_count_ != params.need_invalidate_count) { | 372 if (need_invalidate_count_ != params.need_invalidate_count) { |
435 need_invalidate_count_ = params.need_invalidate_count; | 373 need_invalidate_count_ = params.need_invalidate_count; |
436 client_->PostInvalidate(); | 374 client_->PostInvalidate(); |
437 } | 375 } |
438 | 376 |
439 if (did_activate_pending_tree_count_ != | 377 if (did_activate_pending_tree_count_ != |
440 params.did_activate_pending_tree_count) { | 378 params.did_activate_pending_tree_count) { |
441 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count; | 379 did_activate_pending_tree_count_ = params.did_activate_pending_tree_count; |
442 client_->DidUpdateContent(); | 380 client_->DidUpdateContent(); |
443 } | 381 } |
444 | 382 |
445 // Ensure only valid values from compositor are sent to client. | 383 // Ensure only valid values from compositor are sent to client. |
446 // Compositor has page_scale_factor set to 0 before initialization, so check | 384 // Compositor has page_scale_factor set to 0 before initialization, so check |
447 // for that case here. | 385 // for that case here. |
448 if (params.page_scale_factor) { | 386 if (params.page_scale_factor) { |
449 client_->UpdateRootLayerState( | 387 client_->UpdateRootLayerState( |
450 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), | 388 gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), |
451 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), | 389 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), |
452 params.scrollable_size, params.page_scale_factor, | 390 params.scrollable_size, params.page_scale_factor, |
453 params.min_page_scale_factor, params.max_page_scale_factor); | 391 params.min_page_scale_factor, params.max_page_scale_factor); |
454 } | 392 } |
455 } | 393 } |
456 | 394 |
457 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { | |
458 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); | |
459 } | |
460 | |
461 } // namespace content | 395 } // namespace content |
OLD | NEW |