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

Commit f60f307b authored by rongliu's avatar rongliu
Browse files

Add metadata in direct display surface to support ANativeWindow use cases.

When direct display surface is used with metadata, ComsumerQueue dequeue
reports error because metadata size is hardcoded as 0. It breaks
ANativeWindow case because it has a metadata on the fly.

Create a metadata structure, which could be read and used in the future.

Bug: 64155181
Test: Manual
Change-Id: Ieb35a69d26213769497c6afc7151dd135150c795
parent 7cc9d298
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -298,6 +298,9 @@ Status<LocalChannelHandle> DirectDisplaySurface::OnCreateQueue(
    }

    direct_queue_ = producer->CreateConsumerQueue();
    if (direct_queue_->metadata_size() > 0) {
      metadata_.reset(new uint8_t[direct_queue_->metadata_size()]);
    }
    auto status = RegisterQueue(direct_queue_);
    if (!status) {
      ALOGE(
@@ -342,7 +345,12 @@ void DirectDisplaySurface::DequeueBuffersLocked() {
  while (true) {
    LocalHandle acquire_fence;
    size_t slot;
    auto buffer_status = direct_queue_->Dequeue(0, &slot, &acquire_fence);
    auto buffer_status = direct_queue_->Dequeue(
        0, &slot, metadata_.get(),
        direct_queue_->metadata_size(), &acquire_fence);
    ALOGD_IF(TRACE,
             "DirectDisplaySurface::DequeueBuffersLocked: Dequeue with metadata_size: %zu",
             direct_queue_->metadata_size());
    if (!buffer_status) {
      ALOGD_IF(
          TRACE > 1 && buffer_status.error() == ETIMEDOUT,
+5 −1
Original line number Diff line number Diff line
@@ -143,7 +143,8 @@ class DirectDisplaySurface : public DisplaySurface {
                       const display::SurfaceAttributes& attributes)
      : DisplaySurface(service, SurfaceType::Direct, surface_id, process_id,
                       user_id, attributes),
        acquired_buffers_(kMaxPostedBuffers) {}
        acquired_buffers_(kMaxPostedBuffers),
        metadata_(nullptr){}
  std::vector<int32_t> GetQueueIds() const override;
  bool IsBufferAvailable();
  bool IsBufferPosted();
@@ -178,6 +179,9 @@ class DirectDisplaySurface : public DisplaySurface {
  RingBuffer<AcquiredBuffer> acquired_buffers_;

  std::shared_ptr<ConsumerQueue> direct_queue_;

  // Stores metadata when it dequeue buffers from consumer queue.
  std::unique_ptr<uint8_t[]> metadata_;
};

}  // namespace dvr