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