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