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(1024);
18 auto const [pool2, __] = context->GetDescriptorPoolRecycler()->Get(1024);
21 EXPECT_NE(pool1.get(), pool2.get());
26 TEST(DescriptorPoolRecyclerVKTest, DescriptorPoolCapacityIsRoundedUp) {
27 auto const context = MockVulkanContextBuilder().Build();
28 auto const [pool1, capacity] = context->GetDescriptorPoolRecycler()->Get(1);
31 EXPECT_EQ(capacity, 64u);
33 auto const [pool2, capacity_2] =
34 context->GetDescriptorPoolRecycler()->Get(1023);
37 EXPECT_EQ(capacity_2, 1024u);
47 class DeathRattle final {
49 explicit DeathRattle(std::function<
void()> callback)
50 : callback_(
std::move(callback)) {}
52 DeathRattle(DeathRattle&&) =
default;
53 DeathRattle& operator=(DeathRattle&&) =
default;
55 ~DeathRattle() { callback_(); }
58 std::function<void()> callback_;
63 TEST(DescriptorPoolRecyclerVKTest, ReclaimMakesDescriptorPoolAvailable) {
64 auto const context = MockVulkanContextBuilder().Build();
69 pool.AllocateDescriptorSets(1024, 1024, 1024, {});
78 for (
auto i = 0u; i < 2; i++) {
82 auto waiter = fml::AutoResetWaitableEvent();
83 auto rattle = DeathRattle([&waiter]() { waiter.Signal(); });
91 auto const [pool, _] = context->GetDescriptorPoolRecycler()->Get(1024);
94 auto const called = GetMockVulkanFunctions(context->GetDevice());
96 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"), 1u);
101 TEST(DescriptorPoolRecyclerVKTest, ReclaimDropsDescriptorPoolIfSizeIsExceeded) {
102 auto const context = MockVulkanContextBuilder().Build();
106 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
107 for (
auto i = 0u; i < 33; i++) {
108 auto pool = std::make_unique<DescriptorPoolVK>(context);
109 pool->AllocateDescriptorSets(1024, 1024, 1024, {});
110 pools.push_back(std::move(pool));
115 for (
auto i = 0u; i < 2; i++) {
116 auto waiter = fml::AutoResetWaitableEvent();
117 auto rattle = DeathRattle([&waiter]() { waiter.Signal(); });
125 auto const called = GetMockVulkanFunctions(context->GetDevice());
127 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),
129 EXPECT_EQ(std::count(called->begin(), called->end(),
"vkResetDescriptorPool"),
135 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
136 for (
auto i = 0u; i < 33; i++) {
137 auto pool = std::make_unique<DescriptorPoolVK>(context);
138 pool->AllocateDescriptorSets(1024, 1024, 1024, {});
139 pools.push_back(std::move(pool));
143 for (
auto i = 0u; i < 2; i++) {
144 auto waiter = fml::AutoResetWaitableEvent();
145 auto rattle = DeathRattle([&waiter]() { waiter.Signal(); });
153 auto const called_twice = GetMockVulkanFunctions(context->GetDevice());
156 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),