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