| 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 |