drm_hwcomposer: Produce stable port IDs
Currently, port IDs are generated by returning a monotonically
increasing value (uint64_t hwc2_display_t). This is problematic for
two reasons:
hwc2_display_t is a 64bit value, and the returned port is 8bit.
clients of drm-hwc cannot rely on port ID consistency between
re-plugs to the same connector.
This patch provides a more stable approach to producing port IDs. We
combine the index of the DRM device in the device list, with the
index of the connector within a DRM device in a 3/5 bit split. This will
allow us to support up to 8 DRM devices, each with 32 independent
connectors (ports). If more support is required in the future, we will
have to extend the API to return uint16_t port values instead.
Signed-off-by: Gil Dekel <gildekel@google.com>
diff --git a/drm/ResourceManager.cpp b/drm/ResourceManager.cpp
index c866263..fee251e 100644
--- a/drm/ResourceManager.cpp
+++ b/drm/ResourceManager.cpp
@@ -55,7 +55,7 @@
auto path_len = property_get("vendor.hwc.drm.device", path_pattern,
"/dev/dri/card%");
if (path_pattern[path_len - 1] != '%') {
- auto dev = DrmDevice::CreateInstance(path_pattern, this);
+ auto dev = DrmDevice::CreateInstance(path_pattern, this, 0);
if (dev) {
drms_.emplace_back(std::move(dev));
}
@@ -69,7 +69,7 @@
if (stat(path.str().c_str(), &buf) != 0)
break;
- auto dev = DrmDevice::CreateInstance(path.str(), this);
+ auto dev = DrmDevice::CreateInstance(path.str(), this, idx);
if (dev) {
drms_.emplace_back(std::move(dev));
}