1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_DVR_POSE_CLIENT_INTERNAL_H_
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_DVR_POSE_CLIENT_INTERNAL_H_
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <stdint.h>
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <dvr/pose_client.h>
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/file_handle.h>
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/sensor_constants.h>
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __cplusplus
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoextern "C" {
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Sensord head pose ring buffer.
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotypedef struct __attribute__((packed, aligned(16))) DvrPoseRingBuffer {
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Ring buffer always at the beginning of the structure, as consumers may
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // not have access to this parent structure definition.
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  DvrPoseAsync ring[kPoseAsyncBufferTotalCount];
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  // Current vsync_count (where sensord is writing poses from).
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  uint32_t vsync_count;
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko} DvrPoseMetadata;
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Called by displayd to give vsync count info to the pose service.
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |display_timestamp| Display timestamp is in the middle of scanout.
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |display_period_ns| Nanos between vsyncs.
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// |right_eye_photon_offset_ns| Nanos to shift the prediction timestamp for
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko//    the right eye head pose (relative to the left eye prediction).
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint privateDvrPoseNotifyVsync(DvrPose* client, uint32_t vsync_count,
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                              int64_t display_timestamp,
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                              int64_t display_period_ns,
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                              int64_t right_eye_photon_offset_ns);
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Get file descriptor for access to the shared memory pose buffer. This can be
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// used with GL extensions that support shared memory buffer objects. The caller
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// takes ownership of the returned fd and must close it or pass on ownership.
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint privateDvrPoseGetRingBufferFd(DvrPose* client,
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                  android::pdx::LocalHandle* fd);
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifdef __cplusplus
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // extern "C"
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif  // ANDROID_DVR_POSE_CLIENT_INTERNAL_H_
44