5 #include "flutter/testing/testing.h"
6 #include "fml/closure.h"
7 #include "fml/synchronization/waitable_event.h"
11 #include "impeller/renderer/backend/vulkan/test/mock_vulkan.h"
16 TEST(DescriptorPoolRecyclerVKTest, GetDescriptorPoolRecyclerCreatesNewPools) {
17 auto const context = MockVulkanContextBuilder().Build();
19 auto const pool1 = context->GetDescriptorPoolRecycler()->Get();
20 auto const pool2 = context->GetDescriptorPoolRecycler()->Get();
23 EXPECT_NE(pool1.get(), pool2.get());
28 TEST(DescriptorPoolRecyclerVKTest, ReclaimMakesDescriptorPoolAvailable) {
29 auto const context = MockVulkanContextBuilder().Build();
34 pool.AllocateDescriptorSets({}, *context);
43 for (
auto i = 0u; i < 2; i++) {
47 auto waiter = fml::AutoResetWaitableEvent();
48 auto rattle = fml::ScopedCleanupClosure([&waiter]() { waiter.Signal(); });
51 context->GetResourceManager(), std::move(rattle));
56 auto const pool = context->GetDescriptorPoolRecycler()->Get();
59 auto const called = GetMockVulkanFunctions(context->GetDevice());
61 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"), 1u);
66 TEST(DescriptorPoolRecyclerVKTest, ReclaimDropsDescriptorPoolIfSizeIsExceeded) {
67 auto const context = MockVulkanContextBuilder().Build();
71 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
72 for (
auto i = 0u; i < 33; i++) {
73 auto pool = std::make_unique<DescriptorPoolVK>(context);
74 pool->AllocateDescriptorSets({}, *context);
75 pools.push_back(std::move(pool));
80 for (
auto i = 0u; i < 2; i++) {
81 auto waiter = fml::AutoResetWaitableEvent();
82 auto rattle = fml::ScopedCleanupClosure([&waiter]() { waiter.Signal(); });
85 context->GetResourceManager(), std::move(rattle));
90 auto const called = GetMockVulkanFunctions(context->GetDevice());
92 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),
94 EXPECT_EQ(std::count(called->begin(), called->end(),
"vkResetDescriptorPool"),
100 std::vector<std::unique_ptr<DescriptorPoolVK>> pools;
101 for (
auto i = 0u; i < 33; i++) {
102 auto pool = std::make_unique<DescriptorPoolVK>(context);
103 pool->AllocateDescriptorSets({}, *context);
104 pools.push_back(std::move(pool));
108 for (
auto i = 0u; i < 2; i++) {
109 auto waiter = fml::AutoResetWaitableEvent();
110 auto rattle = fml::ScopedCleanupClosure([&waiter]() { waiter.Signal(); });
113 context->GetResourceManager(), std::move(rattle));
118 auto const called_twice = GetMockVulkanFunctions(context->GetDevice());
121 std::count(called->begin(), called->end(),
"vkCreateDescriptorPool"),
127 TEST(DescriptorPoolRecyclerVKTest, MultipleCommandBuffersShareDescriptorPool) {
128 auto const context = MockVulkanContextBuilder().Build();
130 auto cmd_buffer_1 = context->CreateCommandBuffer();
131 auto cmd_buffer_2 = context->CreateCommandBuffer();
139 context->DisposeThreadLocalCachedResources();
141 auto cmd_buffer_3 = context->CreateCommandBuffer();
static CommandBufferVK & Cast(CommandBuffer &base)
DescriptorPoolVK & GetDescriptorPool() const
A per-frame descriptor pool. Descriptors from this pool don't need to be freed individually....
A unique handle to a resource which will be reclaimed by the specified resource manager.
TEST(AllocationSizeTest, CanCreateTypedAllocations)