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 |