libvrflinger: Add additional info to PDX dump.
- Add logging for surface and layers.
- Minor cleanup of AcquiredBuffer code.
- Add additional debug tracing.
Bug: None
Test: servicetool --dump /dev/socket/pdx/system/vr/display/client
Change-Id: Ie7cfe46978139e0eef2184b03acb4b9bab428a33
diff --git a/libs/vr/libvrflinger/acquired_buffer.cpp b/libs/vr/libvrflinger/acquired_buffer.cpp
index 7932a9c..fda9585 100644
--- a/libs/vr/libvrflinger/acquired_buffer.cpp
+++ b/libs/vr/libvrflinger/acquired_buffer.cpp
@@ -55,9 +55,9 @@
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 @@
}
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();
diff --git a/libs/vr/libvrflinger/acquired_buffer.h b/libs/vr/libvrflinger/acquired_buffer.h
index dd4fcc5..e0dc9f2 100644
--- a/libs/vr/libvrflinger/acquired_buffer.h
+++ b/libs/vr/libvrflinger/acquired_buffer.h
@@ -67,13 +67,13 @@
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
diff --git a/libs/vr/libvrflinger/display_service.cpp b/libs/vr/libvrflinger/display_service.cpp
index dc9807a..7706799 100644
--- a/libs/vr/libvrflinger/display_service.cpp
+++ b/libs/vr/libvrflinger/display_service.cpp
@@ -1,6 +1,10 @@
#include "display_service.h"
#include <unistd.h>
+
+#include <algorithm>
+#include <sstream>
+#include <string>
#include <vector>
#include <android-base/file.h>
@@ -45,7 +49,65 @@
}
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,
diff --git a/libs/vr/libvrflinger/display_surface.cpp b/libs/vr/libvrflinger/display_surface.cpp
index d836fba..2a938a2 100644
--- a/libs/vr/libvrflinger/display_surface.cpp
+++ b/libs/vr/libvrflinger/display_surface.cpp
@@ -258,6 +258,13 @@
}
}
+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");
@@ -370,8 +377,8 @@
}
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 +406,8 @@
break;
}
ALOGD_IF(TRACE,
- "DirectDisplaySurface::AcquireNewestAvailableBuffer: buffer: %p",
- buffer.buffer().get());
+ "DirectDisplaySurface::AcquireNewestAvailableBuffer: buffer_id=%d",
+ buffer.buffer()->id());
return buffer;
}
diff --git a/libs/vr/libvrflinger/display_surface.h b/libs/vr/libvrflinger/display_surface.h
index 5380062..556183a 100644
--- a/libs/vr/libvrflinger/display_surface.h
+++ b/libs/vr/libvrflinger/display_surface.h
@@ -144,6 +144,7 @@
: DisplaySurface(service, SurfaceType::Direct, surface_id, process_id,
user_id, attributes),
acquired_buffers_(kMaxPostedBuffers) {}
+ std::vector<int32_t> GetQueueIds() const override;
bool IsBufferAvailable();
bool IsBufferPosted();
AcquiredBuffer AcquireCurrentBuffer();
diff --git a/libs/vr/libvrflinger/hardware_composer.cpp b/libs/vr/libvrflinger/hardware_composer.cpp
index c18ae82..9a9054d 100644
--- a/libs/vr/libvrflinger/hardware_composer.cpp
+++ b/libs/vr/libvrflinger/hardware_composer.cpp
@@ -19,6 +19,8 @@
#include <chrono>
#include <functional>
#include <map>
+#include <sstream>
+#include <string>
#include <tuple>
#include <dvr/dvr_display_types.h>
@@ -347,7 +349,36 @@
return HWC::Error::None;
}
-std::string HardwareComposer::Dump() { return hwc2_hidl_->dumpDebugInfo(); }
+std::string HardwareComposer::Dump() {
+ std::unique_lock<std::mutex> lock(post_thread_mutex_);
+ std::ostringstream stream;
+
+ stream << "Display metrics: " << display_metrics_.width << "x"
+ << display_metrics_.height << " " << (display_metrics_.dpi.x / 1000.0)
+ << "x" << (display_metrics_.dpi.y / 1000.0) << " dpi @ "
+ << (1000000000.0 / display_metrics_.vsync_period_ns) << " Hz"
+ << std::endl;
+
+ stream << "Post thread resumed: " << post_thread_resumed_ << std::endl;
+ stream << "Active layers: " << active_layer_count_ << std::endl;
+ stream << std::endl;
+
+ for (size_t i = 0; i < active_layer_count_; i++) {
+ stream << "Layer " << i << ":";
+ stream << " type=" << layers_[i].GetCompositionType().to_string();
+ stream << " surface_id=" << layers_[i].GetSurfaceId();
+ stream << " buffer_id=" << layers_[i].GetBufferId();
+ stream << std::endl;
+ }
+ stream << std::endl;
+
+ if (post_thread_resumed_) {
+ stream << "Hardware Composer Debug Info:" << std::endl;
+ stream << hwc2_hidl_->dumpDebugInfo();
+ }
+
+ return stream.str();
+}
void HardwareComposer::PostLayers() {
ATRACE_NAME("HardwareComposer::PostLayers");
@@ -399,9 +430,11 @@
}
#if TRACE
- for (size_t i = 0; i < active_layer_count_; i++)
- ALOGI("HardwareComposer::PostLayers: layer=%zu composition=%s", i,
+ for (size_t i = 0; i < active_layer_count_; i++) {
+ ALOGI("HardwareComposer::PostLayers: layer=%zu buffer_id=%d composition=%s",
+ i, layers_[i].GetBufferId(),
layers_[i].GetCompositionType().to_string().c_str());
+ }
#endif
error = Present(HWC_DISPLAY_PRIMARY);
@@ -492,8 +525,9 @@
int result = ion_buffer.Lock(ion_buffer.usage(), 0, 0, ion_buffer.width(),
ion_buffer.height(), &buffer_base);
if (result != 0) {
- ALOGE("HardwareComposer::MapConfigBuffer: Failed to map vrflinger config "
- "buffer.");
+ ALOGE(
+ "HardwareComposer::MapConfigBuffer: Failed to map vrflinger config "
+ "buffer.");
return -EPERM;
}
diff --git a/libs/vr/libvrflinger/hardware_composer.h b/libs/vr/libvrflinger/hardware_composer.h
index 98e8905..a0c50e1 100644
--- a/libs/vr/libvrflinger/hardware_composer.h
+++ b/libs/vr/libvrflinger/hardware_composer.h
@@ -127,11 +127,20 @@
int surface_id = -1;
pdx::rpc::IfAnyOf<SourceSurface>::Call(
&source_, [&surface_id](const SourceSurface& surface_source) {
- surface_id = surface_source.surface->surface_id();
+ surface_id = surface_source.GetSurfaceId();
});
return surface_id;
}
+ int GetBufferId() const {
+ int buffer_id = -1;
+ pdx::rpc::IfAnyOf<SourceSurface>::Call(
+ &source_, [&buffer_id](const SourceSurface& surface_source) {
+ buffer_id = surface_source.GetBufferId();
+ });
+ return buffer_id;
+ }
+
private:
void CommonLayerSetup();
@@ -192,7 +201,15 @@
}
// Returns the surface id of the surface.
- int GetSurfaceId() { return surface->surface_id(); }
+ int GetSurfaceId() const { return surface->surface_id(); }
+
+ // Returns the buffer id for the current buffer.
+ int GetBufferId() const {
+ if (acquired_buffer.IsAvailable())
+ return acquired_buffer.buffer()->id();
+ else
+ return -1;
+ }
};
// State when the layer is connected to a buffer. Provides the same interface
@@ -213,6 +230,7 @@
IonBuffer* GetBuffer() { return buffer.get(); }
int GetSurfaceId() const { return -1; }
+ int GetBufferId() const { return -1; }
};
// The underlying hardware composer layer is supplied buffers either from a