5 #include "fml/synchronization/waitable_event.h"
6 #include "gtest/gtest.h"
8 #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h"
13 TEST(FenceWaiterVKTest, IgnoresNullFence) {
14 auto const context = MockVulkanContextBuilder().Build();
15 auto const waiter = context->GetFenceWaiter();
16 EXPECT_FALSE(waiter->AddFence(vk::UniqueFence(), []() {}));
19 TEST(FenceWaiterVKTest, IgnoresNullCallback) {
20 auto const context = MockVulkanContextBuilder().Build();
21 auto const device = context->GetDevice();
22 auto const waiter = context->GetFenceWaiter();
24 auto fence = device.createFenceUnique({}).
value;
25 EXPECT_FALSE(waiter->AddFence(std::move(fence),
nullptr));
28 TEST(FenceWaiterVKTest, ExecutesFenceCallback) {
29 auto const context = MockVulkanContextBuilder().Build();
30 auto const device = context->GetDevice();
31 auto const waiter = context->GetFenceWaiter();
33 auto signal = fml::ManualResetWaitableEvent();
34 auto fence = device.createFenceUnique({}).
value;
35 waiter->AddFence(std::move(fence), [&signal]() { signal.Signal(); });
40 TEST(FenceWaiterVKTest, ExecutesFenceCallbackX2) {
41 auto const context = MockVulkanContextBuilder().Build();
42 auto const device = context->GetDevice();
43 auto const waiter = context->GetFenceWaiter();
45 auto signal = fml::ManualResetWaitableEvent();
46 auto fence = device.createFenceUnique({}).
value;
47 waiter->AddFence(std::move(fence), [&signal]() { signal.Signal(); });
49 auto signal2 = fml::ManualResetWaitableEvent();
50 auto fence2 = device.createFenceUnique({}).
value;
51 waiter->AddFence(std::move(fence2), [&signal2]() { signal2.Signal(); });
57 TEST(FenceWaiterVKTest, ExecutesNewFenceThenOldFence) {
58 auto const context = MockVulkanContextBuilder().Build();
59 auto const device = context->GetDevice();
60 auto const waiter = context->GetFenceWaiter();
62 auto signal = fml::ManualResetWaitableEvent();
63 auto fence = device.createFenceUnique({}).
value;
64 MockFence::SetStatus(fence, vk::Result::eNotReady);
65 auto raw_fence = MockFence::GetRawPointer(fence);
66 waiter->AddFence(std::move(fence), [&signal]() { signal.Signal(); });
72 auto signal2 = fml::ManualResetWaitableEvent();
73 auto fence2 = device.createFenceUnique({}).
value;
74 MockFence::SetStatus(fence2, vk::Result::eSuccess);
75 waiter->AddFence(std::move(fence2), [&signal2]() { signal2.Signal(); });
80 raw_fence->SetStatus(vk::Result::eSuccess);
86 TEST(FenceWaiterVKTest, AddFenceDoesNothingIfTerminating) {
87 auto signal = fml::ManualResetWaitableEvent();
90 auto const context = MockVulkanContextBuilder().Build();
91 auto const device = context->GetDevice();
92 auto const waiter = context->GetFenceWaiter();
95 auto fence = device.createFenceUnique({}).
value;
96 waiter->AddFence(std::move(fence), [&signal]() { signal.Signal(); });
100 EXPECT_TRUE(signal.WaitWithTimeout(fml::TimeDelta::FromMilliseconds(100)));
103 TEST(FenceWaiterVKTest, InProgressFencesStillWaitIfTerminated) {
104 MockFence* raw_fence =
nullptr;
105 auto signal = fml::ManualResetWaitableEvent();
107 auto const context = MockVulkanContextBuilder().Build();
108 auto const device = context->GetDevice();
109 auto const waiter = context->GetFenceWaiter();
112 auto fence = device.createFenceUnique({}).
value;
115 MockFence::SetStatus(fence, vk::Result::eNotReady);
116 raw_fence = MockFence::GetRawPointer(fence);
117 waiter->AddFence(std::move(fence), [&signal]() { signal.Signal(); });
120 std::thread thread([&]() {
121 std::this_thread::sleep_for(std::chrono::milliseconds{100u});
122 raw_fence->SetStatus(vk::Result::eSuccess);
TEST(AllocationSizeTest, CanCreateTypedAllocations)