Merge "hwc2: refresh hotplug status during RegisterCallback"
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index d573682..7b60720 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -825,6 +825,23 @@
DLOGI("Hotplugging primary...");
hwc_session->callbacks_.Hotplug(HWC_DISPLAY_PRIMARY, HWC2::Connection::Connected);
}
+
+ std::vector<hwc2_display_t> pending_hotplugs;
+ if (pointer) {
+ for (auto &map_info : hwc_session->map_info_builtin_) {
+ SCOPE_LOCK(locker_[map_info.client_id]);
+ if (hwc_session->hwc_display_[map_info.client_id]) {
+ pending_hotplugs.push_back(static_cast<hwc2_display_t>(map_info.client_id));
+ }
+ }
+ for (auto &map_info : hwc_session->map_info_pluggable_) {
+ SCOPE_LOCK(locker_[map_info.client_id]);
+ if (hwc_session->hwc_display_[map_info.client_id]) {
+ pending_hotplugs.push_back(static_cast<hwc2_display_t>(map_info.client_id));
+ }
+ }
+ }
+
// Create displays since they should now have their final display indices set.
DLOGI("Handling built-in displays...");
if (hwc_session->HandleBuiltInDisplays()) {
@@ -837,6 +854,23 @@
strerror(abs(err)), hwc_session->hotplug_pending_event_ == kHotPlugEvent ? "deferred" :
"dropped");
}
+
+ // If previously registered, call hotplug for all connected displays to refresh
+ if (pointer) {
+ std::vector<hwc2_display_t> updated_pending_hotplugs;
+ for (auto client_id : pending_hotplugs) {
+ SCOPE_LOCK(locker_[client_id]);
+ // check if the display is unregistered
+ if (hwc_session->hwc_display_[client_id]) {
+ updated_pending_hotplugs.push_back(client_id);
+ }
+ }
+ for (auto client_id : updated_pending_hotplugs) {
+ DLOGI("Re-hotplug display connected: client id = %d", client_id);
+ hwc_session->callbacks_.Hotplug(client_id, HWC2::Connection::Connected);
+ }
+ }
+
hwc_session->client_connected_ = !!pointer;
// Notfify all displays.
hwc_session->NotifyClientStatus(hwc_session->client_connected_);