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