Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(473)

Unified Diff: content/browser/android/synchronous_compositor_host.cc

Issue 1541203003: IPC-based sync compositor software draw optimization (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: bring back zero-ing Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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, &params.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(),

Powered by Google App Engine
This is Rietveld 408576698