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/containers/hash_tables.h" | 9 #include "base/containers/hash_tables.h" |
10 #include "base/memory/shared_memory.h" | 10 #include "base/memory/shared_memory.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 : rwhva_(rwhva), | 35 : rwhva_(rwhva), |
36 client_(client), | 36 client_(client), |
37 ui_task_runner_( | 37 ui_task_runner_( |
38 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), | 38 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::UI)), |
39 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), | 39 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), |
40 sender_(rwhva_->GetRenderWidgetHost()), | 40 sender_(rwhva_->GetRenderWidgetHost()), |
41 async_input_(async_input), | 41 async_input_(async_input), |
42 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), | 42 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), |
43 is_active_(false), | 43 is_active_(false), |
44 bytes_limit_(0u), | 44 bytes_limit_(0u), |
| 45 output_surface_id_from_last_draw_(0u), |
45 root_scroll_offset_updated_by_browser_(false), | 46 root_scroll_offset_updated_by_browser_(false), |
46 renderer_param_version_(0u), | 47 renderer_param_version_(0u), |
47 need_animate_scroll_(false), | 48 need_animate_scroll_(false), |
48 need_invalidate_count_(0u), | 49 need_invalidate_count_(0u), |
49 need_begin_frame_(false), | 50 need_begin_frame_(false), |
50 did_activate_pending_tree_count_(0u), | 51 did_activate_pending_tree_count_(0u), |
51 weak_ptr_factory_(this) { | 52 weak_ptr_factory_(this) { |
52 client_->DidInitializeCompositor(this); | 53 client_->DidInitializeCompositor(this); |
53 } | 54 } |
54 | 55 |
(...skipping 10 matching lines...) Expand all Loading... |
65 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll) | 66 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_OverScroll, OnOverScroll) |
66 IPC_MESSAGE_UNHANDLED(handled = false) | 67 IPC_MESSAGE_UNHANDLED(handled = false) |
67 IPC_END_MESSAGE_MAP() | 68 IPC_END_MESSAGE_MAP() |
68 return handled; | 69 return handled; |
69 } | 70 } |
70 | 71 |
71 void SynchronousCompositorHost::DidBecomeCurrent() { | 72 void SynchronousCompositorHost::DidBecomeCurrent() { |
72 client_->DidBecomeCurrent(this); | 73 client_->DidBecomeCurrent(this); |
73 } | 74 } |
74 | 75 |
75 scoped_ptr<cc::CompositorFrame> SynchronousCompositorHost::DemandDrawHw( | 76 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( |
76 const gfx::Size& surface_size, | 77 const gfx::Size& surface_size, |
77 const gfx::Transform& transform, | 78 const gfx::Transform& transform, |
78 const gfx::Rect& viewport, | 79 const gfx::Rect& viewport, |
79 const gfx::Rect& clip, | 80 const gfx::Rect& clip, |
80 const gfx::Rect& viewport_rect_for_tile_priority, | 81 const gfx::Rect& viewport_rect_for_tile_priority, |
81 const gfx::Transform& transform_for_tile_priority) { | 82 const gfx::Transform& transform_for_tile_priority) { |
82 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, | 83 SyncCompositorDemandDrawHwParams params(surface_size, transform, viewport, |
83 clip, viewport_rect_for_tile_priority, | 84 clip, viewport_rect_for_tile_priority, |
84 transform_for_tile_priority); | 85 transform_for_tile_priority); |
85 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 86 SynchronousCompositor::Frame frame; |
| 87 frame.frame.reset(new cc::CompositorFrame); |
86 SyncCompositorCommonBrowserParams common_browser_params; | 88 SyncCompositorCommonBrowserParams common_browser_params; |
87 PopulateCommonParams(&common_browser_params); | 89 PopulateCommonParams(&common_browser_params); |
88 SyncCompositorCommonRendererParams common_renderer_params; | 90 SyncCompositorCommonRendererParams common_renderer_params; |
89 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( | 91 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( |
90 routing_id_, common_browser_params, params, &common_renderer_params, | 92 routing_id_, common_browser_params, params, &common_renderer_params, |
91 frame.get()))) { | 93 &frame.output_surface_id, frame.frame.get()))) { |
92 return nullptr; | 94 return SynchronousCompositor::Frame(); |
93 } | 95 } |
94 ProcessCommonParams(common_renderer_params); | 96 ProcessCommonParams(common_renderer_params); |
95 if (!frame->delegated_frame_data) { | 97 if (!frame.frame->delegated_frame_data) { |
96 // This can happen if compositor did not swap in this draw. | 98 // This can happen if compositor did not swap in this draw. |
97 frame.reset(); | 99 frame.frame.reset(); |
98 } | 100 } |
99 if (frame) | 101 if (frame.frame) { |
100 UpdateFrameMetaData(frame->metadata); | 102 UpdateFrameMetaData(frame.frame->metadata); |
| 103 if (output_surface_id_from_last_draw_ != frame.output_surface_id) |
| 104 returned_resources_.clear(); |
| 105 output_surface_id_from_last_draw_ = frame.output_surface_id; |
| 106 } |
101 return frame; | 107 return frame; |
102 } | 108 } |
103 | 109 |
104 void SynchronousCompositorHost::UpdateFrameMetaData( | 110 void SynchronousCompositorHost::UpdateFrameMetaData( |
105 const cc::CompositorFrameMetadata& frame_metadata) { | 111 const cc::CompositorFrameMetadata& frame_metadata) { |
106 rwhva_->SynchronousFrameMetadata(frame_metadata); | 112 rwhva_->SynchronousFrameMetadata(frame_metadata); |
107 } | 113 } |
108 | 114 |
109 namespace { | 115 namespace { |
110 | 116 |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
262 software_draw_shm_ = std::move(software_draw_shm); | 268 software_draw_shm_ = std::move(software_draw_shm); |
263 ProcessCommonParams(common_renderer_params); | 269 ProcessCommonParams(common_renderer_params); |
264 } | 270 } |
265 | 271 |
266 void SynchronousCompositorHost::SendZeroMemory() { | 272 void SynchronousCompositorHost::SendZeroMemory() { |
267 // No need to check return value. | 273 // No need to check return value. |
268 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); | 274 sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); |
269 } | 275 } |
270 | 276 |
271 void SynchronousCompositorHost::ReturnResources( | 277 void SynchronousCompositorHost::ReturnResources( |
| 278 uint32_t output_surface_id, |
272 const cc::CompositorFrameAck& frame_ack) { | 279 const cc::CompositorFrameAck& frame_ack) { |
| 280 // If output_surface_id does not match, then renderer side has switched |
| 281 // to a new OutputSurface, so dropping resources for old OutputSurface |
| 282 // is allowed. |
| 283 if (output_surface_id_from_last_draw_ != output_surface_id) |
| 284 return; |
273 returned_resources_.insert(returned_resources_.end(), | 285 returned_resources_.insert(returned_resources_.end(), |
274 frame_ack.resources.begin(), | 286 frame_ack.resources.begin(), |
275 frame_ack.resources.end()); | 287 frame_ack.resources.end()); |
276 } | 288 } |
277 | 289 |
278 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { | 290 void SynchronousCompositorHost::SetMemoryPolicy(size_t bytes_limit) { |
279 if (bytes_limit_ == bytes_limit) | 291 if (bytes_limit_ == bytes_limit) |
280 return; | 292 return; |
281 size_t current_bytes_limit = bytes_limit_; | 293 size_t current_bytes_limit = bytes_limit_; |
282 bytes_limit_ = bytes_limit; | 294 bytes_limit_ = bytes_limit; |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
382 const DidOverscrollParams& over_scroll_params) { | 394 const DidOverscrollParams& over_scroll_params) { |
383 ProcessCommonParams(params); | 395 ProcessCommonParams(params); |
384 DidOverscroll(over_scroll_params); | 396 DidOverscroll(over_scroll_params); |
385 } | 397 } |
386 | 398 |
387 void SynchronousCompositorHost::PopulateCommonParams( | 399 void SynchronousCompositorHost::PopulateCommonParams( |
388 SyncCompositorCommonBrowserParams* params) { | 400 SyncCompositorCommonBrowserParams* params) { |
389 DCHECK(params); | 401 DCHECK(params); |
390 DCHECK(params->ack.resources.empty()); | 402 DCHECK(params->ack.resources.empty()); |
391 params->bytes_limit = bytes_limit_; | 403 params->bytes_limit = bytes_limit_; |
| 404 params->output_surface_id_for_returned_resources = |
| 405 output_surface_id_from_last_draw_; |
392 params->ack.resources.swap(returned_resources_); | 406 params->ack.resources.swap(returned_resources_); |
393 if (root_scroll_offset_updated_by_browser_) { | 407 if (root_scroll_offset_updated_by_browser_) { |
394 params->root_scroll_offset = root_scroll_offset_; | 408 params->root_scroll_offset = root_scroll_offset_; |
395 params->update_root_scroll_offset = root_scroll_offset_updated_by_browser_; | 409 params->update_root_scroll_offset = root_scroll_offset_updated_by_browser_; |
396 root_scroll_offset_updated_by_browser_ = false; | 410 root_scroll_offset_updated_by_browser_ = false; |
397 } | 411 } |
398 params->begin_frame_source_paused = !is_active_; | 412 params->begin_frame_source_paused = !is_active_; |
399 | 413 |
400 weak_ptr_factory_.InvalidateWeakPtrs(); | 414 weak_ptr_factory_.InvalidateWeakPtrs(); |
401 } | 415 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
436 params.scrollable_size, params.page_scale_factor, | 450 params.scrollable_size, params.page_scale_factor, |
437 params.min_page_scale_factor, params.max_page_scale_factor); | 451 params.min_page_scale_factor, params.max_page_scale_factor); |
438 } | 452 } |
439 } | 453 } |
440 | 454 |
441 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { | 455 void SynchronousCompositorHost::UpdateNeedsBeginFrames() { |
442 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); | 456 rwhva_->OnSetNeedsBeginFrames(is_active_ && need_begin_frame_); |
443 } | 457 } |
444 | 458 |
445 } // namespace content | 459 } // namespace content |
OLD | NEW |