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

Side by Side Diff: content/renderer/android/synchronous_compositor_proxy.cc

Issue 1553723003: sync compsitor: Send software reply in swap (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
« no previous file with comments | « content/renderer/android/synchronous_compositor_proxy.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 16 matching lines...) Expand all
27 ui::SynchronousInputHandlerProxy* input_handler_proxy, 27 ui::SynchronousInputHandlerProxy* input_handler_proxy,
28 InputHandlerManagerClient::Handler* handler) 28 InputHandlerManagerClient::Handler* handler)
29 : routing_id_(routing_id), 29 : routing_id_(routing_id),
30 sender_(sender), 30 sender_(sender),
31 output_surface_(output_surface), 31 output_surface_(output_surface),
32 begin_frame_source_(begin_frame_source), 32 begin_frame_source_(begin_frame_source),
33 input_handler_proxy_(input_handler_proxy), 33 input_handler_proxy_(input_handler_proxy),
34 input_handler_(handler), 34 input_handler_(handler),
35 inside_receive_(false), 35 inside_receive_(false),
36 hardware_draw_reply_(nullptr), 36 hardware_draw_reply_(nullptr),
37 software_draw_reply_(nullptr),
37 bytes_limit_(0u), 38 bytes_limit_(0u),
38 version_(0u), 39 version_(0u),
39 page_scale_factor_(0.f), 40 page_scale_factor_(0.f),
40 min_page_scale_factor_(0.f), 41 min_page_scale_factor_(0.f),
41 max_page_scale_factor_(0.f), 42 max_page_scale_factor_(0.f),
42 need_animate_scroll_(false), 43 need_animate_scroll_(false),
43 need_invalidate_(false), 44 need_invalidate_(false),
44 need_begin_frame_(false), 45 need_begin_frame_(false),
45 did_activate_pending_tree_(false) { 46 did_activate_pending_tree_(false) {
46 DCHECK(output_surface_); 47 DCHECK(output_surface_);
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 void SynchronousCompositorProxy::OnMessageReceived( 148 void SynchronousCompositorProxy::OnMessageReceived(
148 const IPC::Message& message) { 149 const IPC::Message& message) {
149 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message) 150 IPC_BEGIN_MESSAGE_MAP(SynchronousCompositorProxy, message)
150 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent) 151 IPC_MESSAGE_HANDLER(SyncCompositorMsg_HandleInputEvent, HandleInputEvent)
151 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame) 152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_BeginFrame, BeginFrame)
152 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll) 153 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ComputeScroll, OnComputeScroll)
153 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw, 154 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawHw,
154 DemandDrawHw) 155 DemandDrawHw)
155 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory) 156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_SetSharedMemory, SetSharedMemory)
156 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory) 157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_ZeroSharedMemory, ZeroSharedMemory)
157 IPC_MESSAGE_HANDLER(SyncCompositorMsg_DemandDrawSw, DemandDrawSw) 158 IPC_MESSAGE_HANDLER_DELAY_REPLY(SyncCompositorMsg_DemandDrawSw,
159 DemandDrawSw)
158 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams) 160 IPC_MESSAGE_HANDLER(SyncCompositorMsg_UpdateState, ProcessCommonParams)
159 IPC_END_MESSAGE_MAP() 161 IPC_END_MESSAGE_MAP()
160 } 162 }
161 163
162 bool SynchronousCompositorProxy::Send(IPC::Message* message) { 164 bool SynchronousCompositorProxy::Send(IPC::Message* message) {
163 return sender_->Send(message); 165 return sender_->Send(message);
164 } 166 }
165 167
166 void SynchronousCompositorProxy::HandleInputEvent( 168 void SynchronousCompositorProxy::HandleInputEvent(
167 const SyncCompositorCommonBrowserParams& common_params, 169 const SyncCompositorCommonBrowserParams& common_params,
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 276
275 void SynchronousCompositorProxy::ZeroSharedMemory() { 277 void SynchronousCompositorProxy::ZeroSharedMemory() {
276 DCHECK(!software_draw_shm_->zeroed); 278 DCHECK(!software_draw_shm_->zeroed);
277 memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size); 279 memset(software_draw_shm_->shm.memory(), 0, software_draw_shm_->buffer_size);
278 software_draw_shm_->zeroed = true; 280 software_draw_shm_->zeroed = true;
279 } 281 }
280 282
281 void SynchronousCompositorProxy::DemandDrawSw( 283 void SynchronousCompositorProxy::DemandDrawSw(
282 const SyncCompositorCommonBrowserParams& common_params, 284 const SyncCompositorCommonBrowserParams& common_params,
283 const SyncCompositorDemandDrawSwParams& params, 285 const SyncCompositorDemandDrawSwParams& params,
284 bool* result, 286 IPC::Message* reply_message) {
285 SyncCompositorCommonRendererParams* common_renderer_params,
286 cc::CompositorFrame* frame) {
287 DCHECK(!inside_receive_); 287 DCHECK(!inside_receive_);
288 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); 288 inside_receive_ = true;
289 ProcessCommonParams(common_params);
290 {
291 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply(
hush (inactive) 2015/12/30 21:51:09 name scoped_software_draw_reply?
boliu 2015/12/30 22:17:46 Oops. Done
292 &software_draw_reply_, reply_message);
293 DoDemandDrawSw(params);
294 }
295 if (inside_receive_) {
296 // Did not swap.
297 cc::CompositorFrame empty_frame;
298 SendDemandDrawSwReply(false, &empty_frame, reply_message);
hush (inactive) 2015/12/30 21:51:09 there seems to be an inconsistency between the IPC
boliu 2015/12/30 22:17:46 True. Previously the success bit was so that I cou
299 inside_receive_ = false;
300 } else {
301 DeliverMessages();
302 }
303 }
289 304
290 DCHECK(frame); 305 void SynchronousCompositorProxy::DoDemandDrawSw(
291 ProcessCommonParams(common_params); 306 const SyncCompositorDemandDrawSwParams& params) {
292 *result = false; // Early out ok.
293
294 DCHECK(software_draw_shm_->zeroed); 307 DCHECK(software_draw_shm_->zeroed);
295 software_draw_shm_->zeroed = false; 308 software_draw_shm_->zeroed = false;
296 309
297 SkImageInfo info = 310 SkImageInfo info =
298 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); 311 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height());
299 size_t stride = info.minRowBytes(); 312 size_t stride = info.minRowBytes();
300 size_t buffer_size = info.getSafeSize(stride); 313 size_t buffer_size = info.getSafeSize(stride);
301 DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size); 314 DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size);
302 315
303 SkBitmap bitmap; 316 SkBitmap bitmap;
304 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride)) 317 if (!bitmap.installPixels(info, software_draw_shm_->shm.memory(), stride))
305 return; 318 return;
306 SkCanvas canvas(bitmap); 319 SkCanvas canvas(bitmap);
307 canvas.setMatrix(params.transform.matrix()); 320 canvas.setMatrix(params.transform.matrix());
308 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip))); 321 canvas.setClipRegion(SkRegion(gfx::RectToSkIRect(params.clip)));
309 322
310 output_surface_->DemandDrawSw(&canvas); 323 output_surface_->DemandDrawSw(&canvas);
311 if (software_frame_holder_) { 324 }
312 *result = true; 325
313 software_frame_holder_->AssignTo(frame); 326 void SynchronousCompositorProxy::SwapBuffersSw(cc::CompositorFrame* frame) {
314 software_frame_holder_.reset(); 327 DCHECK(inside_receive_);
315 DeliverMessages(); 328 DCHECK(software_draw_reply_);
316 } 329 DCHECK(frame);
317 PopulateCommonParams(common_renderer_params); 330 SendDemandDrawSwReply(true, frame, software_draw_reply_);
331 inside_receive_ = false;
332 }
333
334 void SynchronousCompositorProxy::SendDemandDrawSwReply(
335 bool success,
336 cc::CompositorFrame* frame,
337 IPC::Message* reply_message) {
338 SyncCompositorCommonRendererParams common_renderer_params;
339 PopulateCommonParams(&common_renderer_params);
340 // Not using WriteParams because cc::CompositorFrame is not copy-able.
341 IPC::ParamTraits<bool>::Write(reply_message, success);
342 IPC::ParamTraits<SyncCompositorCommonRendererParams>::Write(
343 reply_message, common_renderer_params);
344 IPC::ParamTraits<cc::CompositorFrame>::Write(reply_message, *frame);
345 Send(reply_message);
318 } 346 }
319 347
320 void SynchronousCompositorProxy::SwapBuffers(cc::CompositorFrame* frame) { 348 void SynchronousCompositorProxy::SwapBuffers(cc::CompositorFrame* frame) {
349 DCHECK(hardware_draw_reply_ || software_draw_reply_);
350 DCHECK(!(hardware_draw_reply_ && software_draw_reply_));
hush (inactive) 2015/12/30 21:51:09 the above 2 lines can be combined into an xor on t
boliu 2015/12/30 22:17:46 Those aren't booleans though
321 if (hardware_draw_reply_) { 351 if (hardware_draw_reply_) {
322 SwapBuffersHw(frame); 352 SwapBuffersHw(frame);
323 return; 353 } else if (software_draw_reply_) {
354 SwapBuffersSw(frame);
324 } 355 }
325
326 DCHECK(!software_frame_holder_);
327 software_frame_holder_.reset(new cc::CompositorFrame);
328 frame->AssignTo(software_frame_holder_.get());
329 } 356 }
330 357
331 void SynchronousCompositorProxy::OnComputeScroll( 358 void SynchronousCompositorProxy::OnComputeScroll(
332 const SyncCompositorCommonBrowserParams& common_params, 359 const SyncCompositorCommonBrowserParams& common_params,
333 base::TimeTicks animation_time, 360 base::TimeTicks animation_time,
334 SyncCompositorCommonRendererParams* common_renderer_params) { 361 SyncCompositorCommonRendererParams* common_renderer_params) {
335 DCHECK(!inside_receive_); 362 DCHECK(!inside_receive_);
336 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true); 363 base::AutoReset<bool> scoped_inside_receive(&inside_receive_, true);
337 364
338 ProcessCommonParams(common_params); 365 ProcessCommonParams(common_params);
(...skipping 23 matching lines...) Expand all
362 total_scroll_offset_ = common_params.root_scroll_offset; 389 total_scroll_offset_ = common_params.root_scroll_offset;
363 input_handler_proxy_->SynchronouslySetRootScrollOffset( 390 input_handler_proxy_->SynchronouslySetRootScrollOffset(
364 total_scroll_offset_); 391 total_scroll_offset_);
365 } 392 }
366 if (!common_params.ack.resources.empty()) { 393 if (!common_params.ack.resources.empty()) {
367 output_surface_->ReturnResources(common_params.ack); 394 output_surface_->ReturnResources(common_params.ack);
368 } 395 }
369 } 396 }
370 397
371 } // namespace content 398 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/android/synchronous_compositor_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698