OSDN Git Service

Add metadata in direct display surface to support ANativeWindow use cases.
authorrongliu <rongliu@google.com>
Fri, 28 Jul 2017 22:22:17 +0000 (15:22 -0700)
committerrongliu <rongliu@google.com>
Thu, 3 Aug 2017 18:16:36 +0000 (11:16 -0700)
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

libs/vr/libvrflinger/display_surface.cpp
libs/vr/libvrflinger/display_surface.h

index 04e3d5f..795ffcb 100644 (file)
@@ -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,
index 556183a..6db3f55 100644 (file)
@@ -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