1#ifndef ANDROID_DVR_POSE_CLIENT_H_
2#define ANDROID_DVR_POSE_CLIENT_H_
3
4#ifdef __ARM_NEON
5#include <arm_neon.h>
6#else
7#ifndef __FLOAT32X4T_86
8#define __FLOAT32X4T_86
9typedef float float32x4_t __attribute__ ((__vector_size__ (16)));
10typedef struct float32x4x4_t { float32x4_t val[4]; } float32x4x4_t;
11#endif
12#endif
13
14#include <stdbool.h>
15#include <stdint.h>
16
17#include <dvr/dvr_pose.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23typedef struct DvrPoseClient DvrPoseClient;
24
25// Returned by the async pose ring buffer access API.
26typedef struct DvrPoseRingBufferInfo {
27  // Read-only pointer to the pose ring buffer. The current pose is in this
28  // buffer at element buffer[current_frame & (buffer_size - 1)]. The next
29  // frame's forecasted pose is at element
30  // ((current_frame + 1) & (buffer_size - 1)). And so on. The poses are
31  // predicted for when 50% of the corresponding frame's pixel data is visible
32  // to the user.
33  // The last value returned by dvrPresent is the count for the next frame,
34  // which is the earliest that the application could display something if they
35  // were to render promptly. (TODO(jbates) move this comment to dvrPresent).
36  volatile const DvrPoseAsync* buffer;
37  // Minimum number of accurate forecasted poses including the current frame's
38  // pose. This is the number of poses that are udpated by the pose service.
39  // If the application reads past this count, they will get a stale prediction
40  // from a previous frame. Guaranteed to be at least 2.
41  uint32_t min_future_count;
42  // Number of elements in buffer. At least 8 and greater than min_future_count.
43  // Guaranteed to be a power of two. The total size of the buffer in bytes is:
44  //   total_count * sizeof(DvrPoseAsync)
45  uint32_t total_count;
46} DvrPoseRingBufferInfo;
47
48typedef enum DvrPoseMode {
49  DVR_POSE_MODE_6DOF = 0,
50  DVR_POSE_MODE_3DOF,
51  DVR_POSE_MODE_MOCK_FROZEN,
52  DVR_POSE_MODE_MOCK_HEAD_TURN_SLOW,
53  DVR_POSE_MODE_MOCK_HEAD_TURN_FAST,
54  DVR_POSE_MODE_MOCK_ROTATE_SLOW,
55  DVR_POSE_MODE_MOCK_ROTATE_MEDIUM,
56  DVR_POSE_MODE_MOCK_ROTATE_FAST,
57  DVR_POSE_MODE_MOCK_CIRCLE_STRAFE,
58  DVR_POSE_MODE_FLOAT,
59  DVR_POSE_MODE_MOCK_MOTION_SICKNESS,
60
61  // Always last.
62  DVR_POSE_MODE_COUNT,
63} DvrPoseMode;
64
65typedef enum DvrControllerId {
66  DVR_CONTROLLER_0 = 0,
67  DVR_CONTROLLER_1 = 1,
68} DvrControllerId;
69
70// Creates a new pose client.
71//
72// @return Pointer to the created pose client, nullptr on failure.
73DvrPoseClient* dvrPoseClientCreate();
74
75// Destroys a pose client.
76//
77// @param client Pointer to the pose client to be destroyed.
78void dvrPoseClientDestroy(DvrPoseClient* client);
79
80// Gets the pose for the given vsync count.
81//
82// @param client Pointer to the pose client.
83// @param vsync_count Vsync that this pose should be forward-predicted to.
84//     Typically this is the count returned by dvrGetNextVsyncCount.
85// @param out_pose Struct to store pose state.
86// @return Zero on success, negative error code on failure.
87int dvrPoseClientGet(DvrPoseClient* client, uint32_t vsync_count,
88                     DvrPoseAsync* out_pose);
89
90// Gets the current vsync count.
91uint32_t dvrPoseClientGetVsyncCount(DvrPoseClient* client);
92
93// Gets the pose for the given controller at the given vsync count.
94//
95// @param client Pointer to the pose client.
96// @param controller_id The controller id.
97// @param vsync_count Vsync that this pose should be forward-predicted to.
98//     Typically this is the count returned by dvrGetNextVsyncCount.
99// @param out_pose Struct to store pose state.
100// @return Zero on success, negative error code on failure.
101int dvrPoseClientGetController(DvrPoseClient* client, int32_t controller_id,
102                               uint32_t vsync_count, DvrPoseAsync* out_pose);
103
104// Enables/disables logging for the controller fusion.
105//
106// @param client Pointer to the pose client.
107// @param enable True starts logging, False stops.
108// @return Zero on success, negative error code on failure.
109int dvrPoseClientLogController(DvrPoseClient* client, bool enable);
110
111// DEPRECATED
112// Polls current pose state.
113//
114// @param client Pointer to the pose client.
115// @param state Struct to store polled state.
116// @return Zero on success, negative error code on failure.
117int dvrPoseClientPoll(DvrPoseClient* client, DvrPose* state);
118
119// Freezes the pose to the provided state.
120//
121// Future poll operations will return this state until a different state is
122// frozen or dvrPoseClientModeSet() is called with a different mode. The timestamp is
123// not frozen.
124//
125// @param client Pointer to the pose client.
126// @param frozen_state State pose to be frozen to.
127// @return Zero on success, negative error code on failure.
128int dvrPoseClientFreeze(DvrPoseClient* client, const DvrPose* frozen_state);
129
130// Sets the pose service mode.
131//
132// @param mode The requested pose mode.
133// @return Zero on success, negative error code on failure.
134int dvrPoseClientModeSet(DvrPoseClient* client, DvrPoseMode mode);
135
136// Gets the pose service mode.
137//
138// @param mode Return value for the current pose mode.
139// @return Zero on success, negative error code on failure.
140int dvrPoseClientModeGet(DvrPoseClient* client, DvrPoseMode* mode);
141
142// Get access to the shared memory pose ring buffer.
143// A future pose at vsync <current> + <offset> is accessed at index:
144//   index = (<current> + <offset>) % out_buffer_size
145// Where <current> was the last value returned by dvrPresent and
146// <offset> is less than or equal to |out_min_future_count|.
147// |out_buffer| will be set to a pointer to the buffer.
148// |out_fd| will be set to the gralloc buffer file descriptor, which is
149//   required for binding this buffer for GPU use.
150// Returns 0 on success.
151int dvrPoseClientGetRingBuffer(DvrPoseClient* client,
152                               DvrPoseRingBufferInfo* out_info);
153
154// Sets enabled state for sensors pose processing.
155//
156// @param enabled Whether sensors are enabled or disabled.
157// @return Zero on success
158int dvrPoseClientSensorsEnable(DvrPoseClient* client, bool enabled);
159
160// Requests a burst of data samples from pose service. The data samples are
161// passed through a shared memory buffer obtained by calling
162// dvrPoseClientGetDataReader().
163//
164// @param DvrPoseDataCaptureRequest Parameters on how to capture data.
165// @return Zero on success.
166int dvrPoseClientDataCapture(DvrPoseClient* client,
167                             const DvrPoseDataCaptureRequest* request);
168
169// Destroys the write buffer queue for the given |data_type|.
170int dvrPoseClientDataReaderDestroy(DvrPoseClient* client, uint64_t data_type);
171
172#ifdef __cplusplus
173}  // extern "C"
174#endif
175
176#endif  // ANDROID_DVR_POSE_CLIENT_H_
177