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

Unified Diff: content/renderer/android/synchronous_compositor_proxy.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/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());

Powered by Google App Engine
This is Rietveld 408576698