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 std::unique_ptr<base::SimpleTestTickClock> now_src_; | 104 std::unique_ptr<base::SimpleTestTickClock> now_src_; |
105 scoped_refptr<base::NullTaskRunner> task_runner_; | 105 scoped_refptr<base::NullTaskRunner> task_runner_; |
106 std::unique_ptr<FakeDisplaySchedulerClient> client_; | 106 std::unique_ptr<FakeDisplaySchedulerClient> client_; |
107 std::unique_ptr<TestDisplayScheduler> scheduler_; | 107 std::unique_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(0, 1, 0); |
112 SurfaceId root_surface_id2(2); | 112 SurfaceId root_surface_id2(0, 2, 0); |
113 SurfaceId sid1(3); | 113 SurfaceId sid1(0, 3, 0); |
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(0, 1, 0); |
147 SurfaceId sid1(2); | 147 SurfaceId sid1(0, 2, 0); |
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(0, 0, 0); |
181 SurfaceId sid1(1); | 181 SurfaceId sid1(0, 1, 0); |
182 SurfaceId sid2(2); | 182 SurfaceId sid2(0, 2, 0); |
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 root_surface_id(0); | 244 SurfaceId root_surface_id(0, 0, 0); |
245 SurfaceId sid1(1); | 245 SurfaceId sid1(0, 1, 0); |
246 | 246 |
247 // Set the root surface | 247 // Set the root surface |
248 scheduler_->SetNewRootSurface(root_surface_id); | 248 scheduler_->SetNewRootSurface(root_surface_id); |
249 | 249 |
250 // DrawAndSwap normally. | 250 // DrawAndSwap normally. |
251 BeginFrameForTest(); | 251 BeginFrameForTest(); |
252 EXPECT_LT(now_src().NowTicks(), | 252 EXPECT_LT(now_src().NowTicks(), |
253 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 253 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
254 EXPECT_EQ(0, client_->draw_and_swap_count()); | 254 EXPECT_EQ(0, client_->draw_and_swap_count()); |
255 scheduler_->SurfaceDamaged(sid1); | 255 scheduler_->SurfaceDamaged(sid1); |
256 scheduler_->BeginFrameDeadlineForTest(); | 256 scheduler_->BeginFrameDeadlineForTest(); |
257 EXPECT_EQ(1, client_->draw_and_swap_count()); | 257 EXPECT_EQ(1, client_->draw_and_swap_count()); |
258 | 258 |
259 // Deadline triggers immediately on OutputSurfaceLost. | 259 // Deadline triggers immediately on OutputSurfaceLost. |
260 BeginFrameForTest(); | 260 BeginFrameForTest(); |
261 EXPECT_LT(now_src().NowTicks(), | 261 EXPECT_LT(now_src().NowTicks(), |
262 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 262 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
263 scheduler_->OutputSurfaceLost(); | 263 scheduler_->OutputSurfaceLost(); |
264 EXPECT_GE(now_src().NowTicks(), | 264 EXPECT_GE(now_src().NowTicks(), |
265 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 265 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
266 | 266 |
267 // Deadline does not DrawAndSwap after OutputSurfaceLost. | 267 // Deadline does not DrawAndSwap after OutputSurfaceLost. |
268 EXPECT_EQ(1, client_->draw_and_swap_count()); | 268 EXPECT_EQ(1, client_->draw_and_swap_count()); |
269 scheduler_->SurfaceDamaged(sid1); | 269 scheduler_->SurfaceDamaged(sid1); |
270 scheduler_->BeginFrameDeadlineForTest(); | 270 scheduler_->BeginFrameDeadlineForTest(); |
271 EXPECT_EQ(1, client_->draw_and_swap_count()); | 271 EXPECT_EQ(1, client_->draw_and_swap_count()); |
272 } | 272 } |
273 | 273 |
274 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { | 274 TEST_F(DisplaySchedulerTest, ResizeCausesSwap) { |
275 SurfaceId root_surface_id(0); | 275 SurfaceId root_surface_id(0, 0, 0); |
276 SurfaceId sid1(1); | 276 SurfaceId sid1(0, 1, 0); |
277 | 277 |
278 // Set the root surface | 278 // Set the root surface |
279 scheduler_->SetNewRootSurface(root_surface_id); | 279 scheduler_->SetNewRootSurface(root_surface_id); |
280 | 280 |
281 // DrawAndSwap normally. | 281 // DrawAndSwap normally. |
282 BeginFrameForTest(); | 282 BeginFrameForTest(); |
283 EXPECT_LT(now_src().NowTicks(), | 283 EXPECT_LT(now_src().NowTicks(), |
284 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 284 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
285 EXPECT_EQ(0, client_->draw_and_swap_count()); | 285 EXPECT_EQ(0, client_->draw_and_swap_count()); |
286 scheduler_->SurfaceDamaged(sid1); | 286 scheduler_->SurfaceDamaged(sid1); |
287 scheduler_->BeginFrameDeadlineForTest(); | 287 scheduler_->BeginFrameDeadlineForTest(); |
288 EXPECT_EQ(1, client_->draw_and_swap_count()); | 288 EXPECT_EQ(1, client_->draw_and_swap_count()); |
289 | 289 |
290 scheduler_->DisplayResized(); | 290 scheduler_->DisplayResized(); |
291 BeginFrameForTest(); | 291 BeginFrameForTest(); |
292 // DisplayResized should trigger a swap to happen. | 292 // DisplayResized should trigger a swap to happen. |
293 scheduler_->BeginFrameDeadlineForTest(); | 293 scheduler_->BeginFrameDeadlineForTest(); |
294 EXPECT_EQ(2, client_->draw_and_swap_count()); | 294 EXPECT_EQ(2, client_->draw_and_swap_count()); |
295 } | 295 } |
296 | 296 |
297 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { | 297 TEST_F(DisplaySchedulerTest, RootSurfaceResourcesLocked) { |
298 SurfaceId root_surface_id(0); | 298 SurfaceId root_surface_id(0, 0, 0); |
299 SurfaceId sid1(1); | 299 SurfaceId sid1(0, 1, 0); |
300 base::TimeTicks late_deadline; | 300 base::TimeTicks late_deadline; |
301 | 301 |
302 // Set the root surface | 302 // Set the root surface |
303 scheduler_->SetNewRootSurface(root_surface_id); | 303 scheduler_->SetNewRootSurface(root_surface_id); |
304 | 304 |
305 // DrawAndSwap normally. | 305 // DrawAndSwap normally. |
306 BeginFrameForTest(); | 306 BeginFrameForTest(); |
307 EXPECT_LT(now_src().NowTicks(), | 307 EXPECT_LT(now_src().NowTicks(), |
308 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 308 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
309 EXPECT_EQ(0, client_->draw_and_swap_count()); | 309 EXPECT_EQ(0, client_->draw_and_swap_count()); |
(...skipping 24 matching lines...) Expand all Loading... |
334 scheduler_->SurfaceDamaged(root_surface_id); | 334 scheduler_->SurfaceDamaged(root_surface_id); |
335 EXPECT_EQ(base::TimeTicks(), | 335 EXPECT_EQ(base::TimeTicks(), |
336 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); | 336 scheduler_->DesiredBeginFrameDeadlineTimeForTest()); |
337 | 337 |
338 EXPECT_EQ(1, client_->draw_and_swap_count()); | 338 EXPECT_EQ(1, client_->draw_and_swap_count()); |
339 scheduler_->BeginFrameDeadlineForTest(); | 339 scheduler_->BeginFrameDeadlineForTest(); |
340 EXPECT_EQ(2, client_->draw_and_swap_count()); | 340 EXPECT_EQ(2, client_->draw_and_swap_count()); |
341 } | 341 } |
342 | 342 |
343 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { | 343 TEST_F(DisplaySchedulerTest, DidSwapBuffers) { |
344 SurfaceId root_surface_id(0); | 344 SurfaceId root_surface_id(0, 0, 0); |
345 SurfaceId sid1(1); | 345 SurfaceId sid1(0, 1, 0); |
346 SurfaceId sid2(2); | 346 SurfaceId sid2(0, 2, 0); |
347 | 347 |
348 // Set the root surface | 348 // Set the root surface |
349 scheduler_->SetNewRootSurface(root_surface_id); | 349 scheduler_->SetNewRootSurface(root_surface_id); |
350 | 350 |
351 // Get scheduler to detect surface 1 and 2 as active. | 351 // Get scheduler to detect surface 1 and 2 as active. |
352 BeginFrameForTest(); | 352 BeginFrameForTest(); |
353 scheduler_->SurfaceDamaged(sid1); | 353 scheduler_->SurfaceDamaged(sid1); |
354 scheduler_->SurfaceDamaged(sid2); | 354 scheduler_->SurfaceDamaged(sid2); |
355 scheduler_->BeginFrameDeadlineForTest(); | 355 scheduler_->BeginFrameDeadlineForTest(); |
356 BeginFrameForTest(); | 356 BeginFrameForTest(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 base::TimeTicks()); | 399 base::TimeTicks()); |
400 // Draw and swap now that we aren't throttled. | 400 // Draw and swap now that we aren't throttled. |
401 EXPECT_EQ(3, client_->draw_and_swap_count()); | 401 EXPECT_EQ(3, client_->draw_and_swap_count()); |
402 scheduler_->BeginFrameDeadlineForTest(); | 402 scheduler_->BeginFrameDeadlineForTest(); |
403 EXPECT_EQ(4, client_->draw_and_swap_count()); | 403 EXPECT_EQ(4, client_->draw_and_swap_count()); |
404 } | 404 } |
405 | 405 |
406 // This test verfies that we try to reschedule the deadline | 406 // This test verfies that we try to reschedule the deadline |
407 // after any event that may change what deadline we want. | 407 // after any event that may change what deadline we want. |
408 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { | 408 TEST_F(DisplaySchedulerTest, ScheduleBeginFrameDeadline) { |
409 SurfaceId root_surface_id(1); | 409 SurfaceId root_surface_id(0, 1, 0); |
410 SurfaceId sid1(2); | 410 SurfaceId sid1(0, 2, 0); |
411 int count = 1; | 411 int count = 1; |
412 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 412 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
413 | 413 |
414 // Set the root surface | 414 // Set the root surface |
415 scheduler_->SetNewRootSurface(root_surface_id); | 415 scheduler_->SetNewRootSurface(root_surface_id); |
416 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 416 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
417 | 417 |
418 BeginFrameForTest(); | 418 BeginFrameForTest(); |
419 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 419 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
420 | 420 |
(...skipping 16 matching lines...) Expand all Loading... |
437 | 437 |
438 scheduler_->SetRootSurfaceResourcesLocked(true); | 438 scheduler_->SetRootSurfaceResourcesLocked(true); |
439 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 439 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
440 | 440 |
441 scheduler_->OutputSurfaceLost(); | 441 scheduler_->OutputSurfaceLost(); |
442 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); | 442 EXPECT_EQ(count++, scheduler_->scheduler_begin_frame_deadline_count()); |
443 } | 443 } |
444 | 444 |
445 } // namespace | 445 } // namespace |
446 } // namespace cc | 446 } // namespace cc |
OLD | NEW |