166 size_t presents_called = 0u;
167 zx_handle_t release_fence_handle;
168 fake_flatland().SetPresentHandler([&presents_called,
169 &release_fence_handle](
auto present_args) {
171 release_fence_handle = present_args.release_fences().empty()
173 : present_args.release_fences().front().get();
178 size_t vsyncs_handled = 0u;
186 GetCurrentTestName(), TakeFlatlandHandle(), []() { FAIL(); },
187 std::move(on_frame_presented), loop().dispatcher());
188 EXPECT_EQ(presents_called, 0u);
189 EXPECT_EQ(vsyncs_handled, 0u);
192 loop().RunUntilIdle();
193 EXPECT_EQ(presents_called, 0u);
194 EXPECT_EQ(vsyncs_handled, 0u);
197 bool await_vsync_fired =
false;
198 AwaitVsyncChecked(flatland_connection, await_vsync_fired,
200 EXPECT_TRUE(await_vsync_fired);
204 await_vsync_fired =
false;
205 zx::event first_release_fence;
206 zx::event::create(0u, &first_release_fence);
207 const zx_handle_t first_release_fence_handle = first_release_fence.get();
208 flatland_connection.EnqueueReleaseFence(std::move(first_release_fence));
209 flatland_connection.Present();
210 loop().RunUntilIdle();
211 EXPECT_EQ(presents_called, 1u);
212 EXPECT_EQ(release_fence_handle, ZX_HANDLE_INVALID);
213 EXPECT_EQ(vsyncs_handled, 0u);
214 EXPECT_FALSE(await_vsync_fired);
220 fuchsia::ui::composition::OnNextFrameBeginValues on_next_frame_begin_values;
221 on_next_frame_begin_values.set_additional_present_credits(3);
222 on_next_frame_begin_values.set_future_presentation_infos(
223 CreateFuturePresentationInfos(kPresentationTime1, kPresentationTime2));
224 fake_flatland().FireOnNextFrameBeginEvent(
225 std::move(on_next_frame_begin_values));
226 loop().RunUntilIdle();
227 AwaitVsyncChecked(flatland_connection, await_vsync_fired, kPresentationTime1);
228 EXPECT_TRUE(await_vsync_fired);
231 fake_flatland().FireOnFramePresentedEvent(
232 fuchsia::scenic::scheduling::FramePresentedInfo());
233 loop().RunUntilIdle();
234 EXPECT_EQ(vsyncs_handled, 1u);
238 await_vsync_fired =
false;
239 flatland_connection.Present();
240 loop().RunUntilIdle();
241 EXPECT_EQ(presents_called, 2u);
242 EXPECT_EQ(release_fence_handle, first_release_fence_handle);
245 await_vsync_fired =
false;
246 AwaitVsyncChecked(flatland_connection, await_vsync_fired, kPresentationTime2);
247 EXPECT_TRUE(await_vsync_fired);
252 size_t presents_called = 0u;
253 fake_flatland().SetPresentHandler(
254 [&presents_called](
auto present_args) { presents_called++; });
259 GetCurrentTestName(), TakeFlatlandHandle(), []() { FAIL(); },
260 [](
auto...) {}, loop().dispatcher());
261 EXPECT_EQ(presents_called, 0u);
264 loop().RunUntilIdle();
265 EXPECT_EQ(presents_called, 0u);
268 bool await_vsync_callback_fired =
false;
269 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
271 EXPECT_TRUE(await_vsync_callback_fired);
274 bool await_vsync_secondary_callback_fired =
false;
275 flatland_connection.AwaitVsyncForSecondaryCallback(
276 [&await_vsync_secondary_callback_fired](
fml::TimePoint frame_start,
278 await_vsync_secondary_callback_fired =
true;
280 EXPECT_TRUE(await_vsync_secondary_callback_fired);
285 size_t presents_called = 0u;
286 fake_flatland().SetPresentHandler(
287 [&presents_called](
auto present_args) { presents_called++; });
291 size_t vsyncs_handled = 0u;
299 GetCurrentTestName(), TakeFlatlandHandle(), []() { FAIL(); },
300 std::move(on_frame_presented), loop().dispatcher());
301 EXPECT_EQ(presents_called, 0u);
302 EXPECT_EQ(vsyncs_handled, 0u);
305 loop().RunUntilIdle();
306 EXPECT_EQ(presents_called, 0u);
307 EXPECT_EQ(vsyncs_handled, 0u);
310 bool await_vsync_callback_fired =
false;
311 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
313 EXPECT_TRUE(await_vsync_callback_fired);
316 flatland_connection.Present();
317 loop().RunUntilIdle();
318 EXPECT_EQ(presents_called, 1u);
322 await_vsync_callback_fired =
false;
323 const auto kPresentationTime1 =
326 const auto kPresentationTime2 = kPresentationTime1 + kVsyncInterval;
327 OnNextFrameBegin(1, kPresentationTime1, kPresentationTime2);
328 loop().RunUntilIdle();
329 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
331 EXPECT_TRUE(await_vsync_callback_fired);
335 await_vsync_callback_fired =
false;
336 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
338 EXPECT_TRUE(await_vsync_callback_fired);
341 await_vsync_callback_fired =
false;
342 AwaitVsyncChecked(flatland_connection, await_vsync_callback_fired,
343 kPresentationTime2 + kVsyncInterval);
344 EXPECT_TRUE(await_vsync_callback_fired);
349 size_t num_presents_called = 0u;
350 size_t num_release_fences = 0u;
351 size_t num_acquire_fences = 0u;
353 auto reset_test_counters = [&num_presents_called, &num_acquire_fences,
354 &num_release_fences]() {
355 num_presents_called = 0u;
356 num_release_fences = 0u;
357 num_acquire_fences = 0u;
360 fake_flatland().SetPresentHandler(
361 [&num_presents_called, &num_acquire_fences, &num_release_fences](
362 fuchsia::ui::composition::PresentArgs present_args) {
363 num_presents_called++;
364 num_acquire_fences = present_args.acquire_fences().size();
365 num_release_fences = present_args.release_fences().size();
372 GetCurrentTestName(), TakeFlatlandHandle(), []() { FAIL(); },
373 std::move(on_frame_presented), loop().dispatcher());
374 EXPECT_EQ(num_presents_called, 0u);
377 loop().RunUntilIdle();
378 EXPECT_EQ(num_presents_called, 0u);
382 loop().RunUntilIdle();
383 EXPECT_EQ(num_presents_called, 0u);
388 auto fire_callback = [dispatcher = loop().dispatcher(), &flatland_connection](
391 async::PostTask(dispatcher, [&flatland_connection]() {
392 zx::event acquire_fence;
393 zx::event::create(0u, &acquire_fence);
394 zx::event release_fence;
395 zx::event::create(0u, &release_fence);
396 flatland_connection.EnqueueAcquireFence(std::move(acquire_fence));
397 flatland_connection.EnqueueReleaseFence(std::move(release_fence));
398 flatland_connection.Present();
404 reset_test_counters();
405 flatland_connection.AwaitVsync(fire_callback);
406 loop().RunUntilIdle();
407 EXPECT_EQ(num_presents_called, 1u);
408 EXPECT_EQ(num_acquire_fences, 1u);
409 EXPECT_EQ(num_release_fences, 0u);
413 reset_test_counters();
414 flatland_connection.AwaitVsync(fire_callback);
416 loop().RunUntilIdle();
417 EXPECT_EQ(num_presents_called, 0u);
421 reset_test_counters();
423 loop().RunUntilIdle();
424 EXPECT_EQ(num_presents_called, 1u);
425 EXPECT_EQ(num_acquire_fences, 1u);
426 EXPECT_EQ(num_release_fences, 1u);
434 uint num_deferred_callbacks = 0;
439 num_deferred_callbacks++;
440 if (num_deferred_callbacks > num_onfb) {
442 for (uint
i = 0;
i < num_onfb + 1;
i++) {
443 fire_callback(now, now);
444 num_deferred_callbacks--;
449 reset_test_counters();
450 for (uint
i = 0;
i < num_onfb;
i++) {
451 flatland_connection.AwaitVsync(accumulating_fire_callback);
455 OnNextFrameBegin(
i == 0 ? 1 : 0);
456 loop().RunUntilIdle();
457 EXPECT_EQ(num_presents_called, 0u);
463 flatland_connection.AwaitVsync(accumulating_fire_callback);
465 loop().RunUntilIdle();
466 EXPECT_EQ(num_presents_called, 1u);
467 EXPECT_EQ(num_acquire_fences, 1u);
468 EXPECT_EQ(num_release_fences, 1u);
473 reset_test_counters();
476 loop().RunUntilIdle();
477 EXPECT_EQ(num_presents_called, 1u);
478 EXPECT_EQ(num_acquire_fences, num_onfb);
479 EXPECT_EQ(num_release_fences, 1u);
482 reset_test_counters();
483 flatland_connection.AwaitVsync(fire_callback);
485 loop().RunUntilIdle();
486 EXPECT_EQ(num_presents_called, 1u);
487 EXPECT_EQ(num_acquire_fences, 1u);
488 EXPECT_EQ(num_release_fences, num_onfb);
498 auto fences = std::make_shared<std::vector<zx::event>>();
499 auto fences_dup = std::make_shared<std::vector<zx::event>>();
500 for (
size_t i = 0;
i < num_fences;
i++) {
502 auto status = zx::event::create(0u, &fence);
503 EXPECT_EQ(status, ZX_OK);
506 status = fence.duplicate(ZX_RIGHT_SAME_RIGHTS, &fence_dup);
507 EXPECT_EQ(status, ZX_OK);
509 fences->push_back(std::move(fence));
510 fences_dup->push_back(std::move(fence_dup));
514 .fences_dup = fences_dup,
537 size_t num_presents_called = 0u;
538 size_t num_release_fences = 0u;
539 size_t num_acquire_fences = 0u;
541 auto reset_test_counters = [&num_presents_called, &num_acquire_fences,
542 &num_release_fences]() {
543 num_presents_called = 0u;
544 num_release_fences = 0u;
545 num_acquire_fences = 0u;
548 fuchsia::ui::composition::PresentArgs last_present_args;
549 fake_flatland().SetPresentHandler(
550 [&num_presents_called, &num_acquire_fences, &num_release_fences,
551 &last_present_args](fuchsia::ui::composition::PresentArgs present_args) {
552 num_presents_called++;
553 num_acquire_fences = present_args.acquire_fences().size();
554 num_release_fences = present_args.release_fences().size();
556 last_present_args = std::move(present_args);
563 GetCurrentTestName(), TakeFlatlandHandle(), []() { FAIL(); },
564 std::move(on_frame_presented), subloop_dispatcher());
565 EXPECT_EQ(num_presents_called, 0u);
568 loop().RunUntilIdle();
569 EXPECT_EQ(num_presents_called, 0u);
573 loop().RunUntilIdle();
574 EXPECT_EQ(num_presents_called, 0u);
583 auto fire_callback = [dispatcher = loop().dispatcher(), &flatland_connection,
587 async::PostTask(dispatcher, [&flatland_connection, rf = rfd, af = afd]() {
588 for (
auto& fence : *rf) {
590 const auto status = fence.duplicate(ZX_RIGHT_SAME_RIGHTS, &fence_dup);
591 ASSERT_EQ(status, ZX_OK);
592 flatland_connection.EnqueueReleaseFence(std::move(fence_dup));
594 for (
auto& fence : *af) {
596 const auto status = fence.duplicate(ZX_RIGHT_SAME_RIGHTS, &fence_dup);
597 ASSERT_EQ(status, ZX_OK);
598 flatland_connection.EnqueueAcquireFence(std::move(fence_dup));
600 flatland_connection.Present();
608 reset_test_counters();
609 flatland_connection.AwaitVsync(fire_callback);
611 loop().RunUntilIdle();
613 EXPECT_EQ(num_presents_called, 1u);
614 EXPECT_EQ(num_acquire_fences, 16u);
615 EXPECT_EQ(num_release_fences, 0u);
618 reset_test_counters();
621 loop().RunUntilIdle();
623 flatland_connection.AwaitVsync([dispatcher = subloop_dispatcher(),
626 async::PostTask(dispatcher,
627 [&flatland_connection] { flatland_connection.Present(); });
629 loop().RunUntilIdle();
634 SignalAll(last_present_args.mutable_release_fences());
636 loop().RunUntilIdle();
640 EXPECT_EQ(num_presents_called, 1u);
641 EXPECT_EQ(num_acquire_fences, 0u);
642 EXPECT_EQ(num_release_fences, 16u);