| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ui/gfx/android/achoreographer_compat.h" |
| |
| #include <dlfcn.h> |
| |
| #include "base/android/build_info.h" |
| #include "base/logging.h" |
| |
| #define LOAD_FUNCTION(lib, func) \ |
| do { \ |
| func##Fn = reinterpret_cast<p##func>(dlsym(lib, #func)); \ |
| if (!func##Fn) { \ |
| supported = false; \ |
| LOG(ERROR) << "Unable to load function " << #func; \ |
| } \ |
| } while (0) |
| |
| namespace gfx { |
| |
| // static |
| const AChoreographerCompat& AChoreographerCompat::Get() { |
| static AChoreographerCompat instance; |
| return instance; |
| } |
| |
| AChoreographerCompat::AChoreographerCompat() { |
| void* main_dl_handle = dlopen("libandroid.so", RTLD_NOW); |
| if (!main_dl_handle) { |
| LOG(ERROR) << "Couldnt load libandroid.so"; |
| supported = false; |
| return; |
| } |
| |
| LOAD_FUNCTION(main_dl_handle, AChoreographer_getInstance); |
| LOAD_FUNCTION(main_dl_handle, AChoreographer_postFrameCallback64); |
| LOAD_FUNCTION(main_dl_handle, AChoreographer_registerRefreshRateCallback); |
| LOAD_FUNCTION(main_dl_handle, AChoreographer_unregisterRefreshRateCallback); |
| } |
| |
| // static |
| const AChoreographerCompat33& AChoreographerCompat33::Get() { |
| static AChoreographerCompat33 instance; |
| return instance; |
| } |
| |
| AChoreographerCompat33::AChoreographerCompat33() { |
| if (!base::android::BuildInfo::GetInstance()->is_at_least_t()) { |
| supported = false; |
| return; |
| } |
| |
| void* main_dl_handle = dlopen("libandroid.so", RTLD_NOW); |
| if (!main_dl_handle) { |
| LOG(ERROR) << "Couldnt load libandroid.so"; |
| supported = false; |
| return; |
| } |
| |
| LOAD_FUNCTION(main_dl_handle, AChoreographer_postVsyncCallback); |
| LOAD_FUNCTION(main_dl_handle, |
| AChoreographerFrameCallbackData_getFrameTimeNanos); |
| LOAD_FUNCTION(main_dl_handle, |
| AChoreographerFrameCallbackData_getFrameTimelinesLength); |
| LOAD_FUNCTION(main_dl_handle, |
| AChoreographerFrameCallbackData_getPreferredFrameTimelineIndex); |
| LOAD_FUNCTION(main_dl_handle, |
| AChoreographerFrameCallbackData_getFrameTimelineVsyncId); |
| LOAD_FUNCTION( |
| main_dl_handle, |
| AChoreographerFrameCallbackData_getFrameTimelineExpectedPresentationTimeNanos); |
| LOAD_FUNCTION(main_dl_handle, |
| AChoreographerFrameCallbackData_getFrameTimelineDeadlineNanos); |
| } |
| |
| } // namespace gfx |