author | sky 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) |
commit | 7c74f94ec896b8ef70231d98e5f939c2efb87fbb (patch) | |
tree | 0b72adda4ab350bb5d19a945218819bbd1524418 | |
parent | c8d6b4104d80cea5ff04966e2a9154e5747192a8 (diff) | |
download | hwcomposer-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>
-rw-r--r-- | common/display/Android.mk | 7 | ||||
-rw-r--r-- | common/display/ConnectorHdmi.cpp | 48 | ||||
-rw-r--r-- | common/display/ConnectorHdmi.h | 12 | ||||
-rw-r--r-- | common/display/HwDisplayCrtc.cpp | 2 | ||||
-rw-r--r-- | common/display/HwDisplayEventListener.cpp | 2 |
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} }; |