| 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 | 63 |
| 64 SynchronousCompositorHost::SynchronousCompositorHost( | 64 SynchronousCompositorHost::SynchronousCompositorHost( |
| 65 RenderWidgetHostViewAndroid* rwhva, | 65 RenderWidgetHostViewAndroid* rwhva, |
| 66 SynchronousCompositorClient* client, | 66 SynchronousCompositorClient* client, |
| 67 bool use_in_proc_software_draw) | 67 bool use_in_proc_software_draw) |
| 68 : rwhva_(rwhva), | 68 : rwhva_(rwhva), |
| 69 client_(client), | 69 client_(client), |
| 70 ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)), | 70 ui_task_runner_(BrowserThread::GetTaskRunnerForThread(BrowserThread::UI)), |
| 71 process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()), | 71 process_id_(rwhva_->GetRenderWidgetHost()->GetProcess()->GetID()), |
| 72 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), | 72 routing_id_(rwhva_->GetRenderWidgetHost()->GetRoutingID()), |
| 73 rph_observer_(SynchronousCompositorObserver::GetOrCreateFor(process_id_)), | |
| 74 sender_(rwhva_->GetRenderWidgetHost()), | 73 sender_(rwhva_->GetRenderWidgetHost()), |
| 75 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), | 74 use_in_process_zero_copy_software_draw_(use_in_proc_software_draw), |
| 76 bytes_limit_(0u), | 75 bytes_limit_(0u), |
| 77 renderer_param_version_(0u), | 76 renderer_param_version_(0u), |
| 78 need_animate_scroll_(false), | 77 need_animate_scroll_(false), |
| 79 need_invalidate_count_(0u), | 78 need_invalidate_count_(0u), |
| 80 did_activate_pending_tree_count_(0u) { | 79 did_activate_pending_tree_count_(0u) { |
| 81 client_->DidInitializeCompositor(this, process_id_, routing_id_); | 80 client_->DidInitializeCompositor(this, process_id_, routing_id_); |
| 82 } | 81 } |
| 83 | 82 |
| 84 SynchronousCompositorHost::~SynchronousCompositorHost() { | 83 SynchronousCompositorHost::~SynchronousCompositorHost() { |
| 85 client_->DidDestroyCompositor(this, process_id_, routing_id_); | 84 client_->DidDestroyCompositor(this, process_id_, routing_id_); |
| 86 } | 85 } |
| 87 | 86 |
| 88 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { | 87 bool SynchronousCompositorHost::OnMessageReceived(const IPC::Message& message) { |
| 89 bool handled = true; | 88 bool handled = true; |
| 90 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) | 89 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorHost, message) |
| 91 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_CompositorFrameSinkCreated, | 90 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_CompositorFrameSinkCreated, |
| 92 CompositorFrameSinkCreated) | 91 CompositorFrameSinkCreated) |
| 93 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) | 92 IPC_MESSAGE_HANDLER(SyncCompositorHostMsg_UpdateState, ProcessCommonParams) |
| 94 IPC_MESSAGE_HANDLER_GENERIC(SyncCompositorHostMsg_ReturnFrame, | |
| 95 DemandDrawHwReceiveFrame(message)) | |
| 96 IPC_MESSAGE_UNHANDLED(handled = false) | 93 IPC_MESSAGE_UNHANDLED(handled = false) |
| 97 IPC_END_MESSAGE_MAP() | 94 IPC_END_MESSAGE_MAP() |
| 98 return handled; | 95 return handled; |
| 99 } | 96 } |
| 100 | 97 |
| 101 void SynchronousCompositorHost::DemandDrawHwAsync( | 98 scoped_refptr<SynchronousCompositor::FrameFuture> |
| 99 SynchronousCompositorHost::DemandDrawHwAsync( |
| 102 const gfx::Size& viewport_size, | 100 const gfx::Size& viewport_size, |
| 103 const gfx::Rect& viewport_rect_for_tile_priority, | 101 const gfx::Rect& viewport_rect_for_tile_priority, |
| 104 const gfx::Transform& transform_for_tile_priority) { | 102 const gfx::Transform& transform_for_tile_priority) { |
| 105 SyncCompositorDemandDrawHwParams params(viewport_size, | 103 SyncCompositorDemandDrawHwParams params(viewport_size, |
| 106 viewport_rect_for_tile_priority, | 104 viewport_rect_for_tile_priority, |
| 107 transform_for_tile_priority); | 105 transform_for_tile_priority); |
| 108 sender_->Send(new SyncCompositorMsg_DemandDrawHwAsync(routing_id_, params)); | 106 scoped_refptr<FrameFuture> frame_future = new FrameFuture(); |
| 107 if (SynchronousCompositorObserver* filter = GetFilter()) { |
| 108 filter->SetFrameFuture(routing_id_, frame_future); |
| 109 sender_->Send(new SyncCompositorMsg_DemandDrawHwAsync(routing_id_, params)); |
| 110 } else { |
| 111 frame_future->setFrame(nullptr); |
| 112 } |
| 113 return frame_future; |
| 109 } | 114 } |
| 110 | 115 |
| 111 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( | 116 SynchronousCompositor::Frame SynchronousCompositorHost::DemandDrawHw( |
| 112 const gfx::Size& viewport_size, | 117 const gfx::Size& viewport_size, |
| 113 const gfx::Rect& viewport_rect_for_tile_priority, | 118 const gfx::Rect& viewport_rect_for_tile_priority, |
| 114 const gfx::Transform& transform_for_tile_priority) { | 119 const gfx::Transform& transform_for_tile_priority) { |
| 115 SyncCompositorDemandDrawHwParams params(viewport_size, | 120 SyncCompositorDemandDrawHwParams params(viewport_size, |
| 116 viewport_rect_for_tile_priority, | 121 viewport_rect_for_tile_priority, |
| 117 transform_for_tile_priority); | 122 transform_for_tile_priority); |
| 118 uint32_t compositor_frame_sink_id; | 123 uint32_t compositor_frame_sink_id; |
| 119 cc::CompositorFrame compositor_frame; | 124 cc::CompositorFrame compositor_frame; |
| 120 SyncCompositorCommonRendererParams common_renderer_params; | 125 SyncCompositorCommonRendererParams common_renderer_params; |
| 121 | 126 |
| 122 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( | 127 if (!sender_->Send(new SyncCompositorMsg_DemandDrawHw( |
| 123 routing_id_, params, &common_renderer_params, | 128 routing_id_, params, &common_renderer_params, |
| 124 &compositor_frame_sink_id, &compositor_frame))) { | 129 &compositor_frame_sink_id, &compositor_frame))) { |
| 125 return SynchronousCompositor::Frame(); | 130 return SynchronousCompositor::Frame(); |
| 126 } | 131 } |
| 127 | 132 |
| 128 ProcessCommonParams(common_renderer_params); | 133 ProcessCommonParams(common_renderer_params); |
| 129 | 134 |
| 130 return ProcessHardwareFrame(compositor_frame_sink_id, | 135 return ProcessHardwareFrame(compositor_frame_sink_id, |
| 131 std::move(compositor_frame)); | 136 std::move(compositor_frame)); |
| 132 } | 137 } |
| 133 | 138 |
| 134 bool SynchronousCompositorHost::DemandDrawHwReceiveFrame( | |
| 135 const IPC::Message& message) { | |
| 136 SyncCompositorHostMsg_ReturnFrame::Param param; | |
| 137 if (!SyncCompositorHostMsg_ReturnFrame::Read(&message, ¶m)) | |
| 138 return false; | |
| 139 uint32_t compositor_frame_sink_id = std::get<0>(param); | |
| 140 cc::CompositorFrame compositor_frame = std::move(std::get<1>(param)); | |
| 141 scoped_refptr<SynchronousCompositor::FrameFuture> frame_future = | |
| 142 new FrameFuture(); | |
| 143 SynchronousCompositor::Frame frame = ProcessHardwareFrame( | |
| 144 compositor_frame_sink_id, std::move(compositor_frame)); | |
| 145 if (!frame.frame) | |
| 146 return true; | |
| 147 std::unique_ptr<SynchronousCompositor::Frame> frame_ptr = | |
| 148 base::MakeUnique<SynchronousCompositor::Frame>(); | |
| 149 frame_ptr->frame = std::move(frame.frame); | |
| 150 frame_ptr->compositor_frame_sink_id = frame.compositor_frame_sink_id; | |
| 151 frame_future->setFrame(std::move(frame_ptr)); | |
| 152 client_->OnDrawHardwareProcessFrameFuture(std::move(frame_future)); | |
| 153 return true; | |
| 154 } | |
| 155 | |
| 156 SynchronousCompositor::Frame SynchronousCompositorHost::ProcessHardwareFrame( | 139 SynchronousCompositor::Frame SynchronousCompositorHost::ProcessHardwareFrame( |
| 157 uint32_t compositor_frame_sink_id, | 140 uint32_t compositor_frame_sink_id, |
| 158 cc::CompositorFrame compositor_frame) { | 141 cc::CompositorFrame compositor_frame) { |
| 159 SynchronousCompositor::Frame frame; | 142 SynchronousCompositor::Frame frame; |
| 160 frame.frame.reset(new cc::CompositorFrame); | 143 frame.frame.reset(new cc::CompositorFrame); |
| 161 frame.compositor_frame_sink_id = compositor_frame_sink_id; | 144 frame.compositor_frame_sink_id = compositor_frame_sink_id; |
| 162 *frame.frame = std::move(compositor_frame); | 145 *frame.frame = std::move(compositor_frame); |
| 163 if (!frame.frame->delegated_frame_data) { | 146 if (!frame.frame->delegated_frame_data) { |
| 164 // This can happen if compositor did not swap in this draw. | 147 // This can happen if compositor did not swap in this draw. |
| 165 frame.frame.reset(); | 148 frame.frame.reset(); |
| 166 } | 149 } |
| 167 if (frame.frame) { | 150 if (frame.frame) { |
| 168 UpdateFrameMetaData(frame.frame->metadata.Clone()); | 151 UpdateFrameMetaData(frame.frame->metadata.Clone()); |
| 169 } | 152 } |
| 170 return frame; | 153 return frame; |
| 171 } | 154 } |
| 172 | 155 |
| 173 void SynchronousCompositorHost::UpdateFrameMetaData( | 156 void SynchronousCompositorHost::UpdateFrameMetaData( |
| 174 cc::CompositorFrameMetadata frame_metadata) { | 157 cc::CompositorFrameMetadata frame_metadata) { |
| 175 rwhva_->SynchronousFrameMetadata(std::move(frame_metadata)); | 158 rwhva_->SynchronousFrameMetadata(std::move(frame_metadata)); |
| 176 } | 159 } |
| 177 | 160 |
| 161 SynchronousCompositorObserver* SynchronousCompositorHost::GetFilter() { |
| 162 return static_cast<RenderProcessHostImpl*>( |
| 163 rwhva_->GetRenderWidgetHost()->GetProcess()) |
| 164 ->synchronous_compositor_filter(); |
| 165 } |
| 166 |
| 178 namespace { | 167 namespace { |
| 179 | 168 |
| 180 class ScopedSetSkCanvas { | 169 class ScopedSetSkCanvas { |
| 181 public: | 170 public: |
| 182 explicit ScopedSetSkCanvas(SkCanvas* canvas) { | 171 explicit ScopedSetSkCanvas(SkCanvas* canvas) { |
| 183 SynchronousCompositorSetSkCanvas(canvas); | 172 SynchronousCompositorSetSkCanvas(canvas); |
| 184 } | 173 } |
| 185 | 174 |
| 186 ~ScopedSetSkCanvas() { | 175 ~ScopedSetSkCanvas() { |
| 187 SynchronousCompositorSetSkCanvas(nullptr); | 176 SynchronousCompositorSetSkCanvas(nullptr); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 | 369 |
| 381 void SynchronousCompositorHost::DidOverscroll( | 370 void SynchronousCompositorHost::DidOverscroll( |
| 382 const ui::DidOverscrollParams& over_scroll_params) { | 371 const ui::DidOverscrollParams& over_scroll_params) { |
| 383 client_->DidOverscroll(this, over_scroll_params.accumulated_overscroll, | 372 client_->DidOverscroll(this, over_scroll_params.accumulated_overscroll, |
| 384 over_scroll_params.latest_overscroll_delta, | 373 over_scroll_params.latest_overscroll_delta, |
| 385 over_scroll_params.current_fling_velocity); | 374 over_scroll_params.current_fling_velocity); |
| 386 } | 375 } |
| 387 | 376 |
| 388 void SynchronousCompositorHost::DidSendBeginFrame( | 377 void SynchronousCompositorHost::DidSendBeginFrame( |
| 389 ui::WindowAndroid* window_android) { | 378 ui::WindowAndroid* window_android) { |
| 390 rph_observer_->SyncStateAfterVSync(window_android, this); | 379 if (SynchronousCompositorObserver* filter = GetFilter()) |
| 380 filter->SyncStateAfterVSync(window_android, this); |
| 391 } | 381 } |
| 392 | 382 |
| 393 void SynchronousCompositorHost::CompositorFrameSinkCreated() { | 383 void SynchronousCompositorHost::CompositorFrameSinkCreated() { |
| 394 // New CompositorFrameSink is not aware of state from Browser side. So need to | 384 // New CompositorFrameSink is not aware of state from Browser side. So need to |
| 395 // re-send all browser side state here. | 385 // re-send all browser side state here. |
| 396 sender_->Send( | 386 sender_->Send( |
| 397 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); | 387 new SyncCompositorMsg_SetMemoryPolicy(routing_id_, bytes_limit_)); |
| 398 } | 388 } |
| 399 | 389 |
| 400 void SynchronousCompositorHost::ProcessCommonParams( | 390 void SynchronousCompositorHost::ProcessCommonParams( |
| (...skipping 24 matching lines...) Expand all Loading... |
| 425 if (params.page_scale_factor) { | 415 if (params.page_scale_factor) { |
| 426 client_->UpdateRootLayerState( | 416 client_->UpdateRootLayerState( |
| 427 this, gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), | 417 this, gfx::ScrollOffsetToVector2dF(params.total_scroll_offset), |
| 428 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), | 418 gfx::ScrollOffsetToVector2dF(params.max_scroll_offset), |
| 429 params.scrollable_size, params.page_scale_factor, | 419 params.scrollable_size, params.page_scale_factor, |
| 430 params.min_page_scale_factor, params.max_page_scale_factor); | 420 params.min_page_scale_factor, params.max_page_scale_factor); |
| 431 } | 421 } |
| 432 } | 422 } |
| 433 | 423 |
| 434 } // namespace content | 424 } // namespace content |
| OLD | NEW |