| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 | 101 |
| 102 FakeBeginFrameSource fake_begin_frame_source_; | 102 FakeBeginFrameSource fake_begin_frame_source_; |
| 103 | 103 |
| 104 scoped_ptr<base::SimpleTestTickClock> now_src_; | 104 scoped_ptr<base::SimpleTestTickClock> now_src_; |
| 105 scoped_refptr<base::NullTaskRunner> task_runner_; | 105 scoped_refptr<base::NullTaskRunner> task_runner_; |
| 106 scoped_ptr<FakeDisplaySchedulerClient> client_; | 106 scoped_ptr<FakeDisplaySchedulerClient> client_; |
| 107 scoped_ptr<TestDisplayScheduler> scheduler_; | 107 scoped_ptr<TestDisplayScheduler> scheduler_; |
| 108 }; | 108 }; |
| 109 | 109 |
| 110 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { | 110 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { |
| 111 SurfaceId root_surface_id1(1); | 111 SurfaceId root_surface_id1 = SurfaceId::FromUnsafeValue(1); |
| 112 SurfaceId root_surface_id2(2); | 112 SurfaceId root_surface_id2 = SurfaceId::FromUnsafeValue(2); |
| 113 SurfaceId sid1(3); | 113 SurfaceId sid1 = SurfaceId::FromUnsafeValue(3); |
| 114 base::TimeTicks late_deadline; | 114 base::TimeTicks late_deadline; |
| 115 | 115 |
| 116 // Go trough an initial BeginFrame cycle with the root surface. | 116 // Go trough an initial BeginFrame cycle with the root surface. |
| 117 BeginFrameForTest(); | 117 BeginFrameForTest(); |
| 118 scheduler_->SetNewRootSurface(root_surface_id1); | 118 scheduler_->SetNewRootSurface(root_surface_id1); |
| 119 scheduler_->BeginFrameDeadlineForTest(); | 119 scheduler_->BeginFrameDeadlineForTest(); |
| 120 | 120 |
| 121 // Resize on the next begin frame cycle should cause the deadline to wait | 121 // Resize on the next begin frame cycle should cause the deadline to wait |
| 122 // for a new root surface. | 122 // for a new root surface. |
| 123 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 123 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 136 BeginFrameForTest(); | 136 BeginFrameForTest(); |
| 137 scheduler_->SurfaceDamaged(sid1); | 137 scheduler_->SurfaceDamaged(sid1); |
| 138 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 138 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 139 scheduler_->SurfaceDamaged(root_surface_id2); | 139 scheduler_->SurfaceDamaged(root_surface_id2); |
| 140 EXPECT_GE(now_src().NowTicks(), | 140 EXPECT_GE(now_src().NowTicks(), |
| 141 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 141 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 142 scheduler_->BeginFrameDeadlineForTest(); | 142 scheduler_->BeginFrameDeadlineForTest(); |
| 143 } | 143 } |
| 144 | 144 |
| 145 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { | 145 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { |
| 146 SurfaceId root_surface_id(1); | 146 SurfaceId root_surface_id = SurfaceId::FromUnsafeValue(1); |
| 147 SurfaceId sid1(2); | 147 SurfaceId sid1 = SurfaceId::FromUnsafeValue(2); |
| 148 base::TimeTicks late_deadline; | 148 base::TimeTicks late_deadline; |
| 149 | 149 |
| 150 // Go trough an initial BeginFrame cycle with the root surface. | 150 // Go trough an initial BeginFrame cycle with the root surface. |
| 151 BeginFrameForTest(); | 151 BeginFrameForTest(); |
| 152 scheduler_->SetNewRootSurface(root_surface_id); | 152 scheduler_->SetNewRootSurface(root_surface_id); |
| 153 scheduler_->BeginFrameDeadlineForTest(); | 153 scheduler_->BeginFrameDeadlineForTest(); |
| 154 | 154 |
| 155 // Resize on the next begin frame cycle should cause the deadline to wait | 155 // Resize on the next begin frame cycle should cause the deadline to wait |
| 156 // for a new root surface. | 156 // for a new root surface. |
| 157 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 157 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 170 BeginFrameForTest(); | 170 BeginFrameForTest(); |
| 171 scheduler_->SurfaceDamaged(sid1); | 171 scheduler_->SurfaceDamaged(sid1); |
| 172 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 172 EXPECT_GT(late_deadline, scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 173 scheduler_->SurfaceDamaged(root_surface_id); | 173 scheduler_->SurfaceDamaged(root_surface_id); |
| 174 EXPECT_GE(now_src().NowTicks(), | 174 EXPECT_GE(now_src().NowTicks(), |
| 175 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 175 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 176 scheduler_->BeginFrameDeadlineForTest(); | 176 scheduler_->BeginFrameDeadlineForTest(); |
| 177 } | 177 } |
| 178 | 178 |
| 179 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 179 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
| 180 SurfaceId root_surface_id(0); | 180 SurfaceId root_surface_id = SurfaceId::FromUnsafeValue(0); |
| 181 SurfaceId sid1(1); | 181 SurfaceId sid1 = SurfaceId::FromUnsafeValue(1); |
| 182 SurfaceId sid2(2); | 182 SurfaceId sid2 = SurfaceId::FromUnsafeValue(2); |
| 183 | 183 |
| 184 // Set the root surface | 184 // Set the root surface |
| 185 scheduler_->SetNewRootSurface(root_surface_id); | 185 scheduler_->SetNewRootSurface(root_surface_id); |
| 186 | 186 |
| 187 // Get scheduler to detect surface 1 as active by drawing | 187 // Get scheduler to detect surface 1 as active by drawing |
| 188 // two frames in a row with damage from surface 1. | 188 // two frames in a row with damage from surface 1. |
| 189 BeginFrameForTest(); | 189 BeginFrameForTest(); |
| 190 scheduler_->SurfaceDamaged(sid1); | 190 scheduler_->SurfaceDamaged(sid1); |
| 191 scheduler_->BeginFrameDeadlineForTest(); | 191 scheduler_->BeginFrameDeadlineForTest(); |
| 192 BeginFrameForTest(); | 192 BeginFrameForTest(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 BeginFrameForTest(); | 234 BeginFrameForTest(); |
| 235 EXPECT_LT(now_src().NowTicks(), | 235 EXPECT_LT(now_src().NowTicks(), |
| 236 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 236 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 237 scheduler_->SurfaceDamaged(root_surface_id); | 237 scheduler_->SurfaceDamaged(root_surface_id); |
| 238 EXPECT_GE(now_src().NowTicks(), | 238 EXPECT_GE(now_src().NowTicks(), |
| 239 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 239 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 240 scheduler_->BeginFrameDeadlineForTest(); | 240 scheduler_->BeginFrameDeadlineForTest(); |
| 241 } | 241 } |
| 242 | 242 |
| 243 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 243 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
| 244 SurfaceId sid1(1); | 244 SurfaceId sid1 = SurfaceId::FromUnsafeValue(1); |
| 245 | 245 |
| 246 // DrawAndSwap normally. | 246 // DrawAndSwap normally. |
| 247 BeginFrameForTest(); | 247 BeginFrameForTest(); |
| 248 EXPECT_LT(now_src().NowTicks(), | 248 EXPECT_LT(now_src().NowTicks(), |
| 249 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 249 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 250 EXPECT_EQ(0, client_->draw_and_swap_count()); | 250 EXPECT_EQ(0, client_->draw_and_swap_count()); |
| 251 scheduler_->SurfaceDamaged(sid1); | 251 scheduler_->SurfaceDamaged(sid1); |
| 252 scheduler_->BeginFrameDeadlineForTest(); | 252 scheduler_->BeginFrameDeadlineForTest(); |
| 253 EXPECT_EQ(1, client_->draw_and_swap_count()); | 253 EXPECT_EQ(1, client_->draw_and_swap_count()); |
| 254 | 254 |
| 255 // Deadline triggers immediately on OutputSurfaceLost. | 255 // Deadline triggers immediately on OutputSurfaceLost. |
| 256 BeginFrameForTest(); | 256 BeginFrameForTest(); |
| 257 EXPECT_LT(now_src().NowTicks(), | 257 EXPECT_LT(now_src().NowTicks(), |
| 258 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 258 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 259 scheduler_->OutputSurfaceLost(); | 259 scheduler_->OutputSurfaceLost(); |
| 260 EXPECT_GE(now_src().NowTicks(), | 260 EXPECT_GE(now_src().NowTicks(), |
| 261 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 261 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 262 | 262 |
| 263 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 263 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
| 264 EXPECT_EQ(1, client_->draw_and_swap_count()); | 264 EXPECT_EQ(1, client_->draw_and_swap_count()); |
| 265 scheduler_->SurfaceDamaged(sid1); | 265 scheduler_->SurfaceDamaged(sid1); |
| 266 scheduler_->BeginFrameDeadlineForTest(); | 266 scheduler_->BeginFrameDeadlineForTest(); |
| 267 EXPECT_EQ(1, client_->draw_and_swap_count()); | 267 EXPECT_EQ(1, client_->draw_and_swap_count()); |
| 268 } | 268 } |
| 269 | 269 |
| 270 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { | 270 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { |
| 271 SurfaceId sid1(1); | 271 SurfaceId sid1 = SurfaceId::FromUnsafeValue(1); |
| 272 | 272 |
| 273 // DrawAndSwap normally. | 273 // DrawAndSwap normally. |
| 274 BeginFrameForTest(); | 274 BeginFrameForTest(); |
| 275 EXPECT_LT(now_src().NowTicks(), | 275 EXPECT_LT(now_src().NowTicks(), |
| 276 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 276 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 277 EXPECT_EQ(0, client_->draw_and_swap_count()); | 277 EXPECT_EQ(0, client_->draw_and_swap_count()); |
| 278 scheduler_->SurfaceDamaged(sid1); | 278 scheduler_->SurfaceDamaged(sid1); |
| 279 scheduler_->BeginFrameDeadlineForTest(); | 279 scheduler_->BeginFrameDeadlineForTest(); |
| 280 EXPECT_EQ(1, client_->draw_and_swap_count()); | 280 EXPECT_EQ(1, client_->draw_and_swap_count()); |
| 281 | 281 |
| 282 scheduler_->DisplayResized(); | 282 scheduler_->DisplayResized(); |
| 283 BeginFrameForTest(); | 283 BeginFrameForTest(); |
| 284 // DisplayResized should trigger a swap to happen. | 284 // DisplayResized should trigger a swap to happen. |
| 285 scheduler_->BeginFrameDeadlineForTest(); | 285 scheduler_->BeginFrameDeadlineForTest(); |
| 286 EXPECT_EQ(2, client_->draw_and_swap_count()); | 286 EXPECT_EQ(2, client_->draw_and_swap_count()); |
| 287 } | 287 } |
| 288 | 288 |
| 289 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 289 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
| 290 SurfaceId sid1(1); | 290 SurfaceId sid1 = SurfaceId::FromUnsafeValue(1); |
| 291 base::TimeTicks late_deadline; | 291 base::TimeTicks late_deadline; |
| 292 | 292 |
| 293 // DrawAndSwap normally. | 293 // DrawAndSwap normally. |
| 294 BeginFrameForTest(); | 294 BeginFrameForTest(); |
| 295 EXPECT_LT(now_src().NowTicks(), | 295 EXPECT_LT(now_src().NowTicks(), |
| 296 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 296 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 297 EXPECT_EQ(0, client_->draw_and_swap_count()); | 297 EXPECT_EQ(0, client_->draw_and_swap_count()); |
| 298 scheduler_->SurfaceDamaged(sid1); | 298 scheduler_->SurfaceDamaged(sid1); |
| 299 scheduler_->BeginFrameDeadlineForTest(); | 299 scheduler_->BeginFrameDeadlineForTest(); |
| 300 EXPECT_EQ(1, client_->draw_and_swap_count()); | 300 EXPECT_EQ(1, client_->draw_and_swap_count()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 321 scheduler_->SetRootSurfaceResourcesLocked(false); | 321 scheduler_->SetRootSurfaceResourcesLocked(false); |
| 322 EXPECT_EQ(base::TimeTicks(), | 322 EXPECT_EQ(base::TimeTicks(), |
| 323 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 323 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
| 324 | 324 |
| 325 EXPECT_EQ(1, client_->draw_and_swap_count()); | 325 EXPECT_EQ(1, client_->draw_and_swap_count()); |
| 326 scheduler_->BeginFrameDeadlineForTest(); | 326 scheduler_->BeginFrameDeadlineForTest(); |
| 327 EXPECT_EQ(2, client_->draw_and_swap_count()); | 327 EXPECT_EQ(2, client_->draw_and_swap_count()); |
| 328 } | 328 } |
| 329 | 329 |
| 330 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 330 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
| 331 SurfaceId sid1(1); | 331 SurfaceId sid1 = SurfaceId::FromUnsafeValue(1); |
| 332 SurfaceId sid2(2); | 332 SurfaceId sid2 = SurfaceId::FromUnsafeValue(2); |
| 333 | 333 |
| 334 // Get scheduler to detect surface 1 and 2 as active. | 334 // Get scheduler to detect surface 1 and 2 as active. |
| 335 BeginFrameForTest(); | 335 BeginFrameForTest(); |
| 336 scheduler_->SurfaceDamaged(sid1); | 336 scheduler_->SurfaceDamaged(sid1); |
| 337 scheduler_->SurfaceDamaged(sid2); | 337 scheduler_->SurfaceDamaged(sid2); |
| 338 scheduler_->BeginFrameDeadlineForTest(); | 338 scheduler_->BeginFrameDeadlineForTest(); |
| 339 BeginFrameForTest(); | 339 BeginFrameForTest(); |
| 340 scheduler_->SurfaceDamaged(sid1); | 340 scheduler_->SurfaceDamaged(sid1); |
| 341 scheduler_->SurfaceDamaged(sid2); | 341 scheduler_->SurfaceDamaged(sid2); |
| 342 scheduler_->BeginFrameDeadlineForTest(); | 342 scheduler_->BeginFrameDeadlineForTest(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 base::TimeTicks()); | 382 base::TimeTicks()); |
| 383 // Draw and swap now that we aren't throttled. | 383 // Draw and swap now that we aren't throttled. |
| 384 EXPECT_EQ(3, client_->draw_and_swap_count()); | 384 EXPECT_EQ(3, client_->draw_and_swap_count()); |
| 385 scheduler_->BeginFrameDeadlineForTest(); | 385 scheduler_->BeginFrameDeadlineForTest(); |
| 386 EXPECT_EQ(4, client_->draw_and_swap_count()); | 386 EXPECT_EQ(4, client_->draw_and_swap_count()); |
| 387 } | 387 } |
| 388 | 388 |
| 389 // This test verfies that we try to reschedule the deadline | 389 // This test verfies that we try to reschedule the deadline |
| 390 // after any event that may change what deadline we want. | 390 // after any event that may change what deadline we want. |
| 391 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 391 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
| 392 SurfaceId root_surface_id(1); | 392 SurfaceId root_surface_id = SurfaceId::FromUnsafeValue(1); |
| 393 SurfaceId sid1(2); | 393 SurfaceId sid1 = SurfaceId::FromUnsafeValue(2); |
| 394 int count = 1; | 394 int count = 1; |
| 395 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 395 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 396 | 396 |
| 397 BeginFrameForTest(); | 397 BeginFrameForTest(); |
| 398 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 398 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 399 | 399 |
| 400 scheduler_->BeginFrameDeadlineForTest(); | 400 scheduler_->BeginFrameDeadlineForTest(); |
| 401 scheduler_->DidSwapBuffers(); | 401 scheduler_->DidSwapBuffers(); |
| 402 BeginFrameForTest(); | 402 BeginFrameForTest(); |
| 403 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 403 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 416 | 416 |
| 417 scheduler_->SetRootSurfaceResourcesLocked(true); | 417 scheduler_->SetRootSurfaceResourcesLocked(true); |
| 418 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 418 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 419 | 419 |
| 420 scheduler_->OutputSurfaceLost(); | 420 scheduler_->OutputSurfaceLost(); |
| 421 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 421 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
| 422 } | 422 } |
| 423 | 423 |
| 424 } // namespace | 424 } // namespace |
| 425 } // namespace cc | 425 } // namespace cc |
| OLD | NEW |