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/memory/shared_memory.h" |
8 #include "content/common/android/sync_compositor_messages.h" | 9 #include "content/common/android/sync_compositor_messages.h" |
9 #include "content/common/cc_messages.h" | 10 #include "content/common/cc_messages.h" |
10 #include "ipc/ipc_message.h" | 11 #include "ipc/ipc_message.h" |
11 #include "ipc/ipc_sender.h" | 12 #include "ipc/ipc_sender.h" |
| 13 #include "third_party/skia/include/core/SkBitmap.h" |
| 14 #include "third_party/skia/include/core/SkCanvas.h" |
| 15 #include "third_party/skia/include/core/SkImageInfo.h" |
| 16 #include "third_party/skia/include/core/SkRegion.h" |
12 #include "ui/events/latency_info.h" | 17 #include "ui/events/latency_info.h" |
| 18 #include "ui/gfx/skia_util.h" |
13 | 19 |
14 namespace content { | 20 namespace content { |
15 | 21 |
16 SynchronousCompositorProxy::SynchronousCompositorProxy( | 22 SynchronousCompositorProxy::SynchronousCompositorProxy( |
17 int routing_id, | 23 int routing_id, |
18 IPC::Sender* sender, | 24 IPC::Sender* sender, |
19 SynchronousCompositorOutputSurface* output_surface, | 25 SynchronousCompositorOutputSurface* output_surface, |
20 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, | 26 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, |
21 ui::SynchronousInputHandlerProxy* input_handler_proxy, | 27 ui::SynchronousInputHandlerProxy* input_handler_proxy, |
22 InputHandlerManagerClient::Handler* handler) | 28 InputHandlerManagerClient::Handler* handler) |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 | 146 |
141 void SynchronousCompositorProxy::OnMessageReceived( | 147 void SynchronousCompositorProxy::OnMessageReceived( |
142 const IPC::Message& message) { | 148 const IPC::Message& message) { |
143 DCHECK(!inside_receive_); | 149 DCHECK(!inside_receive_); |
144 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); | 150 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
145 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) | 151 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) |
146 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) | 152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) |
147 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) | 153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
148 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) | 154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
149 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) | 155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
| 156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) |
150 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) | 157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) |
151 IPC_END_MESSAGE_MAP() | 158 IPC_END_MESSAGE_MAP() |
152 } | 159 } |
153 | 160 |
154 bool SynchronousCompositorProxy::Send(IPC::Message* message) { | 161 bool SynchronousCompositorProxy::Send(IPC::Message* message) { |
155 return sender_->Send(message); | 162 return sender_->Send(message); |
156 } | 163 } |
157 | 164 |
158 void SynchronousCompositorProxy::HandleInputEvent( | 165 void SynchronousCompositorProxy::HandleInputEvent( |
159 const SyncCompositorCommonBrowserParams& common_params, | 166 const SyncCompositorCommonBrowserParams& common_params, |
(...skipping 29 matching lines...) Expand all Loading... |
189 params.surface_size, params.transform, params.viewport, params.clip, | 196 params.surface_size, params.transform, params.viewport, params.clip, |
190 params.viewport_rect_for_tile_priority, | 197 params.viewport_rect_for_tile_priority, |
191 params.transform_for_tile_priority); | 198 params.transform_for_tile_priority); |
192 if (frame_ptr) { | 199 if (frame_ptr) { |
193 frame_ptr->AssignTo(frame); | 200 frame_ptr->AssignTo(frame); |
194 DeliverMessages(); | 201 DeliverMessages(); |
195 } | 202 } |
196 PopulateCommonParams(common_renderer_params); | 203 PopulateCommonParams(common_renderer_params); |
197 } | 204 } |
198 | 205 |
| 206 void SynchronousCompositorProxy::DemandDrawSw( |
| 207 const SyncCompositorCommonBrowserParams& common_params, |
| 208 const SyncCompositorDemandDrawSwParams& params, |
| 209 bool* result, |
| 210 SyncCompositorCommonRendererParams* common_renderer_params, |
| 211 cc::CompositorFrame* frame) { |
| 212 DCHECK(frame); |
| 213 ProcessCommonParams(common_params); |
| 214 *result = false; // Early out ok. |
| 215 if (!base::SharedMemory::IsHandleValid(params.shm_handle)) |
| 216 return; |
| 217 |
| 218 SkImageInfo info = |
| 219 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
| 220 size_t stride = info.minRowBytes(); |
| 221 size_t buffer_size = info.getSafeSize(stride); |
| 222 DCHECK(buffer_size); |
| 223 |
| 224 base::SharedMemory shm(params.shm_handle, false); |
| 225 if (!shm.Map(buffer_size)) |
| 226 return; |
| 227 DCHECK(shm.memory()); |
| 228 |
| 229 SkBitmap bitmap; |
| 230 if (!bitmap.installPixels(info, shm.memory(), stride)) |
| 231 return; |
| 232 SkCanvas canvas(bitmap); |
| 233 canvas.setMatrix(params.transform.matrix()); |
| 234 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); |
| 235 |
| 236 scoped_ptr<cc::CompositorFrame> frame_ptr = |
| 237 output_surface_->DemandDrawSw(&canvas); |
| 238 if (frame_ptr) { |
| 239 *result = true; |
| 240 frame_ptr->AssignTo(frame); |
| 241 DeliverMessages(); |
| 242 } |
| 243 PopulateCommonParams(common_renderer_params); |
| 244 } |
| 245 |
199 void SynchronousCompositorProxy::OnComputeScroll( | 246 void SynchronousCompositorProxy::OnComputeScroll( |
200 const SyncCompositorCommonBrowserParams& common_params, | 247 const SyncCompositorCommonBrowserParams& common_params, |
201 base::TimeTicks animation_time, | 248 base::TimeTicks animation_time, |
202 SyncCompositorCommonRendererParams* common_renderer_params) { | 249 SyncCompositorCommonRendererParams* common_renderer_params) { |
203 ProcessCommonParams(common_params); | 250 ProcessCommonParams(common_params); |
204 if (need_animate_scroll_) { | 251 if (need_animate_scroll_) { |
205 need_animate_scroll_ = false; | 252 need_animate_scroll_ = false; |
206 input_handler_proxy_->SynchronouslyAnimate(animation_time); | 253 input_handler_proxy_->SynchronouslyAnimate(animation_time); |
207 } | 254 } |
208 PopulateCommonParams(common_renderer_params); | 255 PopulateCommonParams(common_renderer_params); |
(...skipping 17 matching lines...) Expand all Loading... |
226 total_scroll_offset_ = common_params.root_scroll_offset; | 273 total_scroll_offset_ = common_params.root_scroll_offset; |
227 input_handler_proxy_->SynchronouslySetRootScrollOffset( | 274 input_handler_proxy_->SynchronouslySetRootScrollOffset( |
228 total_scroll_offset_); | 275 total_scroll_offset_); |
229 } | 276 } |
230 if (!common_params.ack.resources.empty()) { | 277 if (!common_params.ack.resources.empty()) { |
231 output_surface_->ReturnResources(common_params.ack); | 278 output_surface_->ReturnResources(common_params.ack); |
232 } | 279 } |
233 } | 280 } |
234 | 281 |
235 } // namespace content | 282 } // namespace content |
OLD | NEW |