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 |