OSDN Git Service

Merge "Get rid of IGraphicBufferAlloc"
[android-x86/frameworks-native.git] / libs / vr / libvrsensor / tests / sensor_app_tests.cpp
1 #include <EGL/egl.h>
2 #include <GLES2/gl2.h>
3 #include <math.h>
4 #include <inttypes.h>
5
6 #include <dvr/graphics.h>
7 #include <dvr/pose_client.h>
8 #include <gtest/gtest.h>
9 #include <log/log.h>
10 #include <private/dvr/types.h>
11
12 using android::dvr::vec4;
13
14 namespace {
15
16 vec4 ToVec4(float32x4_t rhs) { return vec4(rhs[0], rhs[1], rhs[2], rhs[3]); }
17
18 }
19
20 DvrGraphicsContext* CreateContext() {
21   DvrGraphicsContext* context = nullptr;
22   int display_width = 0, display_height = 0;
23   int surface_width = 0, surface_height = 0;
24   float inter_lens_meters = 0.0f;
25   float left_fov[4] = {0.0f};
26   float right_fov[4] = {0.0f};
27   int disable_warp = 0;
28   DvrSurfaceParameter surface_params[] = {
29       DVR_SURFACE_PARAMETER_IN(DISABLE_DISTORTION, disable_warp),
30       DVR_SURFACE_PARAMETER_OUT(DISPLAY_WIDTH, &display_width),
31       DVR_SURFACE_PARAMETER_OUT(DISPLAY_HEIGHT, &display_height),
32       DVR_SURFACE_PARAMETER_OUT(SURFACE_WIDTH, &surface_width),
33       DVR_SURFACE_PARAMETER_OUT(SURFACE_HEIGHT, &surface_height),
34       DVR_SURFACE_PARAMETER_OUT(INTER_LENS_METERS, &inter_lens_meters),
35       DVR_SURFACE_PARAMETER_OUT(LEFT_FOV_LRBT, left_fov),
36       DVR_SURFACE_PARAMETER_OUT(RIGHT_FOV_LRBT, right_fov),
37       DVR_SURFACE_PARAMETER_LIST_END,
38   };
39   dvrGraphicsContextCreate(surface_params, &context);
40   return context;
41 }
42
43 TEST(SensorAppTests, GetPose) {
44   DvrGraphicsContext* context = CreateContext();
45   ASSERT_NE(nullptr, context);
46   DvrPose* client = dvrPoseCreate();
47   ASSERT_NE(nullptr, client);
48
49   DvrPoseAsync last_pose;
50   uint32_t last_vsync_count = 0;
51   for (int i = 0; i < 10; ++i) {
52     DvrFrameSchedule schedule;
53     dvrGraphicsWaitNextFrame(context, 0, &schedule);
54     DvrPoseAsync pose;
55     int ret = dvrPoseGet(client, schedule.vsync_count, &pose);
56     ASSERT_EQ(0, ret);
57
58     // Check for unit-length quaternion to verify valid pose.
59     vec4 quaternion = ToVec4(pose.orientation);
60     float length = quaternion.norm();
61     EXPECT_GT(0.001, fabs(1.0f - length));
62
63     // Check for different data each frame, but skip first few to allow
64     // startup anomalies.
65     if (i > 0) {
66       if (last_vsync_count == schedule.vsync_count)
67         ALOGE("vsync did not increment: %u", schedule.vsync_count);
68       if (pose.timestamp_ns == last_pose.timestamp_ns)
69         ALOGE("timestamp did not change: %" PRIu64, pose.timestamp_ns);
70       // TODO(jbates) figure out why the bots are not passing this check.
71       // EXPECT_NE(last_vsync_count, schedule.vsync_count);
72       // EXPECT_NE(pose.timestamp_ns, last_pose.timestamp_ns);
73     }
74     last_pose = pose;
75     last_vsync_count = schedule.vsync_count;
76     dvrBeginRenderFrame(context);
77     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
78     dvrPresent(context);
79   }
80
81   dvrPoseDestroy(client);
82   dvrGraphicsContextDestroy(context);
83 }
84
85 TEST(SensorAppTests, PoseRingBuffer) {
86   DvrGraphicsContext* context = CreateContext();
87   ASSERT_NE(nullptr, context);
88   DvrPose* client = dvrPoseCreate();
89   ASSERT_NE(nullptr, client);
90
91   DvrPoseRingBufferInfo info;
92   int ret = dvrPoseGetRingBuffer(client, &info);
93   ASSERT_EQ(0, ret);
94   ASSERT_NE(nullptr, info.buffer);
95   EXPECT_LE(2u, info.min_future_count);
96   EXPECT_LE(8u, info.total_count);
97
98   DvrPoseAsync last_pose;
99   uint32_t last_vsync_count = 0;
100   for (int i = 0; i < 10; ++i) {
101     DvrFrameSchedule schedule;
102     dvrGraphicsWaitNextFrame(context, 0, &schedule);
103     DvrPoseAsync pose;
104     ret = dvrPoseGet(client, schedule.vsync_count, &pose);
105     ASSERT_EQ(0, ret);
106
107     // Check for unit-length quaternion to verify valid pose.
108     vec4 quaternion = ToVec4(pose.orientation);
109     float length = quaternion.norm();
110     EXPECT_GT(0.001, fabs(1.0f - length));
111
112     // Check for different data each frame, but skip first few to allow
113     // startup anomalies.
114     if (i > 0) {
115       if (last_vsync_count == schedule.vsync_count)
116         ALOGE("vsync did not increment: %u", schedule.vsync_count);
117       if (pose.timestamp_ns == last_pose.timestamp_ns)
118         ALOGE("timestamp did not change: %" PRIu64, pose.timestamp_ns);
119       // TODO(jbates) figure out why the bots are not passing this check.
120       // EXPECT_NE(last_vsync_count, schedule.vsync_count);
121       // EXPECT_NE(pose.timestamp_ns, last_pose.timestamp_ns);
122     }
123     last_pose = pose;
124     last_vsync_count = schedule.vsync_count;
125     dvrBeginRenderFrame(context);
126     glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
127     dvrPresent(context);
128   }
129
130   dvrPoseDestroy(client);
131   dvrGraphicsContextDestroy(context);
132 }