6 #include <dvr/graphics.h>
7 #include <dvr/pose_client.h>
8 #include <gtest/gtest.h>
10 #include <private/dvr/types.h>
12 using android::dvr::vec4;
16 vec4 ToVec4(float32x4_t rhs) { return vec4(rhs[0], rhs[1], rhs[2], rhs[3]); }
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};
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,
39 dvrGraphicsContextCreate(surface_params, &context);
43 TEST(SensorAppTests, GetPose) {
44 DvrGraphicsContext* context = CreateContext();
45 ASSERT_NE(nullptr, context);
46 DvrPose* client = dvrPoseCreate();
47 ASSERT_NE(nullptr, client);
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);
55 int ret = dvrPoseGet(client, schedule.vsync_count, &pose);
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));
63 // Check for different data each frame, but skip first few to allow
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);
75 last_vsync_count = schedule.vsync_count;
76 dvrBeginRenderFrame(context);
77 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
81 dvrPoseDestroy(client);
82 dvrGraphicsContextDestroy(context);
85 TEST(SensorAppTests, PoseRingBuffer) {
86 DvrGraphicsContext* context = CreateContext();
87 ASSERT_NE(nullptr, context);
88 DvrPose* client = dvrPoseCreate();
89 ASSERT_NE(nullptr, client);
91 DvrPoseRingBufferInfo info;
92 int ret = dvrPoseGetRingBuffer(client, &info);
94 ASSERT_NE(nullptr, info.buffer);
95 EXPECT_LE(2u, info.min_future_count);
96 EXPECT_LE(8u, info.total_count);
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);
104 ret = dvrPoseGet(client, schedule.vsync_count, &pose);
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));
112 // Check for different data each frame, but skip first few to allow
113 // startup anomalies.
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);
124 last_vsync_count = schedule.vsync_count;
125 dvrBeginRenderFrame(context);
126 glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
130 dvrPoseDestroy(client);
131 dvrGraphicsContextDestroy(context);