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