Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21850d83 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic 'vrflinger-cleanup'

* changes:
  libbufferhub: Fix native buffer.
  libvrflinger: Move display request to avoid duplicate calls.
  libvrflinger: Remove superfluous update to display manager.
  libvrflinger: Move some tracing to a more verbose level.
  libvrflinger: Add additional info to PDX dump.
parents e4f32071 26b7bd48
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -52,8 +52,6 @@ class NativeBuffer
  void operator=(NativeBuffer&) = delete;
};

// NativeBufferProducer is an implementation of ANativeWindowBuffer backed by a
// BufferProducer.
class NativeBufferProducer : public android::ANativeObjectBase<
                                 ANativeWindowBuffer, NativeBufferProducer,
                                 android::LightRefBase<NativeBufferProducer>> {
@@ -71,20 +69,25 @@ class NativeBufferProducer : public android::ANativeObjectBase<
    ANativeWindowBuffer::stride = buffer_->stride();
    ANativeWindowBuffer::format = buffer_->format();
    ANativeWindowBuffer::usage = buffer_->usage();
    handle = buffer_->native_handle();
    ANativeWindowBuffer::handle = buffer_->native_handle();
    if (display_) {
      image_khr_ =
          eglCreateImageKHR(display_, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
                            static_cast<ANativeWindowBuffer*>(this), nullptr);
    } else {
      image_khr_ = EGL_NO_IMAGE_KHR;
    }
  }

  explicit NativeBufferProducer(const std::shared_ptr<BufferProducer>& buffer)
      : NativeBufferProducer(buffer, nullptr, 0) {}

  virtual ~NativeBufferProducer() {
    for (EGLImageKHR egl_image : egl_images_) {
      if (egl_image != EGL_NO_IMAGE_KHR)
        eglDestroyImageKHR(display_, egl_image);
    }
    if (image_khr_ != EGL_NO_IMAGE_KHR)
      eglDestroyImageKHR(display_, image_khr_);
  }

  EGLImageKHR image_khr(int index) const { return egl_images_[index]; }
  EGLImageKHR image_khr() const { return image_khr_; }
  std::shared_ptr<BufferProducer> buffer() const { return buffer_; }
  int release_fence() const { return release_fence_.Get(); }
  uint32_t surface_buffer_index() const { return surface_buffer_index_; }
@@ -112,7 +115,7 @@ class NativeBufferProducer : public android::ANativeObjectBase<

  std::shared_ptr<BufferProducer> buffer_;
  pdx::LocalHandle release_fence_;
  std::vector<EGLImageKHR> egl_images_;
  EGLImageKHR image_khr_;
  uint32_t surface_buffer_index_;
  EGLDisplay display_;

