SF: Use vsync workaround to detect hotplug errors
HWC sets a system property,
debug.sf.hwc_hotplug_error_via_neg_vsync, to inform SF that
it should check negative vsync, parse and propagate any error
code on hotplug event up the stack.
Bug: 241286153
Test: manual
Change-Id: I32214378b00a1b002fa144dbef3f6610818a053a
diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp
index 312a412..dc7f23b 100644
--- a/services/surfaceflinger/SurfaceFlinger.cpp
+++ b/services/surfaceflinger/SurfaceFlinger.cpp
@@ -2084,6 +2084,17 @@
void SurfaceFlinger::onComposerHalVsync(hal::HWDisplayId hwcDisplayId, int64_t timestamp,
std::optional<hal::VsyncPeriodNanos> vsyncPeriod) {
+ if (mConnectedDisplayFlagValue) {
+ // use ~0 instead of -1 as AidlComposerHal.cpp passes the param as unsigned int32
+ if (mIsHotplugErrViaNegVsync && timestamp < 0 && vsyncPeriod.has_value() &&
+ vsyncPeriod.value() == ~0) {
+ int hotplugErrorCode = static_cast<int32_t>(-timestamp);
+ ALOGD("SurfaceFlinger got hotplugErrorCode=%d", hotplugErrorCode);
+ mScheduler->onHotplugConnectionError(mAppConnectionHandle, hotplugErrorCode);
+ return;
+ }
+ }
+
ATRACE_NAME(vsyncPeriod
? ftl::Concat(__func__, ' ', hwcDisplayId, ' ', *vsyncPeriod, "ns").c_str()
: ftl::Concat(__func__, ' ', hwcDisplayId).c_str());
@@ -4050,6 +4061,9 @@
sp<RegionSamplingThread>::make(*this,
RegionSamplingThread::EnvironmentTimingTunables());
mFpsReporter = sp<FpsReporter>::make(*mFrameTimeline, *this);
+
+ mIsHotplugErrViaNegVsync =
+ base::GetBoolProperty("debug.sf.hwc_hotplug_error_via_neg_vsync"s, false);
}
void SurfaceFlinger::updatePhaseConfiguration(Fps refreshRate) {