blob: b743f491e4eaea49d45538e4f788c7470c74f995 [file] [log] [blame]
Michael Wrightf5eee402015-12-07 15:26:38 -05001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/**
18 * @addtogroup Choreographer
19 * @{
20 */
21
22/**
23 * @file choreographer.h
24 */
25
26#ifndef ANDROID_CHOREOGRAPHER_H
27#define ANDROID_CHOREOGRAPHER_H
28
Santos Cordon908d0082019-02-20 18:08:02 +000029#include <stdint.h>
Michael Wrightfb911b22016-01-26 16:05:54 -080030#include <sys/cdefs.h>
31
Michael Wrightf5eee402015-12-07 15:26:38 -050032__BEGIN_DECLS
33
34struct AChoreographer;
gfan7fed43d2021-04-06 18:50:06 -070035/**
36 * Opaque type that provides access to an AChoreographer object.
37 *
38 * A pointer can be obtained using {@link AChoreographer_getInstance()}.
39 */
Michael Wrightf5eee402015-12-07 15:26:38 -050040typedef struct AChoreographer AChoreographer;
41
42/**
43 * Prototype of the function that is called when a new frame is being rendered.
44 * It's passed the time that the frame is being rendered as nanoseconds in the
45 * CLOCK_MONOTONIC time base, as well as the data pointer provided by the
46 * application that registered a callback. All callbacks that run as part of
47 * rendering a frame will observe the same frame time, so it should be used
48 * whenever events need to be synchronized (e.g. animations).
49 */
50typedef void (*AChoreographer_frameCallback)(long frameTimeNanos, void* data);
51
Santos Cordon908d0082019-02-20 18:08:02 +000052/**
53 * Prototype of the function that is called when a new frame is being rendered.
54 * It's passed the time that the frame is being rendered as nanoseconds in the
55 * CLOCK_MONOTONIC time base, as well as the data pointer provided by the
56 * application that registered a callback. All callbacks that run as part of
57 * rendering a frame will observe the same frame time, so it should be used
58 * whenever events need to be synchronized (e.g. animations).
59 */
60typedef void (*AChoreographer_frameCallback64)(int64_t frameTimeNanos, void* data);
61
Alec Mouri33682e92020-01-10 15:11:15 -080062/**
63 * Prototype of the function that is called when the display refresh rate
64 * changes. It's passed the new vsync period in nanoseconds, as well as the data
65 * pointer provided by the application that registered a callback.
66 */
67typedef void (*AChoreographer_refreshRateCallback)(int64_t vsyncPeriodNanos, void* data);
68
Michael Wrightf5eee402015-12-07 15:26:38 -050069/**
70 * Get the AChoreographer instance for the current thread. This must be called
71 * on an ALooper thread.
Elliott Hughes3d70e532019-10-29 08:59:39 -070072 *
73 * Available since API level 24.
Michael Wrightf5eee402015-12-07 15:26:38 -050074 */
Elliott Hughes9db409b2018-06-18 12:28:46 -070075AChoreographer* AChoreographer_getInstance() __INTRODUCED_IN(24);
Michael Wrightf5eee402015-12-07 15:26:38 -050076
77/**
Santos Cordon908d0082019-02-20 18:08:02 +000078 * Deprecated: Use AChoreographer_postFrameCallback64 instead.
Michael Wrightf5eee402015-12-07 15:26:38 -050079 */
80void AChoreographer_postFrameCallback(AChoreographer* choreographer,
Alec Mouri271de042020-04-27 22:38:19 -070081 AChoreographer_frameCallback callback, void* data)
82 __INTRODUCED_IN(24) __DEPRECATED_IN(29);
Elliott Hughes9db409b2018-06-18 12:28:46 -070083
Michael Wrightf5eee402015-12-07 15:26:38 -050084/**
Santos Cordon908d0082019-02-20 18:08:02 +000085 * Deprecated: Use AChoreographer_postFrameCallbackDelayed64 instead.
Michael Wrightf5eee402015-12-07 15:26:38 -050086 */
87void AChoreographer_postFrameCallbackDelayed(AChoreographer* choreographer,
Alec Mouri271de042020-04-27 22:38:19 -070088 AChoreographer_frameCallback callback, void* data,
89 long delayMillis) __INTRODUCED_IN(24)
90 __DEPRECATED_IN(29);
Dan Albert494ed552016-09-23 15:57:45 -070091
Santos Cordon908d0082019-02-20 18:08:02 +000092/**
93 * Power a callback to be run on the next frame. The data pointer provided will
94 * be passed to the callback function when it's called.
Elliott Hughes3d70e532019-10-29 08:59:39 -070095 *
96 * Available since API level 29.
Santos Cordon908d0082019-02-20 18:08:02 +000097 */
Dillon Cower20e67fa2019-07-30 15:39:54 -070098void AChoreographer_postFrameCallback64(AChoreographer* choreographer,
Alec Mouri271de042020-04-27 22:38:19 -070099 AChoreographer_frameCallback64 callback, void* data)
100 __INTRODUCED_IN(29);
Santos Cordon908d0082019-02-20 18:08:02 +0000101
102/**
103 * Post a callback to be run on the frame following the specified delay. The
104 * data pointer provided will be passed to the callback function when it's
105 * called.
Elliott Hughes3d70e532019-10-29 08:59:39 -0700106 *
107 * Available since API level 29.
Santos Cordon908d0082019-02-20 18:08:02 +0000108 */
109void AChoreographer_postFrameCallbackDelayed64(AChoreographer* choreographer,
Alec Mouri271de042020-04-27 22:38:19 -0700110 AChoreographer_frameCallback64 callback, void* data,
111 uint32_t delayMillis) __INTRODUCED_IN(29);
Santos Cordon908d0082019-02-20 18:08:02 +0000112
Alec Mouri33682e92020-01-10 15:11:15 -0800113/**
114 * Registers a callback to be run when the display refresh rate changes. The
115 * data pointer provided will be passed to the callback function when it's
116 * called. The same callback may be registered multiple times, provided that a
117 * different data pointer is provided each time.
118 *
119 * If an application registers a callback for this choreographer instance when
120 * no new callbacks were previously registered, that callback is guaranteed to
121 * be dispatched. However, if the callback and associated data pointer are
122 * unregistered prior to running the callback, then the callback may be silently
123 * dropped.
124 *
125 * This api is thread-safe. Any thread is allowed to register a new refresh
126 * rate callback for the choreographer instance.
Elliott Hughes7be0e2d2020-06-02 13:05:04 -0700127 *
Alec Mouri4a331652020-07-20 22:05:24 +0000128 * Note that in API level 30, this api is not guaranteed to be atomic with
129 * DisplayManager. That is, calling Display#getRefreshRate very soon after
130 * a refresh rate callback is invoked may return a stale refresh rate. If any
131 * Display properties would be required by this callback, then it is recommended
132 * to listen directly to DisplayManager.DisplayListener#onDisplayChanged events
133 * instead.
134 *
Alec Mouri7015fa92021-02-11 19:31:44 +0000135 * As of API level 31, this api is guaranteed to have a consistent view with DisplayManager;
136 * Display#getRefreshRate is guaranteed to not return a stale refresh rate when invoked from this
137 * callback.
138 *
Elliott Hughes7be0e2d2020-06-02 13:05:04 -0700139 * Available since API level 30.
Alec Mouri33682e92020-01-10 15:11:15 -0800140 */
141void AChoreographer_registerRefreshRateCallback(AChoreographer* choreographer,
Elliott Hughes7be0e2d2020-06-02 13:05:04 -0700142 AChoreographer_refreshRateCallback, void* data)
143 __INTRODUCED_IN(30);
Alec Mouri33682e92020-01-10 15:11:15 -0800144
145/**
146 * Unregisters a callback to be run when the display refresh rate changes, along
147 * with the data pointer previously provided when registering the callback. The
148 * callback is only unregistered when the data pointer matches one that was
149 * previously registered.
150 *
151 * This api is thread-safe. Any thread is allowed to unregister an existing
152 * refresh rate callback for the choreographer instance. When a refresh rate
153 * callback and associated data pointer are unregistered, then there is a
154 * guarantee that when the unregistration completes that that callback will not
155 * be run with the data pointer passed.
Elliott Hughes7be0e2d2020-06-02 13:05:04 -0700156 *
157 * Available since API level 30.
Alec Mouri33682e92020-01-10 15:11:15 -0800158 */
159void AChoreographer_unregisterRefreshRateCallback(AChoreographer* choreographer,
Elliott Hughes7be0e2d2020-06-02 13:05:04 -0700160 AChoreographer_refreshRateCallback, void* data)
161 __INTRODUCED_IN(30);
Alec Mouri33682e92020-01-10 15:11:15 -0800162
Michael Wrightf5eee402015-12-07 15:26:38 -0500163__END_DECLS
164
165#endif // ANDROID_CHOREOGRAPHER_H
166
167/** @} */