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

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: remove CHECK 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..8b6e79897ffa7d7eeda4935aca6c961f75deb40f 100644
--- a/content/browser/android/synchronous_compositor_host.cc
+++ b/content/browser/android/synchronous_compositor_host.cc
@@ -4,6 +4,8 @@
#include "content/browser/android/synchronous_compositor_host.h"
+#include <utility>
+
#include "base/containers/hash_tables.h"
#include "base/memory/shared_memory.h"
#include "base/trace_event/trace_event_argument.h"
@@ -96,6 +98,29 @@ void SynchronousCompositorHost::UpdateFrameMetaData(
rwhva_->SynchronousFrameMetadata(frame_metadata);
}
+class SynchronousCompositorHost::ScopedSendZeroMemory {
+ public:
+ ScopedSendZeroMemory(SynchronousCompositorHost* host) : host_(host) {}
+ ~ScopedSendZeroMemory() { host_->SendZeroMemory(); }
+
+ private:
+ SynchronousCompositorHost* const host_;
+
+ 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) {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(SharedMemoryWithSize);
+};
+
bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) {
SyncCompositorDemandDrawSwParams params;
params.size = gfx::Size(canvas->getBaseLayerSize().width(),
@@ -115,15 +140,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 +154,7 @@ bool SynchronousCompositorHost::DemandDrawSw(SkCanvas* canvas) {
&common_renderer_params, frame.get()))) {
return false;
}
+ ScopedSendZeroMemory send_zero_memory(this);
if (!success)
return false;
@@ -143,7 +162,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 +176,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);
+ 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(),
« no previous file with comments | « content/browser/android/synchronous_compositor_host.h ('k') | content/common/android/sync_compositor_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698