@@ -25,6 +25,18 @@ typedef void (*fp_AHardwareBuffer_describe)(AHardwareBuffer* buffer,
2525typedef void (*fp_AHardwareBuffer_getId)(AHardwareBuffer* buffer,
2626 uint64_t * outId);
2727
28+ typedef bool (*fp_ATrace_isEnabled)(void );
29+
30+ typedef AChoreographer* (*fp_AChoreographer_getInstance)(void );
31+ typedef void (*fp_AChoreographer_postFrameCallback)(
32+ AChoreographer* choreographer,
33+ AChoreographer_frameCallback callbackk,
34+ void * data);
35+ typedef void (*fp_AChoreographer_postFrameCallback64)(
36+ AChoreographer* choreographer,
37+ AChoreographer_frameCallback64 callbackk,
38+ void * data);
39+
2840typedef EGLClientBuffer (*fp_eglGetNativeClientBufferANDROID)(
2941 AHardwareBuffer* buffer);
3042
@@ -37,6 +49,17 @@ void (*_AHardwareBuffer_describe)(AHardwareBuffer* buffer,
3749 AHardwareBuffer_Desc* desc) = nullptr ;
3850void (*_AHardwareBuffer_getId)(AHardwareBuffer* buffer,
3951 uint64_t * outId) = nullptr ;
52+ bool (*_ATrace_isEnabled)() = nullptr ;
53+ AChoreographer* (*_AChoreographer_getInstance)() = nullptr ;
54+ void (*_AChoreographer_postFrameCallback)(
55+ AChoreographer* choreographer,
56+ AChoreographer_frameCallback callbackk,
57+ void * data) = nullptr ;
58+ void (*_AChoreographer_postFrameCallback64)(
59+ AChoreographer* choreographer,
60+ AChoreographer_frameCallback64 callbackk,
61+ void * data) = nullptr ;
62+
4063EGLClientBuffer (*_eglGetNativeClientBufferANDROID)(AHardwareBuffer* buffer) =
4164 nullptr ;
4265
@@ -75,6 +98,32 @@ void InitOnceCallback() {
7598 ->ResolveFunction <fp_AHardwareBuffer_describe>(
7699 " AHardwareBuffer_describe" )
77100 .value_or (nullptr );
101+
102+ _ATrace_isEnabled =
103+ android->ResolveFunction <fp_ATrace_isEnabled>(" ATrace_isEnabled" )
104+ .value_or (nullptr );
105+
106+ _AChoreographer_getInstance =
107+ android
108+ ->ResolveFunction <fp_AChoreographer_getInstance>(
109+ " AChoreographer_getInstance" )
110+ .value_or (nullptr );
111+ if (_AChoreographer_getInstance) {
112+ _AChoreographer_postFrameCallback64 =
113+ android
114+ ->ResolveFunction <fp_AChoreographer_postFrameCallback64>(
115+ " AChoreographer_postFrameCallback64" )
116+ .value_or (nullptr );
117+ #if FML_ARCH_CPU_64_BITS
118+ if (!_AChoreographer_postFrameCallback64) {
119+ _AChoreographer_postFrameCallback =
120+ android
121+ ->ResolveFunction <fp_AChoreographer_postFrameCallback>(
122+ " AChoreographer_postFrameCallback" )
123+ .value_or (nullptr );
124+ }
125+ #endif
126+ }
78127}
79128
80129} // namespace
@@ -83,42 +132,74 @@ void NDKHelpers::Init() {
83132 std::call_once (init_once, InitOnceCallback);
84133}
85134
135+ bool NDKHelpers::ATrace_isEnabled () {
136+ if (_ATrace_isEnabled) {
137+ return _ATrace_isEnabled ();
138+ }
139+ return false ;
140+ }
141+
142+ ChoreographerSupportStatus NDKHelpers::ChoreographerSupported () {
143+ if (_AChoreographer_postFrameCallback64) {
144+ return ChoreographerSupportStatus::kSupported64 ;
145+ }
146+ if (_AChoreographer_postFrameCallback) {
147+ return ChoreographerSupportStatus::kSupported32 ;
148+ }
149+ return ChoreographerSupportStatus::kUnsupported ;
150+ }
151+
152+ AChoreographer* NDKHelpers::AChoreographer_getInstance () {
153+ FML_CHECK (_AChoreographer_getInstance);
154+ return _AChoreographer_getInstance ();
155+ }
156+
157+ void NDKHelpers::AChoreographer_postFrameCallback (
158+ AChoreographer* choreographer,
159+ AChoreographer_frameCallback callback,
160+ void * data) {
161+ FML_CHECK (_AChoreographer_postFrameCallback);
162+ return _AChoreographer_postFrameCallback (choreographer, callback, data);
163+ }
164+
165+ void NDKHelpers::AChoreographer_postFrameCallback64 (
166+ AChoreographer* choreographer,
167+ AChoreographer_frameCallback64 callback,
168+ void * data) {
169+ FML_CHECK (_AChoreographer_postFrameCallback64);
170+ return _AChoreographer_postFrameCallback64 (choreographer, callback, data);
171+ }
172+
86173bool NDKHelpers::HardwareBufferSupported () {
87- NDKHelpers::Init ();
88174 const bool r = _AHardwareBuffer_fromHardwareBuffer != nullptr ;
89175 return r;
90176}
91177
92178AHardwareBuffer* NDKHelpers::AHardwareBuffer_fromHardwareBuffer (
93179 JNIEnv* env,
94180 jobject hardwareBufferObj) {
95- NDKHelpers::Init ();
96181 FML_CHECK (_AHardwareBuffer_fromHardwareBuffer != nullptr );
97182 return _AHardwareBuffer_fromHardwareBuffer (env, hardwareBufferObj);
98183}
99184
100185void NDKHelpers::AHardwareBuffer_acquire (AHardwareBuffer* buffer) {
101- NDKHelpers::Init ();
102186 FML_CHECK (_AHardwareBuffer_acquire != nullptr );
103187 _AHardwareBuffer_acquire (buffer);
104188}
105189
106190void NDKHelpers::AHardwareBuffer_release (AHardwareBuffer* buffer) {
107- NDKHelpers::Init ();
108191 FML_CHECK (_AHardwareBuffer_release != nullptr );
109192 _AHardwareBuffer_release (buffer);
110193}
111194
112195void NDKHelpers::AHardwareBuffer_describe (AHardwareBuffer* buffer,
113196 AHardwareBuffer_Desc* desc) {
114- NDKHelpers::Init ();
115197 FML_CHECK (_AHardwareBuffer_describe != nullptr );
116198 _AHardwareBuffer_describe (buffer, desc);
117199}
118200
119201std::optional<HardwareBufferKey> NDKHelpers::AHardwareBuffer_getId (
120202 AHardwareBuffer* buffer) {
121- NDKHelpers::Init ();
122203 if (_AHardwareBuffer_getId == nullptr ) {
123204 return std::nullopt ;
124205 }
@@ -129,7 +210,6 @@ std::optional<HardwareBufferKey> NDKHelpers::AHardwareBuffer_getId(
129210
130211EGLClientBuffer NDKHelpers::eglGetNativeClientBufferANDROID (
131212 AHardwareBuffer* buffer) {
132- NDKHelpers::Init ();
133213 FML_CHECK (_eglGetNativeClientBufferANDROID != nullptr );
134214 return _eglGetNativeClientBufferANDROID (buffer);
135215}
0 commit comments