blob: 63c73855f4f196c22b7b77d51f1787504ec300b8 [file] [log] [blame]
#ifndef ANDROID_DVR_SHARED_BUFFERS_H_
#define ANDROID_DVR_SHARED_BUFFERS_H_
#include <dvr/dvr_config.h>
#include <dvr/dvr_pose.h>
#include <dvr/dvr_vsync.h>
#include <libbroadcastring/broadcast_ring.h>
// This header is shared by VrCore and Android and must be kept in sync.
namespace android {
namespace dvr {
// Increment when the layout for the buffers change.
enum : uint32_t { kSharedBufferLayoutVersion = 2 };
// Note: These buffers will be mapped from various system processes as well
// as VrCore and the application processes in a r/w manner.
//
// Therefore it is possible for the application to mess with the contents of
// these buffers.
//
// While using them, assume garbage memory: Your logic must not crash or lead
// to execution of unsafe code as a function of the contents of these buffers.
// Sanity check for basic type sizes.
static_assert(sizeof(DvrPoseAsync) == 128, "Unexpected size for DvrPoseAsync");
static_assert(sizeof(DvrPose) == 112, "Unexpected size for DvrPose");
static_assert(sizeof(DvrVsync) == 32, "Unexpected size for DvrVsync");
static_assert(sizeof(DvrConfig) == 16, "Unexpected size for DvrConfig");
// A helper class that provides compile time sized traits for the BroadcastRing.
template <class DvrType, size_t StaticCount>
class DvrRingBufferTraits {
public:
using Record = DvrType;
static constexpr bool kUseStaticRecordSize = false;
static constexpr uint32_t kStaticRecordCount = StaticCount;
static constexpr int kMaxReservedRecords = 1;
static constexpr int kMinAvailableRecords = 1;
};
// Traits classes.
using DvrPoseTraits = DvrRingBufferTraits<DvrPose, 0>;
using DvrVsyncTraits = DvrRingBufferTraits<DvrVsync, 2>;
using DvrConfigTraits = DvrRingBufferTraits<DvrConfig, 2>;
// The broadcast ring classes that will expose the data.
using DvrPoseRing = BroadcastRing<DvrPose, DvrPoseTraits>;
using DvrVsyncRing = BroadcastRing<DvrVsync, DvrVsyncTraits>;
using DvrConfigRing = BroadcastRing<DvrConfig, DvrConfigTraits>;
// This is a shared memory buffer for passing pose data estimated at vsyncs.
//
// This will be primarily used for late latching and EDS where we bind this
// buffer in a shader and extract the right vsync-predicted pose.
struct __attribute__((packed, aligned(16))) DvrVsyncPoseBuffer {
enum : int {
// The number vsync predicted poses to keep in the ring buffer.
// Must be a power of 2.
kSize = 8,
kIndexMask = kSize - 1,
// The number of vsyncs (from the current vsync) we predict in vsync buffer.
// The other poses are left alone.
kMinFutureCount = 4
};
// The vsync predicted poses.
// The pose for the vsync n is:
// vsync_poses[n % kSize]
//
// This buffer is unsynchronized: It is possible to get torn reads as the
// sensor service updates the predictions as new sensor measurements come
// in. In particular, it is possible to get the position and an updated
// orientation while reading.
DvrPoseAsync vsync_poses[kSize];
// The latest sensor pose for GPU usage.
DvrPose current_pose;
// Current vsync_count (where sensord is writing poses from).
uint32_t vsync_count;
// For 16 byte alignment.
uint8_t padding[12];
};
static_assert(sizeof(DvrVsyncPoseBuffer) == 1152,
"Unexpected size for DvrVsyncPoseBuffer");
// The keys for the dvr global buffers.
enum DvrGlobalBuffers : int32_t {
kVsyncPoseBuffer = 1,
kVsyncBuffer = 2,
kSensorPoseBuffer = 3,
kVrFlingerConfigBufferKey = 4
};
} // namespace dvr
} // namespace android
#endif // ANDROID_DVR_SHARED_BUFFERS_H_