129 const uintptr_t kWarmUpBaton = 0xFFFFFFFF;
132 CFTimeInterval timestamp;
133 CFTimeInterval targetTimestamp;
136 __block std::vector<Entry> entries;
139 initWithDisplayLink:displayLink
140 block:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp,
142 entries.push_back({timestamp, targetTimestamp, baton});
143 if (baton == kWarmUpBaton) {
147 CFRunLoopStop(CFRunLoopGetCurrent());
150 __block CFTimeInterval expectedStartUntil;
154 [waiter waitForVSync:kWarmUpBaton];
155 [[NSRunLoop currentRunLoop] performBlock:^{
156 expectedStartUntil = CACurrentMediaTime();
160 CFTimeInterval now = CACurrentMediaTime();
164 EXPECT_EQ(displayLink.
paused, YES);
166 [waiter waitForVSync:1];
169 [waiter waitForVSync:2];
174 [waiter waitForVSync:3];
179 EXPECT_FALSE(displayLink.
paused);
184 CFTimeInterval start = CACurrentMediaTime();
185 while (!displayLink.
paused) {
187 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.02, NO);
188 if (CACurrentMediaTime() - start > 1.0) {
192 ASSERT_TRUE(displayLink.
paused);
194 EXPECT_EQ(entries.size(),
size_t(4));
197 EXPECT_TRUE(entries[0].timestamp <= expectedStartUntil);
198 EXPECT_TRUE(entries[0].targetTimestamp <= expectedStartUntil);
199 EXPECT_EQ(entries[0].baton, kWarmUpBaton);
203 EXPECT_EQ(entries[1].baton,
size_t(1));
206 EXPECT_EQ(entries[2].baton,
size_t(2));
209 EXPECT_EQ(entries[3].baton,
size_t(3));