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

Side by Side 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 4 years, 12 months 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/android/synchronous_compositor_proxy.h" 5 #include "content/renderer/android/synchronous_compositor_proxy.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/memory/shared_memory.h" 8 #include "base/memory/shared_memory.h"
9 #include "content/common/android/sync_compositor_messages.h" 9 #include "content/common/android/sync_compositor_messages.h"
10 #include "content/common/cc_messages.h" 10 #include "content/common/cc_messages.h"
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 145
146 void SynchronousCompositorProxy::OnMessageReceived( 146 void SynchronousCompositorProxy::OnMessageReceived(
147 const IPC::Message& message) { 147 const IPC::Message& message) {
148 DCHECK(!inside_receive_); 148 DCHECK(!inside_receive_);
149 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); 149 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
150 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) 150 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message)
151 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) 151 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent)
152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) 152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame)
153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) 153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll)
154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw) 154 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawHw, DemandDrawHw)
155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory)
156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory)
155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) 157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw)
156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) 158 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams)
157 IPC_END_MESSAGE_MAP() 159 IPC_END_MESSAGE_MAP()
158 } 160 }
159 161
160 bool SynchronousCompositorProxy::Send(IPC::Message* message) { 162 bool SynchronousCompositorProxy::Send(IPC::Message* message) {
161 return sender_->Send(message); 163 return sender_->Send(message);
162 } 164 }
163 165
164 void SynchronousCompositorProxy::HandleInputEvent( 166 void SynchronousCompositorProxy::HandleInputEvent(
(...skipping 30 matching lines...) Expand all
195 params.surface_size, params.transform, params.viewport, params.clip, 197 params.surface_size, params.transform, params.viewport, params.clip,
196 params.viewport_rect_for_tile_priority, 198 params.viewport_rect_for_tile_priority,
197 params.transform_for_tile_priority); 199 params.transform_for_tile_priority);
198 if (frame_ptr) { 200 if (frame_ptr) {
199 frame_ptr->AssignTo(frame); 201 frame_ptr->AssignTo(frame);
200 DeliverMessages(); 202 DeliverMessages();
201 } 203 }
202 PopulateCommonParams(common_renderer_params); 204 PopulateCommonParams(common_renderer_params);
203 } 205 }
204 206
207 struct SynchronousCompositorProxy::SharedMemoryWithSize {
208 base::SharedMemory shm;
209 const size_t buffer_size;
210 bool zeroed;
211
212 SharedMemoryWithSize(base::SharedMemoryHandle shm_handle, size_t buffer_size)
213 : shm(shm_handle, false), buffer_size(buffer_size), zeroed(true) {}
214 };
215
216 void SynchronousCompositorProxy::SetSharedMemory(
217 const SyncCompositorCommonBrowserParams& common_params,
218 const SyncCompositorSetSharedMemoryParams& params,
219 bool* success,
220 SyncCompositorCommonRendererParams* common_renderer_params) {
221 *success = false;
222 ProcessCommonParams(common_params);
223 if (!base::SharedMemory::IsHandleValid(params.shm_handle))
224 return;
225
226 software_draw_shm_.reset(
227 new SharedMemoryWithSize(params.shm_handle, params.buffer_size));
228 if (!software_draw_shm_->shm.Map(params.buffer_size))
229 return;
230 DCHECK(software_draw_shm_->shm.memory());
231 PopulateCommonParams(common_renderer_params);
232 *success = true;
233 }
234
235 void SynchronousCompositorProxy::ZeroSharedMemory() {
236 DCHECK(!software_draw_shm_->zeroed);
237 memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size);
238 software_draw_shm_->zeroed = true;
239 }
240
205 void SynchronousCompositorProxy::DemandDrawSw( 241 void SynchronousCompositorProxy::DemandDrawSw(
206 const SyncCompositorCommonBrowserParams& common_params, 242 const SyncCompositorCommonBrowserParams& common_params,
207 const SyncCompositorDemandDrawSwParams& params, 243 const SyncCompositorDemandDrawSwParams& params,
208 bool* result, 244 bool* result,
209 SyncCompositorCommonRendererParams* common_renderer_params, 245 SyncCompositorCommonRendererParams* common_renderer_params,
210 cc::CompositorFrame* frame) { 246 cc::CompositorFrame* frame) {
211 DCHECK(frame); 247 DCHECK(frame);
212 ProcessCommonParams(common_params); 248 ProcessCommonParams(common_params);
213 *result = false; // Early out ok. 249 *result = false; // Early out ok.
214 if (!base::SharedMemory::IsHandleValid(params.shm_handle)) 250
215 return; 251 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
252 DCHECK(software_draw_shm_->zeroed);
253 software_draw_shm_->zeroed = false;
216 254
217 SkImageInfo info = 255 SkImageInfo info =
218 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); 256 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height());
219 size_t stride = info.minRowBytes(); 257 size_t stride = info.minRowBytes();
220 size_t buffer_size = info.getSafeSize(stride); 258 size_t buffer_size = info.getSafeSize(stride);
221 DCHECK(buffer_size); 259 DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size);
222
223 base::SharedMemory shm(params.shm_handle, false);
224 if (!shm.Map(buffer_size))
225 return;
226 DCHECK(shm.memory());
227 260
228 SkBitmap bitmap; 261 SkBitmap bitmap;
229 if (!bitmap.installPixels(info, shm.memory(), stride)) 262 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride))
230 return; 263 return;
231 SkCanvas canvas(bitmap); 264 SkCanvas canvas(bitmap);
232 canvas.setMatrix(params.transform.matrix()); 265 canvas.setMatrix(params.transform.matrix());
233 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); 266 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip)));
234 267
235 scoped_ptr<cc::CompositorFrame> frame_ptr = 268 scoped_ptr<cc::CompositorFrame> frame_ptr =
236 output_surface_->DemandDrawSw(&canvas); 269 output_surface_->DemandDrawSw(&canvas);
237 if (frame_ptr) { 270 if (frame_ptr) {
238 *result = true; 271 *result = true;
239 frame_ptr->AssignTo(frame); 272 frame_ptr->AssignTo(frame);
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 total_scroll_offset_ = common_params.root_scroll_offset; 306 total_scroll_offset_ = common_params.root_scroll_offset;
274 input_handler_proxy_->SynchronouslySetRootScrollOffset( 307 input_handler_proxy_->SynchronouslySetRootScrollOffset(
275 total_scroll_offset_); 308 total_scroll_offset_);
276 } 309 }
277 if (!common_params.ack.resources.empty()) { 310 if (!common_params.ack.resources.empty()) {
278 output_surface_->ReturnResources(common_params.ack); 311 output_surface_->ReturnResources(common_params.ack);
279 } 312 }
280 } 313 }
281 314
282 } // namespace content 315 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698