| OLD | NEW |
| 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 #include "cc/scheduler/scheduler.h" | 4 #include "cc/scheduler/scheduler.h" |
| 5 | 5 |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/scoped_vector.h" | 10 #include "base/memory/scoped_vector.h" |
| 11 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.h" |
| 12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
| 13 #include "base/test/test_simple_task_runner.h" | 13 #include "base/test/test_simple_task_runner.h" |
| 14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 15 #include "cc/test/begin_frame_args_test.h" | 15 #include "cc/test/begin_frame_args_test.h" |
| 16 #include "cc/test/scheduler_test_common.h" | 16 #include "cc/test/scheduler_test_common.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 17 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 19 | 19 |
| 20 #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \ | 20 #define EXPECT_ACTION(action, client, action_index, expected_num_actions) \ |
| 21 EXPECT_EQ(expected_num_actions, client.num_actions_()); \ | 21 EXPECT_EQ(expected_num_actions, client.num_actions_()); \ |
| 22 ASSERT_LT(action_index, client.num_actions_()); \ | 22 ASSERT_LT(action_index, client.num_actions_()) << scheduler; \ |
| 23 do { \ | 23 do { \ |
| 24 EXPECT_STREQ(action, client.Action(action_index)); \ | 24 EXPECT_STREQ(action, client.Action(action_index)); \ |
| 25 for (int i = expected_num_actions; i < client.num_actions_(); ++i) \ | 25 for (int i = expected_num_actions; i < client.num_actions_(); ++i) \ |
| 26 ADD_FAILURE() << "Unexpected action: " << client.Action(i) << \ | 26 ADD_FAILURE() << "Unexpected action: " << client.Action(i) \ |
| 27 " with state:\n" << client.StateForAction(action_index); \ | 27 << " with state:\n" \ |
| 28 << client.StateForAction(action_index); \ |
| 28 } while (false) | 29 } while (false) |
| 29 | 30 |
| 30 #define EXPECT_SINGLE_ACTION(action, client) \ | 31 #define EXPECT_SINGLE_ACTION(action, client) \ |
| 31 EXPECT_ACTION(action, client, 0, 1) | 32 EXPECT_ACTION(action, client, 0, 1) |
| 32 | 33 |
| 33 namespace cc { | 34 namespace cc { |
| 34 namespace { | 35 namespace { |
| 35 | 36 |
| 36 class FakeSchedulerClient; | 37 class FakeSchedulerClient; |
| 37 | 38 |
| 38 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 39 class FakeBeginFrameSource : public BaseBeginFrameSource { |
| 39 FakeSchedulerClient* client); | 40 public: |
| 41 FakeSchedulerClient* fake_client_; |
| 42 |
| 43 explicit FakeBeginFrameSource(FakeSchedulerClient* fake_client) |
| 44 : BaseBeginFrameSource(0), fake_client_(fake_client) {} |
| 45 |
| 46 virtual void OnGenerateChange(bool generate_frames) OVERRIDE; |
| 47 |
| 48 virtual inline std::string TypeString() const OVERRIDE { |
| 49 return "FakeBeginFrameSource"; |
| 50 } |
| 51 |
| 52 void TestBeginFrame(BeginFrameArgs args) { frame_sink_->BeginFrame(args); } |
| 53 }; |
| 40 | 54 |
| 41 class FakeSchedulerClient : public SchedulerClient { | 55 class FakeSchedulerClient : public SchedulerClient { |
| 42 public: | 56 public: |
| 43 FakeSchedulerClient() : needs_begin_frame_(false), automatic_swap_ack_(true) { | 57 FakeSchedulerClient() |
| 58 : generate_frames_(false), |
| 59 automatic_swap_ack_(true), |
| 60 frame_source_(this) { |
| 44 Reset(); | 61 Reset(); |
| 45 } | 62 } |
| 46 | 63 |
| 47 void Reset() { | 64 void Reset() { |
| 48 actions_.clear(); | 65 actions_.clear(); |
| 49 states_.clear(); | 66 states_.clear(); |
| 50 draw_will_happen_ = true; | 67 draw_will_happen_ = true; |
| 51 swap_will_happen_if_draw_happens_ = true; | 68 swap_will_happen_if_draw_happens_ = true; |
| 52 num_draws_ = 0; | 69 num_draws_ = 0; |
| 53 log_anticipated_draw_time_change_ = false; | 70 log_anticipated_draw_time_change_ = false; |
| 54 } | 71 } |
| 55 | 72 |
| 56 Scheduler* CreateScheduler(const SchedulerSettings& settings) { | 73 Scheduler* CreateScheduler(const SchedulerSettings& settings) { |
| 57 task_runner_ = new base::TestSimpleTaskRunner; | 74 task_runner_ = new base::TestSimpleTaskRunner; |
| 58 scheduler_ = Scheduler::Create(this, settings, 0, task_runner_); | 75 |
| 76 scheduler_ = |
| 77 Scheduler::Create(this, |
| 78 settings, |
| 79 0, |
| 80 static_cast<BeginFrameSource*>(&frame_source_), |
| 81 task_runner_); |
| 59 return scheduler_.get(); | 82 return scheduler_.get(); |
| 60 } | 83 } |
| 61 | 84 |
| 62 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it | 85 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it |
| 63 // for tests that do. | 86 // for tests that do. |
| 64 void set_log_anticipated_draw_time_change(bool log) { | 87 void set_log_anticipated_draw_time_change(bool log) { |
| 65 log_anticipated_draw_time_change_ = log; | 88 log_anticipated_draw_time_change_ = log; |
| 66 } | 89 } |
| 67 bool needs_begin_frame() { return needs_begin_frame_; } | 90 bool generate_frames() { return generate_frames_; } |
| 68 int num_draws() const { return num_draws_; } | 91 int num_draws() const { return num_draws_; } |
| 69 int num_actions_() const { return static_cast<int>(actions_.size()); } | 92 int num_actions_() const { return static_cast<int>(actions_.size()); } |
| 70 const char* Action(int i) const { return actions_[i]; } | 93 const char* Action(int i) const { return actions_[i]; } |
| 71 base::Value& StateForAction(int i) const { return *states_[i]; } | 94 base::Value& StateForAction(int i) const { return *states_[i]; } |
| 72 base::TimeTicks posted_begin_impl_frame_deadline() const { | 95 base::TimeTicks posted_begin_impl_frame_deadline() const { |
| 73 return posted_begin_impl_frame_deadline_; | 96 return posted_begin_impl_frame_deadline_; |
| 74 } | 97 } |
| 75 | 98 |
| 76 base::TestSimpleTaskRunner& task_runner() { return *task_runner_; } | 99 base::TestSimpleTaskRunner& task_runner() { return *task_runner_; } |
| 77 | 100 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 90 draw_will_happen_ = draw_will_happen; | 113 draw_will_happen_ = draw_will_happen; |
| 91 } | 114 } |
| 92 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { | 115 void SetSwapWillHappenIfDrawHappens(bool swap_will_happen_if_draw_happens) { |
| 93 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; | 116 swap_will_happen_if_draw_happens_ = swap_will_happen_if_draw_happens; |
| 94 } | 117 } |
| 95 void SetAutomaticSwapAck(bool automatic_swap_ack) { | 118 void SetAutomaticSwapAck(bool automatic_swap_ack) { |
| 96 automatic_swap_ack_ = automatic_swap_ack; | 119 automatic_swap_ack_ = automatic_swap_ack; |
| 97 } | 120 } |
| 98 | 121 |
| 99 // SchedulerClient implementation. | 122 // SchedulerClient implementation. |
| 100 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { | |
| 101 actions_.push_back("SetNeedsBeginFrame"); | |
| 102 states_.push_back(scheduler_->AsValue().release()); | |
| 103 needs_begin_frame_ = enable; | |
| 104 } | |
| 105 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { | 123 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { |
| 106 actions_.push_back("WillBeginImplFrame"); | 124 actions_.push_back("WillBeginImplFrame"); |
| 107 states_.push_back(scheduler_->AsValue().release()); | 125 states_.push_back(scheduler_->AsValue().release()); |
| 108 } | 126 } |
| 109 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { | 127 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { |
| 110 actions_.push_back("ScheduledActionSendBeginMainFrame"); | 128 actions_.push_back("ScheduledActionSendBeginMainFrame"); |
| 111 states_.push_back(scheduler_->AsValue().release()); | 129 states_.push_back(scheduler_->AsValue().release()); |
| 112 } | 130 } |
| 113 virtual void ScheduledActionAnimate() OVERRIDE { | 131 virtual void ScheduledActionAnimate() OVERRIDE { |
| 114 actions_.push_back("ScheduledActionAnimate"); | 132 actions_.push_back("ScheduledActionAnimate"); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 } | 181 } |
| 164 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE { | 182 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE { |
| 165 return base::TimeDelta(); | 183 return base::TimeDelta(); |
| 166 } | 184 } |
| 167 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { | 185 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { |
| 168 return base::TimeDelta(); | 186 return base::TimeDelta(); |
| 169 } | 187 } |
| 170 | 188 |
| 171 virtual void DidBeginImplFrameDeadline() OVERRIDE {} | 189 virtual void DidBeginImplFrameDeadline() OVERRIDE {} |
| 172 | 190 |
| 191 FakeBeginFrameSource& frame_source() { return frame_source_; } |
| 192 |
| 173 protected: | 193 protected: |
| 174 bool needs_begin_frame_; | 194 bool generate_frames_; |
| 175 bool draw_will_happen_; | 195 bool draw_will_happen_; |
| 176 bool swap_will_happen_if_draw_happens_; | 196 bool swap_will_happen_if_draw_happens_; |
| 177 bool automatic_swap_ack_; | 197 bool automatic_swap_ack_; |
| 178 int num_draws_; | 198 int num_draws_; |
| 179 bool log_anticipated_draw_time_change_; | 199 bool log_anticipated_draw_time_change_; |
| 180 base::TimeTicks posted_begin_impl_frame_deadline_; | 200 base::TimeTicks posted_begin_impl_frame_deadline_; |
| 181 std::vector<const char*> actions_; | 201 std::vector<const char*> actions_; |
| 182 ScopedVector<base::Value> states_; | 202 ScopedVector<base::Value> states_; |
| 183 scoped_ptr<Scheduler> scheduler_; | 203 scoped_ptr<Scheduler> scheduler_; |
| 184 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 204 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 205 |
| 206 friend class FakeBeginFrameSource; |
| 207 FakeBeginFrameSource frame_source_; |
| 185 }; | 208 }; |
| 186 | 209 |
| 210 void FakeBeginFrameSource::OnGenerateChange(bool generate_frames) { |
| 211 fake_client_->actions_.push_back("SetGenerateFrames"); |
| 212 fake_client_->states_.push_back( |
| 213 fake_client_->scheduler_->AsValue().release()); |
| 214 fake_client_->generate_frames_ = generate_frames; |
| 215 } |
| 216 |
| 187 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 217 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
| 188 FakeSchedulerClient* client) { | 218 FakeSchedulerClient* client) { |
| 189 bool client_initiates_begin_frame = | 219 bool client_initiates_begin_frame = |
| 190 scheduler->settings().begin_frame_scheduling_enabled && | 220 scheduler->settings().begin_frame_scheduling_enabled && |
| 191 scheduler->settings().throttle_frame_production; | 221 scheduler->settings().throttle_frame_production; |
| 192 | 222 |
| 193 scheduler->DidCreateAndInitializeOutputSurface(); | 223 scheduler->DidCreateAndInitializeOutputSurface(); |
| 194 scheduler->SetNeedsCommit(); | 224 scheduler->SetNeedsCommit(); |
| 195 scheduler->NotifyBeginMainFrameStarted(); | 225 scheduler->NotifyBeginMainFrameStarted(); |
| 196 scheduler->NotifyReadyToCommit(); | 226 scheduler->NotifyReadyToCommit(); |
| 197 // Go through the motions to draw the commit. | 227 // Go through the motions to draw the commit. |
| 198 if (client_initiates_begin_frame) | 228 if (client_initiates_begin_frame) |
| 199 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 229 client->frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 200 else | 230 else |
| 201 client->task_runner().RunPendingTasks(); // Run posted BeginFrame. | 231 client->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 202 | 232 |
| 203 // Run the posted deadline task. | 233 // Run the posted deadline task. |
| 204 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 234 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 205 client->task_runner().RunPendingTasks(); | 235 client->task_runner().RunPendingTasks(); |
| 206 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 236 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 207 | 237 |
| 238 // EXPECT_TRUE(client->generate_frames()); |
| 239 |
| 208 // We need another BeginImplFrame so Scheduler calls | 240 // We need another BeginImplFrame so Scheduler calls |
| 209 // SetNeedsBeginFrame(false). | 241 // SetGenerateFrames(false). |
| 210 if (client_initiates_begin_frame) | 242 if (client_initiates_begin_frame) |
| 211 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 243 client->frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 212 else | 244 else |
| 213 client->task_runner().RunPendingTasks(); // Run posted BeginFrame. | 245 client->task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 214 | 246 |
| 247 // EXPECT_FALSE(client->generate_frames()); |
| 248 |
| 215 // Run the posted deadline task. | 249 // Run the posted deadline task. |
| 216 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 250 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 217 client->task_runner().RunPendingTasks(); | 251 client->task_runner().RunPendingTasks(); |
| 218 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 252 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 219 } | 253 } |
| 220 | 254 |
| 221 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { | 255 TEST(SchedulerTest, InitializeOutputSurfaceDoesNotBeginImplFrame) { |
| 222 FakeSchedulerClient client; | 256 FakeSchedulerClient client; |
| 223 SchedulerSettings default_scheduler_settings; | 257 SchedulerSettings default_scheduler_settings; |
| 224 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 258 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 239 scheduler->SetCanStart(); | 273 scheduler->SetCanStart(); |
| 240 scheduler->SetVisible(true); | 274 scheduler->SetVisible(true); |
| 241 scheduler->SetCanDraw(true); | 275 scheduler->SetCanDraw(true); |
| 242 | 276 |
| 243 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 277 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 244 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 278 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 245 | 279 |
| 246 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 280 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 247 client.Reset(); | 281 client.Reset(); |
| 248 scheduler->SetNeedsCommit(); | 282 scheduler->SetNeedsCommit(); |
| 249 EXPECT_TRUE(client.needs_begin_frame()); | 283 EXPECT_TRUE(client.generate_frames()); |
| 250 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 284 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 251 client.Reset(); | 285 client.Reset(); |
| 252 | 286 |
| 253 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 287 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 254 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 288 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 255 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 289 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 256 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 290 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 257 EXPECT_TRUE(client.needs_begin_frame()); | 291 EXPECT_TRUE(client.generate_frames()); |
| 258 client.Reset(); | 292 client.Reset(); |
| 259 | 293 |
| 260 // If we don't swap on the deadline, we wait for the next BeginFrame. | 294 // If we don't swap on the deadline, we wait for the next BeginFrame. |
| 261 client.task_runner().RunPendingTasks(); // Run posted deadline. | 295 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 262 EXPECT_EQ(0, client.num_actions_()); | 296 EXPECT_EQ(0, client.num_actions_()); |
| 263 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 297 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 264 EXPECT_TRUE(client.needs_begin_frame()); | 298 EXPECT_TRUE(client.generate_frames()); |
| 265 client.Reset(); | 299 client.Reset(); |
| 266 | 300 |
| 267 // NotifyReadyToCommit should trigger the commit. | 301 // NotifyReadyToCommit should trigger the commit. |
| 268 scheduler->NotifyBeginMainFrameStarted(); | 302 scheduler->NotifyBeginMainFrameStarted(); |
| 269 scheduler->NotifyReadyToCommit(); | 303 scheduler->NotifyReadyToCommit(); |
| 270 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 304 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 271 EXPECT_TRUE(client.needs_begin_frame()); | 305 EXPECT_TRUE(client.generate_frames()); |
| 272 client.Reset(); | 306 client.Reset(); |
| 273 | 307 |
| 274 // BeginImplFrame should prepare the draw. | 308 // BeginImplFrame should prepare the draw. |
| 275 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 309 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 276 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 310 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 277 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 311 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 278 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 312 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 279 EXPECT_TRUE(client.needs_begin_frame()); | 313 EXPECT_TRUE(client.generate_frames()); |
| 280 client.Reset(); | 314 client.Reset(); |
| 281 | 315 |
| 282 // BeginImplFrame deadline should draw. | 316 // BeginImplFrame deadline should draw. |
| 283 client.task_runner().RunPendingTasks(); // Run posted deadline. | 317 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 284 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 318 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 285 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 319 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 286 EXPECT_TRUE(client.needs_begin_frame()); | 320 EXPECT_TRUE(client.generate_frames()); |
| 287 client.Reset(); | 321 client.Reset(); |
| 288 | 322 |
| 289 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | 323 // The following BeginImplFrame deadline should SetGenerateFrames(false) |
| 290 // to avoid excessive toggles. | 324 // to avoid excessive toggles. |
| 291 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 325 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 292 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 326 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 293 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 327 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 294 client.Reset(); | 328 client.Reset(); |
| 295 | 329 |
| 296 client.task_runner().RunPendingTasks(); // Run posted deadline. | 330 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 297 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 331 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 298 EXPECT_FALSE(client.needs_begin_frame()); | 332 EXPECT_FALSE(client.generate_frames()); |
| 299 client.Reset(); | 333 client.Reset(); |
| 300 } | 334 } |
| 301 | 335 |
| 302 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { | 336 TEST(SchedulerTest, RequestCommitAfterBeginMainFrameSent) { |
| 303 FakeSchedulerClient client; | 337 FakeSchedulerClient client; |
| 304 SchedulerSettings scheduler_settings; | 338 SchedulerSettings scheduler_settings; |
| 305 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 339 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 306 scheduler->SetCanStart(); | 340 scheduler->SetCanStart(); |
| 307 scheduler->SetVisible(true); | 341 scheduler->SetVisible(true); |
| 308 scheduler->SetCanDraw(true); | 342 scheduler->SetCanDraw(true); |
| 309 | 343 |
| 310 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 344 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 311 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 345 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 312 client.Reset(); | 346 client.Reset(); |
| 313 | 347 |
| 314 // SetNeedsCommit should begin the frame. | 348 // SetNeedsCommit should begin the frame. |
| 315 scheduler->SetNeedsCommit(); | 349 scheduler->SetNeedsCommit(); |
| 316 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 350 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 317 | 351 |
| 318 client.Reset(); | 352 client.Reset(); |
| 319 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 353 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 320 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 354 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 321 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 355 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 322 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 356 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 323 | 357 |
| 324 EXPECT_TRUE(client.needs_begin_frame()); | 358 EXPECT_TRUE(client.generate_frames()); |
| 325 client.Reset(); | 359 client.Reset(); |
| 326 | 360 |
| 327 // Now SetNeedsCommit again. Calling here means we need a second commit. | 361 // Now SetNeedsCommit again. Calling here means we need a second commit. |
| 328 scheduler->SetNeedsCommit(); | 362 scheduler->SetNeedsCommit(); |
| 329 EXPECT_EQ(client.num_actions_(), 0); | 363 EXPECT_EQ(client.num_actions_(), 0); |
| 330 client.Reset(); | 364 client.Reset(); |
| 331 | 365 |
| 332 // Finish the first commit. | 366 // Finish the first commit. |
| 333 scheduler->NotifyBeginMainFrameStarted(); | 367 scheduler->NotifyBeginMainFrameStarted(); |
| 334 scheduler->NotifyReadyToCommit(); | 368 scheduler->NotifyReadyToCommit(); |
| 335 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 369 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 336 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 370 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 337 client.Reset(); | 371 client.Reset(); |
| 338 client.task_runner().RunPendingTasks(); // Run posted deadline. | 372 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 339 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 373 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 340 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 374 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 341 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 375 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 342 | 376 |
| 343 // Because we just swapped, the Scheduler should also request the next | 377 // Because we just swapped, the Scheduler should also request the next |
| 344 // BeginImplFrame from the OutputSurface. | 378 // BeginImplFrame from the OutputSurface. |
| 345 EXPECT_TRUE(client.needs_begin_frame()); | 379 EXPECT_TRUE(client.generate_frames()); |
| 346 client.Reset(); | 380 client.Reset(); |
| 347 // Since another commit is needed, the next BeginImplFrame should initiate | 381 // Since another commit is needed, the next BeginImplFrame should initiate |
| 348 // the second commit. | 382 // the second commit. |
| 349 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 383 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 350 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 384 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 351 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 385 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 352 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 386 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 353 client.Reset(); | 387 client.Reset(); |
| 354 | 388 |
| 355 // Finishing the commit before the deadline should post a new deadline task | 389 // Finishing the commit before the deadline should post a new deadline task |
| 356 // to trigger the deadline early. | 390 // to trigger the deadline early. |
| 357 scheduler->NotifyBeginMainFrameStarted(); | 391 scheduler->NotifyBeginMainFrameStarted(); |
| 358 scheduler->NotifyReadyToCommit(); | 392 scheduler->NotifyReadyToCommit(); |
| 359 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 393 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 360 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 394 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 361 client.Reset(); | 395 client.Reset(); |
| 362 client.task_runner().RunPendingTasks(); // Run posted deadline. | 396 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 363 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 397 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 364 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 398 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 365 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 399 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 366 EXPECT_TRUE(client.needs_begin_frame()); | 400 EXPECT_TRUE(client.generate_frames()); |
| 367 client.Reset(); | 401 client.Reset(); |
| 368 | 402 |
| 369 // On the next BeginImplFrame, verify we go back to a quiescent state and | 403 // On the next BeginImplFrame, verify we go back to a quiescent state and |
| 370 // no longer request BeginImplFrames. | 404 // no longer request BeginImplFrames. |
| 371 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 405 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 372 client.task_runner().RunPendingTasks(); // Run posted deadline. | 406 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 373 EXPECT_FALSE(client.needs_begin_frame()); | 407 EXPECT_FALSE(client.generate_frames()); |
| 374 client.Reset(); | 408 client.Reset(); |
| 375 } | 409 } |
| 376 | 410 |
| 377 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { | 411 class SchedulerClientThatsetNeedsDrawInsideDraw : public FakeSchedulerClient { |
| 378 public: | 412 public: |
| 379 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} | 413 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} |
| 380 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() | 414 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() |
| 381 OVERRIDE { | 415 OVERRIDE { |
| 382 // Only SetNeedsRedraw the first time this is called | 416 // Only SetNeedsRedraw the first time this is called |
| 383 if (!num_draws_) | 417 if (!num_draws_) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 404 SchedulerSettings default_scheduler_settings; | 438 SchedulerSettings default_scheduler_settings; |
| 405 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 439 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 406 scheduler->SetCanStart(); | 440 scheduler->SetCanStart(); |
| 407 scheduler->SetVisible(true); | 441 scheduler->SetVisible(true); |
| 408 scheduler->SetCanDraw(true); | 442 scheduler->SetCanDraw(true); |
| 409 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 443 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 410 client.Reset(); | 444 client.Reset(); |
| 411 | 445 |
| 412 scheduler->SetNeedsRedraw(); | 446 scheduler->SetNeedsRedraw(); |
| 413 EXPECT_TRUE(scheduler->RedrawPending()); | 447 EXPECT_TRUE(scheduler->RedrawPending()); |
| 414 EXPECT_TRUE(client.needs_begin_frame()); | 448 EXPECT_TRUE(client.generate_frames()); |
| 415 EXPECT_EQ(0, client.num_draws()); | 449 EXPECT_EQ(0, client.num_draws()); |
| 416 | 450 |
| 417 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 451 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 418 client.task_runner().RunPendingTasks(); // Run posted deadline. | 452 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 419 EXPECT_EQ(1, client.num_draws()); | 453 EXPECT_EQ(1, client.num_draws()); |
| 420 EXPECT_TRUE(scheduler->RedrawPending()); | 454 EXPECT_TRUE(scheduler->RedrawPending()); |
| 421 EXPECT_TRUE(client.needs_begin_frame()); | 455 EXPECT_TRUE(client.generate_frames()); |
| 422 | 456 |
| 423 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 457 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 424 client.task_runner().RunPendingTasks(); // Run posted deadline. | 458 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 425 EXPECT_EQ(2, client.num_draws()); | 459 EXPECT_EQ(2, client.num_draws()); |
| 426 EXPECT_FALSE(scheduler->RedrawPending()); | 460 EXPECT_FALSE(scheduler->RedrawPending()); |
| 427 EXPECT_TRUE(client.needs_begin_frame()); | 461 EXPECT_TRUE(client.generate_frames()); |
| 428 | 462 |
| 429 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't | 463 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
| 430 // swap. | 464 // swap. |
| 431 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 465 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 432 client.task_runner().RunPendingTasks(); // Run posted deadline. | 466 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 433 EXPECT_EQ(2, client.num_draws()); | 467 EXPECT_EQ(2, client.num_draws()); |
| 434 EXPECT_FALSE(scheduler->RedrawPending()); | 468 EXPECT_FALSE(scheduler->RedrawPending()); |
| 435 EXPECT_FALSE(client.needs_begin_frame()); | 469 EXPECT_FALSE(client.generate_frames()); |
| 436 } | 470 } |
| 437 | 471 |
| 438 // Test that requesting redraw inside a failed draw doesn't lose the request. | 472 // Test that requesting redraw inside a failed draw doesn't lose the request. |
| 439 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { | 473 TEST(SchedulerTest, RequestRedrawInsideFailedDraw) { |
| 440 SchedulerClientThatsetNeedsDrawInsideDraw client; | 474 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 441 SchedulerSettings default_scheduler_settings; | 475 SchedulerSettings default_scheduler_settings; |
| 442 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 476 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 443 scheduler->SetCanStart(); | 477 scheduler->SetCanStart(); |
| 444 scheduler->SetVisible(true); | 478 scheduler->SetVisible(true); |
| 445 scheduler->SetCanDraw(true); | 479 scheduler->SetCanDraw(true); |
| 446 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 480 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 447 client.Reset(); | 481 client.Reset(); |
| 448 | 482 |
| 449 client.SetDrawWillHappen(false); | 483 client.SetDrawWillHappen(false); |
| 450 | 484 |
| 451 scheduler->SetNeedsRedraw(); | 485 scheduler->SetNeedsRedraw(); |
| 452 EXPECT_TRUE(scheduler->RedrawPending()); | 486 EXPECT_TRUE(scheduler->RedrawPending()); |
| 453 EXPECT_TRUE(client.needs_begin_frame()); | 487 EXPECT_TRUE(client.generate_frames()); |
| 454 EXPECT_EQ(0, client.num_draws()); | 488 EXPECT_EQ(0, client.num_draws()); |
| 455 | 489 |
| 456 // Fail the draw. | 490 // Fail the draw. |
| 457 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 491 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 458 client.task_runner().RunPendingTasks(); // Run posted deadline. | 492 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 459 EXPECT_EQ(1, client.num_draws()); | 493 EXPECT_EQ(1, client.num_draws()); |
| 460 | 494 |
| 461 // We have a commit pending and the draw failed, and we didn't lose the redraw | 495 // We have a commit pending and the draw failed, and we didn't lose the redraw |
| 462 // request. | 496 // request. |
| 463 EXPECT_TRUE(scheduler->CommitPending()); | 497 EXPECT_TRUE(scheduler->CommitPending()); |
| 464 EXPECT_TRUE(scheduler->RedrawPending()); | 498 EXPECT_TRUE(scheduler->RedrawPending()); |
| 465 EXPECT_TRUE(client.needs_begin_frame()); | 499 EXPECT_TRUE(client.generate_frames()); |
| 466 | 500 |
| 467 // Fail the draw again. | 501 // Fail the draw again. |
| 468 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 502 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 469 client.task_runner().RunPendingTasks(); // Run posted deadline. | 503 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 470 EXPECT_EQ(2, client.num_draws()); | 504 EXPECT_EQ(2, client.num_draws()); |
| 471 EXPECT_TRUE(scheduler->CommitPending()); | 505 EXPECT_TRUE(scheduler->CommitPending()); |
| 472 EXPECT_TRUE(scheduler->RedrawPending()); | 506 EXPECT_TRUE(scheduler->RedrawPending()); |
| 473 EXPECT_TRUE(client.needs_begin_frame()); | 507 EXPECT_TRUE(client.generate_frames()); |
| 474 | 508 |
| 475 // Draw successfully. | 509 // Draw successfully. |
| 476 client.SetDrawWillHappen(true); | 510 client.SetDrawWillHappen(true); |
| 477 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 511 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 478 client.task_runner().RunPendingTasks(); // Run posted deadline. | 512 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 479 EXPECT_EQ(3, client.num_draws()); | 513 EXPECT_EQ(3, client.num_draws()); |
| 480 EXPECT_TRUE(scheduler->CommitPending()); | 514 EXPECT_TRUE(scheduler->CommitPending()); |
| 481 EXPECT_FALSE(scheduler->RedrawPending()); | 515 EXPECT_FALSE(scheduler->RedrawPending()); |
| 482 EXPECT_TRUE(client.needs_begin_frame()); | 516 EXPECT_TRUE(client.generate_frames()); |
| 483 } | 517 } |
| 484 | 518 |
| 485 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { | 519 class SchedulerClientThatSetNeedsCommitInsideDraw : public FakeSchedulerClient { |
| 486 public: | 520 public: |
| 487 SchedulerClientThatSetNeedsCommitInsideDraw() | 521 SchedulerClientThatSetNeedsCommitInsideDraw() |
| 488 : set_needs_commit_on_next_draw_(false) {} | 522 : set_needs_commit_on_next_draw_(false) {} |
| 489 | 523 |
| 490 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} | 524 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE {} |
| 491 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() | 525 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() |
| 492 OVERRIDE { | 526 OVERRIDE { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 518 TEST(SchedulerTest, RequestCommitInsideDraw) { | 552 TEST(SchedulerTest, RequestCommitInsideDraw) { |
| 519 SchedulerClientThatSetNeedsCommitInsideDraw client; | 553 SchedulerClientThatSetNeedsCommitInsideDraw client; |
| 520 SchedulerSettings default_scheduler_settings; | 554 SchedulerSettings default_scheduler_settings; |
| 521 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 555 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 522 scheduler->SetCanStart(); | 556 scheduler->SetCanStart(); |
| 523 scheduler->SetVisible(true); | 557 scheduler->SetVisible(true); |
| 524 scheduler->SetCanDraw(true); | 558 scheduler->SetCanDraw(true); |
| 525 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 559 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 526 client.Reset(); | 560 client.Reset(); |
| 527 | 561 |
| 528 EXPECT_FALSE(client.needs_begin_frame()); | 562 EXPECT_FALSE(client.generate_frames()); |
| 529 scheduler->SetNeedsRedraw(); | 563 scheduler->SetNeedsRedraw(); |
| 530 EXPECT_TRUE(scheduler->RedrawPending()); | 564 EXPECT_TRUE(scheduler->RedrawPending()); |
| 531 EXPECT_EQ(0, client.num_draws()); | 565 EXPECT_EQ(0, client.num_draws()); |
| 532 EXPECT_TRUE(client.needs_begin_frame()); | 566 EXPECT_TRUE(client.generate_frames()); |
| 533 | 567 |
| 534 client.SetNeedsCommitOnNextDraw(); | 568 client.SetNeedsCommitOnNextDraw(); |
| 535 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 569 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 536 client.SetNeedsCommitOnNextDraw(); | 570 client.SetNeedsCommitOnNextDraw(); |
| 537 client.task_runner().RunPendingTasks(); // Run posted deadline. | 571 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 538 EXPECT_EQ(1, client.num_draws()); | 572 EXPECT_EQ(1, client.num_draws()); |
| 539 EXPECT_TRUE(scheduler->CommitPending()); | 573 EXPECT_TRUE(scheduler->CommitPending()); |
| 540 EXPECT_TRUE(client.needs_begin_frame()); | 574 EXPECT_TRUE(client.generate_frames()); |
| 541 scheduler->NotifyBeginMainFrameStarted(); | 575 scheduler->NotifyBeginMainFrameStarted(); |
| 542 scheduler->NotifyReadyToCommit(); | 576 scheduler->NotifyReadyToCommit(); |
| 543 | 577 |
| 544 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 578 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 545 client.task_runner().RunPendingTasks(); // Run posted deadline. | 579 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 546 EXPECT_EQ(2, client.num_draws()); | 580 EXPECT_EQ(2, client.num_draws()); |
| 547 | 581 |
| 548 EXPECT_FALSE(scheduler->RedrawPending()); | 582 EXPECT_FALSE(scheduler->RedrawPending()); |
| 549 EXPECT_FALSE(scheduler->CommitPending()); | 583 EXPECT_FALSE(scheduler->CommitPending()); |
| 550 EXPECT_TRUE(client.needs_begin_frame()); | 584 EXPECT_TRUE(client.generate_frames()); |
| 551 | 585 |
| 552 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't | 586 // We stop requesting BeginImplFrames after a BeginImplFrame where we don't |
| 553 // swap. | 587 // swap. |
| 554 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 588 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 555 client.task_runner().RunPendingTasks(); // Run posted deadline. | 589 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 556 EXPECT_EQ(2, client.num_draws()); | 590 EXPECT_EQ(2, client.num_draws()); |
| 557 EXPECT_FALSE(scheduler->RedrawPending()); | 591 EXPECT_FALSE(scheduler->RedrawPending()); |
| 558 EXPECT_FALSE(scheduler->CommitPending()); | 592 EXPECT_FALSE(scheduler->CommitPending()); |
| 559 EXPECT_FALSE(client.needs_begin_frame()); | 593 EXPECT_FALSE(client.generate_frames()); |
| 560 } | 594 } |
| 561 | 595 |
| 562 // Tests that when a draw fails then the pending commit should not be dropped. | 596 // Tests that when a draw fails then the pending commit should not be dropped. |
| 563 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { | 597 TEST(SchedulerTest, RequestCommitInsideFailedDraw) { |
| 564 SchedulerClientThatsetNeedsDrawInsideDraw client; | 598 SchedulerClientThatsetNeedsDrawInsideDraw client; |
| 565 SchedulerSettings default_scheduler_settings; | 599 SchedulerSettings default_scheduler_settings; |
| 566 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 600 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 567 scheduler->SetCanStart(); | 601 scheduler->SetCanStart(); |
| 568 scheduler->SetVisible(true); | 602 scheduler->SetVisible(true); |
| 569 scheduler->SetCanDraw(true); | 603 scheduler->SetCanDraw(true); |
| 570 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 604 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 571 client.Reset(); | 605 client.Reset(); |
| 572 | 606 |
| 573 client.SetDrawWillHappen(false); | 607 client.SetDrawWillHappen(false); |
| 574 | 608 |
| 575 scheduler->SetNeedsRedraw(); | 609 scheduler->SetNeedsRedraw(); |
| 576 EXPECT_TRUE(scheduler->RedrawPending()); | 610 EXPECT_TRUE(scheduler->RedrawPending()); |
| 577 EXPECT_TRUE(client.needs_begin_frame()); | 611 EXPECT_TRUE(client.generate_frames()); |
| 578 EXPECT_EQ(0, client.num_draws()); | 612 EXPECT_EQ(0, client.num_draws()); |
| 579 | 613 |
| 580 // Fail the draw. | 614 // Fail the draw. |
| 581 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 615 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 582 client.task_runner().RunPendingTasks(); // Run posted deadline. | 616 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 583 EXPECT_EQ(1, client.num_draws()); | 617 EXPECT_EQ(1, client.num_draws()); |
| 584 | 618 |
| 585 // We have a commit pending and the draw failed, and we didn't lose the commit | 619 // We have a commit pending and the draw failed, and we didn't lose the commit |
| 586 // request. | 620 // request. |
| 587 EXPECT_TRUE(scheduler->CommitPending()); | 621 EXPECT_TRUE(scheduler->CommitPending()); |
| 588 EXPECT_TRUE(scheduler->RedrawPending()); | 622 EXPECT_TRUE(scheduler->RedrawPending()); |
| 589 EXPECT_TRUE(client.needs_begin_frame()); | 623 EXPECT_TRUE(client.generate_frames()); |
| 590 | 624 |
| 591 // Fail the draw again. | 625 // Fail the draw again. |
| 592 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 626 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 593 | 627 |
| 594 client.task_runner().RunPendingTasks(); // Run posted deadline. | 628 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 595 EXPECT_EQ(2, client.num_draws()); | 629 EXPECT_EQ(2, client.num_draws()); |
| 596 EXPECT_TRUE(scheduler->CommitPending()); | 630 EXPECT_TRUE(scheduler->CommitPending()); |
| 597 EXPECT_TRUE(scheduler->RedrawPending()); | 631 EXPECT_TRUE(scheduler->RedrawPending()); |
| 598 EXPECT_TRUE(client.needs_begin_frame()); | 632 EXPECT_TRUE(client.generate_frames()); |
| 599 | 633 |
| 600 // Draw successfully. | 634 // Draw successfully. |
| 601 client.SetDrawWillHappen(true); | 635 client.SetDrawWillHappen(true); |
| 602 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 636 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 603 client.task_runner().RunPendingTasks(); // Run posted deadline. | 637 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 604 EXPECT_EQ(3, client.num_draws()); | 638 EXPECT_EQ(3, client.num_draws()); |
| 605 EXPECT_TRUE(scheduler->CommitPending()); | 639 EXPECT_TRUE(scheduler->CommitPending()); |
| 606 EXPECT_FALSE(scheduler->RedrawPending()); | 640 EXPECT_FALSE(scheduler->RedrawPending()); |
| 607 EXPECT_TRUE(client.needs_begin_frame()); | 641 EXPECT_TRUE(client.generate_frames()); |
| 608 } | 642 } |
| 609 | 643 |
| 610 TEST(SchedulerTest, NoSwapWhenDrawFails) { | 644 TEST(SchedulerTest, NoSwapWhenDrawFails) { |
| 611 SchedulerClientThatSetNeedsCommitInsideDraw client; | 645 SchedulerClientThatSetNeedsCommitInsideDraw client; |
| 612 SchedulerSettings default_scheduler_settings; | 646 SchedulerSettings default_scheduler_settings; |
| 613 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 647 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 614 scheduler->SetCanStart(); | 648 scheduler->SetCanStart(); |
| 615 scheduler->SetVisible(true); | 649 scheduler->SetVisible(true); |
| 616 scheduler->SetCanDraw(true); | 650 scheduler->SetCanDraw(true); |
| 617 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 651 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 618 client.Reset(); | 652 client.Reset(); |
| 619 | 653 |
| 620 scheduler->SetNeedsRedraw(); | 654 scheduler->SetNeedsRedraw(); |
| 621 EXPECT_TRUE(scheduler->RedrawPending()); | 655 EXPECT_TRUE(scheduler->RedrawPending()); |
| 622 EXPECT_TRUE(client.needs_begin_frame()); | 656 EXPECT_TRUE(client.generate_frames()); |
| 623 EXPECT_EQ(0, client.num_draws()); | 657 EXPECT_EQ(0, client.num_draws()); |
| 624 | 658 |
| 625 // Draw successfully, this starts a new frame. | 659 // Draw successfully, this starts a new frame. |
| 626 client.SetNeedsCommitOnNextDraw(); | 660 client.SetNeedsCommitOnNextDraw(); |
| 627 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 661 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 628 client.task_runner().RunPendingTasks(); // Run posted deadline. | 662 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 629 EXPECT_EQ(1, client.num_draws()); | 663 EXPECT_EQ(1, client.num_draws()); |
| 630 | 664 |
| 631 scheduler->SetNeedsRedraw(); | 665 scheduler->SetNeedsRedraw(); |
| 632 EXPECT_TRUE(scheduler->RedrawPending()); | 666 EXPECT_TRUE(scheduler->RedrawPending()); |
| 633 EXPECT_TRUE(client.needs_begin_frame()); | 667 EXPECT_TRUE(client.generate_frames()); |
| 634 | 668 |
| 635 // Fail to draw, this should not start a frame. | 669 // Fail to draw, this should not start a frame. |
| 636 client.SetDrawWillHappen(false); | 670 client.SetDrawWillHappen(false); |
| 637 client.SetNeedsCommitOnNextDraw(); | 671 client.SetNeedsCommitOnNextDraw(); |
| 638 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 672 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 639 client.task_runner().RunPendingTasks(); // Run posted deadline. | 673 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 640 EXPECT_EQ(2, client.num_draws()); | 674 EXPECT_EQ(2, client.num_draws()); |
| 641 } | 675 } |
| 642 | 676 |
| 643 class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { | 677 class SchedulerClientNeedsManageTilesInDraw : public FakeSchedulerClient { |
| 644 public: | 678 public: |
| 645 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() | 679 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() |
| 646 OVERRIDE { | 680 OVERRIDE { |
| 647 scheduler_->SetNeedsManageTiles(); | 681 scheduler_->SetNeedsManageTiles(); |
| 648 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); | 682 return FakeSchedulerClient::ScheduledActionDrawAndSwapIfPossible(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 659 scheduler->SetCanDraw(true); | 693 scheduler->SetCanDraw(true); |
| 660 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 694 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 661 | 695 |
| 662 // Request both draw and manage tiles. ManageTiles shouldn't | 696 // Request both draw and manage tiles. ManageTiles shouldn't |
| 663 // be trigged until BeginImplFrame. | 697 // be trigged until BeginImplFrame. |
| 664 client.Reset(); | 698 client.Reset(); |
| 665 scheduler->SetNeedsManageTiles(); | 699 scheduler->SetNeedsManageTiles(); |
| 666 scheduler->SetNeedsRedraw(); | 700 scheduler->SetNeedsRedraw(); |
| 667 EXPECT_TRUE(scheduler->RedrawPending()); | 701 EXPECT_TRUE(scheduler->RedrawPending()); |
| 668 EXPECT_TRUE(scheduler->ManageTilesPending()); | 702 EXPECT_TRUE(scheduler->ManageTilesPending()); |
| 669 EXPECT_TRUE(client.needs_begin_frame()); | 703 EXPECT_TRUE(client.generate_frames()); |
| 670 EXPECT_EQ(0, client.num_draws()); | 704 EXPECT_EQ(0, client.num_draws()); |
| 671 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 705 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
| 672 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 706 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 673 | 707 |
| 674 // We have no immediate actions to perform, so the BeginImplFrame should post | 708 // We have no immediate actions to perform, so the BeginImplFrame should post |
| 675 // the deadline task. | 709 // the deadline task. |
| 676 client.Reset(); | 710 client.Reset(); |
| 677 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 711 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 678 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 712 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 679 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 713 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 680 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 714 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 681 | 715 |
| 682 // On the deadline, he actions should have occured in the right order. | 716 // On the deadline, he actions should have occured in the right order. |
| 683 client.Reset(); | 717 client.Reset(); |
| 684 client.task_runner().RunPendingTasks(); // Run posted deadline. | 718 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 685 EXPECT_EQ(1, client.num_draws()); | 719 EXPECT_EQ(1, client.num_draws()); |
| 686 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 720 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 687 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 721 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
| 688 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 722 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| 689 client.ActionIndex("ScheduledActionManageTiles")); | 723 client.ActionIndex("ScheduledActionManageTiles")); |
| 690 EXPECT_FALSE(scheduler->RedrawPending()); | 724 EXPECT_FALSE(scheduler->RedrawPending()); |
| 691 EXPECT_FALSE(scheduler->ManageTilesPending()); | 725 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 692 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 726 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 693 | 727 |
| 694 // Request a draw. We don't need a ManageTiles yet. | 728 // Request a draw. We don't need a ManageTiles yet. |
| 695 client.Reset(); | 729 client.Reset(); |
| 696 scheduler->SetNeedsRedraw(); | 730 scheduler->SetNeedsRedraw(); |
| 697 EXPECT_TRUE(scheduler->RedrawPending()); | 731 EXPECT_TRUE(scheduler->RedrawPending()); |
| 698 EXPECT_FALSE(scheduler->ManageTilesPending()); | 732 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 699 EXPECT_TRUE(client.needs_begin_frame()); | 733 EXPECT_TRUE(client.generate_frames()); |
| 700 EXPECT_EQ(0, client.num_draws()); | 734 EXPECT_EQ(0, client.num_draws()); |
| 701 | 735 |
| 702 // We have no immediate actions to perform, so the BeginImplFrame should post | 736 // We have no immediate actions to perform, so the BeginImplFrame should post |
| 703 // the deadline task. | 737 // the deadline task. |
| 704 client.Reset(); | 738 client.Reset(); |
| 705 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 739 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 706 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 740 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 707 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 741 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 708 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 742 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 709 | 743 |
| 710 // Draw. The draw will trigger SetNeedsManageTiles, and | 744 // Draw. The draw will trigger SetNeedsManageTiles, and |
| 711 // then the ManageTiles action will be triggered after the Draw. | 745 // then the ManageTiles action will be triggered after the Draw. |
| 712 // Afterwards, neither a draw nor ManageTiles are pending. | 746 // Afterwards, neither a draw nor ManageTiles are pending. |
| 713 client.Reset(); | 747 client.Reset(); |
| 714 client.task_runner().RunPendingTasks(); // Run posted deadline. | 748 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 715 EXPECT_EQ(1, client.num_draws()); | 749 EXPECT_EQ(1, client.num_draws()); |
| 716 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 750 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 717 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 751 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
| 718 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 752 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| 719 client.ActionIndex("ScheduledActionManageTiles")); | 753 client.ActionIndex("ScheduledActionManageTiles")); |
| 720 EXPECT_FALSE(scheduler->RedrawPending()); | 754 EXPECT_FALSE(scheduler->RedrawPending()); |
| 721 EXPECT_FALSE(scheduler->ManageTilesPending()); | 755 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 722 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 756 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 723 | 757 |
| 724 // We need a BeginImplFrame where we don't swap to go idle. | 758 // We need a BeginImplFrame where we don't swap to go idle. |
| 725 client.Reset(); | 759 client.Reset(); |
| 726 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 760 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 727 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 761 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 728 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 762 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 729 client.Reset(); | 763 client.Reset(); |
| 730 client.task_runner().RunPendingTasks(); // Run posted deadline. | 764 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 731 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 765 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 732 EXPECT_FALSE(client.needs_begin_frame()); | 766 EXPECT_FALSE(client.generate_frames()); |
| 733 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 767 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 734 EXPECT_EQ(0, client.num_draws()); | 768 EXPECT_EQ(0, client.num_draws()); |
| 735 | 769 |
| 736 // Now trigger a ManageTiles outside of a draw. We will then need | 770 // Now trigger a ManageTiles outside of a draw. We will then need |
| 737 // a begin-frame for the ManageTiles, but we don't need a draw. | 771 // a begin-frame for the ManageTiles, but we don't need a draw. |
| 738 client.Reset(); | 772 client.Reset(); |
| 739 EXPECT_FALSE(client.needs_begin_frame()); | 773 EXPECT_FALSE(client.generate_frames()); |
| 740 scheduler->SetNeedsManageTiles(); | 774 scheduler->SetNeedsManageTiles(); |
| 741 EXPECT_TRUE(client.needs_begin_frame()); | 775 EXPECT_TRUE(client.generate_frames()); |
| 742 EXPECT_TRUE(scheduler->ManageTilesPending()); | 776 EXPECT_TRUE(scheduler->ManageTilesPending()); |
| 743 EXPECT_FALSE(scheduler->RedrawPending()); | 777 EXPECT_FALSE(scheduler->RedrawPending()); |
| 744 | 778 |
| 745 // BeginImplFrame. There will be no draw, only ManageTiles. | 779 // BeginImplFrame. There will be no draw, only ManageTiles. |
| 746 client.Reset(); | 780 client.Reset(); |
| 747 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 781 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 748 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 782 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 749 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 783 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 750 client.Reset(); | 784 client.Reset(); |
| 751 client.task_runner().RunPendingTasks(); // Run posted deadline. | 785 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 752 EXPECT_EQ(0, client.num_draws()); | 786 EXPECT_EQ(0, client.num_draws()); |
| 753 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 787 EXPECT_FALSE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 754 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 788 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
| 755 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 789 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 756 } | 790 } |
| 757 | 791 |
| 758 // Test that ManageTiles only happens once per frame. If an external caller | 792 // Test that ManageTiles only happens once per frame. If an external caller |
| 759 // initiates it, then the state machine should not ManageTiles on that frame. | 793 // initiates it, then the state machine should not ManageTiles on that frame. |
| 760 TEST(SchedulerTest, ManageTilesOncePerFrame) { | 794 TEST(SchedulerTest, ManageTilesOncePerFrame) { |
| 761 FakeSchedulerClient client; | 795 FakeSchedulerClient client; |
| 762 SchedulerSettings default_scheduler_settings; | 796 SchedulerSettings default_scheduler_settings; |
| 763 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 797 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 764 scheduler->SetCanStart(); | 798 scheduler->SetCanStart(); |
| 765 scheduler->SetVisible(true); | 799 scheduler->SetVisible(true); |
| 766 scheduler->SetCanDraw(true); | 800 scheduler->SetCanDraw(true); |
| 767 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 801 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 768 | 802 |
| 769 // If DidManageTiles during a frame, then ManageTiles should not occur again. | 803 // If DidManageTiles during a frame, then ManageTiles should not occur again. |
| 770 scheduler->SetNeedsManageTiles(); | 804 scheduler->SetNeedsManageTiles(); |
| 771 scheduler->SetNeedsRedraw(); | 805 scheduler->SetNeedsRedraw(); |
| 772 client.Reset(); | 806 client.Reset(); |
| 773 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 807 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 774 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 808 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 775 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 809 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 776 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 810 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 777 | 811 |
| 778 EXPECT_TRUE(scheduler->ManageTilesPending()); | 812 EXPECT_TRUE(scheduler->ManageTilesPending()); |
| 779 scheduler->DidManageTiles(); // An explicit ManageTiles. | 813 scheduler->DidManageTiles(); // An explicit ManageTiles. |
| 780 EXPECT_FALSE(scheduler->ManageTilesPending()); | 814 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 781 | 815 |
| 782 client.Reset(); | 816 client.Reset(); |
| 783 client.task_runner().RunPendingTasks(); // Run posted deadline. | 817 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 784 EXPECT_EQ(1, client.num_draws()); | 818 EXPECT_EQ(1, client.num_draws()); |
| 785 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 819 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 786 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 820 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
| 787 EXPECT_FALSE(scheduler->RedrawPending()); | 821 EXPECT_FALSE(scheduler->RedrawPending()); |
| 788 EXPECT_FALSE(scheduler->ManageTilesPending()); | 822 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 789 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 823 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 790 | 824 |
| 791 // Next frame without DidManageTiles should ManageTiles with draw. | 825 // Next frame without DidManageTiles should ManageTiles with draw. |
| 792 scheduler->SetNeedsManageTiles(); | 826 scheduler->SetNeedsManageTiles(); |
| 793 scheduler->SetNeedsRedraw(); | 827 scheduler->SetNeedsRedraw(); |
| 794 client.Reset(); | 828 client.Reset(); |
| 795 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 829 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 796 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 830 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 797 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 831 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 798 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 832 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 799 | 833 |
| 800 client.Reset(); | 834 client.Reset(); |
| 801 client.task_runner().RunPendingTasks(); // Run posted deadline. | 835 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 802 EXPECT_EQ(1, client.num_draws()); | 836 EXPECT_EQ(1, client.num_draws()); |
| 803 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 837 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 804 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 838 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
| 805 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 839 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| 806 client.ActionIndex("ScheduledActionManageTiles")); | 840 client.ActionIndex("ScheduledActionManageTiles")); |
| 807 EXPECT_FALSE(scheduler->RedrawPending()); | 841 EXPECT_FALSE(scheduler->RedrawPending()); |
| 808 EXPECT_FALSE(scheduler->ManageTilesPending()); | 842 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 809 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 843 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 810 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles | 844 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles |
| 811 | 845 |
| 812 // If we get another DidManageTiles within the same frame, we should | 846 // If we get another DidManageTiles within the same frame, we should |
| 813 // not ManageTiles on the next frame. | 847 // not ManageTiles on the next frame. |
| 814 scheduler->DidManageTiles(); // An explicit ManageTiles. | 848 scheduler->DidManageTiles(); // An explicit ManageTiles. |
| 815 scheduler->SetNeedsManageTiles(); | 849 scheduler->SetNeedsManageTiles(); |
| 816 scheduler->SetNeedsRedraw(); | 850 scheduler->SetNeedsRedraw(); |
| 817 client.Reset(); | 851 client.Reset(); |
| 818 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 852 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 819 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 853 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 820 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 854 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 821 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 855 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 822 | 856 |
| 823 EXPECT_TRUE(scheduler->ManageTilesPending()); | 857 EXPECT_TRUE(scheduler->ManageTilesPending()); |
| 824 | 858 |
| 825 client.Reset(); | 859 client.Reset(); |
| 826 client.task_runner().RunPendingTasks(); // Run posted deadline. | 860 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 827 EXPECT_EQ(1, client.num_draws()); | 861 EXPECT_EQ(1, client.num_draws()); |
| 828 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 862 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 829 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 863 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
| 830 EXPECT_FALSE(scheduler->RedrawPending()); | 864 EXPECT_FALSE(scheduler->RedrawPending()); |
| 831 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 865 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 832 | 866 |
| 833 // If we get another DidManageTiles, we should not ManageTiles on the next | 867 // If we get another DidManageTiles, we should not ManageTiles on the next |
| 834 // frame. This verifies we don't alternate calling ManageTiles once and twice. | 868 // frame. This verifies we don't alternate calling ManageTiles once and twice. |
| 835 EXPECT_TRUE(scheduler->ManageTilesPending()); | 869 EXPECT_TRUE(scheduler->ManageTilesPending()); |
| 836 scheduler->DidManageTiles(); // An explicit ManageTiles. | 870 scheduler->DidManageTiles(); // An explicit ManageTiles. |
| 837 EXPECT_FALSE(scheduler->ManageTilesPending()); | 871 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 838 scheduler->SetNeedsManageTiles(); | 872 scheduler->SetNeedsManageTiles(); |
| 839 scheduler->SetNeedsRedraw(); | 873 scheduler->SetNeedsRedraw(); |
| 840 client.Reset(); | 874 client.Reset(); |
| 841 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 875 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 842 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 876 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 843 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 877 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 844 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 878 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 845 | 879 |
| 846 EXPECT_TRUE(scheduler->ManageTilesPending()); | 880 EXPECT_TRUE(scheduler->ManageTilesPending()); |
| 847 | 881 |
| 848 client.Reset(); | 882 client.Reset(); |
| 849 client.task_runner().RunPendingTasks(); // Run posted deadline. | 883 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 850 EXPECT_EQ(1, client.num_draws()); | 884 EXPECT_EQ(1, client.num_draws()); |
| 851 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 885 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 852 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); | 886 EXPECT_FALSE(client.HasAction("ScheduledActionManageTiles")); |
| 853 EXPECT_FALSE(scheduler->RedrawPending()); | 887 EXPECT_FALSE(scheduler->RedrawPending()); |
| 854 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 888 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 855 | 889 |
| 856 // Next frame without DidManageTiles should ManageTiles with draw. | 890 // Next frame without DidManageTiles should ManageTiles with draw. |
| 857 scheduler->SetNeedsManageTiles(); | 891 scheduler->SetNeedsManageTiles(); |
| 858 scheduler->SetNeedsRedraw(); | 892 scheduler->SetNeedsRedraw(); |
| 859 client.Reset(); | 893 client.Reset(); |
| 860 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 894 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 861 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 895 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 862 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 896 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 863 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 897 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 864 | 898 |
| 865 client.Reset(); | 899 client.Reset(); |
| 866 client.task_runner().RunPendingTasks(); // Run posted deadline. | 900 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 867 EXPECT_EQ(1, client.num_draws()); | 901 EXPECT_EQ(1, client.num_draws()); |
| 868 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); | 902 EXPECT_TRUE(client.HasAction("ScheduledActionDrawAndSwapIfPossible")); |
| 869 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); | 903 EXPECT_TRUE(client.HasAction("ScheduledActionManageTiles")); |
| 870 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), | 904 EXPECT_LT(client.ActionIndex("ScheduledActionDrawAndSwapIfPossible"), |
| 871 client.ActionIndex("ScheduledActionManageTiles")); | 905 client.ActionIndex("ScheduledActionManageTiles")); |
| 872 EXPECT_FALSE(scheduler->RedrawPending()); | 906 EXPECT_FALSE(scheduler->RedrawPending()); |
| 873 EXPECT_FALSE(scheduler->ManageTilesPending()); | 907 EXPECT_FALSE(scheduler->ManageTilesPending()); |
| 874 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 908 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 875 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles | 909 scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles |
| 876 } | 910 } |
| 877 | 911 |
| 878 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { | 912 TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { |
| 879 SchedulerClientNeedsManageTilesInDraw client; | 913 SchedulerClientNeedsManageTilesInDraw client; |
| 880 SchedulerSettings default_scheduler_settings; | 914 SchedulerSettings default_scheduler_settings; |
| 881 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); | 915 Scheduler* scheduler = client.CreateScheduler(default_scheduler_settings); |
| 882 scheduler->SetCanStart(); | 916 scheduler->SetCanStart(); |
| 883 scheduler->SetVisible(true); | 917 scheduler->SetVisible(true); |
| 884 scheduler->SetCanDraw(true); | 918 scheduler->SetCanDraw(true); |
| 885 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 919 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 886 | 920 |
| 887 client.Reset(); | 921 client.Reset(); |
| 888 scheduler->SetNeedsRedraw(); | 922 scheduler->SetNeedsRedraw(); |
| 889 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 923 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 890 | 924 |
| 891 // The deadline should be zero since there is no work other than drawing | 925 // The deadline should be zero since there is no work other than drawing |
| 892 // pending. | 926 // pending. |
| 893 EXPECT_EQ(base::TimeTicks(), client.posted_begin_impl_frame_deadline()); | 927 EXPECT_EQ(base::TimeTicks(), client.posted_begin_impl_frame_deadline()); |
| 894 } | 928 } |
| 895 | 929 |
| 896 class SchedulerClientWithFixedEstimates : public FakeSchedulerClient { | 930 class SchedulerClientWithFixedEstimates : public FakeSchedulerClient { |
| 897 public: | 931 public: |
| 898 SchedulerClientWithFixedEstimates( | 932 SchedulerClientWithFixedEstimates( |
| 899 base::TimeDelta draw_duration, | 933 base::TimeDelta draw_duration, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 scheduler->SetCanStart(); | 969 scheduler->SetCanStart(); |
| 936 scheduler->SetVisible(true); | 970 scheduler->SetVisible(true); |
| 937 scheduler->SetCanDraw(true); | 971 scheduler->SetCanDraw(true); |
| 938 scheduler->SetSmoothnessTakesPriority(smoothness_takes_priority); | 972 scheduler->SetSmoothnessTakesPriority(smoothness_takes_priority); |
| 939 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 973 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 940 | 974 |
| 941 // Impl thread hits deadline before commit finishes. | 975 // Impl thread hits deadline before commit finishes. |
| 942 client.Reset(); | 976 client.Reset(); |
| 943 scheduler->SetNeedsCommit(); | 977 scheduler->SetNeedsCommit(); |
| 944 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); | 978 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); |
| 945 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 979 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 946 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); | 980 EXPECT_FALSE(scheduler->MainThreadIsInHighLatencyMode()); |
| 947 client.task_runner().RunPendingTasks(); // Run posted deadline. | 981 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 948 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 982 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| 949 scheduler->NotifyBeginMainFrameStarted(); | 983 scheduler->NotifyBeginMainFrameStarted(); |
| 950 scheduler->NotifyReadyToCommit(); | 984 scheduler->NotifyReadyToCommit(); |
| 951 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 985 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| 952 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); | 986 EXPECT_TRUE(client.HasAction("ScheduledActionSendBeginMainFrame")); |
| 953 | 987 |
| 954 client.Reset(); | 988 client.Reset(); |
| 955 scheduler->SetNeedsCommit(); | 989 scheduler->SetNeedsCommit(); |
| 956 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 990 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| 957 scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); | 991 client.frame_source().TestBeginFrame(CreateBeginFrameArgsForTesting()); |
| 958 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); | 992 EXPECT_TRUE(scheduler->MainThreadIsInHighLatencyMode()); |
| 959 client.task_runner().RunPendingTasks(); // Run posted deadline. | 993 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 960 EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), | 994 EXPECT_EQ(scheduler->MainThreadIsInHighLatencyMode(), |
| 961 should_send_begin_main_frame); | 995 should_send_begin_main_frame); |
| 962 EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"), | 996 EXPECT_EQ(client.HasAction("ScheduledActionSendBeginMainFrame"), |
| 963 should_send_begin_main_frame); | 997 should_send_begin_main_frame); |
| 964 } | 998 } |
| 965 | 999 |
| 966 TEST(SchedulerTest, | 1000 TEST(SchedulerTest, |
| 967 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) { | 1001 SkipMainFrameIfHighLatencyAndCanCommitAndActivateBeforeDeadline) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 scheduler->DidCreateAndInitializeOutputSurface(); | 1040 scheduler->DidCreateAndInitializeOutputSurface(); |
| 1007 | 1041 |
| 1008 scheduler->SetNeedsCommit(); | 1042 scheduler->SetNeedsCommit(); |
| 1009 EXPECT_TRUE(scheduler->CommitPending()); | 1043 EXPECT_TRUE(scheduler->CommitPending()); |
| 1010 scheduler->NotifyBeginMainFrameStarted(); | 1044 scheduler->NotifyBeginMainFrameStarted(); |
| 1011 scheduler->NotifyReadyToCommit(); | 1045 scheduler->NotifyReadyToCommit(); |
| 1012 scheduler->SetNeedsRedraw(); | 1046 scheduler->SetNeedsRedraw(); |
| 1013 | 1047 |
| 1014 BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(); | 1048 BeginFrameArgs frame_args = CreateBeginFrameArgsForTesting(); |
| 1015 frame_args.interval = base::TimeDelta::FromMilliseconds(1000); | 1049 frame_args.interval = base::TimeDelta::FromMilliseconds(1000); |
| 1016 scheduler->BeginFrame(frame_args); | 1050 client.frame_source().TestBeginFrame(frame_args); |
| 1017 | 1051 |
| 1018 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1052 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1019 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1053 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1020 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1054 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1021 | 1055 |
| 1022 scheduler->DidSwapBuffers(); | 1056 scheduler->DidSwapBuffers(); |
| 1023 scheduler->DidSwapBuffersComplete(); | 1057 scheduler->DidSwapBuffersComplete(); |
| 1024 | 1058 |
| 1025 // At this point, we've drawn a frame. Start another commit, but hold off on | 1059 // At this point, we've drawn a frame. Start another commit, but hold off on |
| 1026 // the NotifyReadyToCommit for now. | 1060 // the NotifyReadyToCommit for now. |
| 1027 EXPECT_FALSE(scheduler->CommitPending()); | 1061 EXPECT_FALSE(scheduler->CommitPending()); |
| 1028 scheduler->SetNeedsCommit(); | 1062 scheduler->SetNeedsCommit(); |
| 1029 scheduler->BeginFrame(frame_args); | 1063 client.frame_source().TestBeginFrame(frame_args); |
| 1030 EXPECT_TRUE(scheduler->CommitPending()); | 1064 EXPECT_TRUE(scheduler->CommitPending()); |
| 1031 | 1065 |
| 1032 // Draw and swap the frame, but don't ack the swap to simulate the Browser | 1066 // Draw and swap the frame, but don't ack the swap to simulate the Browser |
| 1033 // blocking on the renderer. | 1067 // blocking on the renderer. |
| 1034 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1068 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1035 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1069 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1036 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1070 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1037 scheduler->DidSwapBuffers(); | 1071 scheduler->DidSwapBuffers(); |
| 1038 | 1072 |
| 1039 // Spin the event loop a few times and make sure we get more | 1073 // Spin the event loop a few times and make sure we get more |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1071 SchedulerSettings scheduler_settings; | 1105 SchedulerSettings scheduler_settings; |
| 1072 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1106 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1073 scheduler->SetCanStart(); | 1107 scheduler->SetCanStart(); |
| 1074 scheduler->SetVisible(true); | 1108 scheduler->SetVisible(true); |
| 1075 scheduler->SetCanDraw(true); | 1109 scheduler->SetCanDraw(true); |
| 1076 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1110 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1077 | 1111 |
| 1078 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1112 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1079 client.Reset(); | 1113 client.Reset(); |
| 1080 scheduler->SetNeedsCommit(); | 1114 scheduler->SetNeedsCommit(); |
| 1081 EXPECT_TRUE(client.needs_begin_frame()); | 1115 EXPECT_TRUE(client.generate_frames()); |
| 1082 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1116 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 1083 client.Reset(); | 1117 client.Reset(); |
| 1084 | 1118 |
| 1085 // Create a BeginFrame with a long deadline to avoid race conditions. | 1119 // Create a BeginFrame with a long deadline to avoid race conditions. |
| 1086 // This is the first BeginFrame, which will be handled immediately. | 1120 // This is the first BeginFrame, which will be handled immediately. |
| 1087 BeginFrameArgs args = CreateBeginFrameArgsForTesting(); | 1121 BeginFrameArgs args = CreateBeginFrameArgsForTesting(); |
| 1088 args.deadline += base::TimeDelta::FromHours(1); | 1122 args.deadline += base::TimeDelta::FromHours(1); |
| 1089 scheduler->BeginFrame(args); | 1123 client.frame_source().TestBeginFrame(args); |
| 1090 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1124 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1091 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1125 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1092 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1126 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1093 EXPECT_TRUE(client.needs_begin_frame()); | 1127 EXPECT_TRUE(client.generate_frames()); |
| 1094 client.Reset(); | 1128 client.Reset(); |
| 1095 | 1129 |
| 1096 // Queue BeginFrames while we are still handling the previous BeginFrame. | 1130 // Queue BeginFrames while we are still handling the previous BeginFrame. |
| 1097 args.frame_time += base::TimeDelta::FromSeconds(1); | 1131 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1098 scheduler->BeginFrame(args); | 1132 client.frame_source().TestBeginFrame(args); |
| 1099 args.frame_time += base::TimeDelta::FromSeconds(1); | 1133 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1100 scheduler->BeginFrame(args); | 1134 client.frame_source().TestBeginFrame(args); |
| 1101 | 1135 |
| 1102 // If we don't swap on the deadline, we wait for the next BeginImplFrame. | 1136 // If we don't swap on the deadline, we wait for the next BeginImplFrame. |
| 1103 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1137 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1104 EXPECT_EQ(0, client.num_actions_()); | 1138 EXPECT_EQ(0, client.num_actions_()); |
| 1105 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1139 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1106 EXPECT_TRUE(client.needs_begin_frame()); | 1140 EXPECT_TRUE(client.generate_frames()); |
| 1107 client.Reset(); | 1141 client.Reset(); |
| 1108 | 1142 |
| 1109 // NotifyReadyToCommit should trigger the commit. | 1143 // NotifyReadyToCommit should trigger the commit. |
| 1110 scheduler->NotifyBeginMainFrameStarted(); | 1144 scheduler->NotifyBeginMainFrameStarted(); |
| 1111 scheduler->NotifyReadyToCommit(); | 1145 scheduler->NotifyReadyToCommit(); |
| 1112 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1146 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1113 EXPECT_TRUE(client.needs_begin_frame()); | 1147 EXPECT_TRUE(client.generate_frames()); |
| 1114 client.Reset(); | 1148 client.Reset(); |
| 1115 | 1149 |
| 1116 // BeginImplFrame should prepare the draw. | 1150 // BeginImplFrame should prepare the draw. |
| 1117 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1151 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| 1118 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1152 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1119 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 1153 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 1120 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1154 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1121 EXPECT_TRUE(client.needs_begin_frame()); | 1155 EXPECT_TRUE(client.generate_frames()); |
| 1122 client.Reset(); | 1156 client.Reset(); |
| 1123 | 1157 |
| 1124 // BeginImplFrame deadline should draw. | 1158 // BeginImplFrame deadline should draw. |
| 1125 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1159 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1126 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1160 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 1127 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1161 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1128 EXPECT_TRUE(client.needs_begin_frame()); | 1162 EXPECT_TRUE(client.generate_frames()); |
| 1129 client.Reset(); | 1163 client.Reset(); |
| 1130 | 1164 |
| 1131 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | 1165 // The following BeginImplFrame deadline should SetGenerateFrames(false) |
| 1132 // to avoid excessive toggles. | 1166 // to avoid excessive toggles. |
| 1133 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1167 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| 1134 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1168 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 1135 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1169 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1136 client.Reset(); | 1170 client.Reset(); |
| 1137 | 1171 |
| 1138 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1172 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1139 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1173 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 1140 EXPECT_FALSE(client.needs_begin_frame()); | 1174 EXPECT_FALSE(client.generate_frames()); |
| 1141 client.Reset(); | 1175 client.Reset(); |
| 1142 } | 1176 } |
| 1143 | 1177 |
| 1144 TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { | 1178 TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) { |
| 1145 FakeSchedulerClient client; | 1179 FakeSchedulerClient client; |
| 1146 SchedulerSettings scheduler_settings; | 1180 SchedulerSettings scheduler_settings; |
| 1147 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1181 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1148 scheduler->SetCanStart(); | 1182 scheduler->SetCanStart(); |
| 1149 scheduler->SetVisible(true); | 1183 scheduler->SetVisible(true); |
| 1150 scheduler->SetCanDraw(true); | 1184 scheduler->SetCanDraw(true); |
| 1151 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1185 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1152 | 1186 |
| 1153 // To test swap ack throttling, this test disables automatic swap acks. | 1187 // To test swap ack throttling, this test disables automatic swap acks. |
| 1154 scheduler->SetMaxSwapsPending(1); | 1188 scheduler->SetMaxSwapsPending(1); |
| 1155 client.SetAutomaticSwapAck(false); | 1189 client.SetAutomaticSwapAck(false); |
| 1156 | 1190 |
| 1157 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1191 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1158 client.Reset(); | 1192 client.Reset(); |
| 1159 scheduler->SetNeedsCommit(); | 1193 scheduler->SetNeedsCommit(); |
| 1160 EXPECT_TRUE(client.needs_begin_frame()); | 1194 EXPECT_TRUE(client.generate_frames()); |
| 1161 EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); | 1195 EXPECT_SINGLE_ACTION("SetGenerateFrames", client); |
| 1162 client.Reset(); | 1196 client.Reset(); |
| 1163 | 1197 |
| 1164 // Create a BeginFrame with a long deadline to avoid race conditions. | 1198 // Create a BeginFrame with a long deadline to avoid race conditions. |
| 1165 // This is the first BeginFrame, which will be handled immediately. | 1199 // This is the first BeginFrame, which will be handled immediately. |
| 1166 BeginFrameArgs args = CreateBeginFrameArgsForTesting(); | 1200 BeginFrameArgs args = CreateBeginFrameArgsForTesting(); |
| 1167 args.deadline += base::TimeDelta::FromHours(1); | 1201 args.deadline += base::TimeDelta::FromHours(1); |
| 1168 scheduler->BeginFrame(args); | 1202 client.frame_source().TestBeginFrame(args); |
| 1169 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1203 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1170 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1204 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1171 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1205 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1172 EXPECT_TRUE(client.needs_begin_frame()); | 1206 EXPECT_TRUE(client.generate_frames()); |
| 1173 client.Reset(); | 1207 client.Reset(); |
| 1174 | 1208 |
| 1175 // Queue BeginFrame while we are still handling the previous BeginFrame. | 1209 // Queue BeginFrame while we are still handling the previous BeginFrame. |
| 1176 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1210 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1177 args.frame_time += base::TimeDelta::FromSeconds(1); | 1211 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1178 scheduler->BeginFrame(args); | 1212 client.frame_source().TestBeginFrame(args); |
| 1179 EXPECT_EQ(0, client.num_actions_()); | 1213 EXPECT_EQ(0, client.num_actions_()); |
| 1180 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1214 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1181 client.Reset(); | 1215 client.Reset(); |
| 1182 | 1216 |
| 1183 // NotifyReadyToCommit should trigger the pending commit and draw. | 1217 // NotifyReadyToCommit should trigger the pending commit and draw. |
| 1184 scheduler->NotifyBeginMainFrameStarted(); | 1218 scheduler->NotifyBeginMainFrameStarted(); |
| 1185 scheduler->NotifyReadyToCommit(); | 1219 scheduler->NotifyReadyToCommit(); |
| 1186 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1220 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1187 EXPECT_TRUE(client.needs_begin_frame()); | 1221 EXPECT_TRUE(client.generate_frames()); |
| 1188 client.Reset(); | 1222 client.Reset(); |
| 1189 | 1223 |
| 1190 // Swapping will put us into a swap throttled state. | 1224 // Swapping will put us into a swap throttled state. |
| 1191 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1225 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1192 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1226 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1193 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1227 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1194 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1228 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1195 EXPECT_TRUE(client.needs_begin_frame()); | 1229 EXPECT_TRUE(client.generate_frames()); |
| 1196 client.Reset(); | 1230 client.Reset(); |
| 1197 | 1231 |
| 1198 // While swap throttled, BeginRetroFrames should trigger BeginImplFrames | 1232 // While swap throttled, BeginRetroFrames should trigger BeginImplFrames |
| 1199 // but not a BeginMainFrame or draw. | 1233 // but not a BeginMainFrame or draw. |
| 1200 scheduler->SetNeedsCommit(); | 1234 scheduler->SetNeedsCommit(); |
| 1201 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. | 1235 client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame. |
| 1202 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1236 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
| 1203 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1237 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1204 EXPECT_TRUE(client.needs_begin_frame()); | 1238 EXPECT_TRUE(client.generate_frames()); |
| 1205 client.Reset(); | 1239 client.Reset(); |
| 1206 | 1240 |
| 1207 // Queue BeginFrame while we are still handling the previous BeginFrame. | 1241 // Queue BeginFrame while we are still handling the previous BeginFrame. |
| 1208 args.frame_time += base::TimeDelta::FromSeconds(1); | 1242 args.frame_time += base::TimeDelta::FromSeconds(1); |
| 1209 scheduler->BeginFrame(args); | 1243 client.frame_source().TestBeginFrame(args); |
| 1210 EXPECT_EQ(0, client.num_actions_()); | 1244 EXPECT_EQ(0, client.num_actions_()); |
| 1211 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1245 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1212 EXPECT_TRUE(client.needs_begin_frame()); | 1246 EXPECT_TRUE(client.generate_frames()); |
| 1213 client.Reset(); | 1247 client.Reset(); |
| 1214 | 1248 |
| 1215 // Take us out of a swap throttled state. | 1249 // Take us out of a swap throttled state. |
| 1216 scheduler->DidSwapBuffersComplete(); | 1250 scheduler->DidSwapBuffersComplete(); |
| 1217 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1251 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
| 1218 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1252 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1219 EXPECT_TRUE(client.needs_begin_frame()); | 1253 EXPECT_TRUE(client.generate_frames()); |
| 1220 client.Reset(); | 1254 client.Reset(); |
| 1221 | 1255 |
| 1222 // BeginImplFrame deadline should draw. | 1256 // BeginImplFrame deadline should draw. |
| 1223 scheduler->SetNeedsRedraw(); | 1257 scheduler->SetNeedsRedraw(); |
| 1224 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1258 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1225 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1259 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1226 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1260 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1227 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1261 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1228 EXPECT_TRUE(client.needs_begin_frame()); | 1262 EXPECT_TRUE(client.generate_frames()); |
| 1229 client.Reset(); | 1263 client.Reset(); |
| 1230 } | 1264 } |
| 1231 | 1265 |
| 1232 void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, | 1266 void BeginFramesNotFromClient(bool begin_frame_scheduling_enabled, |
| 1233 bool throttle_frame_production) { | 1267 bool throttle_frame_production) { |
| 1234 FakeSchedulerClient client; | 1268 FakeSchedulerClient client; |
| 1235 SchedulerSettings scheduler_settings; | 1269 SchedulerSettings scheduler_settings; |
| 1236 scheduler_settings.begin_frame_scheduling_enabled = | 1270 scheduler_settings.begin_frame_scheduling_enabled = |
| 1237 begin_frame_scheduling_enabled; | 1271 begin_frame_scheduling_enabled; |
| 1238 scheduler_settings.throttle_frame_production = throttle_frame_production; | 1272 scheduler_settings.throttle_frame_production = throttle_frame_production; |
| 1239 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); | 1273 Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
| 1240 scheduler->SetCanStart(); | 1274 scheduler->SetCanStart(); |
| 1241 scheduler->SetVisible(true); | 1275 scheduler->SetVisible(true); |
| 1242 scheduler->SetCanDraw(true); | 1276 scheduler->SetCanDraw(true); |
| 1243 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1277 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1244 | 1278 |
| 1245 // SetNeedsCommit should begin the frame on the next BeginImplFrame | 1279 // SetNeedsCommit should begin the frame on the next BeginImplFrame |
| 1246 // without calling SetNeedsBeginFrame. | 1280 // without calling SetGenerateFrames. |
| 1247 client.Reset(); | 1281 client.Reset(); |
| 1248 scheduler->SetNeedsCommit(); | 1282 scheduler->SetNeedsCommit(); |
| 1249 EXPECT_FALSE(client.needs_begin_frame()); | 1283 EXPECT_FALSE(client.generate_frames()); |
| 1250 EXPECT_EQ(0, client.num_actions_()); | 1284 EXPECT_EQ(0, client.num_actions_()); |
| 1251 client.Reset(); | 1285 client.Reset(); |
| 1252 | 1286 |
| 1253 // When the client-driven BeginFrame are disabled, the scheduler posts it's | 1287 // When the client-driven BeginFrame are disabled, the scheduler posts it's |
| 1254 // own BeginFrame tasks. | 1288 // own BeginFrame tasks. |
| 1255 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1289 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1256 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1290 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1257 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1291 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1258 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1292 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1259 EXPECT_FALSE(client.needs_begin_frame()); | 1293 EXPECT_FALSE(client.generate_frames()); |
| 1260 client.Reset(); | 1294 client.Reset(); |
| 1261 | 1295 |
| 1262 // If we don't swap on the deadline, we wait for the next BeginFrame. | 1296 // If we don't swap on the deadline, we wait for the next BeginFrame. |
| 1263 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1297 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1264 EXPECT_EQ(0, client.num_actions_()); | 1298 EXPECT_EQ(0, client.num_actions_()); |
| 1265 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1299 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1266 EXPECT_FALSE(client.needs_begin_frame()); | 1300 EXPECT_FALSE(client.generate_frames()); |
| 1267 client.Reset(); | 1301 client.Reset(); |
| 1268 | 1302 |
| 1269 // NotifyReadyToCommit should trigger the commit. | 1303 // NotifyReadyToCommit should trigger the commit. |
| 1270 scheduler->NotifyBeginMainFrameStarted(); | 1304 scheduler->NotifyBeginMainFrameStarted(); |
| 1271 scheduler->NotifyReadyToCommit(); | 1305 scheduler->NotifyReadyToCommit(); |
| 1272 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1306 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1273 EXPECT_FALSE(client.needs_begin_frame()); | 1307 EXPECT_FALSE(client.generate_frames()); |
| 1274 client.Reset(); | 1308 client.Reset(); |
| 1275 | 1309 |
| 1276 // BeginImplFrame should prepare the draw. | 1310 // BeginImplFrame should prepare the draw. |
| 1277 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1311 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1278 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1312 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1279 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); | 1313 EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
| 1280 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1314 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1281 EXPECT_FALSE(client.needs_begin_frame()); | 1315 EXPECT_FALSE(client.generate_frames()); |
| 1282 client.Reset(); | 1316 client.Reset(); |
| 1283 | 1317 |
| 1284 // BeginImplFrame deadline should draw. | 1318 // BeginImplFrame deadline should draw. |
| 1285 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1319 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1286 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); | 1320 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
| 1287 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1321 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1288 EXPECT_FALSE(client.needs_begin_frame()); | 1322 EXPECT_FALSE(client.generate_frames()); |
| 1289 client.Reset(); | 1323 client.Reset(); |
| 1290 | 1324 |
| 1291 // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) | 1325 // The following BeginImplFrame deadline should SetGenerateFrames(false) |
| 1292 // to avoid excessive toggles. | 1326 // to avoid excessive toggles. |
| 1293 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1327 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1294 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); | 1328 EXPECT_SINGLE_ACTION("WillBeginImplFrame", client); |
| 1295 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1329 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1296 client.Reset(); | 1330 client.Reset(); |
| 1297 | 1331 |
| 1298 // Make sure SetNeedsBeginFrame isn't called on the client | 1332 // Make sure SetGenerateFrames isn't called on the client |
| 1299 // when the BeginFrame is no longer needed. | 1333 // when the BeginFrame is no longer needed. |
| 1300 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1334 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1301 EXPECT_EQ(0, client.num_actions_()); | 1335 EXPECT_EQ(0, client.num_actions_()); |
| 1302 EXPECT_FALSE(client.needs_begin_frame()); | 1336 EXPECT_FALSE(client.generate_frames()); |
| 1303 client.Reset(); | 1337 client.Reset(); |
| 1304 } | 1338 } |
| 1305 | 1339 |
| 1306 TEST(SchedulerTest, SyntheticBeginFrames) { | 1340 TEST(SchedulerTest, SyntheticBeginFrames) { |
| 1307 bool begin_frame_scheduling_enabled = false; | 1341 bool begin_frame_scheduling_enabled = false; |
| 1308 bool throttle_frame_production = true; | 1342 bool throttle_frame_production = true; |
| 1309 BeginFramesNotFromClient(begin_frame_scheduling_enabled, | 1343 BeginFramesNotFromClient(begin_frame_scheduling_enabled, |
| 1310 throttle_frame_production); | 1344 throttle_frame_production); |
| 1311 } | 1345 } |
| 1312 | 1346 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1337 scheduler->SetCanDraw(true); | 1371 scheduler->SetCanDraw(true); |
| 1338 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); | 1372 InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
| 1339 | 1373 |
| 1340 // To test swap ack throttling, this test disables automatic swap acks. | 1374 // To test swap ack throttling, this test disables automatic swap acks. |
| 1341 scheduler->SetMaxSwapsPending(1); | 1375 scheduler->SetMaxSwapsPending(1); |
| 1342 client.SetAutomaticSwapAck(false); | 1376 client.SetAutomaticSwapAck(false); |
| 1343 | 1377 |
| 1344 // SetNeedsCommit should begin the frame on the next BeginImplFrame. | 1378 // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
| 1345 client.Reset(); | 1379 client.Reset(); |
| 1346 scheduler->SetNeedsCommit(); | 1380 scheduler->SetNeedsCommit(); |
| 1347 EXPECT_FALSE(client.needs_begin_frame()); | 1381 EXPECT_FALSE(client.generate_frames()); |
| 1348 EXPECT_EQ(0, client.num_actions_()); | 1382 EXPECT_EQ(0, client.num_actions_()); |
| 1349 client.Reset(); | 1383 client.Reset(); |
| 1350 | 1384 |
| 1351 // Trigger the first BeginImplFrame and BeginMainFrame | 1385 // Trigger the first BeginImplFrame and BeginMainFrame |
| 1352 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1386 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1353 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); | 1387 EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
| 1354 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); | 1388 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
| 1355 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1389 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1356 EXPECT_FALSE(client.needs_begin_frame()); | 1390 EXPECT_FALSE(client.generate_frames()); |
| 1357 client.Reset(); | 1391 client.Reset(); |
| 1358 | 1392 |
| 1359 // NotifyReadyToCommit should trigger the pending commit and draw. | 1393 // NotifyReadyToCommit should trigger the pending commit and draw. |
| 1360 scheduler->NotifyBeginMainFrameStarted(); | 1394 scheduler->NotifyBeginMainFrameStarted(); |
| 1361 scheduler->NotifyReadyToCommit(); | 1395 scheduler->NotifyReadyToCommit(); |
| 1362 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); | 1396 EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
| 1363 EXPECT_FALSE(client.needs_begin_frame()); | 1397 EXPECT_FALSE(client.generate_frames()); |
| 1364 client.Reset(); | 1398 client.Reset(); |
| 1365 | 1399 |
| 1366 // Swapping will put us into a swap throttled state. | 1400 // Swapping will put us into a swap throttled state. |
| 1367 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1401 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1368 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1402 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1369 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1403 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1370 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1404 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1371 EXPECT_FALSE(client.needs_begin_frame()); | 1405 EXPECT_FALSE(client.generate_frames()); |
| 1372 client.Reset(); | 1406 client.Reset(); |
| 1373 | 1407 |
| 1374 // While swap throttled, BeginFrames should trigger BeginImplFrames, | 1408 // While swap throttled, BeginFrames should trigger BeginImplFrames, |
| 1375 // but not a BeginMainFrame or draw. | 1409 // but not a BeginMainFrame or draw. |
| 1376 scheduler->SetNeedsCommit(); | 1410 scheduler->SetNeedsCommit(); |
| 1377 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. | 1411 client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
| 1378 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); | 1412 EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
| 1379 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1413 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1380 EXPECT_FALSE(client.needs_begin_frame()); | 1414 EXPECT_FALSE(client.generate_frames()); |
| 1381 client.Reset(); | 1415 client.Reset(); |
| 1382 | 1416 |
| 1383 // Take us out of a swap throttled state. | 1417 // Take us out of a swap throttled state. |
| 1384 scheduler->DidSwapBuffersComplete(); | 1418 scheduler->DidSwapBuffersComplete(); |
| 1385 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); | 1419 EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1); |
| 1386 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); | 1420 EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
| 1387 EXPECT_FALSE(client.needs_begin_frame()); | 1421 EXPECT_FALSE(client.generate_frames()); |
| 1388 client.Reset(); | 1422 client.Reset(); |
| 1389 | 1423 |
| 1390 // BeginImplFrame deadline should draw. | 1424 // BeginImplFrame deadline should draw. |
| 1391 scheduler->SetNeedsRedraw(); | 1425 scheduler->SetNeedsRedraw(); |
| 1392 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1426 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1393 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); | 1427 EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
| 1394 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); | 1428 EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
| 1395 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); | 1429 EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
| 1396 EXPECT_FALSE(client.needs_begin_frame()); | 1430 EXPECT_FALSE(client.generate_frames()); |
| 1397 client.Reset(); | 1431 client.Reset(); |
| 1398 } | 1432 } |
| 1399 | 1433 |
| 1400 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { | 1434 TEST(SchedulerTest, SyntheticBeginFrames_SwapThrottled) { |
| 1401 bool begin_frame_scheduling_enabled = false; | 1435 bool begin_frame_scheduling_enabled = false; |
| 1402 bool throttle_frame_production = true; | 1436 bool throttle_frame_production = true; |
| 1403 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1437 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1404 throttle_frame_production); | 1438 throttle_frame_production); |
| 1405 } | 1439 } |
| 1406 | 1440 |
| 1407 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { | 1441 TEST(SchedulerTest, VSyncThrottlingDisabled_SwapThrottled) { |
| 1408 bool begin_frame_scheduling_enabled = true; | 1442 bool begin_frame_scheduling_enabled = true; |
| 1409 bool throttle_frame_production = false; | 1443 bool throttle_frame_production = false; |
| 1410 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1444 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1411 throttle_frame_production); | 1445 throttle_frame_production); |
| 1412 } | 1446 } |
| 1413 | 1447 |
| 1414 TEST(SchedulerTest, | 1448 TEST(SchedulerTest, |
| 1415 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { | 1449 SyntheticBeginFrames_And_VSyncThrottlingDisabled_SwapThrottled) { |
| 1416 bool begin_frame_scheduling_enabled = false; | 1450 bool begin_frame_scheduling_enabled = false; |
| 1417 bool throttle_frame_production = false; | 1451 bool throttle_frame_production = false; |
| 1418 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, | 1452 BeginFramesNotFromClient_SwapThrottled(begin_frame_scheduling_enabled, |
| 1419 throttle_frame_production); | 1453 throttle_frame_production); |
| 1420 } | 1454 } |
| 1421 | 1455 |
| 1422 } // namespace | 1456 } // namespace |
| 1423 } // namespace cc | 1457 } // namespace cc |
| OLD | NEW |