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/renderer/android/synchronous_compositor_proxy.h" | 5 #include "content/renderer/android/synchronous_compositor_proxy.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/memory/shared_memory.h" | 9 #include "base/memory/shared_memory.h" |
10 #include "cc/ipc/cc_param_traits.h" | 10 #include "cc/ipc/cc_param_traits.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 : routing_id_(routing_id), | 28 : routing_id_(routing_id), |
29 sender_(sender), | 29 sender_(sender), |
30 input_handler_proxy_(input_handler_proxy), | 30 input_handler_proxy_(input_handler_proxy), |
31 use_in_process_zero_copy_software_draw_( | 31 use_in_process_zero_copy_software_draw_( |
32 base::CommandLine::ForCurrentProcess()->HasSwitch( | 32 base::CommandLine::ForCurrentProcess()->HasSwitch( |
33 switches::kSingleProcess)), | 33 switches::kSingleProcess)), |
34 output_surface_(nullptr), | 34 output_surface_(nullptr), |
35 inside_receive_(false), | 35 inside_receive_(false), |
36 hardware_draw_reply_(nullptr), | 36 hardware_draw_reply_(nullptr), |
37 software_draw_reply_(nullptr), | 37 software_draw_reply_(nullptr), |
| 38 hardware_draw_reply_async_(false), |
38 version_(0u), | 39 version_(0u), |
39 page_scale_factor_(0.f), | 40 page_scale_factor_(0.f), |
40 min_page_scale_factor_(0.f), | 41 min_page_scale_factor_(0.f), |
41 max_page_scale_factor_(0.f), | 42 max_page_scale_factor_(0.f), |
42 need_animate_scroll_(false), | 43 need_animate_scroll_(false), |
43 need_invalidate_count_(0u), | 44 need_invalidate_count_(0u), |
44 did_activate_pending_tree_count_(0u) { | 45 did_activate_pending_tree_count_(0u) { |
45 DCHECK(input_handler_proxy_); | 46 DCHECK(input_handler_proxy_); |
46 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); | 47 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); |
47 } | 48 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 void SynchronousCompositorProxy::OnMessageReceived( | 130 void SynchronousCompositorProxy::OnMessageReceived( |
130 const IPC::Message& message) { | 131 const IPC::Message& message) { |
131 if (output_surface_ && output_surface_->OnMessageReceived(message)) | 132 if (output_surface_ && output_surface_->OnMessageReceived(message)) |
132 return; | 133 return; |
133 | 134 |
134 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) | 135 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) |
135 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SynchronizeRendererState, | 136 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SynchronizeRendererState, |
136 PopulateCommonParams) | 137 PopulateCommonParams) |
137 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) | 138 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
138 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, | 139 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, |
139 DemandDrawHw) | 140 DemandDrawHw_Sync) |
| 141 IPC_MESSAGE_HANDLER(CompositorMsg_DemandDrawHw, DemandDrawHw) |
| 142 |
140 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) | 143 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) |
141 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) | 144 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) |
142 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, | 145 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw, |
143 DemandDrawSw) | 146 DemandDrawSw) |
144 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy) | 147 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZoomBy, SynchronouslyZoomBy) |
145 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll) | 148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetScroll, SetScroll) |
146 IPC_END_MESSAGE_MAP() | 149 IPC_END_MESSAGE_MAP() |
147 } | 150 } |
148 | 151 |
149 bool SynchronousCompositorProxy::Send(IPC::Message* message) { | 152 bool SynchronousCompositorProxy::Send(IPC::Message* message) { |
150 return sender_->Send(message); | 153 return sender_->Send(message); |
151 } | 154 } |
152 | 155 |
153 void SynchronousCompositorProxy::DemandDrawHw( | 156 void SynchronousCompositorProxy::DemandDrawHw_Sync( |
154 const SyncCompositorDemandDrawHwParams& params, | 157 const SyncCompositorDemandDrawHwParams& params, |
155 IPC::Message* reply_message) { | 158 IPC::Message* reply_message) { |
156 DCHECK(!inside_receive_); | 159 DCHECK(!inside_receive_); |
157 DCHECK(reply_message); | 160 DCHECK(reply_message); |
158 | 161 |
159 inside_receive_ = true; | 162 inside_receive_ = true; |
160 | 163 |
161 if (output_surface_) { | 164 if (output_surface_) { |
162 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( | 165 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( |
163 &hardware_draw_reply_, reply_message); | 166 &hardware_draw_reply_, reply_message); |
164 output_surface_->DemandDrawHw(params.surface_size, params.transform, | 167 output_surface_->DemandDrawHw(params.surface_size, params.transform, |
165 params.viewport, params.clip, | 168 params.viewport, params.clip, |
166 params.viewport_rect_for_tile_priority, | 169 params.viewport_rect_for_tile_priority, |
167 params.transform_for_tile_priority); | 170 params.transform_for_tile_priority); |
168 } | 171 } |
169 | 172 |
170 if (inside_receive_) { | 173 if (inside_receive_) { |
171 // Did not swap. | 174 // Did not swap. |
172 SendDemandDrawHwReply(cc::CompositorFrame(), 0u, reply_message); | 175 SendDemandDrawHwReply_Sync(cc::CompositorFrame(), 0u, reply_message); |
173 inside_receive_ = false; | 176 inside_receive_ = false; |
174 } | 177 } |
175 } | 178 } |
176 | 179 |
| 180 void SynchronousCompositorProxy::DemandDrawHw( |
| 181 // const SyncCompositorDemandDrawHwParams& params, |
| 182 // IPC::Message* reply_message) { |
| 183 const SyncCompositorDemandDrawHwParams& params) { |
| 184 DCHECK(!inside_receive_); |
| 185 // DCHECK(reply_message); |
| 186 |
| 187 inside_receive_ = true; |
| 188 |
| 189 if (output_surface_) { |
| 190 /* TODO: Since there is no reply message, is it OK to just set |
| 191 * hardware_draw_reply_ to anything that passes the DCHECK for being true? |
| 192 */ |
| 193 // base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( |
| 194 // &hardware_draw_reply_, reply_message); |
| 195 base::AutoReset<bool> scoped_hardware_draw_reply_async( |
| 196 &hardware_draw_reply_async_, true); |
| 197 hardware_draw_reply_ = new IPC::Message(); |
| 198 output_surface_->DemandDrawHw(params.surface_size, params.transform, |
| 199 params.viewport, params.clip, |
| 200 params.viewport_rect_for_tile_priority, |
| 201 params.transform_for_tile_priority); |
| 202 } |
| 203 |
| 204 if (inside_receive_) { |
| 205 // Did not swap. |
| 206 // SendDemandDrawHwReply(cc::CompositorFrame(), 0u, reply_message); |
| 207 SendDemandDrawHwReply(cc::CompositorFrame(), 0u); |
| 208 inside_receive_ = false; |
| 209 } |
| 210 } |
| 211 |
| 212 void SynchronousCompositorProxy::SwapBuffersHw_Sync(uint32_t output_surface_id, |
| 213 cc::CompositorFrame frame) { |
| 214 DCHECK(inside_receive_); |
| 215 DCHECK(hardware_draw_reply_); |
| 216 SendDemandDrawHwReply_Sync(std::move(frame), output_surface_id, |
| 217 hardware_draw_reply_); |
| 218 inside_receive_ = false; |
| 219 } |
| 220 |
177 void SynchronousCompositorProxy::SwapBuffersHw(uint32_t output_surface_id, | 221 void SynchronousCompositorProxy::SwapBuffersHw(uint32_t output_surface_id, |
178 cc::CompositorFrame frame) { | 222 cc::CompositorFrame frame) { |
179 DCHECK(inside_receive_); | 223 DCHECK(inside_receive_); |
180 DCHECK(hardware_draw_reply_); | 224 DCHECK(hardware_draw_reply_async_); |
181 SendDemandDrawHwReply(std::move(frame), output_surface_id, | 225 // SendDemandDrawHwReply(std::move(frame), output_surface_id, |
182 hardware_draw_reply_); | 226 // hardware_draw_reply_); |
| 227 SendDemandDrawHwReply(std::move(frame), output_surface_id); |
183 inside_receive_ = false; | 228 inside_receive_ = false; |
184 } | 229 } |
185 | 230 |
186 void SynchronousCompositorProxy::SendDemandDrawHwReply( | 231 void SynchronousCompositorProxy::SendDemandDrawHwReply_Sync( |
187 cc::CompositorFrame frame, | 232 cc::CompositorFrame frame, |
188 uint32_t output_surface_id, | 233 uint32_t output_surface_id, |
189 IPC::Message* reply_message) { | 234 IPC::Message* reply_message) { |
190 SyncCompositorCommonRendererParams common_renderer_params; | 235 SyncCompositorCommonRendererParams common_renderer_params; |
191 PopulateCommonParams(&common_renderer_params); | 236 PopulateCommonParams(&common_renderer_params); |
192 SyncCompositorMsg_DemandDrawHw::WriteReplyParams( | 237 SyncCompositorMsg_DemandDrawHw::WriteReplyParams( |
193 reply_message, common_renderer_params, output_surface_id, frame); | 238 reply_message, common_renderer_params, output_surface_id, frame); |
194 Send(reply_message); | 239 Send(reply_message); |
195 } | 240 } |
196 | 241 |
| 242 void SynchronousCompositorProxy::SendDemandDrawHwReply( |
| 243 cc::CompositorFrame frame, |
| 244 uint32_t output_surface_id) { |
| 245 // uint32_t output_surface_id, |
| 246 // IPC::Message* reply_message) { |
| 247 // |
| 248 // SyncCompositorMsg_DemandDrawHw::WriteReplyParams( |
| 249 // reply_message, common_renderer_params, output_surface_id, frame); |
| 250 // Send(reply_message); |
| 251 Send(new CompositorHostMsg_Frame(routing_id_, output_surface_id, frame)); |
| 252 } |
| 253 |
197 struct SynchronousCompositorProxy::SharedMemoryWithSize { | 254 struct SynchronousCompositorProxy::SharedMemoryWithSize { |
198 base::SharedMemory shm; | 255 base::SharedMemory shm; |
199 const size_t buffer_size; | 256 const size_t buffer_size; |
200 bool zeroed; | 257 bool zeroed; |
201 | 258 |
202 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size) | 259 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size) |
203 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} | 260 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} |
204 }; | 261 }; |
205 | 262 |
206 void SynchronousCompositorProxy::SetSharedMemory( | 263 void SynchronousCompositorProxy::SetSharedMemory( |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 IPC::Message* reply_message) { | 350 IPC::Message* reply_message) { |
294 SyncCompositorCommonRendererParams common_renderer_params; | 351 SyncCompositorCommonRendererParams common_renderer_params; |
295 PopulateCommonParams(&common_renderer_params); | 352 PopulateCommonParams(&common_renderer_params); |
296 SyncCompositorMsg_DemandDrawSw::WriteReplyParams( | 353 SyncCompositorMsg_DemandDrawSw::WriteReplyParams( |
297 reply_message, success, common_renderer_params, frame); | 354 reply_message, success, common_renderer_params, frame); |
298 Send(reply_message); | 355 Send(reply_message); |
299 } | 356 } |
300 | 357 |
301 void SynchronousCompositorProxy::SwapBuffers(uint32_t output_surface_id, | 358 void SynchronousCompositorProxy::SwapBuffers(uint32_t output_surface_id, |
302 cc::CompositorFrame frame) { | 359 cc::CompositorFrame frame) { |
303 DCHECK(hardware_draw_reply_ || software_draw_reply_); | 360 DCHECK(hardware_draw_reply_async_ || hardware_draw_reply_ || |
| 361 software_draw_reply_); |
304 DCHECK(!(hardware_draw_reply_ && software_draw_reply_)); | 362 DCHECK(!(hardware_draw_reply_ && software_draw_reply_)); |
305 if (hardware_draw_reply_) { | 363 if (hardware_draw_reply_async_) { |
306 SwapBuffersHw(output_surface_id, std::move(frame)); | 364 SwapBuffersHw(output_surface_id, std::move(frame)); |
| 365 } else if (hardware_draw_reply_) { |
| 366 SwapBuffersHw_Sync(output_surface_id, std::move(frame)); |
307 } else if (software_draw_reply_) { | 367 } else if (software_draw_reply_) { |
308 SwapBuffersSw(std::move(frame)); | 368 SwapBuffersSw(std::move(frame)); |
309 } | 369 } |
310 } | 370 } |
311 | 371 |
312 void SynchronousCompositorProxy::OnComputeScroll( | 372 void SynchronousCompositorProxy::OnComputeScroll( |
313 base::TimeTicks animation_time) { | 373 base::TimeTicks animation_time) { |
314 if (need_animate_scroll_) { | 374 if (need_animate_scroll_) { |
315 need_animate_scroll_ = false; | 375 need_animate_scroll_ = false; |
316 input_handler_proxy_->SynchronouslyAnimate(animation_time); | 376 input_handler_proxy_->SynchronouslyAnimate(animation_time); |
(...skipping 12 matching lines...) Expand all Loading... |
329 | 389 |
330 void SynchronousCompositorProxy::SetScroll( | 390 void SynchronousCompositorProxy::SetScroll( |
331 const gfx::ScrollOffset& new_total_scroll_offset) { | 391 const gfx::ScrollOffset& new_total_scroll_offset) { |
332 if (total_scroll_offset_ == new_total_scroll_offset) | 392 if (total_scroll_offset_ == new_total_scroll_offset) |
333 return; | 393 return; |
334 total_scroll_offset_ = new_total_scroll_offset; | 394 total_scroll_offset_ = new_total_scroll_offset; |
335 input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_); | 395 input_handler_proxy_->SynchronouslySetRootScrollOffset(total_scroll_offset_); |
336 } | 396 } |
337 | 397 |
338 } // namespace content | 398 } // namespace content |
OLD | NEW |