Chromium Code Reviews| Index: content/renderer/android/synchronous_compositor_proxy.cc |
| diff --git a/content/renderer/android/synchronous_compositor_proxy.cc b/content/renderer/android/synchronous_compositor_proxy.cc |
| index e176975bfdb1b8659a1143e427789fb61de25c89..1deb7c4517ad28adb05330749ecdf1d8f705a119 100644 |
| --- a/content/renderer/android/synchronous_compositor_proxy.cc |
| +++ b/content/renderer/android/synchronous_compositor_proxy.cc |
| @@ -152,6 +152,8 @@ void SynchronousCompositorProxy::OnMessageReceived( |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) |
| + IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) |
| + IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) |
| IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) |
| IPC_END_MESSAGE_MAP() |
| @@ -202,6 +204,40 @@ void SynchronousCompositorProxy::DemandDrawHw( |
| PopulateCommonParams(common_renderer_params); |
| } |
| +struct SynchronousCompositorProxy::SharedMemoryWithSize { |
| + base::SharedMemory shm; |
| + const size_t buffer_size; |
| + bool zeroed; |
| + |
| + SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size) |
| + : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {} |
| +}; |
| + |
| +void SynchronousCompositorProxy::SetSharedMemory( |
| + const SyncCompositorCommonBrowserParams& common_params, |
| + const SyncCompositorSetSharedMemoryParams& params, |
| + bool* success, |
| + SyncCompositorCommonRendererParams* common_renderer_params) { |
| + *success = false; |
| + ProcessCommonParams(common_params); |
| + if (!base::SharedMemory::IsHandleValid(params.shm_handle)) |
| + return; |
| + |
| + software_draw_shm_.reset( |
| + new SharedMemoryWithSize(params.shm_handle, params.buffer_size)); |
| + if (!software_draw_shm_->shm.Map(params.buffer_size)) |
| + return; |
| + DCHECK(software_draw_shm_->shm.memory()); |
| + PopulateCommonParams(common_renderer_params); |
| + *success = true; |
| +} |
| + |
| +void SynchronousCompositorProxy::ZeroSharedMemory() { |
| + DCHECK(!software_draw_shm_->zeroed); |
| + memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size); |
| + software_draw_shm_->zeroed = true; |
| +} |
| + |
| void SynchronousCompositorProxy::DemandDrawSw( |
| const SyncCompositorCommonBrowserParams& common_params, |
| const SyncCompositorDemandDrawSwParams& params, |
| @@ -211,22 +247,19 @@ void SynchronousCompositorProxy::DemandDrawSw( |
| DCHECK(frame); |
| ProcessCommonParams(common_params); |
| *result = false; // Early out ok. |
| - if (!base::SharedMemory::IsHandleValid(params.shm_handle)) |
| - return; |
| + |
| + 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
|
| + DCHECK(software_draw_shm_->zeroed); |
| + software_draw_shm_->zeroed = false; |
| SkImageInfo info = |
| SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); |
| size_t stride = info.minRowBytes(); |
| size_t buffer_size = info.getSafeSize(stride); |
| - DCHECK(buffer_size); |
| - |
| - base::SharedMemory shm(params.shm_handle, false); |
| - if (!shm.Map(buffer_size)) |
| - return; |
| - DCHECK(shm.memory()); |
| + DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size); |
| SkBitmap bitmap; |
| - if (!bitmap.installPixels(info, shm.memory(), stride)) |
| + if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) |
| return; |
| SkCanvas canvas(bitmap); |
| canvas.setMatrix(params.transform.matrix()); |