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
diff --git a/libs/vr/libvrflinger/display_surface.cpp b/libs/vr/libvrflinger/display_surface.cpp
index 04e3d5f..795ffcb 100644
--- a/libs/vr/libvrflinger/display_surface.cpp
+++ b/libs/vr/libvrflinger/display_surface.cpp
@@ -298,6 +298,9 @@
}
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 @@
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,