From 7418e7e4a8208e1aa95bb98b4055e3b7bc95fec1 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 27 Aug 2019 15:30:01 -0700 Subject: [PATCH 01/11] wait for platform view appear --- .../ScenariosUITests/PlatformViewUITests.m | 11 ++++++++++- .../golden_platform_view_D321AP.png | Bin 0 -> 98725 bytes 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index e0a929572b81e..e0982aaecd6e6 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -24,12 +24,21 @@ - (void)setUp { } - (void)testPlatformView { + + XCUIElement *element = self.application.textViews.firstMatch; + BOOL exists = [element waitForExistenceWithTimeout:5]; + if (!exists) { + XCTFail(@"It took longer than 3 second to find the platform view." + @"There might be issues with the platform view's construction, + @"or with how the scenario is built."); + } + NSBundle* bundle = [NSBundle bundleForClass:[self class]]; NSString* goldenName = [NSString stringWithFormat:@"golden_platform_view_%@", [self platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; attachment.lifetime = XCTAttachmentLifetimeKeepAlways; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc639f672890b3b83cd086c0447617e21785cf9 GIT binary patch literal 98725 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 Date: Mon, 30 Sep 2019 08:04:39 -0700 Subject: [PATCH 02/11] prototype adding unregistered callback --- flow/texture.cc | 1 + flow/texture.h | 2 ++ shell/platform/android/android_external_texture_gl.cc | 2 ++ shell/platform/android/android_external_texture_gl.h | 2 ++ shell/platform/darwin/ios/framework/Headers/FlutterTexture.h | 1 + shell/platform/darwin/ios/ios_external_texture_gl.h | 2 ++ shell/platform/darwin/ios/ios_external_texture_gl.mm | 5 +++++ shell/platform/embedder/embedder_external_texture_gl.cc | 3 +++ shell/platform/embedder/embedder_external_texture_gl.h | 3 +++ 9 files changed, 21 insertions(+) diff --git a/flow/texture.cc b/flow/texture.cc index 7bc40f0c1d43b..93f843546bde8 100644 --- a/flow/texture.cc +++ b/flow/texture.cc @@ -15,6 +15,7 @@ void TextureRegistry::RegisterTexture(std::shared_ptr texture) { } void TextureRegistry::UnregisterTexture(int64_t id) { + mapping_[id]->OnUnregistered(); mapping_.erase(id); } diff --git a/flow/texture.h b/flow/texture.h index 749e3835b236a..8c931c1d61950 100644 --- a/flow/texture.h +++ b/flow/texture.h @@ -36,6 +36,8 @@ class Texture { // Called on GPU thread. virtual void MarkNewFrameAvailable() = 0; + virtual void OnUnregistered() = 0; + int64_t Id() { return id_; } private: diff --git a/shell/platform/android/android_external_texture_gl.cc b/shell/platform/android/android_external_texture_gl.cc index 935f60b455797..989e2c034bd7e 100644 --- a/shell/platform/android/android_external_texture_gl.cc +++ b/shell/platform/android/android_external_texture_gl.cc @@ -135,4 +135,6 @@ void AndroidExternalTextureGL::Detach() { } } +void AndroidExternalTextureGL::OnUnregistered() {} + } // namespace flutter diff --git a/shell/platform/android/android_external_texture_gl.h b/shell/platform/android/android_external_texture_gl.h index 9ce87b3255bd1..6e98721079321 100644 --- a/shell/platform/android/android_external_texture_gl.h +++ b/shell/platform/android/android_external_texture_gl.h @@ -30,6 +30,8 @@ class AndroidExternalTextureGL : public flutter::Texture { void MarkNewFrameAvailable() override; + void OnUnregistered() override; + private: void Attach(jint textureName); diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h index e7cd01337deb9..b33ad64e47358 100644 --- a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h +++ b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h @@ -15,6 +15,7 @@ NS_ASSUME_NONNULL_BEGIN FLUTTER_EXPORT @protocol FlutterTexture - (CVPixelBufferRef _Nullable)copyPixelBuffer; +- (void)onUnregistered; @end FLUTTER_EXPORT diff --git a/shell/platform/darwin/ios/ios_external_texture_gl.h b/shell/platform/darwin/ios/ios_external_texture_gl.h index 88be5cc7c466a..f778404ce4631 100644 --- a/shell/platform/darwin/ios/ios_external_texture_gl.h +++ b/shell/platform/darwin/ios/ios_external_texture_gl.h @@ -26,6 +26,8 @@ class IOSExternalTextureGL : public flutter::Texture { void MarkNewFrameAvailable() override; + void OnUnregistered() override; + private: void CreateTextureFromPixelBuffer(); diff --git a/shell/platform/darwin/ios/ios_external_texture_gl.mm b/shell/platform/darwin/ios/ios_external_texture_gl.mm index a5e729195ce34..fc2193c5be347 100644 --- a/shell/platform/darwin/ios/ios_external_texture_gl.mm +++ b/shell/platform/darwin/ios/ios_external_texture_gl.mm @@ -11,6 +11,7 @@ #include "flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" +#include "flutter/shell/platform/embedder/embedder_engine.h" namespace flutter { @@ -104,4 +105,8 @@ new_frame_ready_ = true; } +void IOSExternalTextureGL::OnUnregistered() { + [external_texture_ onUnregistered]; +} + } // namespace flutter diff --git a/shell/platform/embedder/embedder_external_texture_gl.cc b/shell/platform/embedder/embedder_external_texture_gl.cc index b9857ae4ee363..2cb700e31c53f 100644 --- a/shell/platform/embedder/embedder_external_texture_gl.cc +++ b/shell/platform/embedder/embedder_external_texture_gl.cc @@ -44,4 +44,7 @@ void EmbedderExternalTextureGL::OnGrContextDestroyed() {} // |flutter::Texture| void EmbedderExternalTextureGL::MarkNewFrameAvailable() {} +// |flutter::Texture| +void EmbedderExternalTextureGL::OnUnregistered() {} + } // namespace flutter diff --git a/shell/platform/embedder/embedder_external_texture_gl.h b/shell/platform/embedder/embedder_external_texture_gl.h index e1cd383c72f5a..a42c3afff18fd 100644 --- a/shell/platform/embedder/embedder_external_texture_gl.h +++ b/shell/platform/embedder/embedder_external_texture_gl.h @@ -41,6 +41,9 @@ class EmbedderExternalTextureGL : public flutter::Texture { // |flutter::Texture| void MarkNewFrameAvailable() override; + // |flutter::Texture| + void OnUnregistered() override; + FML_DISALLOW_COPY_AND_ASSIGN(EmbedderExternalTextureGL); }; From 9de6e23e316186572ffe6919a8c9860e524ee3cc Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 30 Sep 2019 08:32:29 -0700 Subject: [PATCH 03/11] remove import --- flow/BUILD.gn | 1 + flow/texture_unittests.cc | 49 +++++++++++++++++++ .../darwin/ios/ios_external_texture_gl.mm | 1 - 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 flow/texture_unittests.cc diff --git a/flow/BUILD.gn b/flow/BUILD.gn index 90975c05e6096..f031d099d0f8b 100644 --- a/flow/BUILD.gn +++ b/flow/BUILD.gn @@ -114,6 +114,7 @@ executable("flow_unittests") { "matrix_decomposition_unittests.cc", "mutators_stack_unittests.cc", "raster_cache_unittests.cc", + "texture_unittests.cc" ] deps = [ diff --git a/flow/texture_unittests.cc b/flow/texture_unittests.cc new file mode 100644 index 0000000000000..e7e6e66e9676d --- /dev/null +++ b/flow/texture_unittests.cc @@ -0,0 +1,49 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/flow/texture.h" +#include "gtest/gtest.h" + +//namespace flutter { +//namespace testing { +// +//class MockTexture : public flutter::Texture { +// public: +// MockTexture(); +// +// ~MockTexture() override = default; +// +// bool unregistered; +// +// // Called from GPU thread. +// void Paint(SkCanvas& canvas, const SkRect& bounds, bool freeze, GrContext* context) override { +// +// } +// +// void OnGrContextCreated() override { +// +// } +// +// void OnGrContextDestroyed() override { +// +// } +// +// void MarkNewFrameAvailable() override { +// +// } +// +// void OnUnregistered() override { +// unregistered = true; +// } +//}; +// +//TEST(TextureRegistry, UnregisterTextureCallbackTriggered) { +// TextureRegistry textureRegistry; +// std::shared_ptr mockTexture = std::make_shared(); +// textureRegistry.RegisterTexture(mockTexture); +// textureRegistry.UnregisterTexture(0); +// ASSERT_TRUE(mockTexture->unregistered); +//} +// +//} // namespace flutter diff --git a/shell/platform/darwin/ios/ios_external_texture_gl.mm b/shell/platform/darwin/ios/ios_external_texture_gl.mm index fc2193c5be347..54725d6abd092 100644 --- a/shell/platform/darwin/ios/ios_external_texture_gl.mm +++ b/shell/platform/darwin/ios/ios_external_texture_gl.mm @@ -11,7 +11,6 @@ #include "flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h" #include "third_party/skia/include/core/SkSurface.h" #include "third_party/skia/include/gpu/GrBackendSurface.h" -#include "flutter/shell/platform/embedder/embedder_engine.h" namespace flutter { From ef340fbd249a1b79833ec8d347543752ab42db30 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 30 Sep 2019 09:29:19 -0700 Subject: [PATCH 04/11] add documentation --- flow/texture.h | 1 + flow/texture_unittests.cc | 78 +++++++++---------- .../ios/framework/Headers/FlutterTexture.h | 6 ++ 3 files changed, 43 insertions(+), 42 deletions(-) diff --git a/flow/texture.h b/flow/texture.h index 8c931c1d61950..cbb8886643118 100644 --- a/flow/texture.h +++ b/flow/texture.h @@ -36,6 +36,7 @@ class Texture { // Called on GPU thread. virtual void MarkNewFrameAvailable() = 0; + // Called on GPU thread. virtual void OnUnregistered() = 0; int64_t Id() { return id_; } diff --git a/flow/texture_unittests.cc b/flow/texture_unittests.cc index e7e6e66e9676d..163fe034ebe38 100644 --- a/flow/texture_unittests.cc +++ b/flow/texture_unittests.cc @@ -5,45 +5,39 @@ #include "flutter/flow/texture.h" #include "gtest/gtest.h" -//namespace flutter { -//namespace testing { -// -//class MockTexture : public flutter::Texture { -// public: -// MockTexture(); -// -// ~MockTexture() override = default; -// -// bool unregistered; -// -// // Called from GPU thread. -// void Paint(SkCanvas& canvas, const SkRect& bounds, bool freeze, GrContext* context) override { -// -// } -// -// void OnGrContextCreated() override { -// -// } -// -// void OnGrContextDestroyed() override { -// -// } -// -// void MarkNewFrameAvailable() override { -// -// } -// -// void OnUnregistered() override { -// unregistered = true; -// } -//}; -// -//TEST(TextureRegistry, UnregisterTextureCallbackTriggered) { -// TextureRegistry textureRegistry; -// std::shared_ptr mockTexture = std::make_shared(); -// textureRegistry.RegisterTexture(mockTexture); -// textureRegistry.UnregisterTexture(0); -// ASSERT_TRUE(mockTexture->unregistered); -//} -// -//} // namespace flutter +namespace flutter { +namespace testing { + +class MockTexture : public Texture { + public: + MockTexture(int64_t textureId) : Texture(textureId) {} + + ~MockTexture() override = default; + + bool unregistered = false; + + // Called from GPU thread. + void Paint(SkCanvas& canvas, + const SkRect& bounds, + bool freeze, + GrContext* context) override {} + + void OnGrContextCreated() override {} + + void OnGrContextDestroyed() override {} + + void MarkNewFrameAvailable() override {} + + void OnUnregistered() override { unregistered = true; } +}; + +TEST(TextureRegistry, UnregisterTextureCallbackTriggered) { + TextureRegistry textureRegistry; + std::shared_ptr mockTexture = std::make_shared(0); + textureRegistry.RegisterTexture(mockTexture); + textureRegistry.UnregisterTexture(0); + ASSERT_TRUE(mockTexture->unregistered); +} + +} // namespace testing +} // namespace flutter diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h index b33ad64e47358..93c19db595eec 100644 --- a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h +++ b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h @@ -15,6 +15,12 @@ NS_ASSUME_NONNULL_BEGIN FLUTTER_EXPORT @protocol FlutterTexture - (CVPixelBufferRef _Nullable)copyPixelBuffer; + +/** + * Called when the texture is unregistered. + * + * Called on the GPU thread. + */ - (void)onUnregistered; @end From 2417658bed4c7179235428702ff600e96a5173f6 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 30 Sep 2019 09:34:55 -0700 Subject: [PATCH 05/11] Revert "wait for platform view appear" This reverts commit 7418e7e4a8208e1aa95bb98b4055e3b7bc95fec1. --- .../ScenariosUITests/PlatformViewUITests.m | 11 +---------- .../golden_platform_view_D321AP.png | Bin 98725 -> 0 bytes 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index e0982aaecd6e6..e0a929572b81e 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -24,21 +24,12 @@ - (void)setUp { } - (void)testPlatformView { - - XCUIElement *element = self.application.textViews.firstMatch; - BOOL exists = [element waitForExistenceWithTimeout:5]; - if (!exists) { - XCTFail(@"It took longer than 3 second to find the platform view." - @"There might be issues with the platform view's construction, - @"or with how the scenario is built."); - } - NSBundle* bundle = [NSBundle bundleForClass:[self class]]; NSString* goldenName = [NSString stringWithFormat:@"golden_platform_view_%@", [self platformName]]; NSString* path = [bundle pathForResource:goldenName ofType:@"png"]; UIImage* golden = [[UIImage alloc] initWithContentsOfFile:path]; - + XCUIScreenshot* screenshot = [[XCUIScreen mainScreen] screenshot]; XCTAttachment* attachment = [XCTAttachment attachmentWithScreenshot:screenshot]; attachment.lifetime = XCTAttachmentLifetimeKeepAlways; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_D321AP.png deleted file mode 100644 index 4dc639f672890b3b83cd086c0447617e21785cf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98725 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 Date: Mon, 30 Sep 2019 09:47:42 -0700 Subject: [PATCH 06/11] lisence golden fix, make onUnregistered optional --- ci/licenses_golden/licenses_flutter | 1 + flow/BUILD.gn | 2 +- shell/platform/darwin/ios/framework/Headers/FlutterTexture.h | 1 + shell/platform/darwin/ios/ios_external_texture_gl.mm | 4 +++- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 6b5b591b48f73..d403c60b1e289 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -82,6 +82,7 @@ FILE: ../../../flutter/flow/skia_gpu_object.cc FILE: ../../../flutter/flow/skia_gpu_object.h FILE: ../../../flutter/flow/texture.cc FILE: ../../../flutter/flow/texture.h +FILE: ../../../flutter/flow/texture_unittests.cc FILE: ../../../flutter/flow/view_holder.cc FILE: ../../../flutter/flow/view_holder.h FILE: ../../../flutter/fml/base32.cc diff --git a/flow/BUILD.gn b/flow/BUILD.gn index f031d099d0f8b..3ecc8381c5d33 100644 --- a/flow/BUILD.gn +++ b/flow/BUILD.gn @@ -114,7 +114,7 @@ executable("flow_unittests") { "matrix_decomposition_unittests.cc", "mutators_stack_unittests.cc", "raster_cache_unittests.cc", - "texture_unittests.cc" + "texture_unittests.cc", ] deps = [ diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h index 93c19db595eec..4633b1875d95c 100644 --- a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h +++ b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h @@ -21,6 +21,7 @@ FLUTTER_EXPORT * * Called on the GPU thread. */ +@optional - (void)onUnregistered; @end diff --git a/shell/platform/darwin/ios/ios_external_texture_gl.mm b/shell/platform/darwin/ios/ios_external_texture_gl.mm index 54725d6abd092..71686c4f3a312 100644 --- a/shell/platform/darwin/ios/ios_external_texture_gl.mm +++ b/shell/platform/darwin/ios/ios_external_texture_gl.mm @@ -105,7 +105,9 @@ } void IOSExternalTextureGL::OnUnregistered() { - [external_texture_ onUnregistered]; + if ([external_texture_ respondsToSelector:@selector(onUnregistered)]) { + [external_texture_ onUnregistered]; + } } } // namespace flutter From 2ab9edd2d25969248d11a568f096d4186bf6ec3a Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 30 Sep 2019 13:48:02 -0700 Subject: [PATCH 07/11] rename method --- flow/texture.cc | 2 +- flow/texture.h | 2 +- flow/texture_unittests.cc | 2 +- shell/platform/android/android_external_texture_gl.cc | 2 +- shell/platform/android/android_external_texture_gl.h | 2 +- .../platform/darwin/ios/framework/Headers/FlutterTexture.h | 2 +- shell/platform/darwin/ios/ios_external_texture_gl.h | 2 +- shell/platform/darwin/ios/ios_external_texture_gl.mm | 6 +++--- shell/platform/embedder/embedder_external_texture_gl.cc | 2 +- shell/platform/embedder/embedder_external_texture_gl.h | 2 +- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/flow/texture.cc b/flow/texture.cc index 93f843546bde8..6f25c6df89593 100644 --- a/flow/texture.cc +++ b/flow/texture.cc @@ -15,7 +15,7 @@ void TextureRegistry::RegisterTexture(std::shared_ptr texture) { } void TextureRegistry::UnregisterTexture(int64_t id) { - mapping_[id]->OnUnregistered(); + mapping_[id]->OnTextureUnregistered(); mapping_.erase(id); } diff --git a/flow/texture.h b/flow/texture.h index cbb8886643118..6e06445884b66 100644 --- a/flow/texture.h +++ b/flow/texture.h @@ -37,7 +37,7 @@ class Texture { virtual void MarkNewFrameAvailable() = 0; // Called on GPU thread. - virtual void OnUnregistered() = 0; + virtual void OnTextureUnregistered() = 0; int64_t Id() { return id_; } diff --git a/flow/texture_unittests.cc b/flow/texture_unittests.cc index 163fe034ebe38..138a3aec313ac 100644 --- a/flow/texture_unittests.cc +++ b/flow/texture_unittests.cc @@ -28,7 +28,7 @@ class MockTexture : public Texture { void MarkNewFrameAvailable() override {} - void OnUnregistered() override { unregistered = true; } + void OnTextureUnregistered() override { unregistered = true; } }; TEST(TextureRegistry, UnregisterTextureCallbackTriggered) { diff --git a/shell/platform/android/android_external_texture_gl.cc b/shell/platform/android/android_external_texture_gl.cc index 989e2c034bd7e..8c4f960b0f232 100644 --- a/shell/platform/android/android_external_texture_gl.cc +++ b/shell/platform/android/android_external_texture_gl.cc @@ -135,6 +135,6 @@ void AndroidExternalTextureGL::Detach() { } } -void AndroidExternalTextureGL::OnUnregistered() {} +void AndroidExternalTextureGL::OnTextureUnregistered() {} } // namespace flutter diff --git a/shell/platform/android/android_external_texture_gl.h b/shell/platform/android/android_external_texture_gl.h index 6e98721079321..4e2b187eb3f61 100644 --- a/shell/platform/android/android_external_texture_gl.h +++ b/shell/platform/android/android_external_texture_gl.h @@ -30,7 +30,7 @@ class AndroidExternalTextureGL : public flutter::Texture { void MarkNewFrameAvailable() override; - void OnUnregistered() override; + void OnTextureUnregistered() override; private: void Attach(jint textureName); diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h index 4633b1875d95c..bfb66b092a684 100644 --- a/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h +++ b/shell/platform/darwin/ios/framework/Headers/FlutterTexture.h @@ -22,7 +22,7 @@ FLUTTER_EXPORT * Called on the GPU thread. */ @optional -- (void)onUnregistered; +- (void)onTextureUnregistered:(NSObject*)texture; @end FLUTTER_EXPORT diff --git a/shell/platform/darwin/ios/ios_external_texture_gl.h b/shell/platform/darwin/ios/ios_external_texture_gl.h index f778404ce4631..33e2eee6f7deb 100644 --- a/shell/platform/darwin/ios/ios_external_texture_gl.h +++ b/shell/platform/darwin/ios/ios_external_texture_gl.h @@ -26,7 +26,7 @@ class IOSExternalTextureGL : public flutter::Texture { void MarkNewFrameAvailable() override; - void OnUnregistered() override; + void OnTextureUnregistered() override; private: void CreateTextureFromPixelBuffer(); diff --git a/shell/platform/darwin/ios/ios_external_texture_gl.mm b/shell/platform/darwin/ios/ios_external_texture_gl.mm index 71686c4f3a312..a2efe17c4e146 100644 --- a/shell/platform/darwin/ios/ios_external_texture_gl.mm +++ b/shell/platform/darwin/ios/ios_external_texture_gl.mm @@ -104,9 +104,9 @@ new_frame_ready_ = true; } -void IOSExternalTextureGL::OnUnregistered() { - if ([external_texture_ respondsToSelector:@selector(onUnregistered)]) { - [external_texture_ onUnregistered]; +void IOSExternalTextureGL::OnTextureUnregistered() { + if ([external_texture_ respondsToSelector:@selector(onTextureUnregistered:)]) { + [external_texture_ onTextureUnregistered:external_texture_]; } } diff --git a/shell/platform/embedder/embedder_external_texture_gl.cc b/shell/platform/embedder/embedder_external_texture_gl.cc index 2cb700e31c53f..e170654bbd9cf 100644 --- a/shell/platform/embedder/embedder_external_texture_gl.cc +++ b/shell/platform/embedder/embedder_external_texture_gl.cc @@ -45,6 +45,6 @@ void EmbedderExternalTextureGL::OnGrContextDestroyed() {} void EmbedderExternalTextureGL::MarkNewFrameAvailable() {} // |flutter::Texture| -void EmbedderExternalTextureGL::OnUnregistered() {} +void EmbedderExternalTextureGL::OnTextureUnregistered() {} } // namespace flutter diff --git a/shell/platform/embedder/embedder_external_texture_gl.h b/shell/platform/embedder/embedder_external_texture_gl.h index a42c3afff18fd..e696ebf9eb08e 100644 --- a/shell/platform/embedder/embedder_external_texture_gl.h +++ b/shell/platform/embedder/embedder_external_texture_gl.h @@ -42,7 +42,7 @@ class EmbedderExternalTextureGL : public flutter::Texture { void MarkNewFrameAvailable() override; // |flutter::Texture| - void OnUnregistered() override; + void OnTextureUnregistered() override; FML_DISALLOW_COPY_AND_ASSIGN(EmbedderExternalTextureGL); }; From 1e0a9c5c56a06b87b2b87f2ea97296b3279e2cbf Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Tue, 1 Oct 2019 13:07:34 -0700 Subject: [PATCH 08/11] review fixes --- flow/texture_unittests.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/flow/texture_unittests.cc b/flow/texture_unittests.cc index 138a3aec313ac..d292e3965af87 100644 --- a/flow/texture_unittests.cc +++ b/flow/texture_unittests.cc @@ -14,8 +14,6 @@ class MockTexture : public Texture { ~MockTexture() override = default; - bool unregistered = false; - // Called from GPU thread. void Paint(SkCanvas& canvas, const SkRect& bounds, @@ -28,7 +26,12 @@ class MockTexture : public Texture { void MarkNewFrameAvailable() override {} - void OnTextureUnregistered() override { unregistered = true; } + void OnTextureUnregistered() override { unregistered_ = true; } + + bool unregistered() { return unregistered_; } + + private: + bool unregistered_ = false; }; TEST(TextureRegistry, UnregisterTextureCallbackTriggered) { @@ -36,7 +39,7 @@ TEST(TextureRegistry, UnregisterTextureCallbackTriggered) { std::shared_ptr mockTexture = std::make_shared(0); textureRegistry.RegisterTexture(mockTexture); textureRegistry.UnregisterTexture(0); - ASSERT_TRUE(mockTexture->unregistered); + ASSERT_TRUE(mockTexture->unregistered()); } } // namespace testing From 11e3847248e34c803766c54ee174d4f4e558a376 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 3 Oct 2019 09:55:26 -0700 Subject: [PATCH 09/11] change texture test to mm --- flow/{texture_unittests.cc => texture_unittests.mm} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename flow/{texture_unittests.cc => texture_unittests.mm} (100%) diff --git a/flow/texture_unittests.cc b/flow/texture_unittests.mm similarity index 100% rename from flow/texture_unittests.cc rename to flow/texture_unittests.mm From 01d6d09a4beb15ac47a1355d7b0b8546e1b7f831 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 14:47:02 -0700 Subject: [PATCH 10/11] add texture testing in shell_unittest --- ...ture_unittests.mm => texture_unittests.cc} | 0 shell/common/shell_unittests.cc | 75 +++++++++++++++++++ 2 files changed, 75 insertions(+) rename flow/{texture_unittests.mm => texture_unittests.cc} (100%) diff --git a/flow/texture_unittests.mm b/flow/texture_unittests.cc similarity index 100% rename from flow/texture_unittests.mm rename to flow/texture_unittests.cc diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index 6968cf72994a4..6ee49efa332c7 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -799,5 +799,80 @@ TEST_F(ShellTest, CanCreateImagefromDecompressedBytes) { latch.Wait(); } +class MockTexture : public Texture { + public: + MockTexture(int64_t textureId, std::shared_ptr latch) : + Texture(textureId), + latch_(latch) {} + + ~MockTexture() override = default; + + // Called from GPU thread. + void Paint(SkCanvas& canvas, + const SkRect& bounds, + bool freeze, + GrContext* context) override {} + + void OnGrContextCreated() override {} + + void OnGrContextDestroyed() override {} + + void MarkNewFrameAvailable() override { + frames_available_ ++; + latch_->Signal(); + } + + void OnTextureUnregistered() override { + unregistered_ = true; + latch_->Signal(); + } + + bool unregistered() { return unregistered_; } + int frames_available() { return frames_available_; } + + private: + bool unregistered_ = false; + int frames_available_ = 0; + std::shared_ptr latch_; +}; + +TEST_F(ShellTest, TextureFrameMarkedAvailableAndUnregister) { + Settings settings = CreateSettingsForFixture(); + auto configuration = RunConfiguration::InferFromSettings(settings); + auto task_runner = CreateNewThread(); + TaskRunners task_runners("test", task_runner, task_runner, task_runner, + task_runner); + std::unique_ptr shell = + CreateShell(std::move(settings), std::move(task_runners)); + + ASSERT_TRUE(ValidateShell(shell.get())); + PlatformViewNotifyCreated(shell.get()); + + RunEngine(shell.get(), std::move(configuration)); + + std::shared_ptr latch = std::make_shared(); + + std::shared_ptr mockTexture = std::make_shared(0, latch); + + fml::TaskRunner::RunNowOrPostTask( + shell->GetTaskRunners().GetGPUTaskRunner(), [&]() { + shell->GetPlatformView()->RegisterTexture(mockTexture); + shell->GetPlatformView()->MarkTextureFrameAvailable(0); + }); + latch->Wait(); + + EXPECT_EQ(mockTexture->frames_available(), + 1); + + fml::TaskRunner::RunNowOrPostTask( + shell->GetTaskRunners().GetGPUTaskRunner(), [&]() { + shell->GetPlatformView()->UnregisterTexture(0); + }); + latch->Wait(); + + EXPECT_EQ(mockTexture->unregistered(), + true); +} + } // namespace testing } // namespace flutter From 04059b328181c77f36b6aa30936e4851b6fae5cc Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 7 Oct 2019 15:18:15 -0700 Subject: [PATCH 11/11] formatting --- shell/common/shell_unittests.cc | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/shell/common/shell_unittests.cc b/shell/common/shell_unittests.cc index 6ee49efa332c7..1871f4ea0818a 100644 --- a/shell/common/shell_unittests.cc +++ b/shell/common/shell_unittests.cc @@ -801,9 +801,9 @@ TEST_F(ShellTest, CanCreateImagefromDecompressedBytes) { class MockTexture : public Texture { public: - MockTexture(int64_t textureId, std::shared_ptr latch) : - Texture(textureId), - latch_(latch) {} + MockTexture(int64_t textureId, + std::shared_ptr latch) + : Texture(textureId), latch_(latch) {} ~MockTexture() override = default; @@ -818,7 +818,7 @@ class MockTexture : public Texture { void OnGrContextDestroyed() override {} void MarkNewFrameAvailable() override { - frames_available_ ++; + frames_available_++; latch_->Signal(); } @@ -833,7 +833,7 @@ class MockTexture : public Texture { private: bool unregistered_ = false; int frames_available_ = 0; - std::shared_ptr latch_; + std::shared_ptr latch_; }; TEST_F(ShellTest, TextureFrameMarkedAvailableAndUnregister) { @@ -850,9 +850,11 @@ TEST_F(ShellTest, TextureFrameMarkedAvailableAndUnregister) { RunEngine(shell.get(), std::move(configuration)); - std::shared_ptr latch = std::make_shared(); + std::shared_ptr latch = + std::make_shared(); - std::shared_ptr mockTexture = std::make_shared(0, latch); + std::shared_ptr mockTexture = + std::make_shared(0, latch); fml::TaskRunner::RunNowOrPostTask( shell->GetTaskRunners().GetGPUTaskRunner(), [&]() { @@ -861,17 +863,14 @@ TEST_F(ShellTest, TextureFrameMarkedAvailableAndUnregister) { }); latch->Wait(); - EXPECT_EQ(mockTexture->frames_available(), - 1); + EXPECT_EQ(mockTexture->frames_available(), 1); fml::TaskRunner::RunNowOrPostTask( - shell->GetTaskRunners().GetGPUTaskRunner(), [&]() { - shell->GetPlatformView()->UnregisterTexture(0); - }); + shell->GetTaskRunners().GetGPUTaskRunner(), + [&]() { shell->GetPlatformView()->UnregisterTexture(0); }); latch->Wait(); - EXPECT_EQ(mockTexture->unregistered(), - true); + EXPECT_EQ(mockTexture->unregistered(), true); } } // namespace testing