5 #include "flutter/testing/testing.h"
6 #include "fml/closure.h"
7 #include "fml/synchronization/waitable_event.h"
10 #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h"
15 TEST(DescriptorPoolRecyclerVKTest, GetDescriptorPoolRecyclerCreatesNewPools) {
16 auto const context = MockVulkanContextBuilder().Build();
18 auto const pool1 = context->GetDescriptorPoolRecycler()->Get();
19 auto const pool2 = context->GetDescriptorPoolRecycler()->Get();
22 EXPECT_NE(pool1.get(), pool2.get());
27 TEST(DescriptorPoolRecyclerVKTest, ReclaimMakesDescriptorPoolAvailable) {
28 auto const context = MockVulkanContextBuilder().Build();
33 pool.AllocateDescriptorSets({}, *context);
42 for (
auto i = 0u; i < 2; i++) {
46 auto waiter = fml::AutoResetWaitableEvent();
47 auto rattle = fml::ScopedCleanupClosure([&waiter]() { waiter.Signal(); });
50 context->GetResourceManager(), std::move(rattle));
55 auto const pool = context->GetDescriptorPoolRecycler()->Get();
58 auto const called = GetMockVulkanFunctions(context->GetDevice());
60 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"), 1u);
65 TEST(DescriptorPoolRecyclerVKTest, ReclaimDropsDescriptorPoolIfSizeIsExceeded) {
66 auto const context = MockVulkanContextBuilder().Build();
70 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
71 for (
auto i = 0u; i < 33; i++) {
72 auto pool = std::make_unique<DescriptorPoolVK>(context);
73 pool->AllocateDescriptorSets({}, *context);
74 pools.push_back(std::move(pool));
79 for (
auto i = 0u; i < 2; i++) {
80 auto waiter = fml::AutoResetWaitableEvent();
81 auto rattle = fml::ScopedCleanupClosure([&waiter]() { waiter.Signal(); });
84 context->GetResourceManager(), std::move(rattle));
89 auto const called = GetMockVulkanFunctions(context->GetDevice());
91 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),
93 EXPECT_EQ(std::count(called->begin(), called->end(),
"vkResetDescriptorPool"),
99 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
100 for (
auto i = 0u; i < 33; i++) {
101 auto pool = std::make_unique<DescriptorPoolVK>(context);
102 pool->AllocateDescriptorSets({}, *context);
103 pools.push_back(std::move(pool));
107 for (
auto i = 0u; i < 2; i++) {
108 auto waiter = fml::AutoResetWaitableEvent();
109 auto rattle = fml::ScopedCleanupClosure([&waiter]() { waiter.Signal(); });
112 context->GetResourceManager(), std::move(rattle));
117 auto const called_twice = GetMockVulkanFunctions(context->GetDevice());
120 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),