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

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

Issue 1773873002: sync compositor: Handle context loss (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 9 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/command_line.h" 8 #include "base/command_line.h"
9 #include "base/memory/shared_memory.h" 9 #include "base/memory/shared_memory.h"
10 #include "content/common/android/sync_compositor_messages.h" 10 #include "content/common/android/sync_compositor_messages.h"
11 #include "content/common/cc_messages.h" 11 #include "content/common/cc_messages.h"
12 #include "content/public/common/content_switches.h" 12 #include "content/public/common/content_switches.h"
13 #include "ipc/ipc_message.h" 13 #include "ipc/ipc_message.h"
14 #include "ipc/ipc_sender.h" 14 #include "ipc/ipc_sender.h"
15 #include "third_party/skia/include/core/SkBitmap.h" 15 #include "third_party/skia/include/core/SkBitmap.h"
16 #include "third_party/skia/include/core/SkCanvas.h" 16 #include "third_party/skia/include/core/SkCanvas.h"
17 #include "third_party/skia/include/core/SkImageInfo.h" 17 #include "third_party/skia/include/core/SkImageInfo.h"
18 #include "third_party/skia/include/core/SkRegion.h" 18 #include "third_party/skia/include/core/SkRegion.h"
19 #include "ui/events/latency_info.h" 19 #include "ui/events/latency_info.h"
20 #include "ui/gfx/skia_util.h" 20 #include "ui/gfx/skia_util.h"
21 21
22 namespace content { 22 namespace content {
23 23
24 SynchronousCompositorProxy::SynchronousCompositorProxy( 24 SynchronousCompositorProxy::SynchronousCompositorProxy(
25 int routing_id, 25 int routing_id,
26 IPC::Sender* sender, 26 IPC::Sender* sender,
27 SynchronousCompositorOutputSurface* output_surface,
28 SynchronousCompositorExternalBeginFrameSource* begin_frame_source, 27 SynchronousCompositorExternalBeginFrameSource* begin_frame_source,
29 ui::SynchronousInputHandlerProxy* input_handler_proxy, 28 ui::SynchronousInputHandlerProxy* input_handler_proxy,
30 InputHandlerManagerClient::Handler* handler) 29 InputHandlerManagerClient::Handler* handler)
31 : routing_id_(routing_id), 30 : routing_id_(routing_id),
32 sender_(sender), 31 sender_(sender),
33 output_surface_(output_surface),
34 begin_frame_source_(begin_frame_source), 32 begin_frame_source_(begin_frame_source),
35 input_handler_proxy_(input_handler_proxy), 33 input_handler_proxy_(input_handler_proxy),
36 input_handler_(handler), 34 input_handler_(handler),
37 use_in_process_zero_copy_software_draw_( 35 use_in_process_zero_copy_software_draw_(
38 base::CommandLine::ForCurrentProcess()->HasSwitch( 36 base::CommandLine::ForCurrentProcess()->HasSwitch(
39 switches::kSingleProcess)), 37 switches::kSingleProcess)),
38 output_surface_(nullptr),
40 inside_receive_(false), 39 inside_receive_(false),
41 hardware_draw_reply_(nullptr), 40 hardware_draw_reply_(nullptr),
42 software_draw_reply_(nullptr), 41 software_draw_reply_(nullptr),
43 bytes_limit_(0u), 42 bytes_limit_(0u),
44 version_(0u), 43 version_(0u),
45 page_scale_factor_(0.f), 44 page_scale_factor_(0.f),
46 min_page_scale_factor_(0.f), 45 min_page_scale_factor_(0.f),
47 max_page_scale_factor_(0.f), 46 max_page_scale_factor_(0.f),
48 need_animate_scroll_(false), 47 need_animate_scroll_(false),
49 need_invalidate_count_(0u), 48 need_invalidate_count_(0u),
50 need_begin_frame_(false), 49 need_begin_frame_(false),
51 did_activate_pending_tree_count_(0u) { 50 did_activate_pending_tree_count_(0u) {
52 DCHECK(output_surface_);
53 DCHECK(begin_frame_source_); 51 DCHECK(begin_frame_source_);
54 DCHECK(input_handler_proxy_); 52 DCHECK(input_handler_proxy_);
55 DCHECK(input_handler_); 53 DCHECK(input_handler_);
56 output_surface_->SetSyncClient(this);
57 output_surface_->SetTreeActivationCallback(
58 base::Bind(&SynchronousCompositorProxy::DidActivatePendingTree,
59 base::Unretained(this)));
60 begin_frame_source_->SetClient(this); 54 begin_frame_source_->SetClient(this);
61 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this); 55 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(this);
62 } 56 }
63 57
64 SynchronousCompositorProxy::~SynchronousCompositorProxy() { 58 SynchronousCompositorProxy::~SynchronousCompositorProxy() {
65 output_surface_->SetSyncClient(nullptr); 59 SetOutputSurface(nullptr);
66 output_surface_->SetTreeActivationCallback(base::Closure());
67 begin_frame_source_->SetClient(nullptr); 60 begin_frame_source_->SetClient(nullptr);
68 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr); 61 input_handler_proxy_->SetOnlySynchronouslyAnimateRootFlings(nullptr);
69 } 62 }
70 63
64 void SynchronousCompositorProxy::SetOutputSurface(
65 SynchronousCompositorOutputSurface* output_surface) {
66 DCHECK_NE(output_surface_, output_surface);
67 if (output_surface_) {
68 output_surface_->SetSyncClient(nullptr);
69 output_surface_->SetTreeActivationCallback(base::Closure());
70 }
71 output_surface_ = output_surface;
72 if (output_surface_) {
73 output_surface_->SetSyncClient(this);
74 output_surface_->SetTreeActivationCallback(
75 base::Bind(&SynchronousCompositorProxy::DidActivatePendingTree,
76 base::Unretained(this)));
77 output_surface_->SetMemoryPolicy(bytes_limit_);
Tobias Sargeant 2016/03/23 10:10:55 I guess previously we would never have called SetM
boliu 2016/03/23 15:52:53 Same behavior either way.
78 }
79 }
80
71 void SynchronousCompositorProxy::SetNeedsSynchronousAnimateInput() { 81 void SynchronousCompositorProxy::SetNeedsSynchronousAnimateInput() {
72 need_animate_scroll_ = true; 82 need_animate_scroll_ = true;
73 Invalidate(); 83 Invalidate();
74 } 84 }
75 85
76 void SynchronousCompositorProxy::UpdateRootLayerState( 86 void SynchronousCompositorProxy::UpdateRootLayerState(
77 const gfx::ScrollOffset& total_scroll_offset, 87 const gfx::ScrollOffset& total_scroll_offset,
78 const gfx::ScrollOffset& max_scroll_offset, 88 const gfx::ScrollOffset& max_scroll_offset,
79 const gfx::SizeF& scrollable_size, 89 const gfx::SizeF& scrollable_size,
80 float page_scale_factor, 90 float page_scale_factor,
(...skipping 29 matching lines...) Expand all
110 SendAsyncRendererStateIfNeeded(); 120 SendAsyncRendererStateIfNeeded();
111 } 121 }
112 122
113 void SynchronousCompositorProxy::DidActivatePendingTree() { 123 void SynchronousCompositorProxy::DidActivatePendingTree() {
114 ++did_activate_pending_tree_count_; 124 ++did_activate_pending_tree_count_;
115 SendAsyncRendererStateIfNeeded(); 125 SendAsyncRendererStateIfNeeded();
116 DeliverMessages(); 126 DeliverMessages();
117 } 127 }
118 128
119 void SynchronousCompositorProxy::DeliverMessages() { 129 void SynchronousCompositorProxy::DeliverMessages() {
130 DCHECK(output_surface_);
120 std::vector<scoped_ptr<IPC::Message>> messages; 131 std::vector<scoped_ptr<IPC::Message>> messages;
121 output_surface_->GetMessagesToDeliver(&messages); 132 output_surface_->GetMessagesToDeliver(&messages);
122 for (auto& msg : messages) { 133 for (auto& msg : messages) {
123 Send(msg.release()); 134 Send(msg.release());
124 } 135 }
125 } 136 }
126 137
127 void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() { 138 void SynchronousCompositorProxy::SendAsyncRendererStateIfNeeded() {
128 if (inside_receive_) 139 if (inside_receive_)
129 return; 140 return;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 void SynchronousCompositorProxy::DemandDrawHw( 210 void SynchronousCompositorProxy::DemandDrawHw(
200 const SyncCompositorCommonBrowserParams& common_params, 211 const SyncCompositorCommonBrowserParams& common_params,
201 const SyncCompositorDemandDrawHwParams& params, 212 const SyncCompositorDemandDrawHwParams& params,
202 IPC::Message* reply_message) { 213 IPC::Message* reply_message) {
203 DCHECK(!inside_receive_); 214 DCHECK(!inside_receive_);
204 DCHECK(reply_message); 215 DCHECK(reply_message);
205 216
206 inside_receive_ = true; 217 inside_receive_ = true;
207 ProcessCommonParams(common_params); 218 ProcessCommonParams(common_params);
208 219
209 { 220 if (output_surface_) {
210 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply( 221 base::AutoReset<IPC::Message*> scoped_hardware_draw_reply(
211 &hardware_draw_reply_, reply_message); 222 &hardware_draw_reply_, reply_message);
212 output_surface_->DemandDrawHw(params.surface_size, params.transform, 223 output_surface_->DemandDrawHw(params.surface_size, params.transform,
213 params.viewport, params.clip, 224 params.viewport, params.clip,
214 params.viewport_rect_for_tile_priority, 225 params.viewport_rect_for_tile_priority,
215 params.transform_for_tile_priority); 226 params.transform_for_tile_priority);
216 } 227 }
217 228
218 if (inside_receive_) { 229 if (inside_receive_) {
219 // Did not swap. 230 // Did not swap.
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 software_draw_shm_->zeroed = true; 306 software_draw_shm_->zeroed = true;
296 } 307 }
297 308
298 void SynchronousCompositorProxy::DemandDrawSw( 309 void SynchronousCompositorProxy::DemandDrawSw(
299 const SyncCompositorCommonBrowserParams& common_params, 310 const SyncCompositorCommonBrowserParams& common_params,
300 const SyncCompositorDemandDrawSwParams& params, 311 const SyncCompositorDemandDrawSwParams& params,
301 IPC::Message* reply_message) { 312 IPC::Message* reply_message) {
302 DCHECK(!inside_receive_); 313 DCHECK(!inside_receive_);
303 inside_receive_ = true; 314 inside_receive_ = true;
304 ProcessCommonParams(common_params); 315 ProcessCommonParams(common_params);
305 { 316 if (output_surface_) {
306 base::AutoReset<IPC::Message*> scoped_software_draw_reply( 317 base::AutoReset<IPC::Message*> scoped_software_draw_reply(
307 &software_draw_reply_, reply_message); 318 &software_draw_reply_, reply_message);
308 if (use_in_process_zero_copy_software_draw_) { 319 if (use_in_process_zero_copy_software_draw_) {
309 DCHECK(g_sk_canvas_for_draw); 320 DCHECK(g_sk_canvas_for_draw);
310 output_surface_->DemandDrawSw(g_sk_canvas_for_draw); 321 output_surface_->DemandDrawSw(g_sk_canvas_for_draw);
311 } else { 322 } else {
312 DCHECK(!g_sk_canvas_for_draw); 323 DCHECK(!g_sk_canvas_for_draw);
313 DoDemandDrawSw(params); 324 DoDemandDrawSw(params);
314 } 325 }
315 } 326 }
316 if (inside_receive_) { 327 if (inside_receive_) {
317 // Did not swap. 328 // Did not swap.
318 cc::CompositorFrame empty_frame; 329 cc::CompositorFrame empty_frame;
319 SendDemandDrawSwReply(false, &empty_frame, reply_message); 330 SendDemandDrawSwReply(false, &empty_frame, reply_message);
320 inside_receive_ = false; 331 inside_receive_ = false;
321 } else { 332 } else {
322 DeliverMessages(); 333 DeliverMessages();
323 } 334 }
324 } 335 }
325 336
326 void SynchronousCompositorProxy::DoDemandDrawSw( 337 void SynchronousCompositorProxy::DoDemandDrawSw(
327 const SyncCompositorDemandDrawSwParams& params) { 338 const SyncCompositorDemandDrawSwParams& params) {
339 DCHECK(output_surface_);
328 DCHECK(software_draw_shm_->zeroed); 340 DCHECK(software_draw_shm_->zeroed);
329 software_draw_shm_->zeroed = false; 341 software_draw_shm_->zeroed = false;
330 342
331 SkImageInfo info = 343 SkImageInfo info =
332 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height()); 344 SkImageInfo::MakeN32Premul(params.size.width(), params.size.height());
333 size_t stride = info.minRowBytes(); 345 size_t stride = info.minRowBytes();
334 size_t buffer_size = info.getSafeSize(stride); 346 size_t buffer_size = info.getSafeSize(stride);
335 DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size); 347 DCHECK_EQ(software_draw_shm_->buffer_size, buffer_size);
336 348
337 SkBitmap bitmap; 349 SkBitmap bitmap;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
389 SyncCompositorCommonRendererParams params; 401 SyncCompositorCommonRendererParams params;
390 PopulateCommonParams(&params); 402 PopulateCommonParams(&params);
391 Send(new SyncCompositorHostMsg_OverScroll(routing_id_, params, 403 Send(new SyncCompositorHostMsg_OverScroll(routing_id_, params,
392 did_overscroll_params)); 404 did_overscroll_params));
393 } 405 }
394 406
395 void SynchronousCompositorProxy::ProcessCommonParams( 407 void SynchronousCompositorProxy::ProcessCommonParams(
396 const SyncCompositorCommonBrowserParams& common_params) { 408 const SyncCompositorCommonBrowserParams& common_params) {
397 if (bytes_limit_ != common_params.bytes_limit) { 409 if (bytes_limit_ != common_params.bytes_limit) {
398 bytes_limit_ = common_params.bytes_limit; 410 bytes_limit_ = common_params.bytes_limit;
399 output_surface_->SetMemoryPolicy(bytes_limit_); 411 if (output_surface_)
412 output_surface_->SetMemoryPolicy(bytes_limit_);
400 } 413 }
401 if (common_params.update_root_scroll_offset && 414 if (common_params.update_root_scroll_offset &&
402 total_scroll_offset_ != common_params.root_scroll_offset) { 415 total_scroll_offset_ != common_params.root_scroll_offset) {
403 total_scroll_offset_ = common_params.root_scroll_offset; 416 total_scroll_offset_ = common_params.root_scroll_offset;
404 input_handler_proxy_->SynchronouslySetRootScrollOffset( 417 input_handler_proxy_->SynchronouslySetRootScrollOffset(
405 total_scroll_offset_); 418 total_scroll_offset_);
406 } 419 }
407 begin_frame_source_->SetBeginFrameSourcePaused( 420 begin_frame_source_->SetBeginFrameSourcePaused(
408 common_params.begin_frame_source_paused); 421 common_params.begin_frame_source_paused);
409 if (!common_params.ack.resources.empty()) { 422 if (output_surface_ && !common_params.ack.resources.empty()) {
410 output_surface_->ReturnResources( 423 output_surface_->ReturnResources(
411 common_params.output_surface_id_for_returned_resources, 424 common_params.output_surface_id_for_returned_resources,
412 common_params.ack); 425 common_params.ack);
413 } 426 }
414 } 427 }
415 428
416 } // namespace content 429 } // 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