summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-14 01:05:59 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-06-14 01:05:59 +0000
commitab6d6a8c76ca6983c8f1f7a4fb77c9c775e28357 (patch)
tree75d231fc860f9ee34ff424d512110267547df67c
parent111b83b8b27b6392db93e3fb3ea0e4c5a491236f (diff)
parenta46d3c54fac3798dba83294074b79073065f8733 (diff)
downloadcommon-ab6d6a8c76ca6983c8f1f7a4fb77c9c775e28357.tar.gz
Snap for 8717778 from a46d3c54fac3798dba83294074b79073065f8733 to mainline-networking-releaseaml_net_330910010aml_net_330811010
Change-Id: I4ac0d35fc10475ab35418148853b62f23100ac79
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp23
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h12
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp9
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp16
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h2
5 files changed, 51 insertions, 11 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp
index 47db503..78f65f2 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.cpp
+++ b/libhwc2.1/libdevice/ExynosDisplay.cpp
@@ -4081,7 +4081,8 @@ int32_t ExynosDisplay::setActiveConfigWithConstraints(hwc2_config_t config,
mXres, mYres, mVsyncPeriod, mXdpi, mYdpi);
if (mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_REQUESTED) {
- DISPLAY_LOGI("%s, previous request config is processing", __func__);
+ DISPLAY_LOGI("%s, previous request config is processing (mDesiredConfig: %d)", __func__,
+ mDesiredConfig);
}
/* Config would be requested on present time */
mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_PENDING;
@@ -4188,8 +4189,7 @@ int32_t ExynosDisplay::updateInternalDisplayConfigVariables(
getDisplayAttribute(mActiveConfig, HWC2_ATTRIBUTE_DPI_Y, (int32_t*)&mYdpi);
mHdrFullScrenAreaThreshold = mXres * mYres * kHdrFullScreen;
if (updateVsync) {
- mVsyncPeriod = getDisplayVsyncPeriodFromConfig(mActiveConfig);
- updateBtsVsyncPeriod(mVsyncPeriod, true);
+ resetConfigRequestStateLocked(config);
}
return NO_ERROR;
@@ -4213,11 +4213,12 @@ void ExynosDisplay::updateRefreshRateHint() {
}
/* This function must be called within a mDisplayMutex protection */
-int32_t ExynosDisplay::resetConfigRequestStateLocked() {
- mVsyncPeriod = getDisplayVsyncPeriodFromConfig(mActiveConfig);
+int32_t ExynosDisplay::resetConfigRequestStateLocked(hwc2_config_t config) {
+ ATRACE_CALL();
+
+ mVsyncPeriod = getDisplayVsyncPeriodFromConfig(config);
updateBtsVsyncPeriod(mVsyncPeriod, true);
- DISPLAY_LOGD(eDebugDisplayConfig, "Update mVsyncPeriod %d by mActiveConfig(%d)", mVsyncPeriod,
- mActiveConfig);
+ DISPLAY_LOGD(eDebugDisplayConfig, "Update mVsyncPeriod %d by config(%d)", mVsyncPeriod, config);
updateRefreshRateHint();
@@ -4235,8 +4236,11 @@ int32_t ExynosDisplay::resetConfigRequestStateLocked() {
int32_t ExynosDisplay::updateConfigRequestAppliedTime()
{
- if (mConfigRequestState != hwc_request_state_t::SET_CONFIG_STATE_REQUESTED)
+ if (mConfigRequestState != hwc_request_state_t::SET_CONFIG_STATE_REQUESTED) {
+ DISPLAY_LOGI("%s: mConfigRequestState (%d) is not REQUESTED", __func__,
+ mConfigRequestState);
return NO_ERROR;
+ }
/*
* config change was requested but
@@ -4311,7 +4315,8 @@ int32_t ExynosDisplay::doDisplayConfigPostProcess(ExynosDevice *dev)
needSetActiveConfig = true;
ATRACE_INT("Pending ActiveConfig", 0);
} else {
- DISPLAY_LOGD(eDebugDisplayConfig, "setActiveConfig still pending");
+ DISPLAY_LOGD(eDebugDisplayConfig, "setActiveConfig still pending (mDesiredConfig %d)",
+ mDesiredConfig);
ATRACE_INT("Pending ActiveConfig", mDesiredConfig);
}
diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h
index 5638c08..e31a692 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.h
+++ b/libhwc2.1/libdevice/ExynosDisplay.h
@@ -1101,7 +1101,7 @@ class ExynosDisplay {
bool needNotChangeConfig(hwc2_config_t config);
int32_t updateInternalDisplayConfigVariables(
hwc2_config_t config, bool updateVsync = true);
- int32_t resetConfigRequestStateLocked();
+ int32_t resetConfigRequestStateLocked(hwc2_config_t config);
int32_t updateConfigRequestAppliedTime();
int32_t updateVsyncAppliedTimeLine(int64_t actualChangeTime);
int32_t getDisplayVsyncPeriodInternal(
@@ -1243,6 +1243,13 @@ class ExynosDisplay {
// is the hint session both enabled and supported
bool usePowerHintSession();
+ void setMinDisplayVsyncPeriod(uint32_t period) { mMinDisplayVsyncPeriod = period; }
+
+ bool isCurrentPeakRefreshRate(void) {
+ return ((mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_NONE) &&
+ (mVsyncPeriod == mMinDisplayVsyncPeriod));
+ }
+
private:
bool skipStaticLayerChanged(ExynosCompositionInfo& compositionInfo);
@@ -1257,6 +1264,9 @@ class ExynosDisplay {
static constexpr float kHdrFullScreen = 0.5;
uint32_t mHdrFullScrenAreaThreshold;
+ // vsync period of peak refresh rate
+ uint32_t mMinDisplayVsyncPeriod;
+
/* Display hint to notify power hal */
class PowerHalHintWorker : public Worker {
public:
diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
index 7ee98a7..82286a1 100644
--- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
+++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp
@@ -696,7 +696,7 @@ void ExynosDisplayDrmInterface::Callback(
if (configApplied) {
if (mVsyncCallback.getDesiredVsyncPeriod()) {
- mExynosDisplay->resetConfigRequestStateLocked();
+ mExynosDisplay->resetConfigRequestStateLocked(mActiveModeState.mode.id());
mDrmConnector->set_active_mode(mActiveModeState.mode);
mVsyncCallback.resetDesiredVsyncPeriod();
}
@@ -879,6 +879,7 @@ int32_t ExynosDisplayDrmInterface::getDisplayConfigs(
/* key: (width<<32 | height) */
std::map<uint64_t, uint32_t> groupIds;
uint32_t groupId = 0;
+ uint32_t min_vsync_period = UINT_MAX;
for (const DrmMode &mode : mDrmConnector->modes()) {
displayConfigs_t configs;
@@ -899,11 +900,14 @@ int32_t ExynosDisplayDrmInterface::getDisplayConfigs(
configs.Xdpi = mm_width ? (mode.h_display() * kUmPerInch) / mm_width : -1;
// Dots per 1000 inches
configs.Ydpi = mm_height ? (mode.v_display() * kUmPerInch) / mm_height : -1;
+ // find min vsync period
+ if (configs.vsyncPeriod <= min_vsync_period) min_vsync_period = configs.vsyncPeriod;
mExynosDisplay->mDisplayConfigs.insert(std::make_pair(mode.id(), configs));
ALOGD("config group(%d), w(%d), h(%d), vsync(%d), xdpi(%d), ydpi(%d)",
configs.groupId, configs.width, configs.height,
configs.vsyncPeriod, configs.Xdpi, configs.Ydpi);
}
+ mExynosDisplay->setMinDisplayVsyncPeriod(min_vsync_period);
}
uint32_t num_modes = static_cast<uint32_t>(mDrmConnector->modes().size());
@@ -1064,6 +1068,9 @@ int32_t ExynosDisplayDrmInterface::setActiveConfigWithConstraints(
if ((mActiveModeState.blob_id != 0) &&
(mActiveModeState.mode.id() == config)) {
ALOGD("%s:: same mode %d", __func__, config);
+ /* trigger resetConfigRequestStateLocked() */
+ mVsyncCallback.setDesiredVsyncPeriod(nsecsPerSec / mActiveModeState.mode.v_refresh());
+ mDrmVSyncWorker.VSyncControl(true);
return HWC2_ERROR_NONE;
}
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index d20a313..633b1d7 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -495,6 +495,22 @@ int32_t ExynosPrimaryDisplay::SetCurrentPanelGammaSource(const DisplayType type,
int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) {
ATRACE_CALL();
+ if (enabled) {
+ ATRACE_NAME("wait for peak refresh rate");
+ for (int32_t i = 0; i <= kLhbmWaitForPeakRefreshRate; i++) {
+ if (!isCurrentPeakRefreshRate()) {
+ if (i == kLhbmWaitForPeakRefreshRate) {
+ ALOGW("setLhbmState(on) wait for peak refresh rate timeout !");
+ return TIMED_OUT;
+ }
+ usleep(mVsyncPeriod / 1000 + 1);
+ } else {
+ ALOGI_IF(i, "waited %d vsync to reach peak refresh rate", i);
+ break;
+ }
+ }
+ }
+
requestLhbm(enabled);
ALOGI("setLhbmState =%d", enabled);
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
index e544749..c4d79ea 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
@@ -103,6 +103,8 @@ class ExynosPrimaryDisplay : public ExynosDisplay {
bool mLhbmOn;
bool mLhbmChanged;
int32_t mFramesToReachLhbmPeakBrightness;
+ // wait num of vsync periods for peak refresh rate
+ static constexpr uint32_t kLhbmWaitForPeakRefreshRate = 10;
std::mutex lhbm_mutex_;
std::condition_variable lhbm_cond_;