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 DCHECK(software_draw_shm_->zeroed); |
| 252 software_draw_shm_->zeroed = false; |
216 | 253 |
217 SkImageInfo info = | 254 SkImageInfo info = |
218 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); | 255 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
219 size_t stride = info.minRowBytes(); | 256 size_t stride = info.minRowBytes(); |
220 size_t buffer_size = info.getSafeSize(stride); | 257 size_t buffer_size = info.getSafeSize(stride); |
221 DCHECK(buffer_size); | 258 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 | 259 |
228 SkBitmap bitmap; | 260 SkBitmap bitmap; |
229 if (!bitmap.installPixels(info, shm.memory(), stride)) | 261 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) |
230 return; | 262 return; |
231 SkCanvas canvas(bitmap); | 263 SkCanvas canvas(bitmap); |
232 canvas.setMatrix(params.transform.matrix()); | 264 canvas.setMatrix(params.transform.matrix()); |
233 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); | 265 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); |
234 | 266 |
235 scoped_ptr<cc::CompositorFrame> frame_ptr = | 267 scoped_ptr<cc::CompositorFrame> frame_ptr = |
236 output_surface_->DemandDrawSw(&canvas); | 268 output_surface_->DemandDrawSw(&canvas); |
237 if (frame_ptr) { | 269 if (frame_ptr) { |
238 *result = true; | 270 *result = true; |
239 frame_ptr->AssignTo(frame); | 271 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; | 305 total_scroll_offset_ = common_params.root_scroll_offset; |
274 input_handler_proxy_->SynchronouslySetRootScrollOffset( | 306 input_handler_proxy_->SynchronouslySetRootScrollOffset( |
275 total_scroll_offset_); | 307 total_scroll_offset_); |
276 } | 308 } |
277 if (!common_params.ack.resources.empty()) { | 309 if (!common_params.ack.resources.empty()) { |
278 output_surface_->ReturnResources(common_params.ack); | 310 output_surface_->ReturnResources(common_params.ack); |
279 } | 311 } |
280 } | 312 } |
281 | 313 |
282 } // namespace content | 314 } // namespace content |
OLD | NEW |