+5 −3
Original line number Diff line number Diff line
@@ -55,9 +55,9 @@ bool AcquiredBuffer::IsAvailable() const {
  if (acquire_fence_) {
    const int ret = sync_wait(acquire_fence_.Get(), 0);
    ALOGD_IF(TRACE || (ret < 0 && errno != ETIME),
             "AcquiredBuffer::IsAvailable: acquire_fence_=%d sync_wait()=%d "
             "errno=%d.",
             acquire_fence_.Get(), ret, ret < 0 ? errno : 0);
             "AcquiredBuffer::IsAvailable: buffer_id=%d acquire_fence=%d "
             "sync_wait()=%d errno=%d.",
             buffer_->id(), acquire_fence_.Get(), ret, ret < 0 ? errno : 0);
    if (ret == 0) {
      // The fence is completed, so to avoid further calls to sync_wait we close
      // it here.
@@ -78,6 +78,8 @@ std::shared_ptr<BufferConsumer> AcquiredBuffer::ClaimBuffer() {
}

int AcquiredBuffer::Release(LocalHandle release_fence) {
  ALOGD_IF(TRACE, "AcquiredBuffer::Release: buffer_id=%d release_fence=%d",
           buffer_ ? buffer_->id() : -1, release_fence.Get());
  if (buffer_) {
    // Close the release fence since we can't transfer it with an async release.
    release_fence.Close();
+3 −3
Original line number Diff line number Diff line
@@ -67,13 +67,13 @@ class AcquiredBuffer {
  int Release(pdx::LocalHandle release_fence);

 private:
  AcquiredBuffer(const AcquiredBuffer&) = delete;
  void operator=(const AcquiredBuffer&) = delete;

  std::shared_ptr<BufferConsumer> buffer_;
  // Mutable so that the fence can be closed when it is determined to be
  // signaled during IsAvailable().
  mutable pdx::LocalHandle acquire_fence_;

  AcquiredBuffer(const AcquiredBuffer&) = delete;
  void operator=(const AcquiredBuffer&) = delete;
};

}  // namespace dvr
+63 −3
Original line number Diff line number Diff line
#include "display_service.h"

#include <unistd.h>

#include <algorithm>
#include <sstream>
#include <string>
#include <vector>

#include <android-base/file.h>
@@ -45,7 +49,65 @@ bool DisplayService::IsInitialized() const {
}

std::string DisplayService::DumpState(size_t /*max_length*/) {
  return hardware_composer_.Dump();
  std::ostringstream stream;

  auto surfaces = GetDisplaySurfaces();
  std::sort(surfaces.begin(), surfaces.end(), [](const auto& a, const auto& b) {
    return a->surface_id() < b->surface_id();
  });

  stream << "Application Surfaces:" << std::endl;

  size_t count = 0;
  for (const auto& surface : surfaces) {
    if (surface->surface_type() == SurfaceType::Application) {
      stream << "Surface " << count++ << ":";
      stream << " surface_id=" << surface->surface_id()
             << " process_id=" << surface->process_id()
             << " user_id=" << surface->user_id()
             << " visible=" << surface->visible()
             << " z_order=" << surface->z_order();

      stream << " queue_ids=";
      auto queue_ids = surface->GetQueueIds();
      std::sort(queue_ids.begin(), queue_ids.end());
      for (int32_t id : queue_ids) {
        if (id != queue_ids[0])
          stream << ",";
        stream << id;
      }
      stream << std::endl;
    }
  }
  stream << std::endl;

  stream << "Direct Surfaces:" << std::endl;

  count = 0;
  for (const auto& surface : surfaces) {
    if (surface->surface_type() == SurfaceType::Direct) {
      stream << "Surface " << count++ << ":";
      stream << " surface_id=" << surface->surface_id()
             << " process_id=" << surface->process_id()
             << " user_id=" << surface->user_id()
             << " visible=" << surface->visible()
             << " z_order=" << surface->z_order();

      stream << " queue_ids=";
      auto queue_ids = surface->GetQueueIds();
      std::sort(queue_ids.begin(), queue_ids.end());
      for (int32_t id : queue_ids) {
        if (id != queue_ids[0])
          stream << ",";
        stream << id;
      }
      stream << std::endl;
    }
  }
  stream << std::endl;

  stream << hardware_composer_.Dump();
  return stream.str();
}

void DisplayService::OnChannelClose(pdx::Message& message,
@@ -54,8 +116,6 @@ void DisplayService::OnChannelClose(pdx::Message& message,
    surface->OnSetAttributes(message,
                             {{display::SurfaceAttribute::Visible,
                               display::SurfaceAttributeValue{false}}});
    SurfaceUpdated(surface->surface_type(),
                   display::SurfaceUpdateFlags::VisibilityChanged);
  }
}

+14 −6
Original line number Diff line number Diff line
@@ -127,7 +127,8 @@ void DisplaySurface::SurfaceUpdated(display::SurfaceUpdateFlags update_flags) {
}

void DisplaySurface::ClearUpdate() {
  ALOGD_IF(TRACE, "DisplaySurface::ClearUpdate: surface_id=%d", surface_id());
  ALOGD_IF(TRACE > 1, "DisplaySurface::ClearUpdate: surface_id=%d",
           surface_id());
  update_flags_ = display::SurfaceUpdateFlags::None;
}

@@ -258,6 +259,13 @@ void ApplicationDisplaySurface::OnQueueEvent(
  }
}

std::vector<int32_t> DirectDisplaySurface::GetQueueIds() const {
  std::vector<int32_t> queue_ids;
  if (direct_queue_)
    queue_ids.push_back(direct_queue_->id());
  return queue_ids;
}

Status<LocalChannelHandle> DirectDisplaySurface::OnCreateQueue(
    Message& /*message*/, const ProducerQueueConfig& config) {
  ATRACE_NAME("DirectDisplaySurface::OnCreateQueue");
@@ -326,7 +334,7 @@ void DirectDisplaySurface::DequeueBuffersLocked() {
    auto buffer_status = direct_queue_->Dequeue(0, &slot, &acquire_fence);
    if (!buffer_status) {
      ALOGD_IF(
          TRACE && buffer_status.error() == ETIMEDOUT,
          TRACE > 1 && buffer_status.error() == ETIMEDOUT,
          "DirectDisplaySurface::DequeueBuffersLocked: All buffers dequeued.");
      ALOGE_IF(buffer_status.error() != ETIMEDOUT,
               "DirectDisplaySurface::DequeueBuffersLocked: Failed to dequeue "
@@ -370,8 +378,8 @@ AcquiredBuffer DirectDisplaySurface::AcquireCurrentBuffer() {
  }
  AcquiredBuffer buffer = std::move(acquired_buffers_.Front());
  acquired_buffers_.PopFront();
  ALOGD_IF(TRACE, "DirectDisplaySurface::AcquireCurrentBuffer: buffer: %p",
           buffer.buffer().get());
  ALOGD_IF(TRACE, "DirectDisplaySurface::AcquireCurrentBuffer: buffer_id=%d",
           buffer.buffer()->id());
  return buffer;
}

@@ -399,8 +407,8 @@ AcquiredBuffer DirectDisplaySurface::AcquireNewestAvailableBuffer(
      break;
  }
  ALOGD_IF(TRACE,
           "DirectDisplaySurface::AcquireNewestAvailableBuffer: buffer: %p",
           buffer.buffer().get());
           "DirectDisplaySurface::AcquireNewestAvailableBuffer: buffer_id=%d",
           buffer.buffer()->id());
  return buffer;
}

Loading