summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-01-18 02:09:34 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-01-18 02:09:34 +0000
commitee3797c0bd15c419ffcbaba1ee9c5e29e80701b4 (patch)
tree1ecd2b42f87a114064cbd1219060829cb325b0eb
parent2c23521fa914fa7d184c848e0b2c48b47996f8a5 (diff)
parentcc34d7b7db7f195146585594ac3d00336e7f0262 (diff)
downloadcommon-android13-d4-s1-release.tar.gz
Change-Id: Ief811b4bd9a59602d9ffcd181a2d5f6af82d80b9
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp14
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h8
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp26
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h4
4 files changed, 28 insertions, 24 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp
index 354d75c..2ccab48 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.cpp
+++ b/libhwc2.1/libdevice/ExynosDisplay.cpp
@@ -1000,7 +1000,7 @@ ExynosDisplay::ExynosDisplay(uint32_t index, ExynosDevice *device)
mSkipFrame(false),
mVsyncPeriodChangeConstraints{systemTime(SYSTEM_TIME_MONOTONIC), 0},
mVsyncAppliedTimeLine{false, 0, systemTime(SYSTEM_TIME_MONOTONIC)},
- mConfigRequestState(hwc_request_state_t::SET_CONFIG_STATE_NONE),
+ mConfigRequestState(hwc_request_state_t::SET_CONFIG_STATE_DONE),
mPowerHalHint(getDisplayId(mDisplayId, mIndex)) {
mDisplayControl.enableCompositionCrop = true;
mDisplayControl.enableExynosCompositionOptimization = true;
@@ -4247,10 +4247,18 @@ int32_t ExynosDisplay::resetConfigRequestStateLocked(hwc2_config_t config) {
DISPLAY_LOGI("%s: mConfigRequestState (%d) is not REQUESTED", __func__,
mConfigRequestState);
} else {
- DISPLAY_LOGD(eDebugDisplayInterfaceConfig, "%s: Change mConfigRequestState (%d) to NONE",
+ DISPLAY_LOGD(eDebugDisplayInterfaceConfig, "%s: Change mConfigRequestState (%d) to DONE",
__func__, mConfigRequestState);
- mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_NONE;
+ mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_DONE;
updateAppliedActiveConfig(mActiveConfig, systemTime(SYSTEM_TIME_MONOTONIC));
+
+ std::lock_guard<std::mutex> lock(mPeakRefreshRateMutex);
+ bool isPeakRefreshRate = isCurrentPeakRefreshRate();
+ ATRACE_INT("isPeakRefreshRate", isPeakRefreshRate);
+ if (isPeakRefreshRate && mNotifyPeakRefreshRate) {
+ mPeakRefreshRateCondition.notify_one();
+ mNotifyPeakRefreshRate = false;
+ }
}
return NO_ERROR;
}
diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h
index ad7977b..8a47866 100644
--- a/libhwc2.1/libdevice/ExynosDisplay.h
+++ b/libhwc2.1/libdevice/ExynosDisplay.h
@@ -141,7 +141,7 @@ enum class PanelGammaSource {
};
enum class hwc_request_state_t {
- SET_CONFIG_STATE_NONE = 0,
+ SET_CONFIG_STATE_DONE = 0,
SET_CONFIG_STATE_PENDING,
SET_CONFIG_STATE_REQUESTED,
};
@@ -534,6 +534,10 @@ class ExynosDisplay {
hwc2_config_t mActiveConfig = UINT_MAX;
+ bool mNotifyPeakRefreshRate = false;
+ std::mutex mPeakRefreshRateMutex;
+ std::condition_variable mPeakRefreshRateCondition;
+
void initDisplay();
int getId();
@@ -1255,7 +1259,7 @@ class ExynosDisplay {
void setMinDisplayVsyncPeriod(uint32_t period) { mMinDisplayVsyncPeriod = period; }
bool isCurrentPeakRefreshRate(void) {
- return ((mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_NONE) &&
+ return ((mConfigRequestState == hwc_request_state_t::SET_CONFIG_STATE_DONE) &&
(mVsyncPeriod == mMinDisplayVsyncPeriod));
}
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
index 8320553..6398f11 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp
@@ -164,7 +164,7 @@ int ExynosPrimaryDisplay::getDDIScalerMode(int width, int height) {
int32_t ExynosPrimaryDisplay::doDisplayConfigInternal(hwc2_config_t config) {
if (!mPowerModeState.has_value() || (*mPowerModeState != HWC2_POWER_MODE_ON)) {
mPendActiveConfig = config;
- mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_NONE;
+ mConfigRequestState = hwc_request_state_t::SET_CONFIG_STATE_DONE;
DISPLAY_LOGI("%s:: Pending desired Config: %d", __func__, config);
return NO_ERROR;
}
@@ -533,22 +533,14 @@ int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) {
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;
- }
-
- ATRACE_NAME("wait for one vblank");
- if (mDisplayInterface->waitVBlank()) {
- ALOGE("%s failed to wait vblank for peak refresh rate, %d", __func__, i);
- return -ENODEV;
- }
- } else {
- ALOGI_IF(i, "waited %d vblank to reach peak refresh rate", i);
- break;
- }
+ std::unique_lock<std::mutex> lock(mPeakRefreshRateMutex);
+ mNotifyPeakRefreshRate = true;
+ if (!mPeakRefreshRateCondition.wait_for(lock,
+ std::chrono::milliseconds(
+ kLhbmWaitForPeakRefreshRateMs),
+ [this]() { return isCurrentPeakRefreshRate(); })) {
+ ALOGW("setLhbmState(on) wait for peak refresh rate timeout !");
+ return TIMED_OUT;
}
}
diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
index d9ec1ca..e66bb2a 100644
--- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
+++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h
@@ -118,8 +118,8 @@ class ExynosPrimaryDisplay : public ExynosDisplay {
FILE* mLhbmFd;
std::atomic<bool> mLhbmOn;
int32_t mFramesToReachLhbmPeakBrightness;
- // wait num of vsync periods for peak refresh rate
- static constexpr uint32_t kLhbmWaitForPeakRefreshRate = 10;
+ // timeout value of waiting for peak refresh rate
+ static constexpr uint32_t kLhbmWaitForPeakRefreshRateMs = 200;
static constexpr uint32_t kLhbmRefreshRateThrottleMs = 1000;
FILE* mEarlyWakeupDispFd;