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)));
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct float32x4x4_t { float32x4_t val[4]; };
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <stdbool.h>
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <stdint.h>
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __cplusplus
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoextern "C" {
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct DvrPose DvrPose;
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Represents the current state provided by the pose service, containing a
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// rotation and translation.
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct __attribute__((packed, aligned(8))) DvrPoseState {
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // A quaternion representing the rotation of the HMD in Start Space.
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  struct __attribute__((packed)) {
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    float x, y, z, w;
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  } head_from_start_rotation;
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // The position of the HMD in Start Space.
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  struct __attribute__((packed)) {
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    float x, y, z;
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  } head_from_start_translation;
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Time in nanoseconds for the current pose.
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint64_t timestamp_ns;
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // The rotational velocity of the HMD.
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  struct __attribute__((packed)) {
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    float x, y, z;
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  } sensor_from_start_rotation_velocity;
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseState;
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoenum {
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_FLAG_VALID = (1UL << 0),       // This pose is valid.
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_FLAG_HEAD = (1UL << 1),        // This pose is the head.
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_FLAG_CONTROLLER = (1UL << 2),  // This pose is a controller.
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Represents an estimated pose, accessed asynchronously through a shared ring
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// buffer. No assumptions should be made about the data in padding space.
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// The size of this struct is 128 bytes.
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct __attribute__((packed, aligned(16))) DvrPoseAsync {
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Left eye head-from-start orientation quaternion x,y,z,w.
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float32x4_t orientation;
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Left eye head-from-start translation x,y,z,pad in meters.
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float32x4_t translation;
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Right eye head-from-start orientation quaternion x,y,z,w.
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float32x4_t right_orientation;
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Right eye head-from-start translation x,y,z,pad in meters.
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float32x4_t right_translation;
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Start-space angular velocity x,y,z,pad in radians per second.
61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float32x4_t angular_velocity;
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Start-space positional velocity x,y,z,pad in meters per second.
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  float32x4_t velocity;
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Timestamp of when this pose is predicted for, typically halfway through
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // scanout.
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int64_t timestamp_ns;
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Bitmask of DVR_POSE_FLAG_* constants that apply to this pose.
68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  //
69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // If DVR_POSE_FLAG_VALID is not set, the pose is indeterminate.
70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint64_t flags;
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Reserved padding to 128 bytes.
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint8_t pad[16];
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseAsync;
74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Returned by the async pose ring buffer access API.
76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct DvrPoseRingBufferInfo {
77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Read-only pointer to the pose ring buffer. The current pose is in this
78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // buffer at element buffer[current_frame & (buffer_size - 1)]. The next
79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // frame's forecasted pose is at element
80e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // ((current_frame + 1) & (buffer_size - 1)). And so on. The poses are
81e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // predicted for when 50% of the corresponding frame's pixel data is visible
82e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // to the user.
83e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // The last value returned by dvrPresent is the count for the next frame,
84e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // which is the earliest that the application could display something if they
85e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // were to render promptly. (TODO(jbates) move this comment to dvrPresent).
86e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  volatile const DvrPoseAsync* buffer;
87e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Minimum number of accurate forecasted poses including the current frame's
88e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // pose. This is the number of poses that are udpated by the pose service.
89e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // If the application reads past this count, they will get a stale prediction
90e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // from a previous frame. Guaranteed to be at least 2.
91e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t min_future_count;
92e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Number of elements in buffer. At least 8 and greater than min_future_count.
93e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Guaranteed to be a power of two. The total size of the buffer in bytes is:
94e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  //   total_count * sizeof(DvrPoseAsync)
95e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t total_count;
96e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseRingBufferInfo;
97e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
98e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef enum DvrPoseMode {
99e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_6DOF = 0,
100e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_3DOF,
101e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_FROZEN,
102e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_HEAD_TURN_SLOW,
103e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_HEAD_TURN_FAST,
104e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_ROTATE_SLOW,
105e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_ROTATE_MEDIUM,
106e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_ROTATE_FAST,
107e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_MOCK_CIRCLE_STRAFE,
108e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
109e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Always last.
110e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_POSE_MODE_COUNT,
111e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseMode;
112e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
113e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef enum DvrControllerId {
114e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_CONTROLLER_0 = 0,
115e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DVR_CONTROLLER_1 = 1,
116e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrControllerId;
117e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
118e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Creates a new pose client.
119e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
120e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Pointer to the created pose client, nullptr on failure.
121e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoDvrPose* dvrPoseCreate();
122e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
123e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Destroys a pose client.
124e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
125e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client to be destroyed.
126e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkovoid dvrPoseDestroy(DvrPose* client);
127e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
128e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the pose for the given vsync count.
129e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
130e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client.
131e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param vsync_count Vsync that this pose should be forward-predicted to.
132e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//     Typically this is the count returned by dvrGetNextVsyncCount.
133e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param out_pose Struct to store pose state.
134e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
135e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGet(DvrPose* client, uint32_t vsync_count, DvrPoseAsync* out_pose);
136e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
137e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the current vsync count.
138e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkouint32_t dvrPoseGetVsyncCount(DvrPose* client);
139e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
140e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the pose for the given controller at the given vsync count.
141e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
142e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client.
143e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param controller_id The controller id.
144e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param vsync_count Vsync that this pose should be forward-predicted to.
145e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//     Typically this is the count returned by dvrGetNextVsyncCount.
146e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param out_pose Struct to store pose state.
147e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
148e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGetController(DvrPose* client, int32_t controller_id,
149e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                         uint32_t vsync_count, DvrPoseAsync* out_pose);
150e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
151e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Enables/disables logging for the controller fusion.
152e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
153e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client.
154e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param enable True starts logging, False stops.
155e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
156e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseLogController(DvrPose* client, bool enable);
157e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
158e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// DEPRECATED
159e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Polls current pose state.
160e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
161e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client.
162e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param state Struct to store polled state.
163e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
164e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPosePoll(DvrPose* client, DvrPoseState* state);
165e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
166e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Freezes the pose to the provided state.
167e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
168e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Future poll operations will return this state until a different state is
169e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// frozen or dvrPoseSetMode() is called with a different mode. The timestamp is
170e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// not frozen.
171e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
172e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param client Pointer to the pose client.
173e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param frozen_state State pose to be frozen to.
174e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
175e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseFreeze(DvrPose* client, const DvrPoseState* frozen_state);
176e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
177e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Sets the pose service mode.
178e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
179e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param mode The requested pose mode.
180e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
181e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseSetMode(DvrPose* client, DvrPoseMode mode);
182e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
183e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Gets the pose service mode.
184e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//
185e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @param mode Return value for the current pose mode.
186e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// @return Zero on success, negative error code on failure.
187e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGetMode(DvrPose* client, DvrPoseMode* mode);
188e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
189e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Get access to the shared memory pose ring buffer.
190e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// A future pose at vsync <current> + <offset> is accessed at index:
191e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//   index = (<current> + <offset>) % out_buffer_size
192e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Where <current> was the last value returned by dvrPresent and
193e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// <offset> is less than or equal to |out_min_future_count|.
194e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |out_buffer| will be set to a pointer to the buffer.
195e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |out_fd| will be set to the gralloc buffer file descriptor, which is
196e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//   required for binding this buffer for GPU use.
197e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Returns 0 on success.
198e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint dvrPoseGetRingBuffer(DvrPose* client, DvrPoseRingBufferInfo* out_info);
199e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
200e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
201e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __cplusplus
202e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // extern "C"
203e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
204e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
205e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif  // ANDROID_DVR_POSE_CLIENT_H_
206