diff options
author | linpeter <linpeter@google.com> | 2021-04-14 00:10:13 +0800 |
---|---|---|
committer | linpeter <linpeter@google.com> | 2021-06-03 16:18:17 +0800 |
commit | ff7ef118bddc84c2bc60097285e7cdd5dd157c04 (patch) | |
tree | 24a9355f350998732727b70a566cf71cfc9ff30d | |
parent | 11b37232ff5e6e36d92da85894ff2fd150375912 (diff) |
libhwc2.1: pixel-display V2 interface implement
Bug: 184768835
Bug: 185087460
test: test lhbm function call
Change-Id: I924d162713d95954855c706287f10f8cb696f763
-rw-r--r-- | libhwc2.1/Android.mk | 6 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDevice.cpp | 21 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDevice.h | 4 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.cpp | 1 | ||||
-rw-r--r-- | libhwc2.1/libdevice/ExynosDisplay.h | 6 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp | 6 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h | 2 | ||||
-rw-r--r-- | libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h | 1 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp | 31 | ||||
-rw-r--r-- | libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h | 14 | ||||
-rw-r--r-- | libhwc2.1/pixel-display.cpp | 27 | ||||
-rw-r--r-- | libhwc2.1/pixel-display.h | 3 |
12 files changed, 117 insertions, 5 deletions
diff --git a/libhwc2.1/Android.mk b/libhwc2.1/Android.mk index a9e50ec..f047f6f 100644 --- a/libhwc2.1/Android.mk +++ b/libhwc2.1/Android.mk @@ -63,7 +63,7 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware \ libvendorgraphicbuffer libbinder_ndk \ android.hardware.power-V1-ndk_platform pixel-power-ext-V1-ndk_platform -LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V1-ndk_platform \ +LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V2-ndk_platform \ libbinder_ndk \ libbase @@ -143,7 +143,7 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libbinder libexynosdisplay l android.hardware.graphics.allocator@2.0 \ android.hardware.graphics.mapper@2.0 -LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V1-ndk_platform \ +LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V2-ndk_platform \ libbinder_ndk \ libbase @@ -202,7 +202,7 @@ LOCAL_SHARED_LIBRARIES := liblog libcutils libutils libexynosdisplay libacryl \ android.hardware.graphics.mapper@2.0 \ libui -LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V1-ndk_platform \ +LOCAL_SHARED_LIBRARIES += com.google.hardware.pixel.display-V2-ndk_platform \ libbinder_ndk \ libbase diff --git a/libhwc2.1/libdevice/ExynosDevice.cpp b/libhwc2.1/libdevice/ExynosDevice.cpp index c42fcc1..e6826fb 100644 --- a/libhwc2.1/libdevice/ExynosDevice.cpp +++ b/libhwc2.1/libdevice/ExynosDevice.cpp @@ -1026,3 +1026,24 @@ LbeState ExynosDevice::getLbeState() { } return LbeState::OFF; } + +bool ExynosDevice::isLhbmSupported() { + ExynosDisplay *display = getDisplay(getDisplayId(HWC_DISPLAY_PRIMARY, 0)); + return display->isLhbmSupported(); +} + +int32_t ExynosDevice::setLhbmState(bool enabled) { + if (isLhbmSupported()) { + ExynosDisplay *display = getDisplay(getDisplayId(HWC_DISPLAY_PRIMARY, 0)); + return display->setLhbmState(enabled); + } + return -1; +} + +bool ExynosDevice::getLhbmState() { + if (isLhbmSupported()) { + ExynosDisplay *display = getDisplay(getDisplayId(HWC_DISPLAY_PRIMARY, 0)); + return display->getLhbmState(); + } + return false; +} diff --git a/libhwc2.1/libdevice/ExynosDevice.h b/libhwc2.1/libdevice/ExynosDevice.h index 1fd1853..538e143 100644 --- a/libhwc2.1/libdevice/ExynosDevice.h +++ b/libhwc2.1/libdevice/ExynosDevice.h @@ -329,6 +329,10 @@ class ExynosDevice { void setLbeAmbientLight(int value); LbeState getLbeState(); + bool isLhbmSupported(); + int32_t setLhbmState(bool enabled); + bool getLhbmState(); + private: bool mLbeSupported; }; diff --git a/libhwc2.1/libdevice/ExynosDisplay.cpp b/libhwc2.1/libdevice/ExynosDisplay.cpp index 719c051..de93caf 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.cpp +++ b/libhwc2.1/libdevice/ExynosDisplay.cpp @@ -5158,6 +5158,7 @@ void ExynosDisplay::updateBrightnessState() { } mBrightnessState.local_hbm = mReqLhbm; + mBrightnessState.instant_hbm |= mBrightnessState.local_hbm; if (mDisplayInterface->updateBrightness(true /* syncFrame */) != HWC2_ERROR_NONE) { ALOGW("Failed to update brighntess"); diff --git a/libhwc2.1/libdevice/ExynosDisplay.h b/libhwc2.1/libdevice/ExynosDisplay.h index 0b047f6..a522a96 100644 --- a/libhwc2.1/libdevice/ExynosDisplay.h +++ b/libhwc2.1/libdevice/ExynosDisplay.h @@ -1112,6 +1112,12 @@ class ExynosDisplay { virtual LbeState getLbeState() { return LbeState::OFF; }; int32_t checkPowerHalExtHintSupport(const std::string& mode); + + virtual bool isLhbmSupported() { return false; }; + virtual int32_t setLhbmState(bool __unused enabled) { return NO_ERROR; }; + virtual bool getLhbmState() { return false; }; + virtual void notifyLhbmState(bool __unused enabled){}; + int32_t sendPowerHalExtHint(const std::string& mode, bool enabled); /* getDisplayPreAssignBit support mIndex up to 1. diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp index 7ebd1a0..15a0287 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp @@ -630,6 +630,7 @@ int32_t ExynosDisplayDrmInterface::setPowerMode(int32_t mode) mBrightnessState.reset(); mBrightnessCtrl.reset(); mExynosDisplay->requestLhbm(false); + mExynosDisplay->notifyLhbmState(mBrightnessCtrl.LhbmOn.get()); } return ret; } @@ -1424,7 +1425,6 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() mBrightnessCtrl.LhbmOn.get())) < 0) { HWC_LOGE(mExynosDisplay, "%s: Fail to set lhbm_on property", __func__); } - mBrightnessCtrl.LhbmOn.clear_dirty(); // sync mipi command and frame when lhbm on/off mipi_sync = true; @@ -1519,6 +1519,10 @@ int32_t ExynosDisplayDrmInterface::deliverWinConfigData() " in deliverWinConfigData()\n", __func__, ret); return ret; } + if (mipi_sync_action == brightnessState_t::MIPI_SYNC_LHBM_ON || + mipi_sync_action == brightnessState_t::MIPI_SYNC_LHBM_OFF) { + mExynosDisplay->notifyLhbmState(mBrightnessCtrl.LhbmOn.get()); + } } mExynosDisplay->mDpuData.retire_fence = (int)out_fences[mDrmCrtc->pipe()]; diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h index 04efd54..c85f3f2 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h @@ -253,6 +253,7 @@ class ExynosDisplayDrmInterface : virtual int32_t updateBrightness(bool syncFrame); virtual float getSdrDimRatio(); + virtual int32_t waitVBlank(); bool isHbmOn() { return mBrightnessCtrl.HbmOn.get(); } uint32_t getDbv() { return mBrightnessLevel.get(); } @@ -306,7 +307,6 @@ class ExynosDisplayDrmInterface : int32_t setupWritebackCommit(DrmModeAtomicReq &drmReq); private: - int32_t waitVBlank(); int32_t updateColorSettings(DrmModeAtomicReq &drmReq); int32_t getLowPowerDrmModeModeInfo(); int32_t setActiveDrmMode(DrmMode const &mode); diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h b/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h index 3b3815c..27bc5ab 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h @@ -76,6 +76,7 @@ class ExynosDisplayInterface { /* For HWC 2.4 APIs */ virtual int32_t getVsyncAppliedTime(hwc2_config_t __unused config, int64_t* __unused actualChangeTime) {return NO_ERROR;} + virtual int32_t waitVBlank() { return 0; }; public: uint32_t mType = INTERFACE_TYPE_NONE; }; diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp index 89dd547..27add3d 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp @@ -122,6 +122,9 @@ ExynosPrimaryDisplay::ExynosPrimaryDisplay(uint32_t index, ExynosDevice *device) ALOGE("Brightness node is not opened"); } #endif + + mLhbmFd = fopen(kLocalHbmModeFileNode, "w+"); + if (mLhbmFd == NULL) ALOGE("local hbm mode node open failed! %s", strerror(errno)); } ExynosPrimaryDisplay::~ExynosPrimaryDisplay() @@ -415,3 +418,31 @@ int32_t ExynosPrimaryDisplay::SetCurrentPanelGammaSource(const DisplayType type, currentPanelGammaSource = source; return HWC2_ERROR_NONE; } + +int32_t ExynosPrimaryDisplay::setLhbmState(bool enabled) { + requestLhbm(enabled); + ALOGI("setLhbmState =%d", enabled); + + std::unique_lock<std::mutex> lk(lhbm_mutex_); + mLhbmChanged = false; + if (!lhbm_cond_.wait_for(lk, std::chrono::milliseconds(1000), + [this] { return mLhbmChanged; })) { + ALOGI("setLhbmState =%d timeout !", enabled); + return TIMED_OUT; + } else { + if (enabled) + mDisplayInterface->waitVBlank(); + return NO_ERROR; + } +} + +bool ExynosPrimaryDisplay::getLhbmState() { + return mLhbmOn; +} + +void ExynosPrimaryDisplay::notifyLhbmState(bool enabled) { + std::lock_guard<std::mutex> lk(lhbm_mutex_); + mLhbmChanged = true; + lhbm_cond_.notify_one(); + mLhbmOn = enabled; +} diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h index 06cc579..42b6d09 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h @@ -35,6 +35,11 @@ class ExynosPrimaryDisplay : public ExynosDisplay { return currentPanelGammaSource; } + virtual bool isLhbmSupported() { return mLhbmFd ? true : false; }; + virtual int32_t setLhbmState(bool enabled); + virtual bool getLhbmState(); + virtual void notifyLhbmState(bool enabled); + virtual void initDisplayInterface(uint32_t interfaceType); virtual int32_t doDisplayConfigInternal(hwc2_config_t config) override; @@ -70,6 +75,15 @@ class ExynosPrimaryDisplay : public ExynosDisplay { void firstPowerOn(); std::string getPanelSysfsPath(const displaycolor::DisplayType& type); + + // LHBM + FILE* mLhbmFd; + bool mLhbmOn; + bool mLhbmChanged; + static constexpr const char *kLocalHbmModeFileNode = + "/sys/class/backlight/panel0-backlight/local_hbm_mode"; + std::mutex lhbm_mutex_; + std::condition_variable lhbm_cond_; }; #endif diff --git a/libhwc2.1/pixel-display.cpp b/libhwc2.1/pixel-display.cpp index f79967f..2ee58ef 100644 --- a/libhwc2.1/pixel-display.cpp +++ b/libhwc2.1/pixel-display.cpp @@ -91,6 +91,33 @@ ndk::ScopedAStatus Display::getLbeState(LbeState *_aidl_return) { } return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); } + +ndk::ScopedAStatus Display::isLhbmSupported(bool *_aidl_return) { + if (mDevice) { + *_aidl_return = mDevice->isLhbmSupported(); + return ndk::ScopedAStatus::ok(); + } + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Display::setLhbmState(bool enabled) { + if (mDevice && mDevice->isLhbmSupported()) { + int32_t ret = mDevice->setLhbmState(enabled); + if (!ret) + return ndk::ScopedAStatus::ok(); + else if (ret == TIMED_OUT) + return ndk::ScopedAStatus::fromExceptionCode(STATUS_TIMED_OUT); + } + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} + +ndk::ScopedAStatus Display::getLhbmState(bool *_aidl_return) { + if (mDevice && mDevice->isLhbmSupported()) { + *_aidl_return = mDevice->getLhbmState(); + return ndk::ScopedAStatus::ok(); + } + return ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION); +} } // namespace display } // namespace pixel } // namespace hardware diff --git a/libhwc2.1/pixel-display.h b/libhwc2.1/pixel-display.h index fafe6d4..2d8d4af 100644 --- a/libhwc2.1/pixel-display.h +++ b/libhwc2.1/pixel-display.h @@ -39,6 +39,9 @@ public: ndk::ScopedAStatus setLbeState(LbeState state) override; ndk::ScopedAStatus setLbeAmbientLight(int ambientLux) override; ndk::ScopedAStatus getLbeState(LbeState *_aidl_return) override; + ndk::ScopedAStatus isLhbmSupported(bool *_aidl_return) override; + ndk::ScopedAStatus setLhbmState(bool enabled) override; + ndk::ScopedAStatus getLhbmState(bool *_aidl_return) override; private: ExynosDevice *mDevice = nullptr; |