summaryrefslogtreecommitdiff
authorsky zhou <sky.zhou@amlogic.com>2020-02-11 12:32:15 (GMT)
committer sky zhou <sky.zhou@amlogic.com>2020-05-21 11:55:21 (GMT)
commit7c74f94ec896b8ef70231d98e5f939c2efb87fbb (patch)
tree0b72adda4ab350bb5d19a945218819bbd1524418
parentc8d6b4104d80cea5ff04966e2a9154e5747192a8 (diff)
downloadhwcomposer-7c74f94ec896b8ef70231d98e5f939c2efb87fbb.zip
hwcomposer-7c74f94ec896b8ef70231d98e5f939c2efb87fbb.tar.gz
hwcomposer-7c74f94ec896b8ef70231d98e5f939c2efb87fbb.tar.bz2
display: add fraction only mode config [1/1]
PD#SWPL-20418 Problem: For some product, we need fraction Refresh rate only Solution: Add HWC_HDMI_FRAC_MODE config. Verify: Verify on newton. Change-Id: I24418155249855a04db7254a8513b80080c518e2 Signed-off-by: sky zhou <sky.zhou@amlogic.com>
Diffstat
-rw-r--r--common/display/Android.mk7
-rw-r--r--common/display/ConnectorHdmi.cpp48
-rw-r--r--common/display/ConnectorHdmi.h12
-rw-r--r--common/display/HwDisplayCrtc.cpp2
-rw-r--r--common/display/HwDisplayEventListener.cpp2
5 files changed, 47 insertions, 24 deletions
diff --git a/common/display/Android.mk b/common/display/Android.mk
index 641a2f9..46c9e16 100644
--- a/common/display/Android.mk
+++ b/common/display/Android.mk
@@ -21,8 +21,11 @@ endif
LOCAL_CPPFLAGS := $(HWC_CPP_FLAGS)
LOCAL_CFLAGS := $(HWC_C_FLAGS)
-ifeq ($(HWC_ENABLE_FRACTIONAL_REFRESH_RATE), true)
-LOCAL_CFLAGS += -DENABLE_FRACTIONAL_REFRESH_RATE
+ifneq ($(HWC_HDMI_FRAC_MODE),)
+ LOCAL_CFLAGS += -DHWC_HDMI_FRAC_MODE=$(HWC_HDMI_FRAC_MODE)
+else
+ LOCAL_CFLAGS += -DHWC_HDMI_FRAC_MODE=0
+ $(warning "HDMI default frac mode = 0, use fraction refresh rate.")
endif
LOCAL_SHARED_LIBRARIES := $(HWC_SHARED_LIBS)
diff --git a/common/display/ConnectorHdmi.cpp b/common/display/ConnectorHdmi.cpp
index 13a07f9..b8b2010 100644
--- a/common/display/ConnectorHdmi.cpp
+++ b/common/display/ConnectorHdmi.cpp
@@ -32,12 +32,9 @@ ConnectorHdmi::ConnectorHdmi(int32_t drvFd, uint32_t id)
mIsEDIDValid = false;
mConnected = false;
mSecure = false;
-#ifdef ENABLE_FRACTIONAL_REFRESH_RATE
- mFracMode = true;
-#else
- mFracMode = false;
-#endif
+ mFracMode = HWC_HDMI_FRAC_MODE;
snprintf(mName, 64, "HDMI-%d", id);
+ MESON_LOGD("Connector hdmi (%s) frac mode (%d) created.", mName, mFracMode);
}
ConnectorHdmi::~ConnectorHdmi() {
@@ -143,23 +140,40 @@ int32_t ConnectorHdmi::addDisplayMode(std::string& mode) {
(float)vinfo->sync_duration_num/vinfo->sync_duration_den};
strcpy(modeInfo.name, mode.c_str());
- if (mFracMode) {
- // add frac refresh rate config, like 23.976hz, 29.97hz...
- if (modeInfo.refreshRate == REFRESH_24kHZ
- || modeInfo.refreshRate == REFRESH_30kHZ
- || modeInfo.refreshRate == REFRESH_60kHZ
- || modeInfo.refreshRate == REFRESH_120kHZ
- || modeInfo.refreshRate == REFRESH_240kHZ) {
+ bool bFractionMode = false, bNonFractionMode = false;
+ if (mFracMode == MODE_ALL || mFracMode == MODE_FRACTION) {
+ bFractionMode = true;
+ }
+
+ // add frac refresh rate config, like 23.976hz, 29.97hz...
+ if (modeInfo.refreshRate == REFRESH_24kHZ
+ || modeInfo.refreshRate == REFRESH_30kHZ
+ || modeInfo.refreshRate == REFRESH_60kHZ
+ || modeInfo.refreshRate == REFRESH_120kHZ
+ || modeInfo.refreshRate == REFRESH_240kHZ) {
+ if (bFractionMode) {
drm_mode_info_t fracMode = modeInfo;
fracMode.refreshRate = (modeInfo.refreshRate * 1000) / (float)1001;
mDisplayModes.emplace(mDisplayModes.size(), fracMode);
- mFracRefreshRates.push_back(fracMode.refreshRate);
+ MESON_LOGI("add fraction display mode (%s)", fracMode.name);
+ if (bNonFractionMode == true)
+ mFracRefreshRates.push_back(fracMode.refreshRate);
}
+ } else {
+ /*for non fraction display mode, we also add it in MODE_FRACTION*/
+ bNonFractionMode = true;
+ }
+
+ if (mFracMode == MODE_ALL || mFracMode == MODE_NON_FRACTION) {
+ bNonFractionMode = true;
+ }
+
+ if (bNonFractionMode) {
+ // add normal refresh rate config, like 24hz, 30hz...
+ mDisplayModes.emplace(mDisplayModes.size(), modeInfo);
+ MESON_LOGI("add non fraction display mode (%s)", mode.c_str());
}
- // add normal refresh rate config, like 24hz, 30hz...
- mDisplayModes.emplace(mDisplayModes.size(), modeInfo);
- MESON_LOGI("add display mode (%s)", mode.c_str());
return 0;
}
@@ -168,7 +182,7 @@ int32_t ConnectorHdmi::getModes(std::map<uint32_t, drm_mode_info_t> & modes) {
}
int32_t ConnectorHdmi::setMode(drm_mode_info_t & mode) {
- if (!mFracMode)
+ if (MODE_ALL == mFracMode)
return 0;
/*update rate policy.*/
diff --git a/common/display/ConnectorHdmi.h b/common/display/ConnectorHdmi.h
index 1c70778..14e8bd9 100644
--- a/common/display/ConnectorHdmi.h
+++ b/common/display/ConnectorHdmi.h
@@ -47,14 +47,20 @@ protected:
int32_t parseHdrCapabilities();
virtual void parseEDID();
- std::vector<uint8_t> mEDID;
- bool mIsEDIDValid;
-
private:
+ enum {
+ MODE_FRACTION = 0,
+ MODE_NON_FRACTION,
+ MODE_ALL
+ };
+
char mName[64];
bool mConnected;
bool mSecure;
+ std::vector<uint8_t> mEDID;
+ bool mIsEDIDValid;
+
bool mFracMode;
std::vector<float> mFracRefreshRates;
drm_hdr_capabilities mHdrCapabilities;
diff --git a/common/display/HwDisplayCrtc.cpp b/common/display/HwDisplayCrtc.cpp
index ea031f4..26cbaa7 100644
--- a/common/display/HwDisplayCrtc.cpp
+++ b/common/display/HwDisplayCrtc.cpp
@@ -162,7 +162,7 @@ int32_t HwDisplayCrtc::update() {
for (auto it = mModes.begin(); it != mModes.end(); it ++) {
MESON_LOGD("update: (%s) mode (%s)", displayMode.c_str(), it->second.name);
if (strcmp(it->second.name, displayMode.c_str()) == 0
- && it->second.refreshRate == floor(it->second.refreshRate)) {
+ && it->second.refreshRate == it->second.refreshRate) {
memcpy(&mCurModeInfo, &it->second, sizeof(drm_mode_info_t));
break;
}
diff --git a/common/display/HwDisplayEventListener.cpp b/common/display/HwDisplayEventListener.cpp
index 0653b07..65eb92a 100644
--- a/common/display/HwDisplayEventListener.cpp
+++ b/common/display/HwDisplayEventListener.cpp
@@ -61,7 +61,7 @@ static drm_uevent_info_t mUeventParser[] = {
{HDMITX_HDCP_EVENT, DRM_EVENT_HDMITX_HDCP,
OLD_EVENT_STATE_ENABLE, OLD_EVENT_STATE_DISABLE},
{VOUT_MODE_EVENT, DRM_EVENT_VOUT1_MODE_CHANGED,
- OLD_EVENT_STATE_ENABLE, OLD_EVENT_STATE_DISABLE}
+ OLD_EVENT_STATE_ENABLE, OLD_EVENT_STATE_DISABLE},
{VOUT2_MODE_EVENT, DRM_EVENT_VOUT2_MODE_CHANGED,
OLD_EVENT_STATE_ENABLE, OLD_EVENT_STATE_DISABLE}
};