diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-05-16 18:54:48 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2022-05-16 18:54:48 +0000 |
commit | d813376bf2ff650afeb2fc8e43a5a5ee91314ecd (patch) | |
tree | 0f3d25abacfa4214caba5ed27146ef6f9f924829 | |
parent | 204730d451b1354499aeaabcc35d31cb0f980933 (diff) | |
parent | bb57e559f992b5fbcc07c8080b9ae02522e7af37 (diff) | |
download | common-d813376bf2ff650afeb2fc8e43a5a5ee91314ecd.tar.gz |
Snap for 8598489 from bb57e559f992b5fbcc07c8080b9ae02522e7af37 to mainline-networking-release
Change-Id: I76508b5aa7f081234bbab299ab2aae3535d5db54
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 19 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 4 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 32 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h | 2 |
4 files changed, 40 insertions, 17 deletions
diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index f90d490..98256dc 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -4208,22 +4208,9 @@ int32_t ExynosDisplay::updateInternalDisplayConfigVariables( return NO_ERROR; } -void ExynosDisplay::updateBtsVsyncPeriod(uint32_t vsyncPeriod, bool forceUpdate) { - if (vsyncPeriod < mBtsVsyncPeriod) { - mBtsVsyncPeriod = vsyncPeriod; - - if (mType == HWC_DISPLAY_PRIMARY) { - uint32_t btsRefreshRate = getBtsRefreshRate(); - - for (size_t i = 0; i < mLayers.size(); i++) { - if (!mLayers[i]->checkDownscaleCap(btsRefreshRate)) { - setGeometryChanged(GEOMETRY_DEVICE_CONFIG_CHANGED); - break; - } - } - } - } else if (forceUpdate) { - /* TODO: add check for resource can re-assign to Device */ +void ExynosDisplay::updateBtsVsyncPeriod(uint32_t vsyncPeriod, bool configApplied) { + if (configApplied || vsyncPeriod < mBtsVsyncPeriod) { + checkBtsReassignResource(vsyncPeriod, mBtsVsyncPeriod); mBtsVsyncPeriod = vsyncPeriod; } } diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index c6ca3d9..028798e 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1111,8 +1111,10 @@ class ExynosDisplay { int32_t getConfigAppliedTime(const uint64_t desiredTime, const uint64_t actualChangeTime, int64_t &appliedTime, int64_t &refreshTime); - void updateBtsVsyncPeriod(uint32_t vsyncPeriod, bool forceUpdate = false); + void updateBtsVsyncPeriod(uint32_t vsyncPeriod, bool configApplied = false); uint32_t getBtsRefreshRate() const; + virtual void checkBtsReassignResource(const uint32_t __unused vsyncPeriod, + const uint32_t __unused btsVsyncPeriod) {} /* TODO : TBD */ int32_t setCursorPositionAsync(uint32_t x_pos, uint32_t y_pos); diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp index 9e20e07..35253a9 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp @@ -814,3 +814,35 @@ void ExynosPrimaryDisplay::updateAppliedActiveConfig(const hwc2_config_t newConf mAppliedActiveConfig = newConfig; } + +void ExynosPrimaryDisplay::checkBtsReassignResource(const uint32_t vsyncPeriod, + const uint32_t btsVsyncPeriod) { + ATRACE_CALL(); + uint32_t refreshRate = static_cast<uint32_t>(round(nsecsPerSec / vsyncPeriod * 0.1f) * 10); + + if (vsyncPeriod < btsVsyncPeriod) { + for (size_t i = 0; i < mLayers.size(); i++) { + if (mLayers[i]->mOtfMPP && mLayers[i]->mM2mMPP == nullptr && + !mLayers[i]->checkDownscaleCap(refreshRate)) { + mLayers[i]->setGeometryChanged(GEOMETRY_DEVICE_CONFIG_CHANGED); + break; + } + } + } else if (vsyncPeriod > btsVsyncPeriod) { + for (size_t i = 0; i < mLayers.size(); i++) { + if (mLayers[i]->mOtfMPP && mLayers[i]->mM2mMPP) { + float srcWidth = mLayers[i]->mSourceCrop.right - mLayers[i]->mSourceCrop.left; + float srcHeight = mLayers[i]->mSourceCrop.bottom - mLayers[i]->mSourceCrop.top; + float resolution = srcWidth * srcHeight * refreshRate / 1000; + float ratioVertical = static_cast<float>(mLayers[i]->mDisplayFrame.bottom - + mLayers[i]->mDisplayFrame.top) / + mYres; + + if (mLayers[i]->mOtfMPP->checkDownscaleCap(resolution, ratioVertical)) { + mLayers[i]->setGeometryChanged(GEOMETRY_DEVICE_CONFIG_CHANGED); + break; + } + } + } + } +} diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h index c82d57b..e544749 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h @@ -53,6 +53,8 @@ class ExynosPrimaryDisplay : public ExynosDisplay { virtual void dump(String8& result) override; virtual void updateAppliedActiveConfig(const hwc2_config_t newConfig, const int64_t ts) override; + virtual void checkBtsReassignResource(const uint32_t vsyncPeriod, + const uint32_t btsVsyncPeriod) override; virtual int32_t setBootDisplayConfig(int32_t config) override; virtual int32_t clearBootDisplayConfig() override; |