| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/surfaces/display_scheduler.h" | 5 #include "cc/surfaces/display_scheduler.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/test/null_task_runner.h" | 8 #include "base/test/null_task_runner.h" |
| 9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 void Reset() { draw_and_swap_count_ = 0; } | 32 void Reset() { draw_and_swap_count_ = 0; } |
| 33 | 33 |
| 34 int draw_and_swap_count() const { return draw_and_swap_count_; } | 34 int draw_and_swap_count() const { return draw_and_swap_count_; } |
| 35 | 35 |
| 36 protected: | 36 protected: |
| 37 int draw_and_swap_count_; | 37 int draw_and_swap_count_; |
| 38 }; | 38 }; |
| 39 | 39 |
| 40 class TestDisplayScheduler : public DisplayScheduler { | 40 class TestDisplayScheduler : public DisplayScheduler { |
| 41 public: | 41 public: |
| 42 TestDisplayScheduler(DisplaySchedulerClient* client, | 42 TestDisplayScheduler(BeginFrameSource* begin_frame_source, |
| 43 BeginFrameSource* begin_frame_source, | |
| 44 base::SingleThreadTaskRunner* task_runner, | 43 base::SingleThreadTaskRunner* task_runner, |
| 45 int max_pending_swaps) | 44 int max_pending_swaps) |
| 46 : DisplayScheduler(client, | 45 : DisplayScheduler(begin_frame_source, task_runner, max_pending_swaps), |
| 47 begin_frame_source, | |
| 48 task_runner, | |
| 49 max_pending_swaps), | |
| 50 scheduler_begin_frame_deadline_count_(0) {} | 46 scheduler_begin_frame_deadline_count_(0) {} |
| 51 | 47 |
| 52 base::TimeTicks DesiredBeginFrameDeadlineTimeForTest() { | 48 base::TimeTicks DesiredBeginFrameDeadlineTimeForTest() { |
| 53 return DesiredBeginFrameDeadlineTime(); | 49 return DesiredBeginFrameDeadlineTime(); |
| 54 } | 50 } |
| 55 | 51 |
| 56 void BeginFrameDeadlineForTest() { OnBeginFrameDeadline(); } | 52 void BeginFrameDeadlineForTest() { OnBeginFrameDeadline(); } |
| 57 | 53 |
| 58 void ScheduleBeginFrameDeadline() override { | 54 void ScheduleBeginFrameDeadline() override { |
| 59 scheduler_begin_frame_deadline_count_++; | 55 scheduler_begin_frame_deadline_count_++; |
| 60 DisplayScheduler::ScheduleBeginFrameDeadline(); | 56 DisplayScheduler::ScheduleBeginFrameDeadline(); |
| 61 } | 57 } |
| 62 | 58 |
| 63 int scheduler_begin_frame_deadline_count() { | 59 int scheduler_begin_frame_deadline_count() { |
| 64 return scheduler_begin_frame_deadline_count_; | 60 return scheduler_begin_frame_deadline_count_; |
| 65 } | 61 } |
| 66 | 62 |
| 67 protected: | 63 protected: |
| 68 int scheduler_begin_frame_deadline_count_; | 64 int scheduler_begin_frame_deadline_count_; |
| 69 }; | 65 }; |
| 70 | 66 |
| 71 class DisplaySchedulerTest : public testing::Test { | 67 class DisplaySchedulerTest : public testing::Test { |
| 72 public: | 68 public: |
| 73 DisplaySchedulerTest() | 69 DisplaySchedulerTest() |
| 74 : now_src_(new base::SimpleTestTickClock()), | 70 : task_runner_(new base::NullTaskRunner), |
| 75 task_runner_(new base::NullTaskRunner), | 71 scheduler_(&fake_begin_frame_source_, |
| 76 client_(new FakeDisplaySchedulerClient), | 72 task_runner_.get(), |
| 77 scheduler_(new TestDisplayScheduler(client_.get(), | 73 kMaxPendingSwaps) { |
| 78 &fake_begin_frame_source_, | 74 now_src_.Advance(base::TimeDelta::FromMicroseconds(10000)); |
| 79 task_runner_.get(), | 75 scheduler_.SetClient(&client_); |
| 80 kMaxPendingSwaps)) { | |
| 81 now_src_->Advance(base::TimeDelta::FromMicroseconds(10000)); | |
| 82 } | 76 } |
| 83 | 77 |
| 84 ~DisplaySchedulerTest() override {} | 78 ~DisplaySchedulerTest() override {} |
| 85 | 79 |
| 86 void SetUp() override { scheduler_->SetRootSurfaceResourcesLocked(false); } | 80 void SetUp() override { scheduler_.SetRootSurfaceResourcesLocked(false); } |
| 87 | 81 |
| 88 void BeginFrameForTest() { | 82 void BeginFrameForTest() { |
| 89 base::TimeTicks frame_time = now_src_->NowTicks(); | 83 base::TimeTicks frame_time = now_src_.NowTicks(); |
| 90 base::TimeDelta interval = BeginFrameArgs::DefaultInterval(); | 84 base::TimeDelta interval = BeginFrameArgs::DefaultInterval(); |
| 91 base::TimeTicks deadline = frame_time + interval; | 85 base::TimeTicks deadline = frame_time + interval; |
| 92 fake_begin_frame_source_.TestOnBeginFrame( | 86 fake_begin_frame_source_.TestOnBeginFrame( |
| 93 BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, | 87 BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
| 94 interval, BeginFrameArgs::NORMAL)); | 88 interval, BeginFrameArgs::NORMAL)); |
| 95 } | 89 } |
| 96 | 90 |
| 97 protected: | 91 protected: |
| 98 base::SimpleTestTickClock& now_src() { return *now_src_; } | 92 base::SimpleTestTickClock& now_src() { return now_src_; } |
| 99 FakeDisplaySchedulerClient& client() { return *client_; } | 93 FakeDisplaySchedulerClient& client() { return client_; } |
| 100 DisplayScheduler& scheduler() { return *scheduler_; } | 94 DisplayScheduler& scheduler() { return scheduler_; } |
| 101 | 95 |
| 102 FakeBeginFrameSource fake_begin_frame_source_; | 96 FakeBeginFrameSource fake_begin_frame_source_; |
| 103 | 97 |
| 104 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 98 base::SimpleTestTickClock now_src_; |
| 105 scoped_refptr<base::NullTaskRunner> task_runner_; | 99 scoped_refptr<base::NullTaskRunner> task_runner_; |
| 106 std::unique_ptr<FakeDisplaySchedulerClient> client_; | 100 FakeDisplaySchedulerClient client_; |
| 107 std::unique_ptr<TestDisplayScheduler> scheduler_; | 101 TestDisplayScheduler scheduler_; |
| 108 }; | 102 }; |
| 109 | 103 |
| 110 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { | 104 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { |
| 111 SurfaceId root_surface_id1(0, 1, 0); | 105 SurfaceId root_surface_id1(0, 1, 0); |
| 112 SurfaceId root_surface_id2(0, 2, 0); | 106 SurfaceId root_surface_id2(0, 2, 0); |
| 113 SurfaceId sid1(0, 3, 0); | 107 SurfaceId sid1(0, 3, 0); |
| 114 base::TimeTicks late_deadline; | 108 base::TimeTicks late_deadline; |
| 115 | 109 |
| 116 // Go trough an initial BeginFrame cycle with the root surface. | 110 // Go trough an initial BeginFrame cycle with the root surface. |
| 117 BeginFrameForTest(); | 111 BeginFrameForTest(); |
| 118 scheduler_->SetNewRootSurface(root_surface_id1); | 112 scheduler_.SetNewRootSurface(root_surface_id1); |
| 119 scheduler_->BeginFrameDeadlineForTest(); | 113 scheduler_.BeginFrameDeadlineForTest(); |
| 120 | 114 |
| 121 // Resize on the next begin frame cycle should cause the deadline to wait | 115 // Resize on the next begin frame cycle should cause the deadline to wait |
| 122 // for a new root surface. | 116 // for a new root surface. |
| 123 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 117 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 124 BeginFrameForTest(); | 118 BeginFrameForTest(); |
| 125 scheduler_->SurfaceDamaged(sid1); | 119 scheduler_.SurfaceDamaged(sid1); |
| 126 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 120 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 127 scheduler_->DisplayResized(); | 121 scheduler_.DisplayResized(); |
| 128 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 122 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 129 scheduler_->SetNewRootSurface(root_surface_id2); | 123 scheduler_.SetNewRootSurface(root_surface_id2); |
| 130 EXPECT_GE(now_src().NowTicks(), | 124 EXPECT_GE(now_src().NowTicks(), |
| 131 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 125 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 132 scheduler_->BeginFrameDeadlineForTest(); | 126 scheduler_.BeginFrameDeadlineForTest(); |
| 133 | 127 |
| 134 // Verify deadline goes back to normal after resize. | 128 // Verify deadline goes back to normal after resize. |
| 135 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 129 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 136 BeginFrameForTest(); | 130 BeginFrameForTest(); |
| 137 scheduler_->SurfaceDamaged(sid1); | 131 scheduler_.SurfaceDamaged(sid1); |
| 138 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 132 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 139 scheduler_->SurfaceDamaged(root_surface_id2); | 133 scheduler_.SurfaceDamaged(root_surface_id2); |
| 140 EXPECT_GE(now_src().NowTicks(), | 134 EXPECT_GE(now_src().NowTicks(), |
| 141 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 135 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 142 scheduler_->BeginFrameDeadlineForTest(); | 136 scheduler_.BeginFrameDeadlineForTest(); |
| 143 } | 137 } |
| 144 | 138 |
| 145 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { | 139 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { |
| 146 SurfaceId root_surface_id(0, 1, 0); | 140 SurfaceId root_surface_id(0, 1, 0); |
| 147 SurfaceId sid1(0, 2, 0); | 141 SurfaceId sid1(0, 2, 0); |
| 148 base::TimeTicks late_deadline; | 142 base::TimeTicks late_deadline; |
| 149 | 143 |
| 150 // Go trough an initial BeginFrame cycle with the root surface. | 144 // Go trough an initial BeginFrame cycle with the root surface. |
| 151 BeginFrameForTest(); | 145 BeginFrameForTest(); |
| 152 scheduler_->SetNewRootSurface(root_surface_id); | 146 scheduler_.SetNewRootSurface(root_surface_id); |
| 153 scheduler_->BeginFrameDeadlineForTest(); | 147 scheduler_.BeginFrameDeadlineForTest(); |
| 154 | 148 |
| 155 // Resize on the next begin frame cycle should cause the deadline to wait | 149 // Resize on the next begin frame cycle should cause the deadline to wait |
| 156 // for a new root surface. | 150 // for a new root surface. |
| 157 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 151 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 158 BeginFrameForTest(); | 152 BeginFrameForTest(); |
| 159 scheduler_->SurfaceDamaged(sid1); | 153 scheduler_.SurfaceDamaged(sid1); |
| 160 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 154 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 161 scheduler_->DisplayResized(); | 155 scheduler_.DisplayResized(); |
| 162 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 156 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 163 scheduler_->SurfaceDamaged(root_surface_id); | 157 scheduler_.SurfaceDamaged(root_surface_id); |
| 164 EXPECT_GE(now_src().NowTicks(), | 158 EXPECT_GE(now_src().NowTicks(), |
| 165 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 159 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 166 scheduler_->BeginFrameDeadlineForTest(); | 160 scheduler_.BeginFrameDeadlineForTest(); |
| 167 | 161 |
| 168 // Verify deadline goes back to normal after resize. | 162 // Verify deadline goes back to normal after resize. |
| 169 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 163 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 170 BeginFrameForTest(); | 164 BeginFrameForTest(); |
| 171 scheduler_->SurfaceDamaged(sid1); | 165 scheduler_.SurfaceDamaged(sid1); |
| 172 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 166 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 173 scheduler_->SurfaceDamaged(root_surface_id); | 167 scheduler_.SurfaceDamaged(root_surface_id); |
| 174 EXPECT_GE(now_src().NowTicks(), | 168 EXPECT_GE(now_src().NowTicks(), |
| 175 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 169 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 176 scheduler_->BeginFrameDeadlineForTest(); | 170 scheduler_.BeginFrameDeadlineForTest(); |
| 177 } | 171 } |
| 178 | 172 |
| 179 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 173 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
| 180 SurfaceId root_surface_id(0, 0, 0); | 174 SurfaceId root_surface_id(0, 0, 0); |
| 181 SurfaceId sid1(0, 1, 0); | 175 SurfaceId sid1(0, 1, 0); |
| 182 SurfaceId sid2(0, 2, 0); | 176 SurfaceId sid2(0, 2, 0); |
| 183 | 177 |
| 184 // Set the root surface | 178 // Set the root surface |
| 185 scheduler_->SetNewRootSurface(root_surface_id); | 179 scheduler_.SetNewRootSurface(root_surface_id); |
| 186 | 180 |
| 187 // Get scheduler to detect surface 1 as active by drawing | 181 // Get scheduler to detect surface 1 as active by drawing |
| 188 // two frames in a row with damage from surface 1. | 182 // two frames in a row with damage from surface 1. |
| 189 BeginFrameForTest(); | 183 BeginFrameForTest(); |
| 190 scheduler_->SurfaceDamaged(sid1); | 184 scheduler_.SurfaceDamaged(sid1); |
| 191 scheduler_->BeginFrameDeadlineForTest(); | 185 scheduler_.BeginFrameDeadlineForTest(); |
| 192 BeginFrameForTest(); | 186 BeginFrameForTest(); |
| 193 scheduler_->SurfaceDamaged(sid1); | 187 scheduler_.SurfaceDamaged(sid1); |
| 194 scheduler_->BeginFrameDeadlineForTest(); | 188 scheduler_.BeginFrameDeadlineForTest(); |
| 195 | 189 |
| 196 // Damage only from surface 2 (inactive) does not trigger deadline early. | 190 // Damage only from surface 2 (inactive) does not trigger deadline early. |
| 197 BeginFrameForTest(); | 191 BeginFrameForTest(); |
| 198 scheduler_->SurfaceDamaged(sid2); | 192 scheduler_.SurfaceDamaged(sid2); |
| 199 EXPECT_LT(now_src().NowTicks(), | 193 EXPECT_LT(now_src().NowTicks(), |
| 200 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 194 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 201 | 195 |
| 202 // Damage from surface 1 triggers deadline early. | 196 // Damage from surface 1 triggers deadline early. |
| 203 scheduler_->SurfaceDamaged(sid1); | 197 scheduler_.SurfaceDamaged(sid1); |
| 204 EXPECT_GE(now_src().NowTicks(), | 198 EXPECT_GE(now_src().NowTicks(), |
| 205 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 199 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 206 scheduler_->BeginFrameDeadlineForTest(); | 200 scheduler_.BeginFrameDeadlineForTest(); |
| 207 | 201 |
| 208 // Make both surface 1 and 2 active. | 202 // Make both surface 1 and 2 active. |
| 209 BeginFrameForTest(); | 203 BeginFrameForTest(); |
| 210 scheduler_->SurfaceDamaged(sid2); | 204 scheduler_.SurfaceDamaged(sid2); |
| 211 scheduler_->SurfaceDamaged(sid1); | 205 scheduler_.SurfaceDamaged(sid1); |
| 212 scheduler_->BeginFrameDeadlineForTest(); | 206 scheduler_.BeginFrameDeadlineForTest(); |
| 213 | 207 |
| 214 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. | 208 // Deadline doesn't trigger early until surface 1 and 2 are both damaged. |
| 215 BeginFrameForTest(); | 209 BeginFrameForTest(); |
| 216 EXPECT_LT(now_src().NowTicks(), | 210 EXPECT_LT(now_src().NowTicks(), |
| 217 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 211 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 218 scheduler_->SurfaceDamaged(sid1); | 212 scheduler_.SurfaceDamaged(sid1); |
| 219 EXPECT_LT(now_src().NowTicks(), | 213 EXPECT_LT(now_src().NowTicks(), |
| 220 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 214 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 221 scheduler_->SurfaceDamaged(sid2); | 215 scheduler_.SurfaceDamaged(sid2); |
| 222 EXPECT_GE(now_src().NowTicks(), | 216 EXPECT_GE(now_src().NowTicks(), |
| 223 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 217 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 224 scheduler_->BeginFrameDeadlineForTest(); | 218 scheduler_.BeginFrameDeadlineForTest(); |
| 225 | 219 |
| 226 // Make the system idle | 220 // Make the system idle |
| 227 BeginFrameForTest(); | 221 BeginFrameForTest(); |
| 228 scheduler_->BeginFrameDeadlineForTest(); | 222 scheduler_.BeginFrameDeadlineForTest(); |
| 229 BeginFrameForTest(); | 223 BeginFrameForTest(); |
| 230 scheduler_->BeginFrameDeadlineForTest(); | 224 scheduler_.BeginFrameDeadlineForTest(); |
| 231 | 225 |
| 232 // Deadline should trigger early if child surfaces are idle and | 226 // Deadline should trigger early if child surfaces are idle and |
| 233 // we get damage on the root surface. | 227 // we get damage on the root surface. |
| 234 BeginFrameForTest(); | 228 BeginFrameForTest(); |
| 235 EXPECT_LT(now_src().NowTicks(), | 229 EXPECT_LT(now_src().NowTicks(), |
| 236 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 230 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 237 scheduler_->SurfaceDamaged(root_surface_id); | 231 scheduler_.SurfaceDamaged(root_surface_id); |
| 238 EXPECT_GE(now_src().NowTicks(), | 232 EXPECT_GE(now_src().NowTicks(), |
| 239 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 233 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 240 scheduler_->BeginFrameDeadlineForTest(); | 234 scheduler_.BeginFrameDeadlineForTest(); |
| 241 } | 235 } |
| 242 | 236 |
| 243 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 237 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
| 244 SurfaceId root_surface_id(0, 0, 0); | 238 SurfaceId root_surface_id(0, 0, 0); |
| 245 SurfaceId sid1(0, 1, 0); | 239 SurfaceId sid1(0, 1, 0); |
| 246 | 240 |
| 247 // Set the root surface | 241 // Set the root surface |
| 248 scheduler_->SetNewRootSurface(root_surface_id); | 242 scheduler_.SetNewRootSurface(root_surface_id); |
| 249 | 243 |
| 250 // DrawAndSwap normally. | 244 // DrawAndSwap normally. |
| 251 BeginFrameForTest(); | 245 BeginFrameForTest(); |
| 252 EXPECT_LT(now_src().NowTicks(), | 246 EXPECT_LT(now_src().NowTicks(), |
| 253 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 247 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 254 EXPECT_EQ(0, client_->draw_and_swap_count()); | 248 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 255 scheduler_->SurfaceDamaged(sid1); | 249 scheduler_.SurfaceDamaged(sid1); |
| 256 scheduler_->BeginFrameDeadlineForTest(); | 250 scheduler_.BeginFrameDeadlineForTest(); |
| 257 EXPECT_EQ(1, client_->draw_and_swap_count()); | 251 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 258 | 252 |
| 259 // Deadline triggers immediately on OutputSurfaceLost. | 253 // Deadline triggers immediately on OutputSurfaceLost. |
| 260 BeginFrameForTest(); | 254 BeginFrameForTest(); |
| 261 EXPECT_LT(now_src().NowTicks(), | 255 EXPECT_LT(now_src().NowTicks(), |
| 262 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 256 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 263 scheduler_->OutputSurfaceLost(); | 257 scheduler_.OutputSurfaceLost(); |
| 264 EXPECT_GE(now_src().NowTicks(), | 258 EXPECT_GE(now_src().NowTicks(), |
| 265 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 259 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 266 | 260 |
| 267 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 261 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
| 268 EXPECT_EQ(1, client_->draw_and_swap_count()); | 262 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 269 scheduler_->SurfaceDamaged(sid1); | 263 scheduler_.SurfaceDamaged(sid1); |
| 270 scheduler_->BeginFrameDeadlineForTest(); | 264 scheduler_.BeginFrameDeadlineForTest(); |
| 271 EXPECT_EQ(1, client_->draw_and_swap_count()); | 265 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 272 } | 266 } |
| 273 | 267 |
| 274 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { | 268 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { |
| 275 SurfaceId root_surface_id(0, 0, 0); | 269 SurfaceId root_surface_id(0, 0, 0); |
| 276 SurfaceId sid1(0, 1, 0); | 270 SurfaceId sid1(0, 1, 0); |
| 277 | 271 |
| 278 // Set the root surface | 272 // Set the root surface |
| 279 scheduler_->SetNewRootSurface(root_surface_id); | 273 scheduler_.SetNewRootSurface(root_surface_id); |
| 280 | 274 |
| 281 // DrawAndSwap normally. | 275 // DrawAndSwap normally. |
| 282 BeginFrameForTest(); | 276 BeginFrameForTest(); |
| 283 EXPECT_LT(now_src().NowTicks(), | 277 EXPECT_LT(now_src().NowTicks(), |
| 284 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 278 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 285 EXPECT_EQ(0, client_->draw_and_swap_count()); | 279 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 286 scheduler_->SurfaceDamaged(sid1); | 280 scheduler_.SurfaceDamaged(sid1); |
| 287 scheduler_->BeginFrameDeadlineForTest(); | 281 scheduler_.BeginFrameDeadlineForTest(); |
| 288 EXPECT_EQ(1, client_->draw_and_swap_count()); | 282 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 289 | 283 |
| 290 scheduler_->DisplayResized(); | 284 scheduler_.DisplayResized(); |
| 291 BeginFrameForTest(); | 285 BeginFrameForTest(); |
| 292 // DisplayResized should trigger a swap to happen. | 286 // DisplayResized should trigger a swap to happen. |
| 293 scheduler_->BeginFrameDeadlineForTest(); | 287 scheduler_.BeginFrameDeadlineForTest(); |
| 294 EXPECT_EQ(2, client_->draw_and_swap_count()); | 288 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 295 } | 289 } |
| 296 | 290 |
| 297 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 291 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
| 298 SurfaceId root_surface_id(0, 0, 0); | 292 SurfaceId root_surface_id(0, 0, 0); |
| 299 SurfaceId sid1(0, 1, 0); | 293 SurfaceId sid1(0, 1, 0); |
| 300 base::TimeTicks late_deadline; | 294 base::TimeTicks late_deadline; |
| 301 | 295 |
| 302 // Set the root surface | 296 // Set the root surface |
| 303 scheduler_->SetNewRootSurface(root_surface_id); | 297 scheduler_.SetNewRootSurface(root_surface_id); |
| 304 | 298 |
| 305 // DrawAndSwap normally. | 299 // DrawAndSwap normally. |
| 306 BeginFrameForTest(); | 300 BeginFrameForTest(); |
| 307 EXPECT_LT(now_src().NowTicks(), | 301 EXPECT_LT(now_src().NowTicks(), |
| 308 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 302 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 309 EXPECT_EQ(0, client_->draw_and_swap_count()); | 303 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 310 scheduler_->SurfaceDamaged(sid1); | 304 scheduler_.SurfaceDamaged(sid1); |
| 311 scheduler_->BeginFrameDeadlineForTest(); | 305 scheduler_.BeginFrameDeadlineForTest(); |
| 312 EXPECT_EQ(1, client_->draw_and_swap_count()); | 306 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 313 | 307 |
| 314 // Deadline triggers late while root resources are locked. | 308 // Deadline triggers late while root resources are locked. |
| 315 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 309 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 316 BeginFrameForTest(); | 310 BeginFrameForTest(); |
| 317 scheduler_->SurfaceDamaged(sid1); | 311 scheduler_.SurfaceDamaged(sid1); |
| 318 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 312 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 319 scheduler_->SetRootSurfaceResourcesLocked(true); | 313 scheduler_.SetRootSurfaceResourcesLocked(true); |
| 320 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 314 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 321 | 315 |
| 322 // Deadline does not DrawAndSwap while root resources are locked. | 316 // Deadline does not DrawAndSwap while root resources are locked. |
| 323 EXPECT_EQ(1, client_->draw_and_swap_count()); | 317 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 324 scheduler_->SurfaceDamaged(sid1); | 318 scheduler_.SurfaceDamaged(sid1); |
| 325 scheduler_->BeginFrameDeadlineForTest(); | 319 scheduler_.BeginFrameDeadlineForTest(); |
| 326 EXPECT_EQ(1, client_->draw_and_swap_count()); | 320 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 327 | 321 |
| 328 // Deadline triggers normally when root resources are unlocked. | 322 // Deadline triggers normally when root resources are unlocked. |
| 329 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 323 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 330 BeginFrameForTest(); | 324 BeginFrameForTest(); |
| 331 scheduler_->SurfaceDamaged(sid1); | 325 scheduler_.SurfaceDamaged(sid1); |
| 332 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 326 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 333 scheduler_->SetRootSurfaceResourcesLocked(false); | 327 scheduler_.SetRootSurfaceResourcesLocked(false); |
| 334 scheduler_->SurfaceDamaged(root_surface_id); | 328 scheduler_.SurfaceDamaged(root_surface_id); |
| 335 EXPECT_EQ(base::TimeTicks(), | 329 EXPECT_EQ(base::TimeTicks(), |
| 336 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 330 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 337 | 331 |
| 338 EXPECT_EQ(1, client_->draw_and_swap_count()); | 332 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 339 scheduler_->BeginFrameDeadlineForTest(); | 333 scheduler_.BeginFrameDeadlineForTest(); |
| 340 EXPECT_EQ(2, client_->draw_and_swap_count()); | 334 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 341 } | 335 } |
| 342 | 336 |
| 343 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 337 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
| 344 SurfaceId root_surface_id(0, 0, 0); | 338 SurfaceId root_surface_id(0, 0, 0); |
| 345 SurfaceId sid1(0, 1, 0); | 339 SurfaceId sid1(0, 1, 0); |
| 346 SurfaceId sid2(0, 2, 0); | 340 SurfaceId sid2(0, 2, 0); |
| 347 | 341 |
| 348 // Set the root surface | 342 // Set the root surface |
| 349 scheduler_->SetNewRootSurface(root_surface_id); | 343 scheduler_.SetNewRootSurface(root_surface_id); |
| 350 | 344 |
| 351 // Get scheduler to detect surface 1 and 2 as active. | 345 // Get scheduler to detect surface 1 and 2 as active. |
| 352 BeginFrameForTest(); | 346 BeginFrameForTest(); |
| 353 scheduler_->SurfaceDamaged(sid1); | 347 scheduler_.SurfaceDamaged(sid1); |
| 354 scheduler_->SurfaceDamaged(sid2); | 348 scheduler_.SurfaceDamaged(sid2); |
| 355 scheduler_->BeginFrameDeadlineForTest(); | 349 scheduler_.BeginFrameDeadlineForTest(); |
| 356 BeginFrameForTest(); | 350 BeginFrameForTest(); |
| 357 scheduler_->SurfaceDamaged(sid1); | 351 scheduler_.SurfaceDamaged(sid1); |
| 358 scheduler_->SurfaceDamaged(sid2); | 352 scheduler_.SurfaceDamaged(sid2); |
| 359 scheduler_->BeginFrameDeadlineForTest(); | 353 scheduler_.BeginFrameDeadlineForTest(); |
| 360 | 354 |
| 361 // DrawAndSwap normally. | 355 // DrawAndSwap normally. |
| 362 BeginFrameForTest(); | 356 BeginFrameForTest(); |
| 363 EXPECT_LT(now_src().NowTicks(), | 357 EXPECT_LT(now_src().NowTicks(), |
| 364 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 358 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 365 EXPECT_EQ(2, client_->draw_and_swap_count()); | 359 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 366 scheduler_->SurfaceDamaged(sid1); | 360 scheduler_.SurfaceDamaged(sid1); |
| 367 scheduler_->SurfaceDamaged(sid2); | 361 scheduler_.SurfaceDamaged(sid2); |
| 368 scheduler_->BeginFrameDeadlineForTest(); | 362 scheduler_.BeginFrameDeadlineForTest(); |
| 369 EXPECT_EQ(3, client_->draw_and_swap_count()); | 363 EXPECT_EQ(3, client_.draw_and_swap_count()); |
| 370 scheduler_->DidSwapBuffers(); | 364 scheduler_.DidSwapBuffers(); |
| 371 | 365 |
| 372 // Deadline triggers late when swap throttled. | 366 // Deadline triggers late when swap throttled. |
| 373 base::TimeTicks late_deadline = | 367 base::TimeTicks late_deadline = |
| 374 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 368 now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| 375 BeginFrameForTest(); | 369 BeginFrameForTest(); |
| 376 // Damage surface 1, but not surface 2 so we avoid triggering deadline | 370 // Damage surface 1, but not surface 2 so we avoid triggering deadline |
| 377 // early because all surfaces are ready. | 371 // early because all surfaces are ready. |
| 378 scheduler_->SurfaceDamaged(sid1); | 372 scheduler_.SurfaceDamaged(sid1); |
| 379 EXPECT_EQ(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 373 EXPECT_EQ(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 380 | 374 |
| 381 // Don't draw and swap in deadline while swap throttled. | 375 // Don't draw and swap in deadline while swap throttled. |
| 382 EXPECT_EQ(3, client_->draw_and_swap_count()); | 376 EXPECT_EQ(3, client_.draw_and_swap_count()); |
| 383 scheduler_->BeginFrameDeadlineForTest(); | 377 scheduler_.BeginFrameDeadlineForTest(); |
| 384 EXPECT_EQ(3, client_->draw_and_swap_count()); | 378 EXPECT_EQ(3, client_.draw_and_swap_count()); |
| 385 | 379 |
| 386 // Deadline triggers normally once not swap throttled. | 380 // Deadline triggers normally once not swap throttled. |
| 387 // Damage from previous BeginFrame should cary over, so don't damage again. | 381 // Damage from previous BeginFrame should cary over, so don't damage again. |
| 388 base::TimeTicks expected_deadline = | 382 base::TimeTicks expected_deadline = |
| 389 scheduler_->LastUsedBeginFrameArgs().deadline - | 383 scheduler_.LastUsedBeginFrameArgs().deadline - |
| 390 BeginFrameArgs::DefaultEstimatedParentDrawTime(); | 384 BeginFrameArgs::DefaultEstimatedParentDrawTime(); |
| 391 scheduler_->DidSwapBuffersComplete(); | 385 scheduler_.DidSwapBuffersComplete(); |
| 392 BeginFrameForTest(); | 386 BeginFrameForTest(); |
| 393 EXPECT_EQ(expected_deadline, | 387 EXPECT_EQ(expected_deadline, |
| 394 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 388 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 395 // Still waiting for surface 2. Once it updates, deadline should trigger | 389 // Still waiting for surface 2. Once it updates, deadline should trigger |
| 396 // immediately again. | 390 // immediately again. |
| 397 scheduler_->SurfaceDamaged(sid2); | 391 scheduler_.SurfaceDamaged(sid2); |
| 398 EXPECT_EQ(scheduler_->DesiredBeginFrameDeadlineTimeForTest(), | 392 EXPECT_EQ(scheduler_.DesiredBeginFrameDeadlineTimeForTest(), |
| 399 base::TimeTicks()); | 393 base::TimeTicks()); |
| 400 // Draw and swap now that we aren't throttled. | 394 // Draw and swap now that we aren't throttled. |
| 401 EXPECT_EQ(3, client_->draw_and_swap_count()); | 395 EXPECT_EQ(3, client_.draw_and_swap_count()); |
| 402 scheduler_->BeginFrameDeadlineForTest(); | 396 scheduler_.BeginFrameDeadlineForTest(); |
| 403 EXPECT_EQ(4, client_->draw_and_swap_count()); | 397 EXPECT_EQ(4, client_.draw_and_swap_count()); |
| 404 } | 398 } |
| 405 | 399 |
| 406 // This test verfies that we try to reschedule the deadline | 400 // This test verfies that we try to reschedule the deadline |
| 407 // after any event that may change what deadline we want. | 401 // after any event that may change what deadline we want. |
| 408 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 402 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
| 409 SurfaceId root_surface_id(0, 1, 0); | 403 SurfaceId root_surface_id(0, 1, 0); |
| 410 SurfaceId sid1(0, 2, 0); | 404 SurfaceId sid1(0, 2, 0); |
| 411 int count = 1; | 405 int count = 1; |
| 412 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 406 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 413 | 407 |
| 414 // Set the root surface | 408 // Set the root surface |
| 415 scheduler_->SetNewRootSurface(root_surface_id); | 409 scheduler_.SetNewRootSurface(root_surface_id); |
| 416 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 410 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 417 | 411 |
| 418 BeginFrameForTest(); | 412 BeginFrameForTest(); |
| 419 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 413 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 420 | 414 |
| 421 scheduler_->BeginFrameDeadlineForTest(); | 415 scheduler_.BeginFrameDeadlineForTest(); |
| 422 scheduler_->DidSwapBuffers(); | 416 scheduler_.DidSwapBuffers(); |
| 423 BeginFrameForTest(); | 417 BeginFrameForTest(); |
| 424 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 418 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 425 | 419 |
| 426 scheduler_->DidSwapBuffersComplete(); | 420 scheduler_.DidSwapBuffersComplete(); |
| 427 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 421 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 428 | 422 |
| 429 scheduler_->DisplayResized(); | 423 scheduler_.DisplayResized(); |
| 430 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 424 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 431 | 425 |
| 432 scheduler_->SetNewRootSurface(root_surface_id); | 426 scheduler_.SetNewRootSurface(root_surface_id); |
| 433 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 427 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 434 | 428 |
| 435 scheduler_->SurfaceDamaged(sid1); | 429 scheduler_.SurfaceDamaged(sid1); |
| 436 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 430 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 437 | 431 |
| 438 scheduler_->SetRootSurfaceResourcesLocked(true); | 432 scheduler_.SetRootSurfaceResourcesLocked(true); |
| 439 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 433 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 440 | 434 |
| 441 scheduler_->OutputSurfaceLost(); | 435 scheduler_.OutputSurfaceLost(); |
| 442 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 436 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 443 } | 437 } |
| 444 | 438 |
| 445 } // namespace | 439 } // namespace |
| 446 } // namespace cc | 440 } // namespace cc |
| OLD | NEW |