| // 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/shell/platform/android/android_choreographer.h" | |
| #include "flutter/fml/native_library.h" | |
| // Only avialalbe on API 24+ | |
| typedef void AChoreographer; | |
| // Only available on API 29+ or API 24+ if the architecture is 64-bit. | |
| typedef void (*AChoreographer_frameCallback)(int64_t frameTimeNanos, | |
| void* data); | |
| // Only avialalbe on API 24+ | |
| typedef AChoreographer* (*AChoreographer_getInstance_FPN)(); | |
| typedef void (*AChoreographer_postFrameCallback_FPN)( | |
| AChoreographer* choreographer, | |
| AChoreographer_frameCallback callback, | |
| void* data); | |
| static AChoreographer_getInstance_FPN AChoreographer_getInstance; | |
| static AChoreographer_postFrameCallback_FPN AChoreographer_postFrameCallback; | |
| namespace flutter { | |
| bool AndroidChoreographer::ShouldUseNDKChoreographer() { | |
| static std::optional<bool> use_ndk_choreographer; | |
| if (use_ndk_choreographer) { | |
| return use_ndk_choreographer.value(); | |
| } | |
| auto libandroid = fml::NativeLibrary::Create("libandroid.so"); | |
| FML_DCHECK(libandroid); | |
| auto get_instance_fn = | |
| libandroid->ResolveFunction<AChoreographer_getInstance_FPN>( | |
| "AChoreographer_getInstance"); | |
| auto post_frame_callback_fn = | |
| libandroid->ResolveFunction<AChoreographer_postFrameCallback_FPN>( | |
| "AChoreographer_postFrameCallback64"); | |
| #if FML_ARCH_CPU_64_BITS | |
| if (!post_frame_callback_fn) { | |
| post_frame_callback_fn = | |
| libandroid->ResolveFunction<AChoreographer_postFrameCallback_FPN>( | |
| "AChoreographer_postFrameCallback"); | |
| } | |
| #endif | |
| if (get_instance_fn && post_frame_callback_fn) { | |
| AChoreographer_getInstance = get_instance_fn.value(); | |
| AChoreographer_postFrameCallback = post_frame_callback_fn.value(); | |
| use_ndk_choreographer = true; | |
| } else { | |
| use_ndk_choreographer = false; | |
| } | |
| return use_ndk_choreographer.value(); | |
| } | |
| void AndroidChoreographer::PostFrameCallback(OnFrameCallback callback, | |
| void* data) { | |
| AChoreographer* choreographer = AChoreographer_getInstance(); | |
| AChoreographer_postFrameCallback(choreographer, callback, data); | |
| } | |
| } // namespace flutter |