dvr_api.h revision 45516aab4012fb8eec77b09f20d84d470e6aa8a6
1#ifndef ANDROID_DVR_API_H_
2#define ANDROID_DVR_API_H_
3
4#include <stdbool.h>
5#include <stddef.h>
6#include <stdint.h>
7#include <unistd.h>
8#include <cstdio>
9
10#include <dvr/dvr_display_types.h>
11#include <dvr/dvr_hardware_composer_types.h>
12#include <dvr/dvr_pose.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18typedef struct ANativeWindow ANativeWindow;
19
20typedef struct DvrPoseAsync DvrPoseAsync;
21
22typedef uint64_t DvrSurfaceUpdateFlags;
23typedef struct DvrDisplayManager DvrDisplayManager;
24typedef struct DvrSurfaceState DvrSurfaceState;
25typedef struct DvrPoseClient DvrPoseClient;
26typedef struct DvrPoseDataCaptureRequest DvrPoseDataCaptureRequest;
27typedef struct DvrVSyncClient DvrVSyncClient;
28typedef struct DvrVirtualTouchpad DvrVirtualTouchpad;
29
30typedef struct DvrBuffer DvrBuffer;
31typedef struct DvrWriteBuffer DvrWriteBuffer;
32typedef struct DvrReadBuffer DvrReadBuffer;
33typedef struct AHardwareBuffer AHardwareBuffer;
34
35typedef struct DvrReadBufferQueue DvrReadBufferQueue;
36typedef struct DvrWriteBufferQueue DvrWriteBufferQueue;
37
38typedef struct DvrSurface DvrSurface;
39typedef uint64_t DvrSurfaceAttributeType;
40typedef int32_t DvrSurfaceAttributeKey;
41typedef int32_t DvrGlobalBufferKey;
42
43typedef struct DvrSurfaceAttributeValue DvrSurfaceAttributeValue;
44typedef struct DvrSurfaceAttribute DvrSurfaceAttribute;
45
46// Note: To avoid breaking others during active development, only modify this
47// struct by appending elements to the end.
48// If you do feel we should to re-arrange or remove elements, please make a
49// note of it, and wait until we're about to finalize for an API release to do
50// so.
51typedef struct DvrNativeDisplayMetrics {
52  uint32_t display_width;
53  uint32_t display_height;
54  uint32_t display_x_dpi;
55  uint32_t display_y_dpi;
56  uint32_t vsync_period_ns;
57} DvrNativeDisplayMetrics;
58
59// native_handle contains the fds for the underlying ION allocations inside
60// the gralloc buffer. This is needed temporarily while GPU vendors work on
61// better support for AHardwareBuffer via glBindSharedBuffer APIs. See
62// b/37207909. For now we can declare the native_handle struct where it is
63// used for GPU late latching. See cutils/native_handle.h for the struct layout.
64struct native_handle;
65
66// Device metrics data type enums.
67enum {
68  // Request the device lens metrics protobuf. This matches cardboard protos.
69  DVR_CONFIGURATION_DATA_LENS_METRICS = 0,
70  // Request the device metrics protobuf.
71  DVR_CONFIGURATION_DATA_DEVICE_METRICS = 1,
72  // Request the per device configuration data file.
73  DVR_CONFIGURATION_DATA_DEVICE_CONFIG = 2,
74};
75
76// dvr_display_manager.h
77typedef int (*DvrDisplayManagerCreatePtr)(DvrDisplayManager** client_out);
78typedef void (*DvrDisplayManagerDestroyPtr)(DvrDisplayManager* client);
79typedef int (*DvrDisplayManagerGetEventFdPtr)(DvrDisplayManager* client);
80typedef int (*DvrDisplayManagerTranslateEpollEventMaskPtr)(
81    DvrDisplayManager* client, int in_events, int* out_events);
82typedef int (*DvrDisplayManagerGetSurfaceStatePtr)(
83    DvrDisplayManager* client, DvrSurfaceState* surface_state);
84typedef int (*DvrDisplayManagerGetReadBufferQueuePtr)(
85    DvrDisplayManager* client, int surface_id, int queue_id,
86    DvrReadBufferQueue** queue_out);
87typedef int (*DvrConfigurationDataGetPtr)(int config_type, uint8_t** data,
88                                          size_t* data_size);
89typedef void (*DvrConfigurationDataDestroyPtr)(uint8_t* data);
90typedef int (*DvrSurfaceStateCreatePtr)(DvrSurfaceState** surface_state);
91typedef void (*DvrSurfaceStateDestroyPtr)(DvrSurfaceState* surface_state);
92typedef int (*DvrSurfaceStateGetSurfaceCountPtr)(DvrSurfaceState* surface_state,
93                                                 size_t* count_out);
94typedef int (*DvrSurfaceStateGetUpdateFlagsPtr)(
95    DvrSurfaceState* surface_state, size_t surface_index,
96    DvrSurfaceUpdateFlags* flags_out);
97typedef int (*DvrSurfaceStateGetSurfaceIdPtr)(DvrSurfaceState* surface_state,
98                                              size_t surface_index,
99                                              int* surface_id_out);
100typedef int (*DvrSurfaceStateGetProcessIdPtr)(DvrSurfaceState* surface_state,
101                                              size_t surface_index,
102                                              int* process_id_out);
103typedef int (*DvrSurfaceStateGetQueueCountPtr)(DvrSurfaceState* surface_state,
104                                               size_t surface_index,
105                                               size_t* count_out);
106typedef ssize_t (*DvrSurfaceStateGetQueueIdsPtr)(DvrSurfaceState* surface_state,
107                                                 size_t surface_index,
108                                                 int* queue_ids,
109                                                 size_t max_count);
110typedef int (*DvrSurfaceStateGetZOrderPtr)(DvrSurfaceState* surface_state,
111                                           size_t surface_index,
112                                           int* z_order_out);
113typedef int (*DvrSurfaceStateGetVisiblePtr)(DvrSurfaceState* surface_state,
114                                            size_t surface_index,
115                                            bool* visible_out);
116typedef int (*DvrSurfaceStateGetAttributeCountPtr)(
117    DvrSurfaceState* surface_state, size_t surface_index, size_t* count_out);
118typedef ssize_t (*DvrSurfaceStateGetAttributesPtr)(
119    DvrSurfaceState* surface_state, size_t surface_index,
120    DvrSurfaceAttribute* attributes, size_t max_attribute_count);
121
122// dvr_buffer.h
123typedef void (*DvrWriteBufferCreateEmptyPtr)(DvrWriteBuffer** write_buffer_out);
124typedef void (*DvrWriteBufferDestroyPtr)(DvrWriteBuffer* write_buffer);
125typedef int (*DvrWriteBufferIsValidPtr)(DvrWriteBuffer* write_buffer);
126typedef int (*DvrWriteBufferClearPtr)(DvrWriteBuffer* write_buffer);
127typedef int (*DvrWriteBufferGetIdPtr)(DvrWriteBuffer* write_buffer);
128typedef int (*DvrWriteBufferGetAHardwareBufferPtr)(
129    DvrWriteBuffer* write_buffer, AHardwareBuffer** hardware_buffer);
130typedef int (*DvrWriteBufferPostPtr)(DvrWriteBuffer* write_buffer,
131                                     int ready_fence_fd, const void* meta,
132                                     size_t meta_size_bytes);
133typedef int (*DvrWriteBufferGainPtr)(DvrWriteBuffer* write_buffer,
134                                     int* release_fence_fd);
135typedef int (*DvrWriteBufferGainAsyncPtr)(DvrWriteBuffer* write_buffer);
136typedef const struct native_handle* (*DvrWriteBufferGetNativeHandlePtr)(
137    DvrWriteBuffer* write_buffer);
138
139typedef void (*DvrReadBufferCreateEmptyPtr)(DvrReadBuffer** read_buffer_out);
140typedef void (*DvrReadBufferDestroyPtr)(DvrReadBuffer* read_buffer);
141typedef int (*DvrReadBufferIsValidPtr)(DvrReadBuffer* read_buffer);
142typedef int (*DvrReadBufferClearPtr)(DvrReadBuffer* read_buffer);
143typedef int (*DvrReadBufferGetIdPtr)(DvrReadBuffer* read_buffer);
144typedef int (*DvrReadBufferGetAHardwareBufferPtr)(
145    DvrReadBuffer* read_buffer, AHardwareBuffer** hardware_buffer);
146typedef int (*DvrReadBufferAcquirePtr)(DvrReadBuffer* read_buffer,
147                                       int* ready_fence_fd, void* meta,
148                                       size_t meta_size_bytes);
149typedef int (*DvrReadBufferReleasePtr)(DvrReadBuffer* read_buffer,
150                                       int release_fence_fd);
151typedef int (*DvrReadBufferReleaseAsyncPtr)(DvrReadBuffer* read_buffer);
152typedef const struct native_handle* (*DvrReadBufferGetNativeHandlePtr)(
153    DvrReadBuffer* read_buffer);
154
155typedef void (*DvrBufferDestroyPtr)(DvrBuffer* buffer);
156typedef int (*DvrBufferGetAHardwareBufferPtr)(
157    DvrBuffer* buffer, AHardwareBuffer** hardware_buffer);
158typedef int (*DvrBufferGlobalLayoutVersionGetPtr)();
159typedef const struct native_handle* (*DvrBufferGetNativeHandlePtr)(
160    DvrBuffer* buffer);
161
162// dvr_buffer_queue.h
163typedef int (*DvrWriteBufferQueueCreatePtr)(uint32_t width, uint32_t height,
164                                            uint32_t format,
165                                            uint32_t layer_count,
166                                            uint64_t usage, size_t capacity,
167                                            size_t metadata_size,
168                                            DvrWriteBufferQueue** queue_out);
169typedef void (*DvrWriteBufferQueueDestroyPtr)(DvrWriteBufferQueue* write_queue);
170typedef ssize_t (*DvrWriteBufferQueueGetCapacityPtr)(
171    DvrWriteBufferQueue* write_queue);
172typedef int (*DvrWriteBufferQueueGetIdPtr)(DvrWriteBufferQueue* write_queue);
173typedef int (*DvrWriteBufferQueueGetExternalSurfacePtr)(
174    DvrWriteBufferQueue* write_queue, ANativeWindow** out_window);
175typedef int (*DvrWriteBufferQueueGetANativeWindowPtr)(
176    DvrWriteBufferQueue* write_queue, ANativeWindow** out_window);
177typedef int (*DvrWriteBufferQueueCreateReadQueuePtr)(
178    DvrWriteBufferQueue* write_queue, DvrReadBufferQueue** out_read_queue);
179typedef int (*DvrWriteBufferQueueDequeuePtr)(DvrWriteBufferQueue* write_queue,
180                                             int timeout,
181                                             DvrWriteBuffer* out_buffer,
182                                             int* out_fence_fd);
183typedef int (*DvrWriteBufferQueueResizeBufferPtr)(
184    DvrWriteBufferQueue* write_queue, uint32_t width, uint32_t height);
185typedef void (*DvrReadBufferQueueDestroyPtr)(DvrReadBufferQueue* read_queue);
186typedef ssize_t (*DvrReadBufferQueueGetCapacityPtr)(
187    DvrReadBufferQueue* read_queue);
188typedef int (*DvrReadBufferQueueGetIdPtr)(DvrReadBufferQueue* read_queue);
189typedef int (*DvrReadBufferQueueGetEventFdPtr)(DvrReadBufferQueue* read_queue);
190typedef int (*DvrReadBufferQueueCreateReadQueuePtr)(
191    DvrReadBufferQueue* read_queue, DvrReadBufferQueue** out_read_queue);
192typedef int (*DvrReadBufferQueueDequeuePtr)(DvrReadBufferQueue* read_queue,
193                                            int timeout,
194                                            DvrReadBuffer* out_buffer,
195                                            int* out_fence_fd, void* out_meta,
196                                            size_t meta_size_bytes);
197typedef void (*DvrReadBufferQueueBufferAvailableCallback)(void* context);
198typedef int (*DvrReadBufferQueueSetBufferAvailableCallbackPtr)(
199    DvrReadBufferQueue* read_queue,
200    DvrReadBufferQueueBufferAvailableCallback callback, void* context);
201typedef void (*DvrReadBufferQueueBufferRemovedCallback)(DvrReadBuffer* buffer,
202                                                        void* context);
203typedef int (*DvrReadBufferQueueSetBufferRemovedCallbackPtr)(
204    DvrReadBufferQueue* read_queue,
205    DvrReadBufferQueueBufferRemovedCallback callback, void* context);
206typedef int (*DvrReadBufferQueueHandleEventsPtr)(
207    DvrReadBufferQueue* read_queue);
208
209// dvr_surface.h
210typedef int (*DvrSetupGlobalBufferPtr)(DvrGlobalBufferKey key, size_t size,
211                                       uint64_t usage, DvrBuffer** buffer_out);
212typedef int (*DvrDeleteGlobalBufferPtr)(DvrGlobalBufferKey key);
213typedef int (*DvrGetGlobalBufferPtr)(DvrGlobalBufferKey key,
214                                     DvrBuffer** out_buffer);
215typedef int (*DvrSurfaceCreatePtr)(const DvrSurfaceAttribute* attributes,
216                                   size_t attribute_count,
217                                   DvrSurface** surface_out);
218typedef void (*DvrSurfaceDestroyPtr)(DvrSurface* surface);
219typedef int (*DvrSurfaceGetIdPtr)(DvrSurface* surface);
220typedef int (*DvrSurfaceSetAttributesPtr)(DvrSurface* surface,
221                                          const DvrSurfaceAttribute* attributes,
222                                          size_t attribute_count);
223typedef int (*DvrSurfaceCreateWriteBufferQueuePtr)(
224    DvrSurface* surface, uint32_t width, uint32_t height, uint32_t format,
225    uint32_t layer_count, uint64_t usage, size_t capacity, size_t metadata_size,
226    DvrWriteBufferQueue** queue_out);
227typedef int (*DvrGetNativeDisplayMetricsPtr)(size_t sizeof_metrics,
228                                             DvrNativeDisplayMetrics* metrics);
229
230// dvr_vsync.h
231typedef int (*DvrVSyncClientCreatePtr)(DvrVSyncClient** client_out);
232typedef void (*DvrVSyncClientDestroyPtr)(DvrVSyncClient* client);
233typedef int (*DvrVSyncClientGetSchedInfoPtr)(DvrVSyncClient* client,
234                                             int64_t* vsync_period_ns,
235                                             int64_t* next_timestamp_ns,
236                                             uint32_t* next_vsync_count);
237
238// libs/vr/libvrsensor/include/dvr/pose_client.h
239typedef DvrPoseClient* (*DvrPoseClientCreatePtr)();
240typedef void (*DvrPoseClientDestroyPtr)(DvrPoseClient* client);
241typedef int (*DvrPoseClientGetPtr)(DvrPoseClient* client, uint32_t vsync_count,
242                                   DvrPoseAsync* out_pose);
243typedef uint32_t (*DvrPoseClientGetVsyncCountPtr)(DvrPoseClient* client);
244typedef int (*DvrPoseClientGetControllerPtr)(DvrPoseClient* client,
245                                             int32_t controller_id,
246                                             uint32_t vsync_count,
247                                             DvrPoseAsync* out_pose);
248typedef int (*DvrPoseClientSensorsEnablePtr)(DvrPoseClient* client,
249                                             bool enabled);
250typedef int (*DvrPoseClientDataCapturePtr)(DvrPoseClient* client,
251    const DvrPoseDataCaptureRequest* request);
252typedef int (*DvrPoseClientDataReaderDestroyPtr)(DvrPoseClient* client,
253                                                 uint64_t data_type);
254
255// dvr_pose.h
256typedef int (*DvrPoseClientGetDataReaderPtr)(DvrPoseClient* client,
257                                             uint64_t data_type,
258                                             DvrReadBufferQueue** read_queue);
259
260// services/vr/virtual_touchpad/include/dvr/virtual_touchpad_client.h
261
262// Touchpad IDs for *Touch*() and *ButtonState*() calls.
263enum {
264  DVR_VIRTUAL_TOUCHPAD_PRIMARY = 0,
265  DVR_VIRTUAL_TOUCHPAD_VIRTUAL = 1,
266};
267typedef DvrVirtualTouchpad* (*DvrVirtualTouchpadCreatePtr)();
268typedef void (*DvrVirtualTouchpadDestroyPtr)(DvrVirtualTouchpad* client);
269typedef int (*DvrVirtualTouchpadAttachPtr)(DvrVirtualTouchpad* client);
270typedef int (*DvrVirtualTouchpadDetachPtr)(DvrVirtualTouchpad* client);
271typedef int (*DvrVirtualTouchpadTouchPtr)(DvrVirtualTouchpad* client,
272                                          int touchpad, float x, float y,
273                                          float pressure);
274typedef int (*DvrVirtualTouchpadButtonStatePtr)(DvrVirtualTouchpad* client,
275                                                int touchpad, int buttons);
276typedef int (*DvrVirtualTouchpadScrollPtr)(DvrVirtualTouchpad* client,
277                                           int touchpad, float x, float y);
278
279// dvr_hardware_composer_client.h
280typedef struct DvrHwcClient DvrHwcClient;
281typedef struct DvrHwcFrame DvrHwcFrame;
282typedef int (*DvrHwcOnFrameCallback)(void* client_state, DvrHwcFrame* frame);
283typedef DvrHwcClient* (*DvrHwcClientCreatePtr)(DvrHwcOnFrameCallback callback,
284                                               void* client_state);
285typedef void (*DvrHwcClientDestroyPtr)(DvrHwcClient* client);
286typedef void (*DvrHwcFrameDestroyPtr)(DvrHwcFrame* frame);
287typedef DvrHwcDisplay (*DvrHwcFrameGetDisplayIdPtr)(DvrHwcFrame* frame);
288typedef int32_t (*DvrHwcFrameGetDisplayWidthPtr)(DvrHwcFrame* frame);
289typedef int32_t (*DvrHwcFrameGetDisplayHeightPtr)(DvrHwcFrame* frame);
290typedef bool (*DvrHwcFrameGetDisplayRemovedPtr)(DvrHwcFrame* frame);
291typedef size_t (*DvrHwcFrameGetLayerCountPtr)(DvrHwcFrame* frame);
292typedef DvrHwcLayer (*DvrHwcFrameGetLayerIdPtr)(DvrHwcFrame* frame,
293                                                size_t layer_index);
294typedef uint32_t (*DvrHwcFrameGetActiveConfigPtr)(DvrHwcFrame* frame);
295typedef uint32_t (*DvrHwcFrameGetColorModePtr)(DvrHwcFrame* frame);
296typedef void (*DvrHwcFrameGetColorTransformPtr)(DvrHwcFrame* frame,
297                                                float* out_matrix,
298                                                int32_t* out_hint);
299typedef uint32_t (*DvrHwcFrameGetPowerModePtr)(DvrHwcFrame* frame);
300typedef uint32_t (*DvrHwcFrameGetVsyncEnabledPtr)(DvrHwcFrame* frame);
301typedef AHardwareBuffer* (*DvrHwcFrameGetLayerBufferPtr)(DvrHwcFrame* frame,
302                                                         size_t layer_index);
303typedef int (*DvrHwcFrameGetLayerFencePtr)(DvrHwcFrame* frame,
304                                           size_t layer_index);
305typedef DvrHwcRecti (*DvrHwcFrameGetLayerDisplayFramePtr)(DvrHwcFrame* frame,
306                                                          size_t layer_index);
307typedef DvrHwcRectf (*DvrHwcFrameGetLayerCropPtr)(DvrHwcFrame* frame,
308                                                  size_t layer_index);
309typedef DvrHwcBlendMode (*DvrHwcFrameGetLayerBlendModePtr)(DvrHwcFrame* frame,
310                                                           size_t layer_index);
311typedef float (*DvrHwcFrameGetLayerAlphaPtr)(DvrHwcFrame* frame,
312                                             size_t layer_index);
313typedef uint32_t (*DvrHwcFrameGetLayerTypePtr)(DvrHwcFrame* frame,
314                                               size_t layer_index);
315typedef uint32_t (*DvrHwcFrameGetLayerApplicationIdPtr)(DvrHwcFrame* frame,
316                                                        size_t layer_index);
317typedef uint32_t (*DvrHwcFrameGetLayerZOrderPtr)(DvrHwcFrame* frame,
318                                                 size_t layer_index);
319
320typedef void (*DvrHwcFrameGetLayerCursorPtr)(DvrHwcFrame* frame,
321                                             size_t layer_index, int32_t* out_x,
322                                             int32_t* out_y);
323
324typedef uint32_t (*DvrHwcFrameGetLayerTransformPtr)(DvrHwcFrame* frame,
325                                                    size_t layer_index);
326
327typedef uint32_t (*DvrHwcFrameGetLayerDataspacePtr)(DvrHwcFrame* frame,
328                                                    size_t layer_index);
329
330typedef uint32_t (*DvrHwcFrameGetLayerColorPtr)(DvrHwcFrame* frame,
331                                                size_t layer_index);
332
333typedef uint32_t (*DvrHwcFrameGetLayerNumVisibleRegionsPtr)(DvrHwcFrame* frame,
334                                                            size_t layer_index);
335typedef DvrHwcRecti (*DvrHwcFrameGetLayerVisibleRegionPtr)(DvrHwcFrame* frame,
336                                                           size_t layer_index,
337                                                           size_t index);
338
339typedef uint32_t (*DvrHwcFrameGetLayerNumDamagedRegionsPtr)(DvrHwcFrame* frame,
340                                                            size_t layer_index);
341typedef DvrHwcRecti (*DvrHwcFrameGetLayerDamagedRegionPtr)(DvrHwcFrame* frame,
342                                                           size_t layer_index,
343                                                           size_t index);
344
345// dvr_performance.h
346typedef int (*DvrPerformanceSetSchedulerPolicyPtr)(
347    pid_t task_id, const char* scheduler_policy);
348
349// The buffer metadata that an Android Surface (a.k.a. ANativeWindow)
350// will populate. A DvrWriteBufferQueue must be created with this metadata iff
351// ANativeWindow access is needed. Please do not remove, modify, or reorder
352// existing data members. If new fields need to be added, please take extra care
353// to make sure that new data field is padded properly the size of the struct
354// stays same.
355struct DvrNativeBufferMetadata {
356  // Timestamp of the frame.
357  int64_t timestamp;
358
359  // Whether the buffer is using auto timestamp.
360  int32_t is_auto_timestamp;
361
362  // Must be one of the HAL_DATASPACE_XXX value defined in system/graphics.h
363  int32_t dataspace;
364
365  // Crop extracted from an ACrop or android::Crop object.
366  int32_t crop_left;
367  int32_t crop_top;
368  int32_t crop_right;
369  int32_t crop_bottom;
370
371  // Must be one of the NATIVE_WINDOW_SCALING_MODE_XXX value defined in
372  // system/window.h.
373  int32_t scaling_mode;
374
375  // Must be one of the ANATIVEWINDOW_TRANSFORM_XXX value defined in
376  // android/native_window.h
377  int32_t transform;
378
379  // Reserved bytes for so that the struct is forward compatible.
380  int32_t reserved[16];
381};
382
383struct DvrApi_v1 {
384// Defines an API entry for V1 (no version suffix).
385#define DVR_V1_API_ENTRY(name) Dvr##name##Ptr name
386
387#include "dvr_api_entries.h"
388
389// Undefine macro definitions to play nice with Google3 style rules.
390#undef DVR_V1_API_ENTRY
391};
392
393int dvrGetApi(void* api, size_t struct_size, int version);
394
395#ifdef __cplusplus
396}  // extern "C"
397#endif
398
399#endif  // ANDROID_DVR_API_H_
400