Flutter Engine
 
Loading...
Searching...
No Matches
surface_pool_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 <memory>
7
11#include "gmock/gmock.h"
12#include "gtest/gtest.h"
13#include "third_party/skia/include/gpu/ganesh/GrDirectContext.h"
14
15namespace flutter {
16namespace testing {
17
18using ::testing::_;
19using ::testing::ByMove;
20using ::testing::Return;
21
22class TestAndroidSurfaceFactory : public AndroidSurfaceFactory {
23 public:
25 std::function<std::unique_ptr<AndroidSurface>(void)>;
26 explicit TestAndroidSurfaceFactory(TestSurfaceProducer&& surface_producer) {
27 surface_producer_ = surface_producer;
28 }
29
30 ~TestAndroidSurfaceFactory() override = default;
31
32 std::unique_ptr<AndroidSurface> CreateSurface() override {
33 return surface_producer_();
34 }
35
36 private:
37 TestSurfaceProducer surface_producer_;
38};
39
40TEST(SurfacePool, GetLayerAllocateOneLayer) {
41 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false);
42
43 auto gr_context = GrDirectContext::MakeMock(nullptr);
44 auto android_context =
45 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
46
47 auto jni_mock = std::make_shared<JNIMock>();
48 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
49 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
50 .WillOnce(Return(
51 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
52 0, window))));
53
54 auto surface_factory =
55 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
56 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
57 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
58 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
59 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
60 return android_surface_mock;
61 });
62 auto layer = pool->GetLayer(gr_context.get(), *android_context, jni_mock,
63 surface_factory);
64
65 ASSERT_TRUE(pool->HasLayers());
66 ASSERT_NE(nullptr, layer);
67 ASSERT_EQ(reinterpret_cast<intptr_t>(gr_context.get()),
68 layer->gr_context_key);
69}
70
71TEST(SurfacePool, GetUnusedLayers) {
72 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false);
73
74 auto gr_context = GrDirectContext::MakeMock(nullptr);
75 auto android_context =
76 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
77
78 auto jni_mock = std::make_shared<JNIMock>();
79 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
80 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
81 .WillOnce(Return(
82 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
83 0, window))));
84
85 auto surface_factory =
86 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
87 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
88 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
89 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
90 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
91 return android_surface_mock;
92 });
93 auto layer = pool->GetLayer(gr_context.get(), *android_context, jni_mock,
94 surface_factory);
95 ASSERT_EQ(0UL, pool->GetUnusedLayers().size());
96
97 pool->RecycleLayers();
98
99 ASSERT_TRUE(pool->HasLayers());
100 ASSERT_EQ(1UL, pool->GetUnusedLayers().size());
101 ASSERT_EQ(layer, pool->GetUnusedLayers()[0]);
102}
103
104TEST(SurfacePool, GetLayerRecycle) {
105 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false);
106
107 auto gr_context_1 = GrDirectContext::MakeMock(nullptr);
108 auto jni_mock = std::make_shared<JNIMock>();
109 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
110 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
111 .WillOnce(Return(
112 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
113 0, window))));
114
115 auto android_context =
116 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
117
118 auto gr_context_2 = GrDirectContext::MakeMock(nullptr);
119 auto surface_factory = std::make_shared<TestAndroidSurfaceFactory>(
120 [gr_context_1, gr_context_2, window]() {
121 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
122 // Allocate two GPU surfaces for each gr context.
123 EXPECT_CALL(*android_surface_mock,
124 CreateGPUSurface(gr_context_1.get()));
125 EXPECT_CALL(*android_surface_mock,
126 CreateGPUSurface(gr_context_2.get()));
127 // Set the native window once.
128 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
129 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
130 return android_surface_mock;
131 });
132 auto layer_1 = pool->GetLayer(gr_context_1.get(), *android_context, jni_mock,
133 surface_factory);
134
135 pool->RecycleLayers();
136
137 auto layer_2 = pool->GetLayer(gr_context_2.get(), *android_context, jni_mock,
138 surface_factory);
139
140 ASSERT_TRUE(pool->HasLayers());
141 ASSERT_NE(nullptr, layer_1);
142 ASSERT_EQ(layer_1, layer_2);
143 ASSERT_EQ(reinterpret_cast<intptr_t>(gr_context_2.get()),
144 layer_1->gr_context_key);
145 ASSERT_EQ(reinterpret_cast<intptr_t>(gr_context_2.get()),
146 layer_2->gr_context_key);
147}
148
149TEST(SurfacePool, GetLayerAllocateTwoLayers) {
150 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false);
151
152 auto gr_context = GrDirectContext::MakeMock(nullptr);
153 auto android_context =
154 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
155
156 auto jni_mock = std::make_shared<JNIMock>();
157 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
158 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
159 .Times(2)
160 .WillOnce(Return(
161 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
162 0, window))))
163 .WillOnce(Return(
164 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
165 1, window))));
166
167 auto surface_factory =
168 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
169 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
170 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
171 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
172 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
173 return android_surface_mock;
174 });
175 auto layer_1 = pool->GetLayer(gr_context.get(), *android_context, jni_mock,
176 surface_factory);
177 auto layer_2 = pool->GetLayer(gr_context.get(), *android_context, jni_mock,
178 surface_factory);
179
180 ASSERT_TRUE(pool->HasLayers());
181 ASSERT_NE(nullptr, layer_1);
182 ASSERT_NE(nullptr, layer_2);
183 ASSERT_NE(layer_1, layer_2);
184 ASSERT_EQ(0, layer_1->id);
185 ASSERT_EQ(1, layer_2->id);
186}
187
188TEST(SurfacePool, DestroyLayersNew) {
189 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/true);
190 auto jni_mock = std::make_shared<JNIMock>();
191
192 EXPECT_CALL(*jni_mock, destroyOverlaySurface2()).Times(0);
193 pool->DestroyLayers(jni_mock);
194
195 auto gr_context = GrDirectContext::MakeMock(nullptr);
196 auto android_context =
197 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
198
199 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
200 EXPECT_CALL(*jni_mock, createOverlaySurface2())
201 .Times(1)
202 .WillOnce(Return(
203 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
204 0, window))));
205
206 auto surface_factory =
207 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
208 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
209 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
210 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
211 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
212 return android_surface_mock;
213 });
214 pool->GetLayer(gr_context.get(), *android_context, jni_mock, surface_factory);
215
216 EXPECT_CALL(*jni_mock, destroyOverlaySurface2());
217
218 ASSERT_TRUE(pool->HasLayers());
219 pool->DestroyLayers(jni_mock);
220
221 ASSERT_FALSE(pool->HasLayers());
222 ASSERT_TRUE(pool->GetUnusedLayers().empty());
223}
224
225TEST(SurfacePool, DestroyLayers) {
226 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false);
227 auto jni_mock = std::make_shared<JNIMock>();
228
229 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces()).Times(0);
230 pool->DestroyLayers(jni_mock);
231
232 auto gr_context = GrDirectContext::MakeMock(nullptr);
233 auto android_context =
234 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
235
236 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
237 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
238 .Times(1)
239 .WillOnce(Return(
240 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
241 0, window))));
242
243 auto surface_factory =
244 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
245 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
246 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
247 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
248 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
249 return android_surface_mock;
250 });
251 pool->GetLayer(gr_context.get(), *android_context, jni_mock, surface_factory);
252
253 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces());
254
255 ASSERT_TRUE(pool->HasLayers());
256 pool->DestroyLayers(jni_mock);
257
258 ASSERT_FALSE(pool->HasLayers());
259 ASSERT_TRUE(pool->GetUnusedLayers().empty());
260}
261
262TEST(SurfacePool, DestroyLayersFrameSizeChanged) {
263 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/false);
264 auto jni_mock = std::make_shared<JNIMock>();
265
266 auto gr_context = GrDirectContext::MakeMock(nullptr);
267 auto android_context =
268 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
269
270 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
271
272 auto surface_factory =
273 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
274 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
275 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
276 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
277 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
278 return android_surface_mock;
279 });
280 pool->SetFrameSize(DlISize(10, 10));
281 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces()).Times(0);
282 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
283 .Times(1)
284 .WillOnce(Return(
285 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
286 0, window))));
287
288 ASSERT_FALSE(pool->HasLayers());
289
290 pool->GetLayer(gr_context.get(), *android_context, jni_mock, surface_factory);
291
292 ASSERT_TRUE(pool->HasLayers());
293
294 pool->SetFrameSize(DlISize(20, 20));
295 EXPECT_CALL(*jni_mock, FlutterViewDestroyOverlaySurfaces()).Times(1);
296 EXPECT_CALL(*jni_mock, FlutterViewCreateOverlaySurface())
297 .Times(1)
298 .WillOnce(Return(
299 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
300 1, window))));
301 pool->GetLayer(gr_context.get(), *android_context, jni_mock, surface_factory);
302
303 ASSERT_TRUE(pool->GetUnusedLayers().empty());
304 ASSERT_TRUE(pool->HasLayers());
305}
306
307TEST(SurfacePool, DestroyLayersFrameSizeChangedNew) {
308 auto pool = std::make_unique<SurfacePool>(/*use_new_surface_methods=*/true);
309 auto jni_mock = std::make_shared<JNIMock>();
310
311 auto gr_context = GrDirectContext::MakeMock(nullptr);
312 auto android_context =
313 std::make_shared<AndroidContext>(AndroidRenderingAPI::kSoftware);
314
315 auto window = fml::MakeRefCounted<AndroidNativeWindow>(nullptr);
316
317 auto surface_factory =
318 std::make_shared<TestAndroidSurfaceFactory>([gr_context, window]() {
319 auto android_surface_mock = std::make_unique<AndroidSurfaceMock>();
320 EXPECT_CALL(*android_surface_mock, CreateGPUSurface(gr_context.get()));
321 EXPECT_CALL(*android_surface_mock, SetNativeWindow(window, _));
322 EXPECT_CALL(*android_surface_mock, IsValid()).WillOnce(Return(true));
323 return android_surface_mock;
324 });
325 pool->SetFrameSize(DlISize(10, 10));
326 EXPECT_CALL(*jni_mock, destroyOverlaySurface2()).Times(0);
327 EXPECT_CALL(*jni_mock, createOverlaySurface2())
328 .Times(1)
329 .WillOnce(Return(
330 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
331 0, window))));
332
333 ASSERT_FALSE(pool->HasLayers());
334
335 pool->GetLayer(gr_context.get(), *android_context, jni_mock, surface_factory);
336
337 ASSERT_TRUE(pool->HasLayers());
338
339 pool->SetFrameSize(DlISize(20, 20));
340 EXPECT_CALL(*jni_mock, destroyOverlaySurface2()).Times(1);
341 EXPECT_CALL(*jni_mock, createOverlaySurface2())
342 .Times(1)
343 .WillOnce(Return(
344 ByMove(std::make_unique<PlatformViewAndroidJNI::OverlayMetadata>(
345 1, window))));
346 pool->GetLayer(gr_context.get(), *android_context, jni_mock, surface_factory);
347
348 ASSERT_TRUE(pool->GetUnusedLayers().empty());
349 ASSERT_TRUE(pool->HasLayers());
350}
351
352} // namespace testing
353} // namespace flutter
TestAndroidSurfaceFactory(TestSurfaceProducer &&surface_producer)
std::unique_ptr< AndroidSurface > CreateSurface() override
std::function< std::unique_ptr< AndroidSurface >(void)> TestSurfaceProducer
GLFWwindow * window
Definition main.cc:60
TEST(NativeAssetsManagerTest, NoAvailableAssets)
impeller::ISize32 DlISize