Merge "SurfaceFlinger: setGeometryAppliesWithResize crop latching fixes." into oc-dev
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp
index 80c5ec2..c0602e7 100644
--- a/libs/nativewindow/AHardwareBuffer.cpp
+++ b/libs/nativewindow/AHardwareBuffer.cpp
@@ -179,12 +179,17 @@
     memcpy(fdData, fds.get(), sizeof(int) * fdCount);
     msg.msg_controllen = cmsg->cmsg_len;
 
-    int result = sendmsg(socketFd, &msg, 0);
-    if (result <= 0) {
+    int result;
+    do {
+        result = sendmsg(socketFd, &msg, 0);
+    } while (result == -1 && errno == EINTR);
+    if (result == -1) {
+        result = errno;
         ALOGE("Error writing AHardwareBuffer to socket: error %#x (%s)",
-                result, strerror(errno));
-        return result;
+                result, strerror(result));
+        return -result;
     }
+
     return NO_ERROR;
 }
 
@@ -206,11 +211,15 @@
             .msg_iovlen = 1,
     };
 
-    int result = recvmsg(socketFd, &msg, 0);
-    if (result <= 0) {
+    int result;
+    do {
+        result = recvmsg(socketFd, &msg, 0);
+    } while (result == -1 && errno == EINTR);
+    if (result == -1) {
+        result = errno;
         ALOGE("Error reading AHardwareBuffer from socket: error %#x (%s)",
-                result, strerror(errno));
-        return result;
+                result, strerror(result));
+        return -result;
     }
 
     if (msg.msg_iovlen != 1) {
diff --git a/libs/ui/GraphicsEnv.cpp b/libs/ui/GraphicsEnv.cpp
index 1d20424..8182c07 100644
--- a/libs/ui/GraphicsEnv.cpp
+++ b/libs/ui/GraphicsEnv.cpp
@@ -23,6 +23,11 @@
 #include <log/log.h>
 #include <nativeloader/dlext_namespaces.h>
 
+// TODO(b/37049319) Get this from a header once one exists
+extern "C" {
+  android_namespace_t* android_get_exported_namespace(const char*);
+}
+
 namespace android {
 
 /*static*/ GraphicsEnv& GraphicsEnv::getInstance() {
@@ -43,33 +48,19 @@
 android_namespace_t* GraphicsEnv::getDriverNamespace() {
     static std::once_flag once;
     std::call_once(once, [this]() {
-        // TODO; In the next version of Android, all graphics drivers will be
-        // loaded into a custom namespace. To minimize risk for this release,
-        // only updated drivers use a custom namespace.
-        //
-        // Additionally, the custom namespace will be
-        // ANDROID_NAMESPACE_TYPE_ISOLATED, and will only have access to a
-        // subset of the system.
         if (mDriverPath.empty())
             return;
-
-        char defaultPath[PATH_MAX];
-        android_get_LD_LIBRARY_PATH(defaultPath, sizeof(defaultPath));
-        size_t defaultPathLen = strlen(defaultPath);
-
-        std::string path;
-        path.reserve(mDriverPath.size() + 1 + defaultPathLen);
-        path.append(mDriverPath);
-        path.push_back(':');
-        path.append(defaultPath, defaultPathLen);
-
-        mDriverNamespace = android_create_namespace(
-                "gfx driver",
-                nullptr,                    // ld_library_path
-                path.c_str(),               // default_library_path
-                ANDROID_NAMESPACE_TYPE_SHARED,
-                nullptr,                    // permitted_when_isolated_path
-                nullptr);                   // parent
+        // If the sphal namespace isn't configured for a device, don't support updatable drivers.
+        // We need a parent namespace to inherit the default search path from.
+        auto sphalNamespace = android_get_exported_namespace("sphal");
+        if (!sphalNamespace) return;
+        mDriverNamespace = android_create_namespace("gfx driver",
+                                                    nullptr,             // ld_library_path
+                                                    mDriverPath.c_str(), // default_library_path
+                                                    ANDROID_NAMESPACE_TYPE_SHARED |
+                                                            ANDROID_NAMESPACE_TYPE_ISOLATED,
+                                                    nullptr, // permitted_when_isolated_path
+                                                    sphalNamespace);
     });
     return mDriverNamespace;
 }
diff --git a/libs/vr/libposepredictor/Android.bp b/libs/vr/libposepredictor/Android.bp
deleted file mode 100644
index 2f1d2f5..0000000
--- a/libs/vr/libposepredictor/Android.bp
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2008 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-sourceFiles = [
-    "predictor.cpp",
-    "buffered_predictor.cpp",
-    "linear_predictor.cpp",
-    "polynomial_predictor.cpp",
-    "dvr_pose_predictor.cpp",
-]
-
-includeFiles = [
-    "include",
-]
-
-staticLibraries = ["libvrsensor"]
-
-sharedLibraries = []
-
-headerLibraries = [ "libeigen" ]
-
-cc_library {
-    srcs: sourceFiles,
-    cflags: [
-      "-DLOG_TAG=\"libposepredictor\"",
-      "-DTRACE=0",
-    ],
-    export_include_dirs: includeFiles,
-    static_libs: staticLibraries,
-    shared_libs: sharedLibraries,
-    header_libs: headerLibraries,
-    export_header_lib_headers: headerLibraries,
-    name: "libposepredictor",
-}
-
-cc_test {
-    tags: ["optional"],
-    srcs: [
-        "predictor_tests.cpp",
-        "linear_predictor_tests.cpp",
-        "polynomial_predictor_tests.cpp",
-    ],
-
-    static_libs: ["libposepredictor"] + staticLibraries,
-    shared_libs: sharedLibraries,
-    name: "pose_predictor_tests",
-}
diff --git a/libs/vr/libposepredictor/buffered_predictor.cpp b/libs/vr/libposepredictor/buffered_predictor.cpp
deleted file mode 100644
index f3b41dc..0000000
--- a/libs/vr/libposepredictor/buffered_predictor.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <buffered_predictor.h>
-
-namespace posepredictor {
-
-BufferedPredictor::BufferedPredictor(size_t buffer_size) {
-  buffer_.resize(buffer_size);
-}
-
-void BufferedPredictor::BufferSample(const Pose& sample) {
-  const auto& prev_sample = buffer_[current_pose_index_];
-
-  // If we are updating a sample (the same time stamp), do not advance the
-  // counter.
-  if (sample.time_ns != prev_sample.time_ns) {
-    current_pose_index_ = (current_pose_index_ + 1) % buffer_.size();
-  }
-
-  buffer_[current_pose_index_] = sample;
-
-  // Make sure the subsequent orientations are the closest in quaternion space.
-  if (PrevSample(1).orientation.coeffs().dot(sample.orientation.coeffs()) < 0) {
-    // Flip the quaternion to be closest to the previous sample.
-    buffer_[current_pose_index_].orientation =
-        quat(-sample.orientation.w(), -sample.orientation.x(),
-             -sample.orientation.y(), -sample.orientation.z());
-  }
-
-  ++num_poses_added_;
-}
-
-const Pose& BufferedPredictor::PrevSample(size_t index) const {
-  // We must not request a pose too far in the past.
-  assert(index < buffer_.size());
-  return buffer_[(current_pose_index_ - index + buffer_.size()) %
-                 buffer_.size()];
-}
-
-}  // namespace posepredictor
diff --git a/libs/vr/libposepredictor/dvr_pose_predictor.cpp b/libs/vr/libposepredictor/dvr_pose_predictor.cpp
deleted file mode 100644
index 7f2ecc0..0000000
--- a/libs/vr/libposepredictor/dvr_pose_predictor.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <private/dvr/dvr_pose_predictor.h>
-
-namespace android {
-namespace dvr {
-
-namespace {
-template <typename Vec3Type>
-float32x4_t FromVec3(const Vec3Type& from) {
-  return {static_cast<float>(from.x()), static_cast<float>(from.y()),
-          static_cast<float>(from.z()), 0};
-}
-
-template <typename QuatType>
-float32x4_t FromQuat(const QuatType& from) {
-  return {static_cast<float>(from.x()), static_cast<float>(from.y()),
-          static_cast<float>(from.z()), static_cast<float>(from.w())};
-}
-
-}  //  namespace
-
-void AddPredictorPose(posepredictor::Predictor* predictor,
-                      const posepredictor::vec3& start_t_head,
-                      const posepredictor::quat& start_q_head,
-                      int64_t pose_timestamp, DvrPoseAsync* out) {
-  // Feed the predictor.
-  predictor->Add(
-      posepredictor::Pose{pose_timestamp, start_t_head, start_q_head});
-
-  // Fill the output.
-  out->timestamp_ns = pose_timestamp;
-
-  out->translation = FromVec3(start_t_head);
-  out->orientation = FromQuat(start_q_head);
-
-  out->right_translation = out->translation;
-  out->right_orientation = out->orientation;
-
-  const auto velocity = predictor->PredictVelocity(pose_timestamp);
-
-  out->velocity = FromVec3(velocity.linear);
-  out->angular_velocity = FromVec3(velocity.angular);
-
-  out->flags = DVR_POSE_FLAG_HEAD | DVR_POSE_FLAG_VALID;
-  memset(out->pad, 0, sizeof(out->pad));
-}
-
-void PredictPose(const posepredictor::Predictor* predictor, int64_t left_ns,
-                 int64_t right_ns, DvrPoseAsync* out) {
-  const auto left_pose = predictor->Predict(left_ns);
-  const auto right_pose = predictor->Predict(right_ns);
-  const auto velocity = predictor->PredictVelocity((left_ns + right_ns) / 2);
-
-  // Fill the output.
-  out->timestamp_ns = left_ns;
-
-  out->translation = FromVec3(left_pose.position);
-  out->orientation = FromQuat(left_pose.orientation);
-
-  out->right_translation = FromVec3(right_pose.position);
-  out->right_orientation = FromQuat(right_pose.orientation);
-
-  out->velocity = FromVec3(velocity.linear);
-  out->angular_velocity = FromVec3(velocity.angular);
-
-  out->flags = DVR_POSE_FLAG_HEAD | DVR_POSE_FLAG_VALID;
-  memset(out->pad, 0, sizeof(out->pad));
-}
-
-}  //  dvr
-}  //  android
diff --git a/libs/vr/libposepredictor/include/buffered_predictor.h b/libs/vr/libposepredictor/include/buffered_predictor.h
deleted file mode 100644
index eab0150..0000000
--- a/libs/vr/libposepredictor/include/buffered_predictor.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef POSEPREDICTOR_BUFFERED_PREDICTOR_H_
-#define POSEPREDICTOR_BUFFERED_PREDICTOR_H_
-
-#include <vector>
-
-#include "predictor.h"
-
-namespace posepredictor {
-
-// Keeps the previous n poses around in a ring buffer.
-// The orientations are also unrolled so that a . b > 0 for two subsequent
-// quaternions a and b.
-class BufferedPredictor : public Predictor {
- public:
-  BufferedPredictor(size_t buffer_size);
-  ~BufferedPredictor() = default;
-
- protected:
-  // Add a pose sample into the buffer.
-  void BufferSample(const Pose& sample);
-
-  // Grab a previous sample.
-  // index = 0: last sample
-  // index = 1: the one before that
-  // ...
-  const Pose& PrevSample(size_t index) const;
-
-  // Where we keep the last n poses.
-  std::vector<Pose> buffer_;
-
-  // Where the last valid pose is in the buffer.
-  size_t current_pose_index_ = 0;
-
-  // The number of poses we have added.
-  size_t num_poses_added_ = 0;
-};
-
-}  // namespace posepredictor
-
-#endif  // POSEPREDICTOR_BUFFERED_PREDICTOR_H_
diff --git a/libs/vr/libposepredictor/include/linear_predictor.h b/libs/vr/libposepredictor/include/linear_predictor.h
deleted file mode 100644
index 0d17ec5..0000000
--- a/libs/vr/libposepredictor/include/linear_predictor.h
+++ /dev/null
@@ -1,43 +0,0 @@
-#ifndef POSEPREDICTOR_LINEAR_POSE_PREDICTOR_H_
-#define POSEPREDICTOR_LINEAR_POSE_PREDICTOR_H_
-
-#include "predictor.h"
-
-namespace posepredictor {
-
-// This class makes a linear prediction using the last two samples we received.
-class LinearPosePredictor : public Predictor {
- public:
-  LinearPosePredictor() = default;
-
-  // Add a new sample.
-  void Add(const Pose& sample) override;
-
-  // Predict using the last two samples.
-  Pose Predict(int64_t time_ns) const override;
-
-  // Just copy the velocity over.
-  Velocity PredictVelocity(int64_t time_ns) const override;
-
- private:
-  // The index of the last sample we received.
-  size_t current_index_ = 0;
-
-  // The previous two samples.
-  Pose samples_[2];
-
-  // Experimental
-  bool forward_predict_angular_speed_ = false;
-
-  // Transient variables updated when a sample is added.
-  vec3 velocity_ = vec3::Zero();
-  vec3 rotational_velocity_ = vec3::Zero();
-  vec3 rotational_axis_ = vec3::Zero();
-  real last_angular_speed_ = 0;
-  real angular_speed_ = 0;
-  real angular_accel_ = 0;
-};
-
-}  // namespace posepredictor
-
-#endif  // POSEPREDICTOR_LINEAR_POSE_PREDICTOR_H_
diff --git a/libs/vr/libposepredictor/include/polynomial_predictor.h b/libs/vr/libposepredictor/include/polynomial_predictor.h
deleted file mode 100644
index 4b8d51b..0000000
--- a/libs/vr/libposepredictor/include/polynomial_predictor.h
+++ /dev/null
@@ -1,168 +0,0 @@
-#ifndef POSEPREDICTOR_POLYNOMIAL_POSE_PREDICTOR_H_
-#define POSEPREDICTOR_POLYNOMIAL_POSE_PREDICTOR_H_
-
-#include <vector>
-
-#include <Eigen/Dense>
-
-#include "buffered_predictor.h"
-
-namespace posepredictor {
-
-// Make a polynomial prediction of the form
-// y = coefficients_[0] + coefficients_[1] * t + coefficients_[2] * t^2 + ...
-// where t is time and y is the position and orientation.
-// We recompute the coefficients whenever we add a new sample using
-// training_window previous samples.
-template <size_t PolynomialDegree, size_t TrainingWindow>
-class PolynomialPosePredictor : public BufferedPredictor {
- public:
-  PolynomialPosePredictor(real regularization = 1e-9)
-      : BufferedPredictor(TrainingWindow), regularization_(regularization) {
-    static_assert(TrainingWindow >= PolynomialDegree + 1,
-                  "Underconstrained polynomial regressor");
-  }
-
-  ~PolynomialPosePredictor() = default;
-
-  // We convert pose samples into a vector for matrix arithmetic using this
-  // mapping.
-  enum Components {
-    kPositionX = 0,
-    kPositionY,
-    kPositionZ,
-    kOrientationX,
-    kOrientationY,
-    kOrientationZ,
-    kOrientationW,
-    kNumComponents
-  };
-
-  // Add a new sample.
-  void Add(const Pose& sample) override {
-    // Add the sample to the ring buffer.
-    BufferedPredictor::BufferSample(sample);
-
-    Eigen::Matrix<real, TrainingWindow, kNumComponents> values;
-
-    // Get the pose samples into matrices for fitting.
-    real t_vector[TrainingWindow];
-    for (size_t i = 0; i < TrainingWindow; ++i) {
-      const auto& prev_sample = PrevSample(i);
-
-      t_vector[i] = NsToT(prev_sample.time_ns);
-
-      // Save the values we will be fitting to at each sample time.
-      values(i, kPositionX) = prev_sample.position.x();
-      values(i, kPositionY) = prev_sample.position.y();
-      values(i, kPositionZ) = prev_sample.position.z();
-      values(i, kOrientationX) = prev_sample.orientation.x();
-      values(i, kOrientationY) = prev_sample.orientation.y();
-      values(i, kOrientationZ) = prev_sample.orientation.z();
-      values(i, kOrientationW) = prev_sample.orientation.w();
-    }
-
-    // Some transient matrices for solving for coefficient matrix.
-    Eigen::Matrix<real, PolynomialDegree + 1, PolynomialDegree + 1> M;
-    Eigen::Matrix<real, PolynomialDegree + 1, 1> d;
-    Eigen::Matrix<real, PolynomialDegree + 1, 1> p;
-
-    // Create a polynomial fit for each component.
-    for (size_t component = 0; component < kNumComponents; ++component) {
-      // A = [ 1 t t^2 ... ]'
-      // x = [ coefficients[0] coefficients[1] .... ]'
-      // b = [ position.x ]'
-      // We would like to solve A' x + regularization * I = b'
-      // given the samples we have in our training window.
-      //
-      // The loop below will compute:
-      // M = A' * A
-      // d = A' * b
-      // so we can solve M * coefficients + regularization * I = b
-
-      M.setIdentity();
-      d.setZero();
-      p[0] = 1;
-
-      // M = regularization * I
-      M = M * regularization_;
-
-      // Accumulate the poses in the training window.
-      for (size_t i = 0; i < TrainingWindow; ++i) {
-        // Compute the polynomial at this sample.
-        for (size_t j = 1; j <= PolynomialDegree; ++j) {
-          p[j] = p[j - 1] * t_vector[i];
-        }
-
-        // Accumulate the left and right hand sides.
-        M = M + p * p.transpose();
-        d = d + p * values(i, component);
-      }
-
-      // M is symmetric, positive semi-definite.
-      // Note: This is not the most accurate solver out there but is fast.
-      coefficients_.row(component) = Eigen::LLT<Eigen::MatrixXd>(M).solve(d);
-    }
-  }
-
-  // Predict using the polynomial coefficients.
-  Pose Predict(int64_t time_ns) const override {
-    // Predict the left side.
-    const auto components = SamplePolynomial(time_ns);
-
-    return {time_ns,
-            vec3(components[kPositionX], components[kPositionY],
-                 components[kPositionZ]),
-            quat(components[kOrientationW], components[kOrientationX],
-                 components[kOrientationY], components[kOrientationZ])
-                .normalized()};
-  }
-
- private:
-  // Evaluate the polynomial at a particular time.
-  Eigen::Matrix<real, kNumComponents, 1> SamplePolynomial(
-      int64_t time_ns) const {
-    const auto t = NsToT(time_ns);
-    Eigen::Matrix<real, PolynomialDegree + 1, 1> polynomial;
-    real current_polynomial = t;
-
-    // Compute polynomial = [ 1 t t^2 ... ]
-    polynomial[0] = 1;
-    for (size_t degree = 1; degree <= PolynomialDegree;
-         ++degree, current_polynomial *= t) {
-      polynomial[degree] = polynomial[degree - 1] * t;
-    }
-
-    // The coefficients_ = [ numComponents x (polynomial degree + 1) ].
-    return coefficients_ * polynomial;
-  }
-
-  // Convert a time in nanoseconds to t.
-  // We could use the seconds as t but this would create make it more difficult
-  // to tweak the regularization amount. So we subtract the last sample time so
-  // the scale of the regularization constant doesn't change as a function of
-  // time.
-  real NsToT(int64_t time_ns) const {
-    return NsToSeconds(time_ns - buffer_[current_pose_index_].time_ns);
-  }
-
-  // The ridge regularization constant.
-  real regularization_;
-
-  // This is where we store the polynomial coefficients.
-  Eigen::Matrix<real, kNumComponents, PolynomialDegree + 1> coefficients_;
-};
-
-// Some common polynomial types.
-extern template class PolynomialPosePredictor<1, 2>;
-extern template class PolynomialPosePredictor<2, 3>;
-extern template class PolynomialPosePredictor<3, 4>;
-extern template class PolynomialPosePredictor<4, 5>;
-
-using QuadricPosePredictor = PolynomialPosePredictor<2, 3>;
-using CubicPosePredictor = PolynomialPosePredictor<3, 4>;
-using QuarticPosePredictor = PolynomialPosePredictor<4, 5>;
-
-}  // namespace posepredictor
-
-#endif  // POSEPREDICTOR_POLYNOMIAL_POSE_PREDICTOR_H_
diff --git a/libs/vr/libposepredictor/include/predictor.h b/libs/vr/libposepredictor/include/predictor.h
deleted file mode 100644
index 78db272..0000000
--- a/libs/vr/libposepredictor/include/predictor.h
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef POSEPREDICTOR_POSE_PREDICTOR_H_
-#define POSEPREDICTOR_POSE_PREDICTOR_H_
-
-#include <Eigen/Core>
-#include <Eigen/Geometry>
-
-// This is the only file you need to include for pose prediction.
-
-namespace posepredictor {
-
-// The precision for the predictor.
-// TODO(okana): double precision is probably not necessary.
-typedef double real;
-
-using vec3 = Eigen::Matrix<real, 3, 1>;
-using quat = Eigen::Quaternion<real>;
-
-// Encapsulates a pose sample.
-struct Pose {
-  int64_t time_ns = 0;
-  vec3 position = vec3::Zero();
-  quat orientation = quat::Identity();
-};
-
-// Encapsulates the derivative at a time.
-struct Velocity {
-  vec3 linear = vec3::Zero();
-  vec3 angular = vec3::Zero();
-};
-
-// The preset types we support.
-enum class PredictorType { Linear, Quadric, Cubic };
-
-// This is an abstract base class for prediction 6dof pose given
-// a set of samples.
-class Predictor {
- public:
-  Predictor() = default;
-  virtual ~Predictor() = default;
-
-  // The nanoseconds to use for finite differencing.
-  static constexpr int64_t kFiniteDifferenceNs = 100;
-
-  // Instantiate a new pose predictor for a type.
-  static std::unique_ptr<Predictor> Create(PredictorType type);
-
-  // Compute the angular velocity from orientation start_orientation to
-  // end_orientation in delta_time.
-  static vec3 AngularVelocity(const quat& start_orientation,
-                              const quat& end_orientation, real delta_time);
-
-  // Add a pose sample coming from the sensors.
-  virtual void Add(const Pose& sample) = 0;
-
-  // Make a pose prediction for at specific time.
-  virtual Pose Predict(int64_t time_ns) const = 0;
-
-  // Evaluate velocity at a particular time.
-  // The default implementation uses finite differencing.
-  virtual Velocity PredictVelocity(int64_t time_ns) const;
-
-  // Helpers
-  static real NsToSeconds(int64_t time_ns) {
-    return static_cast<real>(time_ns / 1e9);
-  }
-  static int64_t SecondsToNs(real seconds) {
-    return static_cast<int64_t>(seconds * 1e9);
-  }
-};
-
-}  // namespace posepredictor
-
-#endif  // POSEPREDICTOR_POSE_PREDICTOR_H_
diff --git a/libs/vr/libposepredictor/include/private/dvr/dvr_pose_predictor.h b/libs/vr/libposepredictor/include/private/dvr/dvr_pose_predictor.h
deleted file mode 100644
index bd2dcbc..0000000
--- a/libs/vr/libposepredictor/include/private/dvr/dvr_pose_predictor.h
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef ANDROID_DVR_POSE_PREDICTOR_H_
-#define ANDROID_DVR_POSE_PREDICTOR_H_
-
-#include <dvr/pose_client.h>
-#include <predictor.h>
-
-// Some shim functions for connecting dvr to pose predictor.
-
-namespace android {
-namespace dvr {
-
-// Feed a pose to the predictor.
-void AddPredictorPose(posepredictor::Predictor* predictor,
-                      const posepredictor::vec3& start_t_head,
-                      const posepredictor::quat& start_q_head,
-                      int64_t pose_timestamp, DvrPoseAsync* out);
-
-// Make a prediction for left and right eyes.
-void PredictPose(const posepredictor::Predictor* predictor, int64_t left_ns,
-                 int64_t right_ns, DvrPoseAsync* out);
-
-}  // namespace dvr
-}  // namespace android
-
-#endif  // ANDROID_DVR_POSE_PREDICTOR_H_
diff --git a/libs/vr/libposepredictor/linear_predictor.cpp b/libs/vr/libposepredictor/linear_predictor.cpp
deleted file mode 100644
index 6f924dc..0000000
--- a/libs/vr/libposepredictor/linear_predictor.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#include <linear_predictor.h>
-
-namespace posepredictor {
-
-using AngleAxis = Eigen::AngleAxis<real>;
-
-void LinearPosePredictor::Add(const Pose& sample) {
-  // If we are receiving a new sample, move the index to the next item.
-  // If the time stamp is the same as the last frame, we will just overwrite
-  // it with the new data.
-  if (sample.time_ns != samples_[current_index_].time_ns) {
-    current_index_ ^= 1;
-  }
-
-  // Save the sample.
-  samples_[current_index_] = sample;
-
-  // The previous sample we received.
-  const auto& previous_sample = samples_[current_index_ ^ 1];
-
-  // Ready to compute velocities.
-  const auto pose_delta_time =
-      NsToSeconds(sample.time_ns - previous_sample.time_ns);
-
-  if (pose_delta_time > 0.0) {
-    velocity_ = (sample.position - previous_sample.position) / pose_delta_time;
-    rotational_velocity_ = Predictor::AngularVelocity(
-        previous_sample.orientation, sample.orientation, pose_delta_time);
-  } else {
-    velocity_ = vec3::Zero();
-    rotational_velocity_ = vec3::Zero();
-  }
-
-  // Temporary experiment with acceleration estimate.
-  angular_speed_ = rotational_velocity_.norm();
-  angular_accel_ = 0.0;
-  if (forward_predict_angular_speed_) {
-    angular_accel_ =
-        pose_delta_time > 0.0
-            ? (angular_speed_ - last_angular_speed_) / pose_delta_time
-            : 0.0;
-  }
-  last_angular_speed_ = angular_speed_;
-
-  rotational_axis_ = vec3(0.0, 1.0, 0.0);
-  if (angular_speed_ > 0.0) {
-    rotational_axis_ = rotational_velocity_ / angular_speed_;
-  }
-}
-
-Pose LinearPosePredictor::Predict(int64_t time_ns) const {
-  const auto& sample = samples_[current_index_];
-
-  const auto dt = NsToSeconds(time_ns - sample.time_ns);
-
-  // Temporary forward prediction code.
-  auto angle = angular_speed_ * dt;
-  if (__builtin_expect(forward_predict_angular_speed_, 0)) {
-    angle += 0.5 * angular_accel_ * dt * dt;
-  }
-
-  return {time_ns, sample.position + velocity_ * dt,
-          sample.orientation * quat(AngleAxis(angle, rotational_axis_))};
-}
-
-Velocity LinearPosePredictor::PredictVelocity(int64_t /* time_ns */) const {
-  return {velocity_, rotational_velocity_};
-}
-
-}  // namespace posepredictor
diff --git a/libs/vr/libposepredictor/linear_predictor_tests.cpp b/libs/vr/libposepredictor/linear_predictor_tests.cpp
deleted file mode 100644
index d94aa2d..0000000
--- a/libs/vr/libposepredictor/linear_predictor_tests.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-#include <gtest/gtest.h>
-
-#include <linear_predictor.h>
-
-namespace posepredictor {
-
-namespace {
-
-// For comparing expected and actual.
-constexpr real kAbsErrorTolerance = 1e-5;
-
-// The default rotation axis we will be using.
-const vec3 kRotationAxis = vec3(1, 4, 3).normalized();
-
-// Linearly interpolate between a and b.
-vec3 lerp(const vec3& a, const vec3& b, real t) { return (b - a) * t + a; }
-
-// Linearly interpolate between two angles and return the resulting rotation as
-// a quaternion (around the kRotationAxis).
-quat qlerp(real angle1, real angle2, real t) {
-  return quat(
-      Eigen::AngleAxis<real>((angle2 - angle1) * t + angle1, kRotationAxis));
-}
-
-// Compare two positions.
-void TestPosition(const vec3& expected, const vec3& actual) {
-  for (int i = 0; i < 3; ++i) {
-    EXPECT_NEAR(expected[i], actual[i], kAbsErrorTolerance);
-  }
-}
-
-// Compare two orientations.
-void TestOrientation(const quat& expected, const quat& actual) {
-  // abs(expected.dot(actual)) > 1-eps
-  EXPECT_GE(std::abs(actual.coeffs().dot(expected.coeffs())), 0.99);
-}
-}
-
-// Test the extrapolation from two samples.
-TEST(LinearPosePredictorTest, Extrapolation) {
-  LinearPosePredictor predictor;
-
-  // We wil extrapolate linearly from [position|orientation] 1 -> 2.
-  const vec3 position1(0, 0, 0);
-  const vec3 position2(1, 2, 3);
-  const real angle1 = M_PI * 0.3;
-  const real angle2 = M_PI * 0.5;
-  const quat orientation1(Eigen::AngleAxis<real>(angle1, kRotationAxis));
-  const quat orientation2(Eigen::AngleAxis<real>(angle2, kRotationAxis));
-  const int64_t t1_ns = 0;           //< First sample time stamp
-  const int64_t t2_ns = 10;          //< The second sample time stamp
-  const int64_t eval_left_ns = 23;   //< The eval time for left
-  const int64_t eval_right_ns = 31;  //< The eval time for right
-  Pose start_pose, end_pose, extrapolated_pose;
-
-  predictor.Add(Pose{
-      .position = position1, .orientation = orientation1, .time_ns = t1_ns});
-
-  predictor.Add(Pose{
-      .position = position2, .orientation = orientation2, .time_ns = t2_ns});
-
-  // Extrapolate from t1 - t2 to eval_[left/right].
-  extrapolated_pose = predictor.Predict(eval_left_ns);
-
-  // The interpolation factors for left and right.
-  const auto left_t = (eval_left_ns - t1_ns) / static_cast<real>(t2_ns - t1_ns);
-  EXPECT_EQ(2.3, left_t);
-
-  TestPosition(lerp(position1, position2, left_t), extrapolated_pose.position);
-
-  TestOrientation(qlerp(angle1, angle2, left_t), extrapolated_pose.orientation);
-
-  extrapolated_pose = predictor.Predict(eval_right_ns);
-
-  const auto right_t =
-      (eval_right_ns - t1_ns) / static_cast<real>(t2_ns - t1_ns);
-  EXPECT_EQ(3.1, right_t);
-
-  TestPosition(lerp(position1, position2, right_t), extrapolated_pose.position);
-
-  TestOrientation(qlerp(angle1, angle2, right_t),
-                  extrapolated_pose.orientation);
-}
-
-// Test three samples, where the last two samples have the same timestamp.
-TEST(LinearPosePredictorTest, DuplicateSamples) {
-  LinearPosePredictor predictor;
-
-  const vec3 position1(0, 0, 0);
-  const vec3 position2(1, 2, 3);
-  const vec3 position3(2, 2, 3);
-  const real angle1 = M_PI * 0.3;
-  const real angle2 = M_PI * 0.5;
-  const real angle3 = M_PI * 0.65;
-  const quat orientation1(Eigen::AngleAxis<real>(angle1, kRotationAxis));
-  const quat orientation2(Eigen::AngleAxis<real>(angle2, kRotationAxis));
-  const quat orientation3(Eigen::AngleAxis<real>(angle3, kRotationAxis));
-  const int64_t t1_ns = 0;
-  const int64_t t2_ns = 10;
-  const int64_t eval_left_ns = 27;
-  const int64_t eval_right_ns = 31;
-  Pose extrapolated_pose;
-
-  predictor.Add(Pose{
-      .position = position1, .orientation = orientation1, .time_ns = t1_ns});
-
-  predictor.Add(Pose{
-      .position = position2, .orientation = orientation2, .time_ns = t2_ns});
-
-  {
-    // Extrapolate from t1 - t2 to eval_[left/right].
-    extrapolated_pose = predictor.Predict(eval_left_ns);
-
-    // The interpolation factors for left and right.
-    const auto left_t =
-        (eval_left_ns - t1_ns) / static_cast<real>(t2_ns - t1_ns);
-
-    // Test the result.
-    TestPosition(lerp(position1, position2, left_t),
-                 extrapolated_pose.position);
-
-    TestOrientation(qlerp(angle1, angle2, left_t),
-                    extrapolated_pose.orientation);
-
-    extrapolated_pose = predictor.Predict(eval_right_ns);
-
-    const auto right_t =
-        (eval_right_ns - t1_ns) / static_cast<real>(t2_ns - t1_ns);
-
-    TestPosition(lerp(position1, position2, right_t),
-                 extrapolated_pose.position);
-
-    TestOrientation(qlerp(angle1, angle2, right_t),
-                    extrapolated_pose.orientation);
-  }
-
-  // Sending a duplicate sample here.
-  predictor.Add(Pose{
-      .position = position3, .orientation = orientation3, .time_ns = t2_ns});
-
-  {
-    // Extrapolate from t1 - t2 to eval_[left/right].
-    extrapolated_pose = predictor.Predict(eval_left_ns);
-
-    // The interpolation factors for left and right.
-    const auto left_t =
-        (eval_left_ns - t1_ns) / static_cast<real>(t2_ns - t1_ns);
-
-    TestPosition(lerp(position1, position3, left_t),
-                 extrapolated_pose.position);
-
-    TestOrientation(qlerp(angle1, angle3, left_t),
-                    extrapolated_pose.orientation);
-
-    extrapolated_pose = predictor.Predict(eval_right_ns);
-
-    const auto right_t =
-        (eval_right_ns - t1_ns) / static_cast<real>(t2_ns - t1_ns);
-
-    // Test the result.
-
-    TestPosition(lerp(position1, position3, right_t),
-                 extrapolated_pose.position);
-
-    TestOrientation(qlerp(angle1, angle3, right_t),
-                    extrapolated_pose.orientation);
-  }
-}
-
-}  // namespace posepredictor
diff --git a/libs/vr/libposepredictor/polynomial_predictor.cpp b/libs/vr/libposepredictor/polynomial_predictor.cpp
deleted file mode 100644
index 98fd28a..0000000
--- a/libs/vr/libposepredictor/polynomial_predictor.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <polynomial_predictor.h>
-
-namespace posepredictor {
-
-// Instantiate the common polynomial types.
-template class PolynomialPosePredictor<1, 2>;
-template class PolynomialPosePredictor<2, 3>;
-template class PolynomialPosePredictor<3, 4>;
-template class PolynomialPosePredictor<4, 5>;
-
-}  // namespace posepredictor
diff --git a/libs/vr/libposepredictor/polynomial_predictor_tests.cpp b/libs/vr/libposepredictor/polynomial_predictor_tests.cpp
deleted file mode 100644
index 88cb2b9..0000000
--- a/libs/vr/libposepredictor/polynomial_predictor_tests.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-#include <gtest/gtest.h>
-
-#include <polynomial_predictor.h>
-
-namespace posepredictor {
-
-namespace {
-
-// For comparing expected and actual.
-constexpr real kAbsErrorTolerance = 1e-5;
-
-// Test the linear extrapolation from two samples.
-TEST(PolynomialPosePredictor, Linear) {
-  // Degree = 1, simple line, passing through two points.
-  // Note the regularization is 0 so we expect the exact fit.
-  PolynomialPosePredictor<1, 2> predictor(0);
-
-  // Add two samples.
-  predictor.Add(
-      Pose{.position = {0, 0, 0}, .orientation = {0, 0, 0, 1}, .time_ns = 0});
-
-  predictor.Add(
-      Pose{.position = {1, 2, 3}, .orientation = {0, 0, 0, 1}, .time_ns = 10});
-
-  Pose predicted_pose;
-
-  predicted_pose = predictor.Predict(20);
-
-  // Check the x,y,z components for the expected translation.
-  EXPECT_NEAR(predicted_pose.position[0], 2, kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[1], 4, kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[2], 6, kAbsErrorTolerance);
-
-  predicted_pose = predictor.Predict(30);
-  EXPECT_NEAR(predicted_pose.position[0], 3, kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[1], 6, kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[2], 9, kAbsErrorTolerance);
-}
-
-// Test the degree two polynomial fit.
-TEST(PolynomialPosePredictor, Quadric) {
-  // Degree = 2, need three samples to fit a polynomial.
-  // Note the regularization is 0 so we expect the exact fit.
-  PolynomialPosePredictor<2, 3> predictor(0);
-
-  // Add three samples.
-  predictor.Add(
-      Pose{.position = {1, 2, 3}, .orientation = {0, 0, 0, 1}, .time_ns = 0});
-
-  predictor.Add(
-      Pose{.position = {0, 0, 0}, .orientation = {0, 0, 0, 1}, .time_ns = 10});
-
-  predictor.Add(
-      Pose{.position = {1, 2, 3}, .orientation = {0, 0, 0, 1}, .time_ns = 20});
-
-  // The expected polynomials for x/y/z.
-
-  // x:  0.01 * t^2 - 0.2 * t + 1
-  const auto x = [](auto t) { return 0.01 * t * t - 0.2 * t + 1; };
-
-  // y:  0.02 * t^2 - 0.4 * t + 2
-  const auto y = [](auto t) { return 0.02 * t * t - 0.4 * t + 2; };
-
-  // z:  0.03 * t^2 - 0.6 * t + 3
-  const auto z = [](auto t) { return 0.03 * t * t - 0.6 * t + 3; };
-
-  Pose predicted_pose;
-  predicted_pose = predictor.Predict(40);
-
-  // Check the x,y,z components for the expected translation.
-  EXPECT_NEAR(predicted_pose.position[0], x(40), kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[1], y(40), kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[2], z(40), kAbsErrorTolerance);
-
-  predicted_pose = predictor.Predict(50);
-  EXPECT_NEAR(predicted_pose.position[0], x(50), kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[1], y(50), kAbsErrorTolerance);
-  EXPECT_NEAR(predicted_pose.position[2], z(50), kAbsErrorTolerance);
-}
-
-// Test the degree two polynomial fit with degenerate input.
-//
-// The input samples all lie in a line which would normally make our system
-// degenerate. We will rely on the regularization term to recover the linear
-// solution in a quadric predictor.
-TEST(PolynomialPosePredictor, QuadricDegenate) {
-  // Degree = 2, need three samples to fit a polynomial.
-  // Note that we are using the default regularization term here.
-  // We cannot use 0 regularizer since the input is degenerate.
-  PolynomialPosePredictor<2, 3> predictor(1e-20);
-
-  // Add three samples.
-  predictor.Add(
-      Pose{.position = {0, 0, 0}, .orientation = {0, 0, 0, 1}, .time_ns = 0});
-
-  predictor.Add(
-      Pose{.position = {1, 2, 3}, .orientation = {0, 0, 0, 1}, .time_ns = 10});
-
-  predictor.Add(
-      Pose{.position = {2, 4, 6}, .orientation = {0, 0, 0, 1}, .time_ns = 20});
-
-  Pose predicted_pose;
-
-  predicted_pose = predictor.Predict(30);
-
-  // Check the x,y,z components for the expected translation.
-  // We are using a higher error threshold since this is now approximate.
-  EXPECT_NEAR(predicted_pose.position[0], 3, 0.001);
-  EXPECT_NEAR(predicted_pose.position[1], 6, 0.001);
-  EXPECT_NEAR(predicted_pose.position[2], 9, 0.001);
-
-  predicted_pose = predictor.Predict(40);
-  EXPECT_NEAR(predicted_pose.position[0], 4, 0.001);
-  EXPECT_NEAR(predicted_pose.position[1], 8, 0.001);
-  EXPECT_NEAR(predicted_pose.position[2], 12, 0.001);
-}
-
-}  // namespace
-
-}  // namespace posepredictor
diff --git a/libs/vr/libposepredictor/predictor.cpp b/libs/vr/libposepredictor/predictor.cpp
deleted file mode 100644
index beba156..0000000
--- a/libs/vr/libposepredictor/predictor.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#include <linear_predictor.h>
-#include <polynomial_predictor.h>
-#include <predictor.h>
-
-namespace posepredictor {
-
-vec3 Predictor::AngularVelocity(const quat& a, const quat& b, real delta_time) {
-  const auto delta_q = a.inverse() * b;
-  // Check that delta_q.w() == 1, Eigen doesn't respect this convention. If
-  // delta_q.w() == -1, we'll get the opposite velocity.
-  return 2.0 * (delta_q.w() < 0 ? static_cast<vec3>(-delta_q.vec()) : delta_q.vec()) / delta_time;
-}
-
-Velocity Predictor::PredictVelocity(int64_t time_ns) const {
-  const auto a = Predict(time_ns - kFiniteDifferenceNs);
-  const auto b = Predict(time_ns + kFiniteDifferenceNs);
-  const auto delta_time = NsToSeconds(2 * kFiniteDifferenceNs);
-
-  return {(b.position - a.position) / delta_time,
-          AngularVelocity(a.orientation, b.orientation, delta_time)};
-}
-
-// The factory method.
-std::unique_ptr<Predictor> Predictor::Create(PredictorType type) {
-  switch (type) {
-    case PredictorType::Linear:
-      return std::make_unique<LinearPosePredictor>();
-    case PredictorType::Quadric:
-      return std::make_unique<QuadricPosePredictor>();
-    case PredictorType::Cubic:
-      return std::make_unique<CubicPosePredictor>();
-  }
-}
-}  // namespace posepredictor
diff --git a/libs/vr/libposepredictor/predictor_tests.cpp b/libs/vr/libposepredictor/predictor_tests.cpp
deleted file mode 100644
index e84a93a..0000000
--- a/libs/vr/libposepredictor/predictor_tests.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <gtest/gtest.h>
-
-#include <predictor.h>
-
-namespace posepredictor {
-
-namespace {
-
-// For comparing expected and actual.
-constexpr real kAbsErrorTolerance = 1e-4;
-
-// Test the angular velocity computation from two orientations.
-TEST(PosePredictor, AngularVelocity) {
-  // Some random rotation axis we will rotate around.
-  const vec3 kRotationAxis = vec3(1, 2, 3).normalized();
-
-  // Some random angle we will be rotating by.
-  const real kRotationAngle = M_PI / 30;
-
-  // Random start orientation we are currently at.
-  const quat kStartOrientation = quat(5, 3, 4, 1).normalized();
-
-  // The orientation we will end up at.
-  const quat kEndOrientation =
-      kStartOrientation *
-      quat(Eigen::AngleAxis<real>(kRotationAngle, kRotationAxis));
-
-  // The delta time for going from start orientation to end.
-  const real kDeltaTime = 1.0;
-
-  // Compute the angular velocity from start orientation to end.
-  const auto angularVelocity = Predictor::AngularVelocity(
-      kStartOrientation, kEndOrientation, kDeltaTime);
-
-  // Extract the axis and the angular speed.
-  const auto angularSpeed = angularVelocity.norm();
-  const auto rotationAxis = angularVelocity.normalized();
-
-  // The speed must match.
-  EXPECT_NEAR(angularSpeed, kRotationAngle / kDeltaTime, kAbsErrorTolerance);
-
-  // The rotation axis must match.
-  EXPECT_NEAR(rotationAxis[0], kRotationAxis[0], kAbsErrorTolerance);
-  EXPECT_NEAR(rotationAxis[1], kRotationAxis[1], kAbsErrorTolerance);
-  EXPECT_NEAR(rotationAxis[2], kRotationAxis[2], kAbsErrorTolerance);
-}
-
-}  // namespace
-
-}  // namespace posepredictor
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.cpp b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
index 40979c9..04ab78f 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.cpp
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.cpp
@@ -69,8 +69,7 @@
       mCBContext(),
       mEventHandler(nullptr),
       mVSyncCounts(),
-      mRemainingHwcVirtualDisplays(0),
-      mDumpMayLockUp(false)
+      mRemainingHwcVirtualDisplays(0)
 {
     for (size_t i=0 ; i<HWC_NUM_PHYSICAL_DISPLAY_TYPES ; i++) {
         mLastHwVSync[i] = 0;
@@ -494,8 +493,6 @@
         return NO_ERROR;
     }
 
-    mDumpMayLockUp = true;
-
     uint32_t numTypes = 0;
     uint32_t numRequests = 0;
     auto error = hwcDisplay->validate(&numTypes, &numRequests);
@@ -636,9 +633,6 @@
     auto& displayData = mDisplayData[displayId];
     auto& hwcDisplay = displayData.hwcDisplay;
     auto error = hwcDisplay->present(&displayData.lastPresentFence);
-
-    mDumpMayLockUp = false;
-
     if (error != HWC2::Error::None) {
         ALOGE("presentAndGetReleaseFences: failed for display %d: %s (%d)",
               displayId, to_string(error).c_str(), static_cast<int32_t>(error));
@@ -884,11 +878,6 @@
 }
 
 void HWComposer::dump(String8& result) const {
-    if (mDumpMayLockUp) {
-        result.append("HWComposer dump skipped because present in progress");
-        return;
-    }
-
     // TODO: In order to provide a dump equivalent to HWC1, we need to shadow
     // all the state going into the layers. This is probably better done in
     // Layer itself, but it's going to take a bit of work to get there.
diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h
index 78d0307..631af14 100644
--- a/services/surfaceflinger/DisplayHardware/HWComposer.h
+++ b/services/surfaceflinger/DisplayHardware/HWComposer.h
@@ -224,9 +224,6 @@
 
     // thread-safe
     mutable Mutex mVsyncLock;
-
-    // XXX temporary workaround for b/35806047
-    mutable std::atomic<bool> mDumpMayLockUp;
 };
 
 // ---------------------------------------------------------------------------