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

Side by Side Diff: cc/scheduler/begin_frame_source.cc

Issue 2591773002: [cc] BackToBackBFS: Disable time source if all pending observers removed (Closed)
Patch Set: add DCHECK Created 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | cc/scheduler/begin_frame_source_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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "cc/scheduler/begin_frame_source.h" 5 #include "cc/scheduler/begin_frame_source.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 pending_begin_frame_observers_.insert(obs); 70 pending_begin_frame_observers_.insert(obs);
71 obs->OnBeginFrameSourcePausedChanged(false); 71 obs->OnBeginFrameSourcePausedChanged(false);
72 time_source_->SetActive(true); 72 time_source_->SetActive(true);
73 } 73 }
74 74
75 void BackToBackBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) { 75 void BackToBackBeginFrameSource::RemoveObserver(BeginFrameObserver* obs) {
76 DCHECK(obs); 76 DCHECK(obs);
77 DCHECK(observers_.find(obs) != observers_.end()); 77 DCHECK(observers_.find(obs) != observers_.end());
78 observers_.erase(obs); 78 observers_.erase(obs);
79 pending_begin_frame_observers_.erase(obs); 79 pending_begin_frame_observers_.erase(obs);
80 if (observers_.empty()) 80 if (pending_begin_frame_observers_.empty())
81 time_source_->SetActive(false); 81 time_source_->SetActive(false);
82 } 82 }
83 83
84 void BackToBackBeginFrameSource::DidFinishFrame(BeginFrameObserver* obs, 84 void BackToBackBeginFrameSource::DidFinishFrame(BeginFrameObserver* obs,
85 size_t remaining_frames) { 85 size_t remaining_frames) {
86 if (remaining_frames == 0 && observers_.find(obs) != observers_.end()) { 86 if (remaining_frames == 0 && observers_.find(obs) != observers_.end()) {
87 pending_begin_frame_observers_.insert(obs); 87 pending_begin_frame_observers_.insert(obs);
88 time_source_->SetActive(true); 88 time_source_->SetActive(true);
89 } 89 }
90 } 90 }
91 91
92 bool BackToBackBeginFrameSource::IsThrottled() const { 92 bool BackToBackBeginFrameSource::IsThrottled() const {
93 return false; 93 return false;
94 } 94 }
95 95
96 void BackToBackBeginFrameSource::OnTimerTick() { 96 void BackToBackBeginFrameSource::OnTimerTick() {
97 base::TimeTicks frame_time = time_source_->LastTickTime(); 97 base::TimeTicks frame_time = time_source_->LastTickTime();
98 base::TimeDelta default_interval = BeginFrameArgs::DefaultInterval(); 98 base::TimeDelta default_interval = BeginFrameArgs::DefaultInterval();
99 BeginFrameArgs args = BeginFrameArgs::Create( 99 BeginFrameArgs args = BeginFrameArgs::Create(
100 BEGINFRAME_FROM_HERE, frame_time, frame_time + default_interval, 100 BEGINFRAME_FROM_HERE, frame_time, frame_time + default_interval,
101 default_interval, BeginFrameArgs::NORMAL); 101 default_interval, BeginFrameArgs::NORMAL);
102 102
103 // This must happen after getting the LastTickTime() from the time source. 103 // This must happen after getting the LastTickTime() from the time source.
104 time_source_->SetActive(false); 104 time_source_->SetActive(false);
105 105
106 std::unordered_set<BeginFrameObserver*> pending_observers; 106 std::unordered_set<BeginFrameObserver*> pending_observers;
107 pending_observers.swap(pending_begin_frame_observers_); 107 pending_observers.swap(pending_begin_frame_observers_);
108 DCHECK(!pending_observers.empty());
108 for (BeginFrameObserver* obs : pending_observers) 109 for (BeginFrameObserver* obs : pending_observers)
109 obs->OnBeginFrame(args); 110 obs->OnBeginFrame(args);
110 } 111 }
111 112
112 // DelayBasedBeginFrameSource --------------------------------------------- 113 // DelayBasedBeginFrameSource ---------------------------------------------
113 DelayBasedBeginFrameSource::DelayBasedBeginFrameSource( 114 DelayBasedBeginFrameSource::DelayBasedBeginFrameSource(
114 std::unique_ptr<DelayBasedTimeSource> time_source) 115 std::unique_ptr<DelayBasedTimeSource> time_source)
115 : time_source_(std::move(time_source)) { 116 : time_source_(std::move(time_source)) {
116 time_source_->SetClient(this); 117 time_source_->SetClient(this);
117 } 118 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 245
245 void ExternalBeginFrameSource::OnBeginFrame(const BeginFrameArgs& args) { 246 void ExternalBeginFrameSource::OnBeginFrame(const BeginFrameArgs& args) {
246 missed_begin_frame_args_ = args; 247 missed_begin_frame_args_ = args;
247 missed_begin_frame_args_.type = BeginFrameArgs::MISSED; 248 missed_begin_frame_args_.type = BeginFrameArgs::MISSED;
248 std::unordered_set<BeginFrameObserver*> observers(observers_); 249 std::unordered_set<BeginFrameObserver*> observers(observers_);
249 for (auto* obs : observers) 250 for (auto* obs : observers)
250 obs->OnBeginFrame(args); 251 obs->OnBeginFrame(args);
251 } 252 }
252 253
253 } // namespace cc 254 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/scheduler/begin_frame_source_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698