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 "base/memory/shared_memory.h" |
9 #include "content/common/android/sync_compositor_messages.h" | 9 #include "content/common/android/sync_compositor_messages.h" |
10 #include "content/common/cc_messages.h" | 10 #include "content/common/cc_messages.h" |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
145 | 145 |
146 void SynchronousCompositorProxy::OnMessageReceived( | 146 void SynchronousCompositorProxy::OnMessageReceived( |
147 const IPC::Message& message) { | 147 const IPC::Message& message) { |
148 DCHECK(!inside_receive_); | 148 DCHECK(!inside_receive_); |
149 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); | 149 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); |
150 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) | 150 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) |
151 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) | 151 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) |
152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) | 152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) | 153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) | 154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) | |
156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) | |
155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) | 157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) |
156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) | 158 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) |
157 IPC_END_MESSAGE_MAP() | 159 IPC_END_MESSAGE_MAP() |
158 } | 160 } |
159 | 161 |
160 bool SynchronousCompositorProxy::Send(IPC::Message* message) { | 162 bool SynchronousCompositorProxy::Send(IPC::Message* message) { |
161 return sender_->Send(message); | 163 return sender_->Send(message); |
162 } | 164 } |
163 | 165 |
164 void SynchronousCompositorProxy::HandleInputEvent( | 166 void SynchronousCompositorProxy::HandleInputEvent( |
(...skipping 30 matching lines...) Expand all Loading... | |
195 params.surface_size, params.transform, params.viewport, params.clip, | 197 params.surface_size, params.transform, params.viewport, params.clip, |
196 params.viewport_rect_for_tile_priority, | 198 params.viewport_rect_for_tile_priority, |
197 params.transform_for_tile_priority); | 199 params.transform_for_tile_priority); |
198 if (frame_ptr) { | 200 if (frame_ptr) { |
199 frame_ptr->AssignTo(frame); | 201 frame_ptr->AssignTo(frame); |
200 DeliverMessages(); | 202 DeliverMessages(); |
201 } | 203 } |
202 PopulateCommonParams(common_renderer_params); | 204 PopulateCommonParams(common_renderer_params); |
203 } | 205 } |
204 | 206 |
207 struct SynchronousCompositorProxy::SharedMemoryWithSize { | |
208 base::SharedMemory shm; | |
209 const size_t buffer_size; | |
210 bool zeroed; | |
211 | |
212 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size) | |
213 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} | |
214 }; | |
215 | |
216 void SynchronousCompositorProxy::SetSharedMemory( | |
217 const SyncCompositorCommonBrowserParams& common_params, | |
218 const SyncCompositorSetSharedMemoryParams& params, | |
219 bool* success, | |
220 SyncCompositorCommonRendererParams* common_renderer_params) { | |
221 *success = false; | |
222 ProcessCommonParams(common_params); | |
223 if (!base::SharedMemory::IsHandleValid(params.shm_handle)) | |
224 return; | |
225 | |
226 software_draw_shm_.reset( | |
227 new SharedMemoryWithSize(params.shm_handle, params.buffer_size)); | |
228 if (!software_draw_shm_->shm.Map(params.buffer_size)) | |
229 return; | |
230 DCHECK(software_draw_shm_->shm.memory()); | |
231 PopulateCommonParams(common_renderer_params); | |
232 *success = true; | |
233 } | |
234 | |
235 void SynchronousCompositorProxy::ZeroSharedMemory() { | |
236 DCHECK(!software_draw_shm_->zeroed); | |
237 memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size); | |
238 software_draw_shm_->zeroed = true; | |
239 } | |
240 | |
205 void SynchronousCompositorProxy::DemandDrawSw( | 241 void SynchronousCompositorProxy::DemandDrawSw( |
206 const SyncCompositorCommonBrowserParams& common_params, | 242 const SyncCompositorCommonBrowserParams& common_params, |
207 const SyncCompositorDemandDrawSwParams& params, | 243 const SyncCompositorDemandDrawSwParams& params, |
208 bool* result, | 244 bool* result, |
209 SyncCompositorCommonRendererParams* common_renderer_params, | 245 SyncCompositorCommonRendererParams* common_renderer_params, |
210 cc::CompositorFrame* frame) { | 246 cc::CompositorFrame* frame) { |
211 DCHECK(frame); | 247 DCHECK(frame); |
212 ProcessCommonParams(common_params); | 248 ProcessCommonParams(common_params); |
213 *result = false; // Early out ok. | 249 *result = false; // Early out ok. |
214 if (!base::SharedMemory::IsHandleValid(params.shm_handle)) | 250 |
215 return; | 251 CHECK(software_draw_shm_); |
dcheng
2015/12/29 00:00:24
Why CHECK here?
boliu
2015/12/29 00:16:30
in case if I forgot an edge case and an NPE happen
dcheng
2015/12/29 00:29:52
I'd prefer to remove this, it's going to crash on
boliu
2015/12/29 00:32:29
Sure. Done
| |
252 DCHECK(software_draw_shm_->zeroed); | |
253 software_draw_shm_->zeroed = false; | |
216 | 254 |
217 SkImageInfo info = | 255 SkImageInfo info = |
218 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); | 256 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
219 size_t stride = info.minRowBytes(); | 257 size_t stride = info.minRowBytes(); |
220 size_t buffer_size = info.getSafeSize(stride); | 258 size_t buffer_size = info.getSafeSize(stride); |
221 DCHECK(buffer_size); | 259 DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size); |
222 | |
223 base::SharedMemory shm(params.shm_handle, false); | |
224 if (!shm.Map(buffer_size)) | |
225 return; | |
226 DCHECK(shm.memory()); | |
227 | 260 |
228 SkBitmap bitmap; | 261 SkBitmap bitmap; |
229 if (!bitmap.installPixels(info, shm.memory(), stride)) | 262 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) |
230 return; | 263 return; |
231 SkCanvas canvas(bitmap); | 264 SkCanvas canvas(bitmap); |
232 canvas.setMatrix(params.transform.matrix()); | 265 canvas.setMatrix(params.transform.matrix()); |
233 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); | 266 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); |
234 | 267 |
235 scoped_ptr<cc::CompositorFrame> frame_ptr = | 268 scoped_ptr<cc::CompositorFrame> frame_ptr = |
236 output_surface_->DemandDrawSw(&canvas); | 269 output_surface_->DemandDrawSw(&canvas); |
237 if (frame_ptr) { | 270 if (frame_ptr) { |
238 *result = true; | 271 *result = true; |
239 frame_ptr->AssignTo(frame); | 272 frame_ptr->AssignTo(frame); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
273 total_scroll_offset_ = common_params.root_scroll_offset; | 306 total_scroll_offset_ = common_params.root_scroll_offset; |
274 input_handler_proxy_->SynchronouslySetRootScrollOffset( | 307 input_handler_proxy_->SynchronouslySetRootScrollOffset( |
275 total_scroll_offset_); | 308 total_scroll_offset_); |
276 } | 309 } |
277 if (!common_params.ack.resources.empty()) { | 310 if (!common_params.ack.resources.empty()) { |
278 output_surface_->ReturnResources(common_params.ack); | 311 output_surface_->ReturnResources(common_params.ack); |
279 } | 312 } |
280 } | 313 } |
281 | 314 |
282 } // namespace content | 315 } // namespace content |
OLD | NEW |