120 const uintptr_t kWarmUpBaton = 0xFFFFFFFF;
123 CFTimeInterval timestamp;
124 CFTimeInterval targetTimestamp;
127 __block std::vector<Entry> entries;
130 initWithDisplayLink:displayLink
131 block:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp,
133 entries.push_back({timestamp, targetTimestamp, baton});
134 if (baton == kWarmUpBaton) {
138 CFRunLoopStop(CFRunLoopGetCurrent());
141 __block CFTimeInterval expectedStartUntil;
145 [waiter waitForVSync:kWarmUpBaton];
146 [[NSRunLoop currentRunLoop] performBlock:^{
147 expectedStartUntil = CACurrentMediaTime();
151 CFTimeInterval now = CACurrentMediaTime();
155 EXPECT_EQ(displayLink.
paused, YES);
157 [waiter waitForVSync:1];
160 [waiter waitForVSync:2];
165 [waiter waitForVSync:3];
170 EXPECT_FALSE(displayLink.
paused);
175 CFTimeInterval start = CACurrentMediaTime();
176 while (!displayLink.
paused) {
178 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.02, NO);
179 if (CACurrentMediaTime() - start > 1.0) {
183 ASSERT_TRUE(displayLink.
paused);
185 EXPECT_EQ(entries.size(),
size_t(4));
188 EXPECT_TRUE(entries[0].timestamp <= expectedStartUntil);
189 EXPECT_TRUE(entries[0].targetTimestamp <= expectedStartUntil);
190 EXPECT_EQ(entries[0].baton, kWarmUpBaton);
194 EXPECT_EQ(entries[1].baton,
size_t(1));
197 EXPECT_EQ(entries[2].baton,
size_t(2));
200 EXPECT_EQ(entries[3].baton,
size_t(3));