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

Side by Side Diff: ui/compositor/compositor.cc

Issue 1414533003: Make ui::Compositor BeginFrame subscription robust (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup comment Created 5 years, 1 month 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 | « ui/compositor/compositor.h ('k') | ui/compositor/compositor_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/compositor/compositor.h" 5 #include "ui/compositor/compositor.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <deque> 8 #include <deque>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 187
188 CancelCompositorLock(); 188 CancelCompositorLock();
189 DCHECK(!compositor_lock_); 189 DCHECK(!compositor_lock_);
190 190
191 FOR_EACH_OBSERVER(CompositorObserver, observer_list_, 191 FOR_EACH_OBSERVER(CompositorObserver, observer_list_,
192 OnCompositingShuttingDown(this)); 192 OnCompositingShuttingDown(this));
193 193
194 FOR_EACH_OBSERVER(CompositorAnimationObserver, animation_observer_list_, 194 FOR_EACH_OBSERVER(CompositorAnimationObserver, animation_observer_list_,
195 OnCompositingShuttingDown(this)); 195 OnCompositingShuttingDown(this));
196 196
197 DCHECK(begin_frame_observer_list_.empty());
198
199 if (root_layer_) 197 if (root_layer_)
200 root_layer_->ResetCompositor(); 198 root_layer_->ResetCompositor();
201 199
202 // Stop all outstanding draws before telling the ContextFactory to tear 200 // Stop all outstanding draws before telling the ContextFactory to tear
203 // down any contexts that the |host_| may rely upon. 201 // down any contexts that the |host_| may rely upon.
204 host_.reset(); 202 host_.reset();
205 203
206 context_factory_->RemoveCompositor(this); 204 context_factory_->RemoveCompositor(this);
207 } 205 }
208 206
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 CompositorAnimationObserver* observer) { 350 CompositorAnimationObserver* observer) {
353 animation_observer_list_.RemoveObserver(observer); 351 animation_observer_list_.RemoveObserver(observer);
354 } 352 }
355 353
356 bool Compositor::HasAnimationObserver( 354 bool Compositor::HasAnimationObserver(
357 const CompositorAnimationObserver* observer) const { 355 const CompositorAnimationObserver* observer) const {
358 return animation_observer_list_.HasObserver(observer); 356 return animation_observer_list_.HasObserver(observer);
359 } 357 }
360 358
361 void Compositor::AddBeginFrameObserver(CompositorBeginFrameObserver* observer) { 359 void Compositor::AddBeginFrameObserver(CompositorBeginFrameObserver* observer) {
362 DCHECK(std::find(begin_frame_observer_list_.begin(), 360 if (!begin_frame_observer_list_.might_have_observers())
363 begin_frame_observer_list_.end(), observer) == 361 host_->SetChildrenNeedBeginFrames(true);
364 begin_frame_observer_list_.end());
365 362
366 if (begin_frame_observer_list_.empty()) 363 begin_frame_observer_list_.AddObserver(observer);
367 host_->SetChildrenNeedBeginFrames(true);
368 364
369 if (missed_begin_frame_args_.IsValid()) 365 if (missed_begin_frame_args_.IsValid())
370 observer->OnSendBeginFrame(missed_begin_frame_args_); 366 observer->OnSendBeginFrame(missed_begin_frame_args_);
371
372 begin_frame_observer_list_.push_back(observer);
373 } 367 }
374 368
375 void Compositor::RemoveBeginFrameObserver( 369 void Compositor::RemoveBeginFrameObserver(
376 CompositorBeginFrameObserver* observer) { 370 CompositorBeginFrameObserver* observer) {
377 auto it = std::find(begin_frame_observer_list_.begin(), 371 begin_frame_observer_list_.RemoveObserver(observer);
378 begin_frame_observer_list_.end(), observer);
379 DCHECK(it != begin_frame_observer_list_.end());
380 begin_frame_observer_list_.erase(it);
381 372
382 if (begin_frame_observer_list_.empty()) { 373 // As this call may take place while iterating over observers, unsubscription
383 host_->SetChildrenNeedBeginFrames(false); 374 // from |host_| is performed after iteration in |SendBeginFramesToChildren()|.
384 missed_begin_frame_args_ = cc::BeginFrameArgs();
385 }
386 } 375 }
387 376
388 void Compositor::BeginMainFrame(const cc::BeginFrameArgs& args) { 377 void Compositor::BeginMainFrame(const cc::BeginFrameArgs& args) {
389 FOR_EACH_OBSERVER(CompositorAnimationObserver, 378 FOR_EACH_OBSERVER(CompositorAnimationObserver,
390 animation_observer_list_, 379 animation_observer_list_,
391 OnAnimationStep(args.frame_time)); 380 OnAnimationStep(args.frame_time));
392 if (animation_observer_list_.might_have_observers()) 381 if (animation_observer_list_.might_have_observers())
393 host_->SetNeedsAnimate(); 382 host_->SetNeedsAnimate();
394 } 383 }
395 384
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 OnCompositingStarted(this, start_time)); 434 OnCompositingStarted(this, start_time));
446 } 435 }
447 436
448 void Compositor::DidAbortSwapBuffers() { 437 void Compositor::DidAbortSwapBuffers() {
449 FOR_EACH_OBSERVER(CompositorObserver, 438 FOR_EACH_OBSERVER(CompositorObserver,
450 observer_list_, 439 observer_list_,
451 OnCompositingAborted(this)); 440 OnCompositingAborted(this));
452 } 441 }
453 442
454 void Compositor::SendBeginFramesToChildren(const cc::BeginFrameArgs& args) { 443 void Compositor::SendBeginFramesToChildren(const cc::BeginFrameArgs& args) {
455 for (auto observer : begin_frame_observer_list_) 444 FOR_EACH_OBSERVER(CompositorBeginFrameObserver, begin_frame_observer_list_,
456 observer->OnSendBeginFrame(args); 445 OnSendBeginFrame(args));
446
447 // Unsubscription is performed here, after iteration, to handle the case where
448 // the last BeginFrame observer is removed while iterating over the observers.
449 if (!begin_frame_observer_list_.might_have_observers()) {
450 host_->SetChildrenNeedBeginFrames(false);
451 // Unsubscription should reset |missed_begin_frame_args_|, avoiding stale
452 // BeginFrame dispatch when the next BeginFrame observer is added.
453 missed_begin_frame_args_ = cc::BeginFrameArgs();
454 return;
455 }
457 456
458 missed_begin_frame_args_ = args; 457 missed_begin_frame_args_ = args;
459 missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; 458 missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
460 } 459 }
461 460
462 const cc::LayerTreeDebugState& Compositor::GetLayerTreeDebugState() const { 461 const cc::LayerTreeDebugState& Compositor::GetLayerTreeDebugState() const {
463 return host_->debug_state(); 462 return host_->debug_state();
464 } 463 }
465 464
466 void Compositor::SetLayerTreeDebugState( 465 void Compositor::SetLayerTreeDebugState(
(...skipping 24 matching lines...) Expand all
491 observer_list_, 490 observer_list_,
492 OnCompositingLockStateChanged(this)); 491 OnCompositingLockStateChanged(this));
493 } 492 }
494 493
495 void Compositor::CancelCompositorLock() { 494 void Compositor::CancelCompositorLock() {
496 if (compositor_lock_) 495 if (compositor_lock_)
497 compositor_lock_->CancelLock(); 496 compositor_lock_->CancelLock();
498 } 497 }
499 498
500 } // namespace ui 499 } // namespace ui
OLDNEW
« no previous file with comments | « ui/compositor/compositor.h ('k') | ui/compositor/compositor_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698