Home | History | Annotate | Download | only in dvr
      1 #ifndef ANDROID_DVR_SHARED_BUFFERS_H_
      2 #define ANDROID_DVR_SHARED_BUFFERS_H_
      3 
      4 #include <dvr/dvr_config.h>
      5 #include <dvr/dvr_pose.h>
      6 #include <dvr/dvr_vsync.h>
      7 #include <libbroadcastring/broadcast_ring.h>
      8 
      9 // This header is shared by VrCore and Android and must be kept in sync.
     10 namespace android {
     11 namespace dvr {
     12 
     13 // Increment when the layout for the buffers change.
     14 enum : uint32_t { kSharedBufferLayoutVersion = 2 };
     15 
     16 // Note: These buffers will be mapped from various system processes as well
     17 // as VrCore and the application processes in a r/w manner.
     18 //
     19 // Therefore it is possible for the application to mess with the contents of
     20 // these buffers.
     21 //
     22 // While using them, assume garbage memory: Your logic must not crash or lead
     23 // to execution of unsafe code as a function of the contents of these buffers.
     24 
     25 // Sanity check for basic type sizes.
     26 static_assert(sizeof(DvrPoseAsync) == 128, "Unexpected size for DvrPoseAsync");
     27 static_assert(sizeof(DvrPose) == 112, "Unexpected size for DvrPose");
     28 static_assert(sizeof(DvrVsync) == 32, "Unexpected size for DvrVsync");
     29 static_assert(sizeof(DvrConfig) == 16, "Unexpected size for DvrConfig");
     30 
     31 // A helper class that provides compile time sized traits for the BroadcastRing.
     32 template <class DvrType, size_t StaticCount>
     33 class DvrRingBufferTraits {
     34  public:
     35   using Record = DvrType;
     36   static constexpr bool kUseStaticRecordSize = false;
     37   static constexpr uint32_t kStaticRecordCount = StaticCount;
     38   static constexpr int kMaxReservedRecords = 1;
     39   static constexpr int kMinAvailableRecords = 1;
     40 };
     41 
     42 // Traits classes.
     43 using DvrPoseTraits = DvrRingBufferTraits<DvrPose, 0>;
     44 using DvrVsyncTraits = DvrRingBufferTraits<DvrVsync, 2>;
     45 using DvrConfigTraits = DvrRingBufferTraits<DvrConfig, 2>;
     46 
     47 // The broadcast ring classes that will expose the data.
     48 using DvrPoseRing = BroadcastRing<DvrPose, DvrPoseTraits>;
     49 using DvrVsyncRing = BroadcastRing<DvrVsync, DvrVsyncTraits>;
     50 using DvrConfigRing = BroadcastRing<DvrConfig, DvrConfigTraits>;
     51 
     52 // This is a shared memory buffer for passing pose data estimated at vsyncs.
     53 //
     54 // This will be primarily used for late latching and EDS where we bind this
     55 // buffer in a shader and extract the right vsync-predicted pose.
     56 struct __attribute__((packed, aligned(16))) DvrVsyncPoseBuffer {
     57   enum : int {
     58     // The number vsync predicted poses to keep in the ring buffer.
     59     // Must be a power of 2.
     60     kSize = 8,
     61     kIndexMask = kSize - 1,
     62 
     63     // The number of vsyncs (from the current vsync) we predict in vsync buffer.
     64     // The other poses are left alone.
     65     kMinFutureCount = 4
     66   };
     67 
     68   // The vsync predicted poses.
     69   // The pose for the vsync n is:
     70   // vsync_poses[n % kSize]
     71   //
     72   // This buffer is unsynchronized: It is possible to get torn reads as the
     73   // sensor service updates the predictions as new sensor measurements come
     74   // in. In particular, it is possible to get the position and an updated
     75   // orientation while reading.
     76   DvrPoseAsync vsync_poses[kSize];
     77 
     78   // The latest sensor pose for GPU usage.
     79   DvrPose current_pose;
     80 
     81   // Current vsync_count (where sensord is writing poses from).
     82   uint32_t vsync_count;
     83 
     84   // For 16 byte alignment.
     85   uint8_t padding[12];
     86 };
     87 
     88 static_assert(sizeof(DvrVsyncPoseBuffer) == 1152,
     89               "Unexpected size for DvrVsyncPoseBuffer");
     90 
     91 // The keys for the dvr global buffers.
     92 enum DvrGlobalBuffers : int32_t {
     93   kVsyncPoseBuffer = 1,
     94   kVsyncBuffer = 2,
     95   kSensorPoseBuffer = 3,
     96   kVrFlingerConfigBufferKey = 4
     97 };
     98 
     99 }  // namespace dvr
    100 }  // namespace android
    101 
    102 #endif  // ANDROID_DVR_SHARED_BUFFERS_H_
    103