blob: d684ddcc579812f0282226706c06343fe72ca94b [file] [log] [blame]
#ifndef ANDROID_DVR_POSE_CLIENT_H_
#define ANDROID_DVR_POSE_CLIENT_H_
#ifdef __ARM_NEON
#include <arm_neon.h>
#else
#ifndef __FLOAT32X4T_86
#define __FLOAT32X4T_86
typedef float float32x4_t __attribute__ ((__vector_size__ (16)));
typedef struct float32x4x4_t { float32x4_t val[4]; };
#endif
#endif
#include <stdbool.h>
#include <stdint.h>
#include <dvr/dvr_pose.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct DvrPoseClient DvrPoseClient;
// Returned by the async pose ring buffer access API.
typedef struct DvrPoseRingBufferInfo {
// Read-only pointer to the pose ring buffer. The current pose is in this
// buffer at element buffer[current_frame & (buffer_size - 1)]. The next
// frame's forecasted pose is at element
// ((current_frame + 1) & (buffer_size - 1)). And so on. The poses are
// predicted for when 50% of the corresponding frame's pixel data is visible
// to the user.
// The last value returned by dvrPresent is the count for the next frame,
// which is the earliest that the application could display something if they
// were to render promptly. (TODO(jbates) move this comment to dvrPresent).
volatile const DvrPoseAsync* buffer;
// Minimum number of accurate forecasted poses including the current frame's
// pose. This is the number of poses that are udpated by the pose service.
// If the application reads past this count, they will get a stale prediction
// from a previous frame. Guaranteed to be at least 2.
uint32_t min_future_count;
// Number of elements in buffer. At least 8 and greater than min_future_count.
// Guaranteed to be a power of two. The total size of the buffer in bytes is:
// total_count * sizeof(DvrPoseAsync)
uint32_t total_count;
} DvrPoseRingBufferInfo;
typedef enum DvrPoseMode {
DVR_POSE_MODE_6DOF = 0,
DVR_POSE_MODE_3DOF,
DVR_POSE_MODE_MOCK_FROZEN,
DVR_POSE_MODE_MOCK_HEAD_TURN_SLOW,
DVR_POSE_MODE_MOCK_HEAD_TURN_FAST,
DVR_POSE_MODE_MOCK_ROTATE_SLOW,
DVR_POSE_MODE_MOCK_ROTATE_MEDIUM,
DVR_POSE_MODE_MOCK_ROTATE_FAST,
DVR_POSE_MODE_MOCK_CIRCLE_STRAFE,
DVR_POSE_MODE_FLOAT,
DVR_POSE_MODE_MOCK_MOTION_SICKNESS,
// Always last.
DVR_POSE_MODE_COUNT,
} DvrPoseMode;
typedef enum DvrControllerId {
DVR_CONTROLLER_0 = 0,
DVR_CONTROLLER_1 = 1,
} DvrControllerId;
// Creates a new pose client.
//
// @return Pointer to the created pose client, nullptr on failure.
DvrPoseClient* dvrPoseClientCreate();
// Destroys a pose client.
//
// @param client Pointer to the pose client to be destroyed.
void dvrPoseClientDestroy(DvrPoseClient* client);
// Gets the pose for the given vsync count.
//
// @param client Pointer to the pose client.
// @param vsync_count Vsync that this pose should be forward-predicted to.
// Typically this is the count returned by dvrGetNextVsyncCount.
// @param out_pose Struct to store pose state.
// @return Zero on success, negative error code on failure.
int dvrPoseClientGet(DvrPoseClient* client, uint32_t vsync_count,
DvrPoseAsync* out_pose);
// Gets the current vsync count.
uint32_t dvrPoseClientGetVsyncCount(DvrPoseClient* client);
// Gets the pose for the given controller at the given vsync count.
//
// @param client Pointer to the pose client.
// @param controller_id The controller id.
// @param vsync_count Vsync that this pose should be forward-predicted to.
// Typically this is the count returned by dvrGetNextVsyncCount.
// @param out_pose Struct to store pose state.
// @return Zero on success, negative error code on failure.
int dvrPoseClientGetController(DvrPoseClient* client, int32_t controller_id,
uint32_t vsync_count, DvrPoseAsync* out_pose);
// Enables/disables logging for the controller fusion.
//
// @param client Pointer to the pose client.
// @param enable True starts logging, False stops.
// @return Zero on success, negative error code on failure.
int dvrPoseClientLogController(DvrPoseClient* client, bool enable);
// DEPRECATED
// Polls current pose state.
//
// @param client Pointer to the pose client.
// @param state Struct to store polled state.
// @return Zero on success, negative error code on failure.
int dvrPoseClientPoll(DvrPoseClient* client, DvrPose* state);
// Freezes the pose to the provided state.
//
// Future poll operations will return this state until a different state is
// frozen or dvrPoseClientModeSet() is called with a different mode. The timestamp is
// not frozen.
//
// @param client Pointer to the pose client.
// @param frozen_state State pose to be frozen to.
// @return Zero on success, negative error code on failure.
int dvrPoseClientFreeze(DvrPoseClient* client, const DvrPose* frozen_state);
// Sets the pose service mode.
//
// @param mode The requested pose mode.
// @return Zero on success, negative error code on failure.
int dvrPoseClientModeSet(DvrPoseClient* client, DvrPoseMode mode);
// Gets the pose service mode.
//
// @param mode Return value for the current pose mode.
// @return Zero on success, negative error code on failure.
int dvrPoseClientModeGet(DvrPoseClient* client, DvrPoseMode* mode);
// Get access to the shared memory pose ring buffer.
// A future pose at vsync <current> + <offset> is accessed at index:
// index = (<current> + <offset>) % out_buffer_size
// Where <current> was the last value returned by dvrPresent and
// <offset> is less than or equal to |out_min_future_count|.
// |out_buffer| will be set to a pointer to the buffer.
// |out_fd| will be set to the gralloc buffer file descriptor, which is
// required for binding this buffer for GPU use.
// Returns 0 on success.
int dvrPoseClientGetRingBuffer(DvrPoseClient* client,
DvrPoseRingBufferInfo* out_info);
// Sets enabled state for sensors pose processing.
//
// @param enabled Whether sensors are enabled or disabled.
// @return Zero on success
int dvrPoseClientSensorsEnable(DvrPoseClient* client, bool enabled);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // ANDROID_DVR_POSE_CLIENT_H_