5 #include "flutter/testing/testing.h"
6 #include "fml/synchronization/waitable_event.h"
9 #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h"
14 TEST(DescriptorPoolRecyclerVKTest, GetDescriptorPoolRecyclerCreatesNewPools) {
15 auto const context = MockVulkanContextBuilder().Build();
17 auto const pool1 = context->GetDescriptorPoolRecycler()->Get();
18 auto const pool2 = context->GetDescriptorPoolRecycler()->Get();
21 EXPECT_NE(pool1.get(), pool2.get());
31 class DeathRattle final {
33 explicit DeathRattle(std::function<
void()> callback)
34 : callback_(
std::move(callback)) {}
36 DeathRattle(DeathRattle&&) =
default;
37 DeathRattle& operator=(DeathRattle&&) =
default;
39 ~DeathRattle() { callback_(); }
42 std::function<void()> callback_;
47 TEST(DescriptorPoolRecyclerVKTest, ReclaimMakesDescriptorPoolAvailable) {
48 auto const context = MockVulkanContextBuilder().Build();
53 pool.AllocateDescriptorSets({}, *context);
62 for (
auto i = 0u; i < 2; i++) {
66 auto waiter = fml::AutoResetWaitableEvent();
67 auto rattle = DeathRattle([&waiter]() { waiter.Signal(); });
75 auto const pool = context->GetDescriptorPoolRecycler()->Get();
78 auto const called = GetMockVulkanFunctions(context->GetDevice());
80 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"), 1u);
85 TEST(DescriptorPoolRecyclerVKTest, ReclaimDropsDescriptorPoolIfSizeIsExceeded) {
86 auto const context = MockVulkanContextBuilder().Build();
90 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
91 for (
auto i = 0u; i < 33; i++) {
92 auto pool = std::make_unique<DescriptorPoolVK>(context);
93 pool->AllocateDescriptorSets({}, *context);
94 pools.push_back(std::move(pool));
99 for (
auto i = 0u; i < 2; i++) {
100 auto waiter = fml::AutoResetWaitableEvent();
101 auto rattle = DeathRattle([&waiter]() { waiter.Signal(); });
109 auto const called = GetMockVulkanFunctions(context->GetDevice());
111 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),
113 EXPECT_EQ(std::count(called->begin(), called->end(),
"vkResetDescriptorPool"),
119 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
120 for (
auto i = 0u; i < 33; i++) {
121 auto pool = std::make_unique<DescriptorPoolVK>(context);
122 pool->AllocateDescriptorSets({}, *context);
123 pools.push_back(std::move(pool));
127 for (
auto i = 0u; i < 2; i++) {
128 auto waiter = fml::AutoResetWaitableEvent();
129 auto rattle = DeathRattle([&waiter]() { waiter.Signal(); });
137 auto const called_twice = GetMockVulkanFunctions(context->GetDevice());
140 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),