Chromium Code Reviews| Index: content/browser/android/synchronous_compositor_host.cc |
| diff --git a/content/browser/android/synchronous_compositor_host.cc b/content/browser/android/synchronous_compositor_host.cc |
| index d2eea3e411fdbb30b18d203c0ca7b9f39de55db0..4c49bceeb5741ef40dbcbe5d3ba6e7f766a8121b 100644 |
| --- a/content/browser/android/synchronous_compositor_host.cc |
| +++ b/content/browser/android/synchronous_compositor_host.cc |
| @@ -96,6 +96,26 @@ void SynchronousCompositorHost::UpdateFrameMetaData( |
| rwhva_->SynchronousFrameMetadata(frame_metadata); |
| } |
| +class SynchronousCompositorHost::ScopedSendZeroMemory { |
| + public: |
| + ScopedSendZeroMemory(SynchronousCompositorHost* host) : host_(host) {} |
| + ~ScopedSendZeroMemory() { host_->SendZeroMemory(); } |
| + |
| + private: |
| + SynchronousCompositorHost* host_; |
|
dcheng
2015/12/29 00:00:24
Nit: T* const.
boliu
2015/12/29 00:16:30
Done.
|
| + |
| + DISALLOW_COPY_AND_ASSIGN(ScopedSendZeroMemory); |
| +}; |
| + |
| +struct SynchronousCompositorHost::SharedMemoryWithSize { |
| + base::SharedMemory shm; |
| + const size_t stride; |
| + const size_t buffer_size; |
| + |
| + SharedMemoryWithSize(size_t stride, size_t buffer_size) |
| + : stride(stride), buffer_size(buffer_size) {} |
| +}; |
|
dcheng
2015/12/29 00:00:24
DISALLOW_COPY_AND_ASSIGN here too?
boliu
2015/12/29 00:16:30
Done.
|
| + |
| bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
| SyncCompositorDemandDrawSwParams params; |
| params.size = gfx::Size(canvas->getBaseLayerSize().width(), |
| @@ -115,15 +135,8 @@ bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
| if (!buffer_size) |
| return false; // Overflow. |
| - base::SharedMemory shm; |
| - { |
| - TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size); |
| - if (!shm.CreateAndMapAnonymous(buffer_size)) |
| - return false; |
| - } |
| - base::ProcessHandle renderer_process_handle = |
| - rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); |
| - if (!shm.ShareToProcess(renderer_process_handle, ¶ms.shm_handle)) |
| + SetSoftwareDrawSharedMemoryIfNeeded(stride, buffer_size); |
| + if (!software_draw_shm_) |
| return false; |
| scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| @@ -136,6 +149,7 @@ bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
| &common_renderer_params, frame.get()))) { |
| return false; |
| } |
| + ScopedSendZeroMemory send_zero_memory(this); |
| if (!success) |
| return false; |
| @@ -143,7 +157,7 @@ bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
| UpdateFrameMetaData(frame->metadata); |
| SkBitmap bitmap; |
| - if (!bitmap.installPixels(info, shm.memory(), stride)) |
| + if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) |
| return false; |
| { |
| @@ -157,6 +171,49 @@ bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) { |
| return true; |
| } |
| +void SynchronousCompositorHost::SetSoftwareDrawSharedMemoryIfNeeded( |
| + size_t stride, |
| + size_t buffer_size) { |
| + if (software_draw_shm_ && software_draw_shm_->stride == stride && |
| + software_draw_shm_->buffer_size == buffer_size) |
| + return; |
| + software_draw_shm_.reset(); |
| + scoped_ptr<SharedMemoryWithSize> software_draw_shm( |
| + new SharedMemoryWithSize(stride, buffer_size)); |
| + { |
| + TRACE_EVENT1("browser", "AllocateSharedMemory", "buffer_size", buffer_size); |
| + if (!software_draw_shm->shm.CreateAndMapAnonymous(buffer_size)) |
| + return; |
| + } |
| + |
| + SyncCompositorSetSharedMemoryParams set_shm_params; |
| + set_shm_params.buffer_size = buffer_size; |
| + base::ProcessHandle renderer_process_handle = |
| + rwhva_->GetRenderWidgetHost()->GetProcess()->GetHandle(); |
| + if (!software_draw_shm->shm.ShareToProcess(renderer_process_handle, |
| + &set_shm_params.shm_handle)) { |
| + return; |
| + } |
| + |
| + SyncCompositorCommonBrowserParams common_browser_params; |
| + PopulateCommonParams(&common_browser_params); |
| + bool success = false; |
| + SyncCompositorCommonRendererParams common_renderer_params; |
| + if (!sender_->Send(new SyncCompositorMsg_SetSharedMemory( |
| + routing_id_, common_browser_params, set_shm_params, &success, |
| + &common_renderer_params)) || |
| + !success) { |
| + return; |
| + } |
| + software_draw_shm_ = std::move(software_draw_shm); |
|
dcheng
2015/12/29 00:00:24
#include <utility>
boliu
2015/12/29 00:16:30
Done.
|
| + ProcessCommonParams(common_renderer_params); |
| +} |
| + |
| +void SynchronousCompositorHost::SendZeroMemory() { |
| + // No need to check return value. |
| + sender_->Send(new SyncCompositorMsg_ZeroSharedMemory(routing_id_)); |
| +} |
| + |
| void SynchronousCompositorHost::ReturnResources( |
| const cc::CompositorFrameAck& frame_ack) { |
| returned_resources_.insert(returned_resources_.end(), |