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