summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-05-16 18:54:48 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2022-05-16 18:54:48 +0000
commitd813376bf2ff650afeb2fc8e43a5a5ee91314ecd (patch)
tree0f3d25abacfa4214caba5ed27146ef6f9f924829
parent204730d451b1354499aeaabcc35d31cb0f980933 (diff)
parentbb57e559f992b5fbcc07c8080b9ae02522e7af37 (diff)
downloadcommon-d813376bf2ff650afeb2fc8e43a5a5ee91314ecd.tar.gz
Snap for 8598489 from bb57e559f992b5fbcc07c8080b9ae02522e7af37 to mainline-networking-release
Change-Id: I76508b5aa7f081234bbab299ab2aae3535d5db54
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp19
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h4
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp32
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h2
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;