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 SynchronousInputHandlerProxy* input_handler_proxy, | 27 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 base::SharedMemory shm(params.shm_handle, false); | |
219 if (!shm.Map(params.size.width() * params.size.height() * 4)) | |
dcheng
2015/11/23 23:26:35
This should probably check for overflow.
boliu
2015/11/24 00:16:33
Done.
| |
220 return; | |
221 DCHECK(shm.memory()); | |
222 | |
223 SkImageInfo info = | |
224 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); | |
225 SkBitmap bitmap; | |
226 if (!bitmap.installPixels(info, shm.memory(), params.size.width() * 4)) | |
dcheng
2015/11/23 23:26:35
As should this.
boliu
2015/11/24 00:16:33
Done.
| |
227 return; | |
228 SkCanvas canvas(bitmap); | |
229 canvas.setMatrix(params.transform.matrix()); | |
230 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); | |
231 | |
232 scoped_ptr<cc::CompositorFrame> frame_ptr = | |
233 output_surface_->DemandDrawSw(&canvas); | |
234 if (frame_ptr) { | |
235 *result = true; | |
236 frame_ptr->AssignTo(frame); | |
237 DeliverMessages(); | |
238 } | |
239 PopulateCommonParams(common_renderer_params); | |
240 } | |
241 | |
199 void SynchronousCompositorProxy::OnComputeScroll( | 242 void SynchronousCompositorProxy::OnComputeScroll( |
200 const SyncCompositorCommonBrowserParams& common_params, | 243 const SyncCompositorCommonBrowserParams& common_params, |
201 base::TimeTicks animation_time, | 244 base::TimeTicks animation_time, |
202 SyncCompositorCommonRendererParams* common_renderer_params) { | 245 SyncCompositorCommonRendererParams* common_renderer_params) { |
203 ProcessCommonParams(common_params); | 246 ProcessCommonParams(common_params); |
204 if (need_animate_scroll_) { | 247 if (need_animate_scroll_) { |
205 need_animate_scroll_ = false; | 248 need_animate_scroll_ = false; |
206 input_handler_proxy_->SynchronouslyAnimate(animation_time); | 249 input_handler_proxy_->SynchronouslyAnimate(animation_time); |
207 } | 250 } |
208 PopulateCommonParams(common_renderer_params); | 251 PopulateCommonParams(common_renderer_params); |
(...skipping 17 matching lines...) Expand all Loading... | |
226 total_scroll_offset_ = common_params.root_scroll_offset; | 269 total_scroll_offset_ = common_params.root_scroll_offset; |
227 input_handler_proxy_->SynchronouslySetRootScrollOffset( | 270 input_handler_proxy_->SynchronouslySetRootScrollOffset( |
228 total_scroll_offset_); | 271 total_scroll_offset_); |
229 } | 272 } |
230 if (!common_params.ack.resources.empty()) { | 273 if (!common_params.ack.resources.empty()) { |
231 output_surface_->ReturnResources(common_params.ack); | 274 output_surface_->ReturnResources(common_params.ack); |
232 } | 275 } |
233 } | 276 } |
234 | 277 |
235 } // namespace content | 278 } // namespace content |
OLD | NEW |