hwc2: Do not flush on empty layer stack.
-- Some applications can take time to queue buffers during switches ie;
HDR to Non-HDR, Secure to Non-secure etc; Even though layer stack
is empty it is OK to display previous frame.
-- Composer Client explicitly clears layers upon SurfaceFlinger death.
Since client isn't active, chances of getting a new frame is very unlikey.
Trigger flush so that content gets cleared.
Change-Id: If91135b3d5ea6d0f8842c7ef75547a68002c70ff
CRs-Fixed: 2489780
diff --git a/composer/hwc_display.h b/composer/hwc_display.h
index ba98ef7..177af7a 100644
--- a/composer/hwc_display.h
+++ b/composer/hwc_display.h
@@ -367,6 +367,7 @@
virtual void ClearPendingPowerMode() {
pending_power_mode_ = current_power_mode_;
};
+ virtual void NotifyClientStatus(bool connected) { client_connected_ = connected; }
protected:
static uint32_t throttling_refresh_rate_;
@@ -450,6 +451,7 @@
bool skip_commit_ = false;
std::map<uint32_t, DisplayConfigVariableInfo> variable_config_map_;
std::vector<uint32_t> hwc_config_map_;
+ bool client_connected_ = true;
private:
void DumpInputBuffers(void);
diff --git a/composer/hwc_display_builtin.cpp b/composer/hwc_display_builtin.cpp
index b4c2290..63bd2d8 100644
--- a/composer/hwc_display_builtin.cpp
+++ b/composer/hwc_display_builtin.cpp
@@ -203,7 +203,7 @@
if (layer_set_.empty()) {
// Avoid flush for Command mode panel.
- flush_ = !IsDisplayCommandMode();
+ flush_ = !client_connected_;
validated_ = true;
return status;
}
diff --git a/composer/hwc_display_pluggable.cpp b/composer/hwc_display_pluggable.cpp
index b04e931..8c98a2a 100644
--- a/composer/hwc_display_pluggable.cpp
+++ b/composer/hwc_display_pluggable.cpp
@@ -128,7 +128,7 @@
BuildLayerStack();
if (layer_set_.empty()) {
- flush_ = true;
+ flush_ = !client_connected_;
validated_ = true;
return status;
}
diff --git a/composer/hwc_session.cpp b/composer/hwc_session.cpp
index 03f31ba..fd2377d 100644
--- a/composer/hwc_session.cpp
+++ b/composer/hwc_session.cpp
@@ -775,6 +775,9 @@
callbacks_.Hotplug(client_id, HWC2::Connection::Connected);
}
}
+ client_connected_ = !!pointer;
+ // Notfify all displays.
+ NotifyClientStatus(client_connected_);
}
need_invalidate_ = false;
}
@@ -3182,4 +3185,14 @@
return INT32(error);
}
+void HWCSession::NotifyClientStatus(bool connected) {
+ for (uint32_t i = 0; i < HWCCallbacks::kNumDisplays; i++) {
+ if (!hwc_display_[i]) {
+ continue;
+ }
+ SCOPE_LOCK(locker_[i]);
+ hwc_display_[i]->NotifyClientStatus(connected);
+ }
+}
+
} // namespace sdm
diff --git a/composer/hwc_session.h b/composer/hwc_session.h
index 0315401..b02895d 100644
--- a/composer/hwc_session.h
+++ b/composer/hwc_session.h
@@ -439,6 +439,7 @@
bool IsPluggableDisplayConnected();
hwc2_display_t GetActiveBuiltinDisplay();
void HandlePendingRefresh();
+ void NotifyClientStatus(bool connected);
CoreInterface *core_intf_ = nullptr;
HWCDisplay *hwc_display_[HWCCallbacks::kNumDisplays] = {nullptr};