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(), |