5 #include "flutter/fml/synchronization/waitable_event.h"
6 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
9 #include "flutter/shell/platform/windows/testing/engine_modifier.h"
10 #include "flutter/shell/platform/windows/testing/mock_gl_functions.h"
11 #include "gtest/gtest.h"
16 using Microsoft::WRL::ComPtr;
20 std::unique_ptr<FlutterWindowsEngine> GetTestEngine() {
22 properties.
assets_path = L
"C:\\foo\\flutter_assets";
25 FlutterProjectBundle project(properties);
26 auto engine = std::make_unique<FlutterWindowsEngine>(project);
28 EngineModifier modifier(engine.get());
29 modifier.embedder_api().RegisterExternalTexture =
30 MOCK_ENGINE_PROC(RegisterExternalTexture,
31 ([](
auto engine,
auto texture_id) {
return kSuccess; }));
37 ComPtr<ID3D11Texture2D> CreateD3dTexture(FlutterWindowsEngine* engine,
40 ComPtr<ID3D11Device> d3d_device;
41 ComPtr<ID3D11Texture2D> d3d_texture;
42 if (engine->surface_manager()->GetDevice(d3d_device.GetAddressOf())) {
43 D3D11_TEXTURE2D_DESC texture_description = {};
44 texture_description.MipLevels = 1;
45 texture_description.SampleDesc.Count = 1;
46 texture_description.BindFlags = D3D11_BIND_RENDER_TARGET;
47 texture_description.Usage = D3D11_USAGE_DEFAULT;
48 texture_description.CPUAccessFlags = 0;
49 texture_description.ArraySize = 1;
50 texture_description.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
51 texture_description.Height = width;
52 texture_description.Width = height;
53 texture_description.MiscFlags = D3D11_RESOURCE_MISC_SHARED;
55 d3d_device->CreateTexture2D(&texture_description,
nullptr,
56 d3d_texture.GetAddressOf());
63 TEST(FlutterWindowsTextureRegistrarTest, CreateDestroy) {
64 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
65 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
71 TEST(FlutterWindowsTextureRegistrarTest, RegisterUnregisterTexture) {
72 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
73 EngineModifier modifier(engine.get());
74 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
81 [](
size_t width,
size_t height,
86 int64_t registered_texture_id = 0;
87 bool register_called =
false;
88 modifier.embedder_api().RegisterExternalTexture = MOCK_ENGINE_PROC(
89 RegisterExternalTexture, ([®ister_called, ®istered_texture_id](
91 register_called =
true;
96 bool unregister_called =
false;
97 modifier.embedder_api().UnregisterExternalTexture = MOCK_ENGINE_PROC(
98 UnregisterExternalTexture, ([&unregister_called, ®istered_texture_id](
100 unregister_called =
true;
105 bool mark_frame_available_called =
false;
106 modifier.embedder_api().MarkExternalTextureFrameAvailable =
107 MOCK_ENGINE_PROC(MarkExternalTextureFrameAvailable,
108 ([&mark_frame_available_called, ®istered_texture_id](
110 mark_frame_available_called =
true;
115 modifier.embedder_api().PostRenderThreadTask =
116 MOCK_ENGINE_PROC(PostRenderThreadTask,
117 [](
auto engine,
auto callback,
void* callback_data) {
123 EXPECT_TRUE(register_called);
128 EXPECT_TRUE(mark_frame_available_called);
130 fml::AutoResetWaitableEvent latch;
133 ASSERT_TRUE(unregister_called);
136 TEST(FlutterWindowsTextureRegistrarTest, RegisterUnknownTextureType) {
137 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
138 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
150 TEST(FlutterWindowsTextureRegistrarTest, PopulatePixelBufferTexture) {
151 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
152 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
155 bool release_callback_called =
false;
158 std::unique_ptr<uint8_t[]> pixels =
159 std::make_unique<uint8_t[]>(width * height * 4);
161 pixel_buffer.
width = width;
162 pixel_buffer.
height = height;
163 pixel_buffer.
buffer = pixels.get();
166 bool* called =
reinterpret_cast<bool*
>(release_context);
174 [](
size_t width,
size_t height,
179 FlutterOpenGLTexture flutter_texture = {};
186 EXPECT_EQ(flutter_texture.width, width);
187 EXPECT_EQ(flutter_texture.height, height);
188 EXPECT_EQ(flutter_texture.target, GL_TEXTURE_2D);
189 EXPECT_TRUE(release_callback_called);
192 TEST(FlutterWindowsTextureRegistrarTest, PopulateD3dTextureWithHandle) {
193 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
194 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
199 auto d3d_texture = CreateD3dTexture(engine.get(), width, height);
200 EXPECT_TRUE(d3d_texture);
202 ComPtr<IDXGIResource> shared_resource;
203 EXPECT_TRUE(SUCCEEDED(d3d_texture.As(&shared_resource)));
205 HANDLE shared_handle;
206 EXPECT_TRUE(SUCCEEDED(shared_resource->GetSharedHandle(&shared_handle)));
208 bool release_callback_called =
false;
211 surface_descriptor.
handle = shared_handle;
216 bool* called =
reinterpret_cast<bool*
>(release_context);
228 [](
size_t width,
size_t height,
234 FlutterOpenGLTexture flutter_texture = {};
241 EXPECT_EQ(flutter_texture.width, width);
242 EXPECT_EQ(flutter_texture.height, height);
243 EXPECT_EQ(flutter_texture.target, GL_TEXTURE_2D);
244 EXPECT_TRUE(release_callback_called);
247 TEST(FlutterWindowsTextureRegistrarTest, PopulateD3dTexture) {
248 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
249 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
254 auto d3d_texture = CreateD3dTexture(engine.get(), width, height);
255 EXPECT_TRUE(d3d_texture);
257 bool release_callback_called =
false;
260 surface_descriptor.
handle = d3d_texture.Get();
265 bool* called =
reinterpret_cast<bool*
>(release_context);
277 [](
size_t width,
size_t height,
283 FlutterOpenGLTexture flutter_texture = {};
290 EXPECT_EQ(flutter_texture.width, width);
291 EXPECT_EQ(flutter_texture.height, height);
292 EXPECT_EQ(flutter_texture.target, GL_TEXTURE_2D);
293 EXPECT_TRUE(release_callback_called);
296 TEST(FlutterWindowsTextureRegistrarTest, PopulateInvalidTexture) {
297 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
298 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
303 EXPECT_FALSE(result);
306 TEST(FlutterWindowsTextureRegistrarTest,
307 UnregisterTextureWithEngineDownInvokesCallback) {
308 std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
309 std::unique_ptr<MockGlFunctions> gl = std::make_unique<MockGlFunctions>();
313 fml::AutoResetWaitableEvent latch;