From e2f78e96f9ca6523085151ee402438386448abae Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 12 Feb 2024 20:54:25 -0800 Subject: [PATCH 1/2] Do not use AChoreographer on 32 bit devices --- fml/platform/android/ndk_helpers.cc | 6 ++++++ fml/platform/android/ndk_helpers_unittests.cc | 14 ++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/fml/platform/android/ndk_helpers.cc b/fml/platform/android/ndk_helpers.cc index 67267435a82c4..1fcc49b0146b9 100644 --- a/fml/platform/android/ndk_helpers.cc +++ b/fml/platform/android/ndk_helpers.cc @@ -100,9 +100,15 @@ void InitOnceCallback() { LOOKUP(android, AChoreographer_getInstance); if (_AChoreographer_getInstance) { LOOKUP(android, AChoreographer_postFrameCallback64); +// See discussion at +// https://github.com/flutter/engine/pull/31859#discussion_r822072987 +// This method is not suitable for Flutter's use cases on 32 bit architectures, +// and we should fall back to the Java based Choreographer. +#if FML_ARCH_CPU_64_BITS if (!_AChoreographer_postFrameCallback64) { LOOKUP(android, AChoreographer_postFrameCallback); } +#endif } LOOKUP(android, ASurfaceControl_createFromWindow); diff --git a/fml/platform/android/ndk_helpers_unittests.cc b/fml/platform/android/ndk_helpers_unittests.cc index e6cab428cdbc8..df7c7a32fe919 100644 --- a/fml/platform/android/ndk_helpers_unittests.cc +++ b/fml/platform/android/ndk_helpers_unittests.cc @@ -26,6 +26,7 @@ TEST_F(NdkHelpersTest, ATrace) { EXPECT_FALSE(NDKHelpers::ATrace_isEnabled()); } +#if FML_ARCH_CPU_64_BITS TEST_F(NdkHelpersTest, AChoreographer32) { if (android_get_device_api_level() >= 29) { GTEST_SKIP() << "This test is for less than API 29."; @@ -43,6 +44,19 @@ TEST_F(NdkHelpersTest, AChoreographer32) { NDKHelpers::AChoreographer_postFrameCallback( NDKHelpers::AChoreographer_getInstance(), &OnVsync32, nullptr); } +#else +TEST_F(NdkHelpersTest, AChoreographer32_NotSupported) { + if (android_get_device_api_level() >= 29) { + GTEST_SKIP() << "This test is for less than API 29."; + } + + // The 32 bit framecallback on 32 bit architectures does not deliver + // sufficient resolution. See + // https://github.com/flutter/engine/pull/31859#discussion_r822072987 + EXPECT_EQ(NDKHelpers::ChoreographerSupported(), + ChoreographerSupportStatus::kUnsupported); +} +#endif // FML_ARCH_CPU_64_BITS TEST_F(NdkHelpersTest, AChoreographer64) { if (android_get_device_api_level() < 29) { From ef44944064222d210b6a6960568a3038e9798d1f Mon Sep 17 00:00:00 2001 From: Jonah Williams Date: Tue, 13 Feb 2024 08:55:09 -0800 Subject: [PATCH 2/2] Update ndk_helpers_unittests.cc --- fml/platform/android/ndk_helpers_unittests.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fml/platform/android/ndk_helpers_unittests.cc b/fml/platform/android/ndk_helpers_unittests.cc index df7c7a32fe919..dfcd528d9072a 100644 --- a/fml/platform/android/ndk_helpers_unittests.cc +++ b/fml/platform/android/ndk_helpers_unittests.cc @@ -45,7 +45,7 @@ TEST_F(NdkHelpersTest, AChoreographer32) { NDKHelpers::AChoreographer_getInstance(), &OnVsync32, nullptr); } #else -TEST_F(NdkHelpersTest, AChoreographer32_NotSupported) { +TEST_F(NdkHelpersTest, AChoreographer32NotSupported) { if (android_get_device_api_level() >= 29) { GTEST_SKIP() << "This test is for less than API 29."; }