Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: cc/surfaces/display_scheduler_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698