| 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 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 97 | 97 |
| 98 FakeExternalBeginFrameSource fake_begin_frame_source_; | 98 FakeExternalBeginFrameSource fake_begin_frame_source_; |
| 99 | 99 |
| 100 base::SimpleTestTickClock now_src_; | 100 base::SimpleTestTickClock now_src_; |
| 101 scoped_refptr<base::NullTaskRunner> task_runner_; | 101 scoped_refptr<base::NullTaskRunner> task_runner_; |
| 102 FakeDisplaySchedulerClient client_; | 102 FakeDisplaySchedulerClient client_; |
| 103 TestDisplayScheduler scheduler_; | 103 TestDisplayScheduler scheduler_; |
| 104 }; | 104 }; |
| 105 | 105 |
| 106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { | 106 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilNewRootSurface) { |
| 107 SurfaceId root_surface_id1(0, 1, 0); | 107 SurfaceId root_surface_id1(0, 0, 1, 0); |
| 108 SurfaceId root_surface_id2(0, 2, 0); | 108 SurfaceId root_surface_id2(0, 0, 2, 0); |
| 109 SurfaceId sid1(0, 3, 0); | 109 SurfaceId sid1(0, 0, 3, 0); |
| 110 base::TimeTicks late_deadline; | 110 base::TimeTicks late_deadline; |
| 111 | 111 |
| 112 // Go trough an initial BeginFrame cycle with the root surface. | 112 // Go trough an initial BeginFrame cycle with the root surface. |
| 113 BeginFrameForTest(); | 113 BeginFrameForTest(); |
| 114 scheduler_.SetNewRootSurface(root_surface_id1); | 114 scheduler_.SetNewRootSurface(root_surface_id1); |
| 115 scheduler_.BeginFrameDeadlineForTest(); | 115 scheduler_.BeginFrameDeadlineForTest(); |
| 116 | 116 |
| 117 // Resize on the next begin frame cycle should cause the deadline to wait | 117 // Resize on the next begin frame cycle should cause the deadline to wait |
| 118 // for a new root surface. | 118 // for a new root surface. |
| 119 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 119 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 132 BeginFrameForTest(); | 132 BeginFrameForTest(); |
| 133 scheduler_.SurfaceDamaged(sid1); | 133 scheduler_.SurfaceDamaged(sid1); |
| 134 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 134 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 135 scheduler_.SurfaceDamaged(root_surface_id2); | 135 scheduler_.SurfaceDamaged(root_surface_id2); |
| 136 EXPECT_GE(now_src().NowTicks(), | 136 EXPECT_GE(now_src().NowTicks(), |
| 137 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 137 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 138 scheduler_.BeginFrameDeadlineForTest(); | 138 scheduler_.BeginFrameDeadlineForTest(); |
| 139 } | 139 } |
| 140 | 140 |
| 141 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { | 141 TEST_F(DisplaySchedulerTest, ResizeHasLateDeadlineUntilDamagedSurface) { |
| 142 SurfaceId root_surface_id(0, 1, 0); | 142 SurfaceId root_surface_id(0, 0, 1, 0); |
| 143 SurfaceId sid1(0, 2, 0); | 143 SurfaceId sid1(0, 0, 2, 0); |
| 144 base::TimeTicks late_deadline; | 144 base::TimeTicks late_deadline; |
| 145 | 145 |
| 146 // Go trough an initial BeginFrame cycle with the root surface. | 146 // Go trough an initial BeginFrame cycle with the root surface. |
| 147 BeginFrameForTest(); | 147 BeginFrameForTest(); |
| 148 scheduler_.SetNewRootSurface(root_surface_id); | 148 scheduler_.SetNewRootSurface(root_surface_id); |
| 149 scheduler_.BeginFrameDeadlineForTest(); | 149 scheduler_.BeginFrameDeadlineForTest(); |
| 150 | 150 |
| 151 // Resize on the next begin frame cycle should cause the deadline to wait | 151 // Resize on the next begin frame cycle should cause the deadline to wait |
| 152 // for a new root surface. | 152 // for a new root surface. |
| 153 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); | 153 late_deadline = now_src().NowTicks() + BeginFrameArgs::DefaultInterval(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 166 BeginFrameForTest(); | 166 BeginFrameForTest(); |
| 167 scheduler_.SurfaceDamaged(sid1); | 167 scheduler_.SurfaceDamaged(sid1); |
| 168 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 168 EXPECT_GT(late_deadline, scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 169 scheduler_.SurfaceDamaged(root_surface_id); | 169 scheduler_.SurfaceDamaged(root_surface_id); |
| 170 EXPECT_GE(now_src().NowTicks(), | 170 EXPECT_GE(now_src().NowTicks(), |
| 171 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 171 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 172 scheduler_.BeginFrameDeadlineForTest(); | 172 scheduler_.BeginFrameDeadlineForTest(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { | 175 TEST_F(DisplaySchedulerTest, SurfaceDamaged) { |
| 176 SurfaceId root_surface_id(0, 0, 0); | 176 SurfaceId root_surface_id(0, 0, 0, 0); |
| 177 SurfaceId sid1(0, 1, 0); | 177 SurfaceId sid1(0, 0, 1, 0); |
| 178 SurfaceId sid2(0, 2, 0); | 178 SurfaceId sid2(0, 0, 2, 0); |
| 179 | 179 |
| 180 // Set the root surface | 180 // Set the root surface |
| 181 scheduler_.SetNewRootSurface(root_surface_id); | 181 scheduler_.SetNewRootSurface(root_surface_id); |
| 182 | 182 |
| 183 // Get scheduler to detect surface 1 as active by drawing | 183 // Get scheduler to detect surface 1 as active by drawing |
| 184 // two frames in a row with damage from surface 1. | 184 // two frames in a row with damage from surface 1. |
| 185 BeginFrameForTest(); | 185 BeginFrameForTest(); |
| 186 scheduler_.SurfaceDamaged(sid1); | 186 scheduler_.SurfaceDamaged(sid1); |
| 187 scheduler_.BeginFrameDeadlineForTest(); | 187 scheduler_.BeginFrameDeadlineForTest(); |
| 188 BeginFrameForTest(); | 188 BeginFrameForTest(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 BeginFrameForTest(); | 230 BeginFrameForTest(); |
| 231 EXPECT_LT(now_src().NowTicks(), | 231 EXPECT_LT(now_src().NowTicks(), |
| 232 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 232 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 233 scheduler_.SurfaceDamaged(root_surface_id); | 233 scheduler_.SurfaceDamaged(root_surface_id); |
| 234 EXPECT_GE(now_src().NowTicks(), | 234 EXPECT_GE(now_src().NowTicks(), |
| 235 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 235 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 236 scheduler_.BeginFrameDeadlineForTest(); | 236 scheduler_.BeginFrameDeadlineForTest(); |
| 237 } | 237 } |
| 238 | 238 |
| 239 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { | 239 TEST_F(DisplaySchedulerTest, OutputSurfaceLost) { |
| 240 SurfaceId root_surface_id(0, 0, 0); | 240 SurfaceId root_surface_id(0, 0, 0, 0); |
| 241 SurfaceId sid1(0, 1, 0); | 241 SurfaceId sid1(0, 0, 1, 0); |
| 242 | 242 |
| 243 // Set the root surface | 243 // Set the root surface |
| 244 scheduler_.SetNewRootSurface(root_surface_id); | 244 scheduler_.SetNewRootSurface(root_surface_id); |
| 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 root_surface_id(0, 0, 0); | 271 SurfaceId root_surface_id(0, 0, 0, 0); |
| 272 SurfaceId sid1(0, 1, 0); | 272 SurfaceId sid1(0, 0, 1, 0); |
| 273 | 273 |
| 274 // Set the root surface | 274 // Set the root surface |
| 275 scheduler_.SetNewRootSurface(root_surface_id); | 275 scheduler_.SetNewRootSurface(root_surface_id); |
| 276 | 276 |
| 277 // DrawAndSwap normally. | 277 // DrawAndSwap normally. |
| 278 BeginFrameForTest(); | 278 BeginFrameForTest(); |
| 279 EXPECT_LT(now_src().NowTicks(), | 279 EXPECT_LT(now_src().NowTicks(), |
| 280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 280 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 281 EXPECT_EQ(0, client_.draw_and_swap_count()); | 281 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| 282 scheduler_.SurfaceDamaged(sid1); | 282 scheduler_.SurfaceDamaged(sid1); |
| 283 scheduler_.BeginFrameDeadlineForTest(); | 283 scheduler_.BeginFrameDeadlineForTest(); |
| 284 EXPECT_EQ(1, client_.draw_and_swap_count()); | 284 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 285 | 285 |
| 286 scheduler_.DisplayResized(); | 286 scheduler_.DisplayResized(); |
| 287 BeginFrameForTest(); | 287 BeginFrameForTest(); |
| 288 // DisplayResized should trigger a swap to happen. | 288 // DisplayResized should trigger a swap to happen. |
| 289 scheduler_.BeginFrameDeadlineForTest(); | 289 scheduler_.BeginFrameDeadlineForTest(); |
| 290 EXPECT_EQ(2, client_.draw_and_swap_count()); | 290 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 291 } | 291 } |
| 292 | 292 |
| 293 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 293 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
| 294 SurfaceId root_surface_id(0, 0, 0); | 294 SurfaceId root_surface_id(0, 0, 0, 0); |
| 295 SurfaceId sid1(0, 1, 0); | 295 SurfaceId sid1(0, 0, 1, 0); |
| 296 base::TimeTicks late_deadline; | 296 base::TimeTicks late_deadline; |
| 297 | 297 |
| 298 // Set the root surface | 298 // Set the root surface |
| 299 scheduler_.SetNewRootSurface(root_surface_id); | 299 scheduler_.SetNewRootSurface(root_surface_id); |
| 300 | 300 |
| 301 // DrawAndSwap normally. | 301 // DrawAndSwap normally. |
| 302 BeginFrameForTest(); | 302 BeginFrameForTest(); |
| 303 EXPECT_LT(now_src().NowTicks(), | 303 EXPECT_LT(now_src().NowTicks(), |
| 304 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 304 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 305 EXPECT_EQ(0, client_.draw_and_swap_count()); | 305 EXPECT_EQ(0, client_.draw_and_swap_count()); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 330 scheduler_.SurfaceDamaged(root_surface_id); | 330 scheduler_.SurfaceDamaged(root_surface_id); |
| 331 EXPECT_EQ(base::TimeTicks(), | 331 EXPECT_EQ(base::TimeTicks(), |
| 332 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); | 332 scheduler_.DesiredBeginFrameDeadlineTimeForTest()); |
| 333 | 333 |
| 334 EXPECT_EQ(1, client_.draw_and_swap_count()); | 334 EXPECT_EQ(1, client_.draw_and_swap_count()); |
| 335 scheduler_.BeginFrameDeadlineForTest(); | 335 scheduler_.BeginFrameDeadlineForTest(); |
| 336 EXPECT_EQ(2, client_.draw_and_swap_count()); | 336 EXPECT_EQ(2, client_.draw_and_swap_count()); |
| 337 } | 337 } |
| 338 | 338 |
| 339 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 339 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
| 340 SurfaceId root_surface_id(0, 0, 0); | 340 SurfaceId root_surface_id(0, 0, 0, 0); |
| 341 SurfaceId sid1(0, 1, 0); | 341 SurfaceId sid1(0, 0, 1, 0); |
| 342 SurfaceId sid2(0, 2, 0); | 342 SurfaceId sid2(0, 0, 2, 0); |
| 343 | 343 |
| 344 // Set the root surface | 344 // Set the root surface |
| 345 scheduler_.SetNewRootSurface(root_surface_id); | 345 scheduler_.SetNewRootSurface(root_surface_id); |
| 346 | 346 |
| 347 // Get scheduler to detect surface 1 and 2 as active. | 347 // Get scheduler to detect surface 1 and 2 as active. |
| 348 BeginFrameForTest(); | 348 BeginFrameForTest(); |
| 349 scheduler_.SurfaceDamaged(sid1); | 349 scheduler_.SurfaceDamaged(sid1); |
| 350 scheduler_.SurfaceDamaged(sid2); | 350 scheduler_.SurfaceDamaged(sid2); |
| 351 scheduler_.BeginFrameDeadlineForTest(); | 351 scheduler_.BeginFrameDeadlineForTest(); |
| 352 BeginFrameForTest(); | 352 BeginFrameForTest(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 395 base::TimeTicks()); | 395 base::TimeTicks()); |
| 396 // Draw and swap now that we aren't throttled. | 396 // Draw and swap now that we aren't throttled. |
| 397 EXPECT_EQ(3, client_.draw_and_swap_count()); | 397 EXPECT_EQ(3, client_.draw_and_swap_count()); |
| 398 scheduler_.BeginFrameDeadlineForTest(); | 398 scheduler_.BeginFrameDeadlineForTest(); |
| 399 EXPECT_EQ(4, client_.draw_and_swap_count()); | 399 EXPECT_EQ(4, client_.draw_and_swap_count()); |
| 400 } | 400 } |
| 401 | 401 |
| 402 // This test verfies that we try to reschedule the deadline | 402 // This test verfies that we try to reschedule the deadline |
| 403 // after any event that may change what deadline we want. | 403 // after any event that may change what deadline we want. |
| 404 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 404 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
| 405 SurfaceId root_surface_id(0, 1, 0); | 405 SurfaceId root_surface_id(0, 0, 1, 0); |
| 406 SurfaceId sid1(0, 2, 0); | 406 SurfaceId sid1(0, 0, 2, 0); |
| 407 int count = 1; | 407 int count = 1; |
| 408 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 408 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 409 | 409 |
| 410 // Set the root surface | 410 // Set the root surface |
| 411 scheduler_.SetNewRootSurface(root_surface_id); | 411 scheduler_.SetNewRootSurface(root_surface_id); |
| 412 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 412 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 413 | 413 |
| 414 BeginFrameForTest(); | 414 BeginFrameForTest(); |
| 415 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 415 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 416 | 416 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 433 | 433 |
| 434 scheduler_.SetRootSurfaceResourcesLocked(true); | 434 scheduler_.SetRootSurfaceResourcesLocked(true); |
| 435 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 435 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 436 | 436 |
| 437 scheduler_.OutputSurfaceLost(); | 437 scheduler_.OutputSurfaceLost(); |
| 438 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); | 438 EXPECT_EQ(count++, scheduler_.scheduler_begin_frame_deadline_count()); |
| 439 } | 439 } |
| 440 | 440 |
| 441 } // namespace | 441 } // namespace |
| 442 } // namespace cc | 442 } // namespace cc |
| OLD | NEW |