summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlinpeter <linpeter@google.com>2021-04-14 00:10:13 +0800
committerlinpeter <linpeter@google.com>2021-06-03 16:18:17 +0800
commitff7ef118bddc84c2bc60097285e7cdd5dd157c04 (patch)
tree24a9355f350998732727b70a566cf71cfc9ff30d
parent11b37232ff5e6e36d92da85894ff2fd150375912 (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.mk6
-rw-r--r--libhwc2.1/libdevice/ExynosDevice.cpp21
-rw-r--r--libhwc2.1/libdevice/ExynosDevice.h4
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.cpp1
-rw-r--r--libhwc2.1/libdevice/ExynosDisplay.h6
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.cpp6
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterface.h2
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayInterface.h1
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.cpp31
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplay.h14
-rw-r--r--libhwc2.1/pixel-display.cpp27
-rw-r--r--libhwc2.1/pixel-display.h3
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;