| 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/debug/trace_event.h" |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "base/memory/scoped_vector.h" | 11 #include "base/memory/scoped_vector.h" |
| 11 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 12 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 13 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 14 #include "cc/test/begin_frame_args_test.h" | 15 #include "cc/test/begin_frame_args_test.h" |
| 15 #include "cc/test/ordered_simple_task_runner.h" | 16 #include "cc/test/ordered_simple_task_runner.h" |
| 16 #include "cc/test/scheduler_test_common.h" | 17 #include "cc/test/scheduler_test_common.h" |
| 17 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
| 18 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 | 104 |
| 104 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it | 105 // Most tests don't care about DidAnticipatedDrawTimeChange, so only record it |
| 105 // for tests that do. | 106 // for tests that do. |
| 106 void set_log_anticipated_draw_time_change(bool log) { | 107 void set_log_anticipated_draw_time_change(bool log) { |
| 107 log_anticipated_draw_time_change_ = log; | 108 log_anticipated_draw_time_change_ = log; |
| 108 } | 109 } |
| 109 bool needs_begin_frame() { return needs_begin_frame_; } | 110 bool needs_begin_frame() { return needs_begin_frame_; } |
| 110 int num_draws() const { return num_draws_; } | 111 int num_draws() const { return num_draws_; } |
| 111 int num_actions_() const { return static_cast<int>(actions_.size()); } | 112 int num_actions_() const { return static_cast<int>(actions_.size()); } |
| 112 const char* Action(int i) const { return actions_[i]; } | 113 const char* Action(int i) const { return actions_[i]; } |
| 113 base::Value& StateForAction(int i) const { return *states_[i]; } | 114 std::string StateForAction(int i) const { return states_[i]->ToString(); } |
| 114 base::TimeTicks posted_begin_impl_frame_deadline() const { | 115 base::TimeTicks posted_begin_impl_frame_deadline() const { |
| 115 return posted_begin_impl_frame_deadline_; | 116 return posted_begin_impl_frame_deadline_; |
| 116 } | 117 } |
| 117 | 118 |
| 118 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } | 119 OrderedSimpleTaskRunner& task_runner() { return *task_runner_; } |
| 119 | 120 |
| 120 int ActionIndex(const char* action) const { | 121 int ActionIndex(const char* action) const { |
| 121 for (size_t i = 0; i < actions_.size(); i++) | 122 for (size_t i = 0; i < actions_.size(); i++) |
| 122 if (!strcmp(actions_[i], action)) | 123 if (!strcmp(actions_[i], action)) |
| 123 return i; | 124 return i; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 140 } | 141 } |
| 141 void SetAutomaticSwapAck(bool automatic_swap_ack) { | 142 void SetAutomaticSwapAck(bool automatic_swap_ack) { |
| 142 automatic_swap_ack_ = automatic_swap_ack; | 143 automatic_swap_ack_ = automatic_swap_ack; |
| 143 } | 144 } |
| 144 void SetRedrawWillHappenIfUpdateVisibleTilesHappens(bool redraw) { | 145 void SetRedrawWillHappenIfUpdateVisibleTilesHappens(bool redraw) { |
| 145 redraw_will_happen_if_update_visible_tiles_happens_ = redraw; | 146 redraw_will_happen_if_update_visible_tiles_happens_ = redraw; |
| 146 } | 147 } |
| 147 // SchedulerClient implementation. | 148 // SchedulerClient implementation. |
| 148 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { | 149 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { |
| 149 actions_.push_back("SetNeedsBeginFrame"); | 150 actions_.push_back("SetNeedsBeginFrame"); |
| 150 states_.push_back(scheduler_->AsValue().release()); | 151 states_.push_back(scheduler_->AsValue()); |
| 151 needs_begin_frame_ = enable; | 152 needs_begin_frame_ = enable; |
| 152 } | 153 } |
| 153 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { | 154 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE { |
| 154 actions_.push_back("WillBeginImplFrame"); | 155 actions_.push_back("WillBeginImplFrame"); |
| 155 states_.push_back(scheduler_->AsValue().release()); | 156 states_.push_back(scheduler_->AsValue()); |
| 156 } | 157 } |
| 157 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { | 158 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE { |
| 158 actions_.push_back("ScheduledActionSendBeginMainFrame"); | 159 actions_.push_back("ScheduledActionSendBeginMainFrame"); |
| 159 states_.push_back(scheduler_->AsValue().release()); | 160 states_.push_back(scheduler_->AsValue()); |
| 160 } | 161 } |
| 161 virtual void ScheduledActionAnimate() OVERRIDE { | 162 virtual void ScheduledActionAnimate() OVERRIDE { |
| 162 actions_.push_back("ScheduledActionAnimate"); | 163 actions_.push_back("ScheduledActionAnimate"); |
| 163 states_.push_back(scheduler_->AsValue().release()); | 164 states_.push_back(scheduler_->AsValue()); |
| 164 } | 165 } |
| 165 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { | 166 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE { |
| 166 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); | 167 actions_.push_back("ScheduledActionDrawAndSwapIfPossible"); |
| 167 states_.push_back(scheduler_->AsValue().release()); | 168 states_.push_back(scheduler_->AsValue()); |
| 168 num_draws_++; | 169 num_draws_++; |
| 169 DrawResult result = | 170 DrawResult result = |
| 170 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; | 171 draw_will_happen_ ? DRAW_SUCCESS : DRAW_ABORTED_CHECKERBOARD_ANIMATIONS; |
| 171 bool swap_will_happen = | 172 bool swap_will_happen = |
| 172 draw_will_happen_ && swap_will_happen_if_draw_happens_; | 173 draw_will_happen_ && swap_will_happen_if_draw_happens_; |
| 173 if (swap_will_happen) { | 174 if (swap_will_happen) { |
| 174 scheduler_->DidSwapBuffers(); | 175 scheduler_->DidSwapBuffers(); |
| 175 if (swap_contains_incomplete_tile_) { | 176 if (swap_contains_incomplete_tile_) { |
| 176 scheduler_->SetSwapUsedIncompleteTile(true); | 177 scheduler_->SetSwapUsedIncompleteTile(true); |
| 177 swap_contains_incomplete_tile_ = false; | 178 swap_contains_incomplete_tile_ = false; |
| 178 } else { | 179 } else { |
| 179 scheduler_->SetSwapUsedIncompleteTile(false); | 180 scheduler_->SetSwapUsedIncompleteTile(false); |
| 180 } | 181 } |
| 181 | 182 |
| 182 if (automatic_swap_ack_) | 183 if (automatic_swap_ack_) |
| 183 scheduler_->DidSwapBuffersComplete(); | 184 scheduler_->DidSwapBuffersComplete(); |
| 184 } | 185 } |
| 185 return result; | 186 return result; |
| 186 } | 187 } |
| 187 virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { | 188 virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE { |
| 188 actions_.push_back("ScheduledActionDrawAndSwapForced"); | 189 actions_.push_back("ScheduledActionDrawAndSwapForced"); |
| 189 states_.push_back(scheduler_->AsValue().release()); | 190 states_.push_back(scheduler_->AsValue()); |
| 190 return DRAW_SUCCESS; | 191 return DRAW_SUCCESS; |
| 191 } | 192 } |
| 192 virtual void ScheduledActionCommit() OVERRIDE { | 193 virtual void ScheduledActionCommit() OVERRIDE { |
| 193 actions_.push_back("ScheduledActionCommit"); | 194 actions_.push_back("ScheduledActionCommit"); |
| 194 states_.push_back(scheduler_->AsValue().release()); | 195 states_.push_back(scheduler_->AsValue()); |
| 195 } | 196 } |
| 196 virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE { | 197 virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE { |
| 197 actions_.push_back("ScheduledActionUpdateVisibleTiles"); | 198 actions_.push_back("ScheduledActionUpdateVisibleTiles"); |
| 198 states_.push_back(scheduler_->AsValue().release()); | 199 states_.push_back(scheduler_->AsValue()); |
| 199 if (redraw_will_happen_if_update_visible_tiles_happens_) | 200 if (redraw_will_happen_if_update_visible_tiles_happens_) |
| 200 scheduler_->SetNeedsRedraw(); | 201 scheduler_->SetNeedsRedraw(); |
| 201 } | 202 } |
| 202 virtual void ScheduledActionActivateSyncTree() OVERRIDE { | 203 virtual void ScheduledActionActivateSyncTree() OVERRIDE { |
| 203 actions_.push_back("ScheduledActionActivateSyncTree"); | 204 actions_.push_back("ScheduledActionActivateSyncTree"); |
| 204 states_.push_back(scheduler_->AsValue().release()); | 205 states_.push_back(scheduler_->AsValue()); |
| 205 } | 206 } |
| 206 virtual void ScheduledActionBeginOutputSurfaceCreation() OVERRIDE { | 207 virtual void ScheduledActionBeginOutputSurfaceCreation() OVERRIDE { |
| 207 actions_.push_back("ScheduledActionBeginOutputSurfaceCreation"); | 208 actions_.push_back("ScheduledActionBeginOutputSurfaceCreation"); |
| 208 states_.push_back(scheduler_->AsValue().release()); | 209 states_.push_back(scheduler_->AsValue()); |
| 209 } | 210 } |
| 210 virtual void ScheduledActionManageTiles() OVERRIDE { | 211 virtual void ScheduledActionManageTiles() OVERRIDE { |
| 211 actions_.push_back("ScheduledActionManageTiles"); | 212 actions_.push_back("ScheduledActionManageTiles"); |
| 212 states_.push_back(scheduler_->AsValue().release()); | 213 states_.push_back(scheduler_->AsValue()); |
| 213 } | 214 } |
| 214 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { | 215 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks) OVERRIDE { |
| 215 if (log_anticipated_draw_time_change_) | 216 if (log_anticipated_draw_time_change_) |
| 216 actions_.push_back("DidAnticipatedDrawTimeChange"); | 217 actions_.push_back("DidAnticipatedDrawTimeChange"); |
| 217 } | 218 } |
| 218 virtual base::TimeDelta DrawDurationEstimate() OVERRIDE { | 219 virtual base::TimeDelta DrawDurationEstimate() OVERRIDE { |
| 219 return base::TimeDelta(); | 220 return base::TimeDelta(); |
| 220 } | 221 } |
| 221 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE { | 222 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE { |
| 222 return base::TimeDelta(); | 223 return base::TimeDelta(); |
| 223 } | 224 } |
| 224 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { | 225 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE { |
| 225 return base::TimeDelta(); | 226 return base::TimeDelta(); |
| 226 } | 227 } |
| 227 | 228 |
| 228 virtual void DidBeginImplFrameDeadline() OVERRIDE {} | 229 virtual void DidBeginImplFrameDeadline() OVERRIDE {} |
| 229 | 230 |
| 230 protected: | 231 protected: |
| 231 bool needs_begin_frame_; | 232 bool needs_begin_frame_; |
| 232 bool draw_will_happen_; | 233 bool draw_will_happen_; |
| 233 bool swap_will_happen_if_draw_happens_; | 234 bool swap_will_happen_if_draw_happens_; |
| 234 bool automatic_swap_ack_; | 235 bool automatic_swap_ack_; |
| 235 int num_draws_; | 236 int num_draws_; |
| 236 bool log_anticipated_draw_time_change_; | 237 bool log_anticipated_draw_time_change_; |
| 237 bool swap_contains_incomplete_tile_; | 238 bool swap_contains_incomplete_tile_; |
| 238 bool redraw_will_happen_if_update_visible_tiles_happens_; | 239 bool redraw_will_happen_if_update_visible_tiles_happens_; |
| 239 base::TimeTicks posted_begin_impl_frame_deadline_; | 240 base::TimeTicks posted_begin_impl_frame_deadline_; |
| 240 std::vector<const char*> actions_; | 241 std::vector<const char*> actions_; |
| 241 ScopedVector<base::Value> states_; | 242 std::vector<scoped_refptr<base::debug::ConvertableToTraceFormat> > states_; |
| 242 scoped_ptr<TestScheduler> scheduler_; | 243 scoped_ptr<TestScheduler> scheduler_; |
| 243 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; | 244 scoped_refptr<OrderedSimpleTaskRunner> task_runner_; |
| 244 }; | 245 }; |
| 245 | 246 |
| 246 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, | 247 void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
| 247 FakeSchedulerClient* client) { | 248 FakeSchedulerClient* client) { |
| 248 bool client_initiates_begin_frame = | 249 bool client_initiates_begin_frame = |
| 249 scheduler->settings().begin_frame_scheduling_enabled && | 250 scheduler->settings().begin_frame_scheduling_enabled && |
| 250 scheduler->settings().throttle_frame_production; | 251 scheduler->settings().throttle_frame_production; |
| 251 | 252 |
| (...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1160 scheduler->DidSwapBuffers(); | 1161 scheduler->DidSwapBuffers(); |
| 1161 | 1162 |
| 1162 // Spin the event loop a few times and make sure we get more | 1163 // Spin the event loop a few times and make sure we get more |
| 1163 // DidAnticipateDrawTimeChange calls every time. | 1164 // DidAnticipateDrawTimeChange calls every time. |
| 1164 int actions_so_far = client.num_actions_(); | 1165 int actions_so_far = client.num_actions_(); |
| 1165 | 1166 |
| 1166 // Does three iterations to make sure that the timer is properly repeating. | 1167 // Does three iterations to make sure that the timer is properly repeating. |
| 1167 for (int i = 0; i < 3; ++i) { | 1168 for (int i = 0; i < 3; ++i) { |
| 1168 EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), | 1169 EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), |
| 1169 client.task_runner().NextPendingTaskDelay().InMicroseconds()) | 1170 client.task_runner().NextPendingTaskDelay().InMicroseconds()) |
| 1170 << *scheduler->AsValue(); | 1171 << scheduler->AsValue()->ToString(); |
| 1171 client.task_runner().RunPendingTasks(); | 1172 client.task_runner().RunPendingTasks(); |
| 1172 EXPECT_GT(client.num_actions_(), actions_so_far); | 1173 EXPECT_GT(client.num_actions_(), actions_so_far); |
| 1173 EXPECT_STREQ(client.Action(client.num_actions_() - 1), | 1174 EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
| 1174 "DidAnticipatedDrawTimeChange"); | 1175 "DidAnticipatedDrawTimeChange"); |
| 1175 actions_so_far = client.num_actions_(); | 1176 actions_so_far = client.num_actions_(); |
| 1176 } | 1177 } |
| 1177 | 1178 |
| 1178 // Do the same thing after BeginMainFrame starts but still before activation. | 1179 // Do the same thing after BeginMainFrame starts but still before activation. |
| 1179 scheduler->NotifyBeginMainFrameStarted(); | 1180 scheduler->NotifyBeginMainFrameStarted(); |
| 1180 for (int i = 0; i < 3; ++i) { | 1181 for (int i = 0; i < 3; ++i) { |
| 1181 EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), | 1182 EXPECT_EQ((frame_args.interval * 2).InMicroseconds(), |
| 1182 client.task_runner().NextPendingTaskDelay().InMicroseconds()) | 1183 client.task_runner().NextPendingTaskDelay().InMicroseconds()) |
| 1183 << *scheduler->AsValue(); | 1184 << scheduler->AsValue()->ToString(); |
| 1184 client.task_runner().RunPendingTasks(); | 1185 client.task_runner().RunPendingTasks(); |
| 1185 EXPECT_GT(client.num_actions_(), actions_so_far); | 1186 EXPECT_GT(client.num_actions_(), actions_so_far); |
| 1186 EXPECT_STREQ(client.Action(client.num_actions_() - 1), | 1187 EXPECT_STREQ(client.Action(client.num_actions_() - 1), |
| 1187 "DidAnticipatedDrawTimeChange"); | 1188 "DidAnticipatedDrawTimeChange"); |
| 1188 actions_so_far = client.num_actions_(); | 1189 actions_so_far = client.num_actions_(); |
| 1189 } | 1190 } |
| 1190 } | 1191 } |
| 1191 | 1192 |
| 1192 TEST(SchedulerTest, BeginRetroFrame) { | 1193 TEST(SchedulerTest, BeginRetroFrame) { |
| 1193 FakeSchedulerClient client; | 1194 FakeSchedulerClient client; |
| (...skipping 717 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1911 EXPECT_FALSE(scheduler->IsSyntheticBeginFrameSourceActive()); | 1912 EXPECT_FALSE(scheduler->IsSyntheticBeginFrameSourceActive()); |
| 1912 | 1913 |
| 1913 client.Reset(); | 1914 client.Reset(); |
| 1914 client.task_runner().RunPendingTasks(); // Run posted deadline. | 1915 client.task_runner().RunPendingTasks(); // Run posted deadline. |
| 1915 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); | 1916 EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
| 1916 EXPECT_FALSE(scheduler->IsSyntheticBeginFrameSourceActive()); | 1917 EXPECT_FALSE(scheduler->IsSyntheticBeginFrameSourceActive()); |
| 1917 } | 1918 } |
| 1918 | 1919 |
| 1919 } // namespace | 1920 } // namespace |
| 1920 } // namespace cc | 1921 } // namespace cc |
| OLD | NEW |