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

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

Issue 23892022: cc: Always use SetNeedsBeginFrame to request the next BeginFrame (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 7 years, 3 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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/scheduler.h" 5 #include "cc/scheduler/scheduler.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "cc/debug/traced_value.h" 10 #include "cc/debug/traced_value.h"
11 11
12 namespace cc { 12 namespace cc {
13 13
14 Scheduler::Scheduler(SchedulerClient* client, 14 Scheduler::Scheduler(SchedulerClient* client,
15 const SchedulerSettings& scheduler_settings) 15 const SchedulerSettings& scheduler_settings)
16 : settings_(scheduler_settings), 16 : settings_(scheduler_settings),
17 client_(client), 17 client_(client),
18 weak_factory_(this), 18 weak_factory_(this),
19 last_set_needs_begin_frame_(false), 19 last_set_needs_begin_frame_(false),
20 has_pending_begin_frame_(false),
21 state_machine_(scheduler_settings), 20 state_machine_(scheduler_settings),
22 inside_process_scheduled_actions_(false) { 21 inside_process_scheduled_actions_(false) {
23 DCHECK(client_); 22 DCHECK(client_);
24 DCHECK(!state_machine_.BeginFrameNeededToDrawByImplThread()); 23 DCHECK(!state_machine_.BeginFrameNeededToDrawByImplThread());
25 } 24 }
26 25
27 Scheduler::~Scheduler() { 26 Scheduler::~Scheduler() {
28 client_->SetNeedsBeginFrameOnImplThread(false); 27 client_->SetNeedsBeginFrameOnImplThread(false);
29 } 28 }
30 29
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 87
89 void Scheduler::DidLoseOutputSurface() { 88 void Scheduler::DidLoseOutputSurface() {
90 TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface"); 89 TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface");
91 state_machine_.DidLoseOutputSurface(); 90 state_machine_.DidLoseOutputSurface();
92 ProcessScheduledActions(); 91 ProcessScheduledActions();
93 } 92 }
94 93
95 void Scheduler::DidCreateAndInitializeOutputSurface() { 94 void Scheduler::DidCreateAndInitializeOutputSurface() {
96 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface"); 95 TRACE_EVENT0("cc", "Scheduler::DidCreateAndInitializeOutputSurface");
97 state_machine_.DidCreateAndInitializeOutputSurface(); 96 state_machine_.DidCreateAndInitializeOutputSurface();
98 has_pending_begin_frame_ = false;
99 last_set_needs_begin_frame_ = false; 97 last_set_needs_begin_frame_ = false;
100 ProcessScheduledActions(); 98 ProcessScheduledActions();
101 } 99 }
102 100
103 base::TimeTicks Scheduler::AnticipatedDrawTime() { 101 base::TimeTicks Scheduler::AnticipatedDrawTime() {
104 TRACE_EVENT0("cc", "Scheduler::AnticipatedDrawTime"); 102 TRACE_EVENT0("cc", "Scheduler::AnticipatedDrawTime");
105 103
106 if (!last_set_needs_begin_frame_ || 104 if (!last_set_needs_begin_frame_ ||
107 last_begin_frame_args_.interval <= base::TimeDelta()) 105 last_begin_frame_args_.interval <= base::TimeDelta())
108 return base::TimeTicks(); 106 return base::TimeTicks();
(...skipping 14 matching lines...) Expand all
123 bool needs_begin_frame_to_draw = 121 bool needs_begin_frame_to_draw =
124 state_machine_.BeginFrameNeededToDrawByImplThread(); 122 state_machine_.BeginFrameNeededToDrawByImplThread();
125 // We want to avoid proactive begin frames with the synchronous compositor 123 // We want to avoid proactive begin frames with the synchronous compositor
126 // because every SetNeedsBeginFrame will force a redraw. 124 // because every SetNeedsBeginFrame will force a redraw.
127 bool proactive_begin_frame_wanted = 125 bool proactive_begin_frame_wanted =
128 state_machine_.ProactiveBeginFrameWantedByImplThread() && 126 state_machine_.ProactiveBeginFrameWantedByImplThread() &&
129 !settings_.using_synchronous_renderer_compositor && 127 !settings_.using_synchronous_renderer_compositor &&
130 settings_.throttle_frame_production; 128 settings_.throttle_frame_production;
131 bool needs_begin_frame = needs_begin_frame_to_draw || 129 bool needs_begin_frame = needs_begin_frame_to_draw ||
132 proactive_begin_frame_wanted; 130 proactive_begin_frame_wanted;
133 bool immediate_disables_needed =
134 settings_.using_synchronous_renderer_compositor;
135 131
136 // Determine if we need BeginFrame notifications. 132 bool should_call_set_needs_begin_frame =
137 // If we do, always request the BeginFrame immediately. 133 // Always request the BeginFrame immediately if it wasn't needed before.
138 // If not, only disable on the next BeginFrame to avoid unnecessary toggles. 134 (needs_begin_frame && !last_set_needs_begin_frame_) ||
139 // The synchronous renderer compositor requires immediate disables though. 135 // We always need to explicitly request our next BeginFrame.
140 if ((needs_begin_frame || 136 state_machine_.inside_begin_frame();
141 state_machine_.inside_begin_frame() || 137
142 immediate_disables_needed) && 138 if (should_call_set_needs_begin_frame) {
143 (needs_begin_frame != last_set_needs_begin_frame_)) {
144 has_pending_begin_frame_ = false;
145 client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame); 139 client_->SetNeedsBeginFrameOnImplThread(needs_begin_frame);
146 last_set_needs_begin_frame_ = needs_begin_frame; 140 last_set_needs_begin_frame_ = needs_begin_frame;
147 } 141 }
148 142
149 // Request another BeginFrame if we haven't drawn for now until we have
150 // deadlines implemented.
151 if (state_machine_.inside_begin_frame() && has_pending_begin_frame_) {
152 has_pending_begin_frame_ = false;
153 client_->SetNeedsBeginFrameOnImplThread(true);
154 }
155
156 // Setup PollForAnticipatedDrawTriggers for cases where we want a proactive 143 // Setup PollForAnticipatedDrawTriggers for cases where we want a proactive
157 // BeginFrame but aren't requesting one. 144 // BeginFrame but aren't requesting one.
158 if (!needs_begin_frame && 145 if (!needs_begin_frame &&
159 state_machine_.ProactiveBeginFrameWantedByImplThread()) { 146 state_machine_.ProactiveBeginFrameWantedByImplThread()) {
160 if (poll_for_draw_triggers_closure_.IsCancelled()) { 147 if (poll_for_draw_triggers_closure_.IsCancelled()) {
161 poll_for_draw_triggers_closure_.Reset( 148 poll_for_draw_triggers_closure_.Reset(
162 base::Bind(&Scheduler::PollForAnticipatedDrawTriggers, 149 base::Bind(&Scheduler::PollForAnticipatedDrawTriggers,
163 weak_factory_.GetWeakPtr())); 150 weak_factory_.GetWeakPtr()));
164 base::MessageLoop::current()->PostDelayedTask( 151 base::MessageLoop::current()->PostDelayedTask(
165 FROM_HERE, 152 FROM_HERE,
166 poll_for_draw_triggers_closure_.callback(), 153 poll_for_draw_triggers_closure_.callback(),
167 last_begin_frame_args_.interval); 154 last_begin_frame_args_.interval);
168 } 155 }
169 } else { 156 } else {
170 poll_for_draw_triggers_closure_.Cancel(); 157 poll_for_draw_triggers_closure_.Cancel();
171 } 158 }
172 } 159 }
173 160
174 void Scheduler::BeginFrame(const BeginFrameArgs& args) { 161 void Scheduler::BeginFrame(const BeginFrameArgs& args) {
175 TRACE_EVENT0("cc", "Scheduler::BeginFrame"); 162 TRACE_EVENT0("cc", "Scheduler::BeginFrame");
176 DCHECK(!has_pending_begin_frame_); 163 DCHECK(!state_machine_.inside_begin_frame());
177 has_pending_begin_frame_ = true;
178 last_begin_frame_args_ = args; 164 last_begin_frame_args_ = args;
179 state_machine_.DidEnterBeginFrame(args); 165 state_machine_.DidEnterBeginFrame(args);
180 ProcessScheduledActions(); 166 ProcessScheduledActions();
181 state_machine_.DidLeaveBeginFrame(); 167 state_machine_.DidLeaveBeginFrame();
182 } 168 }
183 169
184 void Scheduler::PollForAnticipatedDrawTriggers() { 170 void Scheduler::PollForAnticipatedDrawTriggers() {
185 TRACE_EVENT0("cc", "Scheduler::PollForAnticipatedDrawTriggers"); 171 TRACE_EVENT0("cc", "Scheduler::PollForAnticipatedDrawTriggers");
186 state_machine_.PollForAnticipatedDrawTriggers(); 172 state_machine_.PollForAnticipatedDrawTriggers();
187 ProcessScheduledActions(); 173 ProcessScheduledActions();
188 } 174 }
189 175
190 void Scheduler::DrawAndSwapIfPossible() { 176 void Scheduler::DrawAndSwapIfPossible() {
191 DrawSwapReadbackResult result = 177 DrawSwapReadbackResult result =
192 client_->ScheduledActionDrawAndSwapIfPossible(); 178 client_->ScheduledActionDrawAndSwapIfPossible();
193 state_machine_.DidDrawIfPossibleCompleted(result.did_draw); 179 state_machine_.DidDrawIfPossibleCompleted(result.did_draw);
194 if (result.did_swap)
195 has_pending_begin_frame_ = false;
196 } 180 }
197 181
198 void Scheduler::DrawAndSwapForced() { 182 void Scheduler::DrawAndSwapForced() {
199 DrawSwapReadbackResult result = client_->ScheduledActionDrawAndSwapForced(); 183 client_->ScheduledActionDrawAndSwapForced();
200 if (result.did_swap)
201 has_pending_begin_frame_ = false;
202 } 184 }
203 185
204 void Scheduler::DrawAndReadback() { 186 void Scheduler::DrawAndReadback() {
205 DrawSwapReadbackResult result = client_->ScheduledActionDrawAndReadback(); 187 DrawSwapReadbackResult result = client_->ScheduledActionDrawAndReadback();
206 DCHECK(!result.did_swap); 188 DCHECK(!result.did_swap);
207 } 189 }
208 190
209 void Scheduler::ProcessScheduledActions() { 191 void Scheduler::ProcessScheduledActions() {
210 // We do not allow ProcessScheduledActions to be recursive. 192 // We do not allow ProcessScheduledActions to be recursive.
211 // The top-level call will iteratively execute the next action for us anyway. 193 // The top-level call will iteratively execute the next action for us anyway.
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 244
263 SetupNextBeginFrameIfNeeded(); 245 SetupNextBeginFrameIfNeeded();
264 client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime()); 246 client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime());
265 } 247 }
266 248
267 bool Scheduler::WillDrawIfNeeded() const { 249 bool Scheduler::WillDrawIfNeeded() const {
268 return !state_machine_.PendingDrawsShouldBeAborted(); 250 return !state_machine_.PendingDrawsShouldBeAborted();
269 } 251 }
270 252
271 } // namespace cc 253 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698