Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
impeller
renderer
backend
vulkan
resource_manager_vk_unittests.cc
Go to the documentation of this file.
1
// Copyright 2013 The Flutter Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style license that can be
3
// found in the LICENSE file.
4
5
#include <sys/types.h>
6
#include <functional>
7
#include <memory>
8
#include <utility>
9
#include "
fml/closure.h
"
10
#include "
fml/synchronization/waitable_event.h
"
11
#include "gtest/gtest.h"
12
#include "
impeller/renderer/backend/vulkan/resource_manager_vk.h
"
13
14
namespace
impeller
{
15
namespace
testing {
16
17
// While expected to be a singleton per context, the class does not enforce it.
18
TEST
(ResourceManagerVKTest, CreatesANewInstance) {
19
auto
const
a
=
ResourceManagerVK::Create
();
20
auto
const
b
=
ResourceManagerVK::Create
();
21
EXPECT_NE(
a
,
b
);
22
}
23
24
TEST
(ResourceManagerVKTest, ReclaimMovesAResourceAndDestroysIt) {
25
auto
const
manager =
ResourceManagerVK::Create
();
26
27
auto
waiter =
fml::AutoResetWaitableEvent
();
28
auto
dead =
false
;
29
auto
rattle =
fml::ScopedCleanupClosure
([&waiter]() { waiter.Signal(); });
30
31
// Not killed immediately.
32
EXPECT_FALSE(waiter.IsSignaledForTest());
33
34
{
35
auto
resource =
UniqueResourceVKT<fml::ScopedCleanupClosure>
(
36
manager, std::move(rattle));
37
}
38
39
waiter.Wait();
40
}
41
42
// Regression test for https://github.com/flutter/flutter/issues/134482.
43
TEST
(ResourceManagerVKTest, TerminatesWhenOutOfScope) {
44
// Originally, this shared_ptr was never destroyed, and the thread never
45
// terminated. This test ensures that the thread terminates when the
46
// ResourceManagerVK is out of scope.
47
std::weak_ptr<ResourceManagerVK> manager;
48
49
{
50
auto
shared =
ResourceManagerVK::Create
();
51
manager = shared;
52
}
53
54
// The thread should have terminated.
55
EXPECT_EQ(manager.lock(),
nullptr
);
56
}
57
58
TEST
(ResourceManagerVKTest, IsThreadSafe) {
59
// In a typical app, there is a single ResourceManagerVK per app, shared b/w
60
// threads.
61
//
62
// This test ensures that the ResourceManagerVK is thread-safe.
63
std::weak_ptr<ResourceManagerVK> manager;
64
65
{
66
auto
const
manager =
ResourceManagerVK::Create
();
67
68
// Spawn two threads, and have them both put resources into the manager.
69
struct
MockResource {};
70
71
std::thread thread1([&manager]() {
72
UniqueResourceVKT<MockResource>
(manager, MockResource{});
73
});
74
75
std::thread thread2([&manager]() {
76
UniqueResourceVKT<MockResource>
(manager, MockResource{});
77
});
78
79
thread1.join();
80
thread2.join();
81
}
82
83
// The thread should have terminated.
84
EXPECT_EQ(manager.lock(),
nullptr
);
85
}
86
87
}
// namespace testing
88
}
// namespace impeller
TEST
#define TEST(S, s, D, expected)
Definition
FitsInTest.cpp:15
fml::AutoResetWaitableEvent
Definition
waitable_event.h:28
fml::ScopedCleanupClosure
Wraps a closure that is invoked in the destructor unless released by the caller.
Definition
closure.h:32
impeller::ResourceManagerVK::Create
static std::shared_ptr< ResourceManagerVK > Create()
Creates a shared resource manager (a dedicated thread).
Definition
resource_manager_vk.cc:14
impeller::UniqueResourceVKT
A unique handle to a resource which will be reclaimed by the specified resource manager.
Definition
resource_manager_vk.h:145
closure.h
b
static bool b
Definition
ffi_native_test_module.c:74
a
struct MyStruct a[10]
impeller
Definition
texture.h:18
resource_manager_vk.h
waitable_event.h
Generated on Fri Apr 26 2024 06:14:13 for Flutter Engine by
1.9.8