From: Okan Arikan Date: Mon, 5 Jun 2017 23:21:42 +0000 (-0700) Subject: Resurrect the pose tool. X-Git-Tag: android-x86-9.0-r1~405^2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=2a4d63ce1737705fff6def88e68b2e537db9074c;p=android-x86%2Fframeworks-native.git Resurrect the pose tool. Editing the tool to look into the same broadcast ring that VrCore reads from. Bug: 62355308 Test: Run pose tool Change-Id: I270e3934c7df398048701a81851ee860a8acb712 --- diff --git a/libs/vr/libdisplay/include/private/dvr/shared_buffer_helpers.h b/libs/vr/libdisplay/include/private/dvr/shared_buffer_helpers.h index ed0651552f..20541a69a5 100644 --- a/libs/vr/libdisplay/include/private/dvr/shared_buffer_helpers.h +++ b/libs/vr/libdisplay/include/private/dvr/shared_buffer_helpers.h @@ -103,9 +103,14 @@ class CPUMappedBroadcastRing : public CPUMappedBuffer { // Try obtaining the ring. If the named buffer has not been created yet, it // will return nullptr. RingType* Ring() { - if (IsMapped() == false) { - TryMapping(); + // No ring created yet? + if (ring_ == nullptr) { + // Not mapped the memory yet? + if (IsMapped() == false) { + TryMapping(); + } + // If have the memory mapped, allocate the ring. if (IsMapped()) { switch (usage_mode_) { case CPUUsageMode::READ_OFTEN: diff --git a/libs/vr/libvrsensor/pose_client.cpp b/libs/vr/libvrsensor/pose_client.cpp index b21c7cf572..4ddf1f33cb 100644 --- a/libs/vr/libvrsensor/pose_client.cpp +++ b/libs/vr/libvrsensor/pose_client.cpp @@ -22,6 +22,11 @@ using android::pdx::Transaction; namespace android { namespace dvr { +namespace { + +typedef CPUMappedBroadcastRing SensorPoseRing; + +} // namespace // PoseClient is a remote interface to the pose service in sensord. class PoseClient : public pdx::ClientBase { @@ -36,16 +41,21 @@ class PoseClient : public pdx::ClientBase { // Polls the pose service for the current state and stores it in *state. // Returns zero on success, a negative error code otherwise. int Poll(DvrPose* state) { - const auto vsync_buffer = GetVsyncBuffer(); - if (vsync_buffer) { - if (state) { - // Fill the state - *state = vsync_buffer->current_pose; + // Allocate the helper class to access the sensor pose buffer. + if (sensor_pose_buffer_ == nullptr) { + sensor_pose_buffer_ = std::make_unique( + DvrGlobalBuffers::kSensorPoseBuffer, CPUUsageMode::READ_RARELY); + } + + if (state) { + if (sensor_pose_buffer_->GetNewest(state)) { + return 0; + } else { + return -EAGAIN; } - return -EINVAL; } - return -EAGAIN; + return -EINVAL; } int GetPose(uint32_t vsync_count, DvrPoseAsync* out_pose) { @@ -235,6 +245,9 @@ class PoseClient : public pdx::ClientBase { // The vsync pose buffer if already mapped. std::unique_ptr vsync_pose_buffer_; + // The direct sensor pose buffer. + std::unique_ptr sensor_pose_buffer_; + const DvrVsyncPoseBuffer* mapped_vsync_pose_buffer_ = nullptr; struct ControllerClientState {