diff options
author | Xu Yang <yangxu@codeaurora.org> | 2016-09-29 16:32:04 +0800 |
---|---|---|
committer | Rajesh Yadav <ryadav@codeaurora.org> | 2017-03-09 19:18:08 +0530 |
commit | c31d7f8d94d0caf226b0ee246400b435a4fa7cec (patch) | |
tree | 80b923c72b5b77a2c221253e2732c79b2b901144 | |
parent | 14ee4b688bdb572f6b7ccc4d8e0fce861a0f6e39 (diff) | |
download | display-c31d7f8d94d0caf226b0ee246400b435a4fa7cec.tar.gz |
sdm: add one action to set panel brightness and refresh screen
Add one action to set panel brightness and refresh screen. The
backlight level is cached and sent through display commit IOCTL
to driver, which would take effect along with display commit.
Change-Id: I87483e82b5c13ef25c1da956ac9403162afd031e
-rw-r--r-- | sdm/include/core/display_interface.h | 8 | ||||
-rw-r--r-- | sdm/include/private/color_params.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/display_base.h | 3 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.cpp | 5 | ||||
-rw-r--r-- | sdm/libs/core/display_primary.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_device_drm.cpp | 4 | ||||
-rw-r--r-- | sdm/libs/core/drm/hw_device_drm.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/fb/hw_device.cpp | 11 | ||||
-rw-r--r-- | sdm/libs/core/fb/hw_device.h | 3 | ||||
-rw-r--r-- | sdm/libs/core/fb/hw_primary.cpp | 6 | ||||
-rw-r--r-- | sdm/libs/core/fb/hw_primary.h | 1 | ||||
-rw-r--r-- | sdm/libs/core/hw_interface.h | 1 | ||||
-rw-r--r-- | sdm/libs/hwc/hwc_display.cpp | 10 | ||||
-rw-r--r-- | sdm/libs/hwc/hwc_display.h | 1 | ||||
-rw-r--r-- | sdm/libs/hwc/hwc_session.cpp | 10 |
15 files changed, 66 insertions, 0 deletions
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h index 1b95b916..09c6a79c 100644 --- a/sdm/include/core/display_interface.h +++ b/sdm/include/core/display_interface.h @@ -472,6 +472,14 @@ class DisplayInterface { */ virtual DisplayError SetPanelBrightness(int level) = 0; + /*! @brief Method to cache brightness of the primary display. + + @param[in] level the new backlight level. + + @return \link DisplayError \endlink + */ + virtual DisplayError CachePanelBrightness(int level) = 0; + /*! @brief Method to notify display about change in min HDCP encryption level. @param[in] min_enc_level minimum encryption level value. diff --git a/sdm/include/private/color_params.h b/sdm/include/private/color_params.h index a3ecd50c..e2e094e4 100644 --- a/sdm/include/private/color_params.h +++ b/sdm/include/private/color_params.h @@ -51,6 +51,7 @@ enum PendingAction { kEnableFrameCapture = BITMAP(6), kDisableFrameCapture = BITMAP(7), kConfigureDetailedEnhancer = BITMAP(8), + kInvalidatingAndkSetPanelBrightness = BITMAP(9), kGetDetailedEnhancerData = BITMAP(21), kNoAction = BITMAP(31), }; diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h index 64f8ab75..3026b38f 100644 --- a/sdm/libs/core/display_base.h +++ b/sdm/libs/core/display_base.h @@ -82,6 +82,9 @@ class DisplayBase : public DisplayInterface, DumpImpl { virtual DisplayError SetPanelBrightness(int level) { return kErrorNotSupported; } + virtual DisplayError CachePanelBrightness(int level) { + return kErrorNotSupported; + } virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level) { return kErrorNotSupported; } diff --git a/sdm/libs/core/display_primary.cpp b/sdm/libs/core/display_primary.cpp index 09e0c228..753020d0 100644 --- a/sdm/libs/core/display_primary.cpp +++ b/sdm/libs/core/display_primary.cpp @@ -240,6 +240,11 @@ DisplayError DisplayPrimary::SetPanelBrightness(int level) { return hw_intf_->SetPanelBrightness(level); } +DisplayError DisplayPrimary::CachePanelBrightness(int level) { + lock_guard<recursive_mutex> obj(recursive_mutex_); + return hw_intf_->CachePanelBrightness(level); +} + DisplayError DisplayPrimary::GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate) { lock_guard<recursive_mutex> obj(recursive_mutex_); diff --git a/sdm/libs/core/display_primary.h b/sdm/libs/core/display_primary.h index 0bfef046..a16c3676 100644 --- a/sdm/libs/core/display_primary.h +++ b/sdm/libs/core/display_primary.h @@ -51,6 +51,7 @@ class DisplayPrimary : public DisplayBase, HWEventHandler { virtual DisplayError SetRefreshRate(uint32_t refresh_rate); virtual DisplayError SetPanelBrightness(int level); virtual DisplayError GetPanelBrightness(int *level); + virtual DisplayError CachePanelBrightness(int level); // Implement the HWEventHandlers virtual DisplayError VSync(int64_t timestamp); diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp index 2886b569..355dab9f 100644 --- a/sdm/libs/core/drm/hw_device_drm.cpp +++ b/sdm/libs/core/drm/hw_device_drm.cpp @@ -649,6 +649,10 @@ DisplayError HWDeviceDRM::SetPanelBrightness(int level) { return kErrorNotSupported; } +DisplayError HWDeviceDRM::CachePanelBrightness(int level) { + return kErrorNotSupported; +} + DisplayError HWDeviceDRM::GetHWScanInfo(HWScanInfo *scan_info) { return kErrorNotSupported; } diff --git a/sdm/libs/core/drm/hw_device_drm.h b/sdm/libs/core/drm/hw_device_drm.h index db135a03..d6e64ad6 100644 --- a/sdm/libs/core/drm/hw_device_drm.h +++ b/sdm/libs/core/drm/hw_device_drm.h @@ -77,6 +77,7 @@ class HWDeviceDRM : public HWInterface { virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode); virtual DisplayError SetRefreshRate(uint32_t refresh_rate); virtual DisplayError SetPanelBrightness(int level); + virtual DisplayError CachePanelBrightness(int level); virtual DisplayError GetHWScanInfo(HWScanInfo *scan_info); virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format); virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format); diff --git a/sdm/libs/core/fb/hw_device.cpp b/sdm/libs/core/fb/hw_device.cpp index 999265eb..6309c09a 100644 --- a/sdm/libs/core/fb/hw_device.cpp +++ b/sdm/libs/core/fb/hw_device.cpp @@ -485,6 +485,10 @@ DisplayError HWDevice::Commit(HWLayers *hw_layers) { if (synchronous_commit_) { mdp_commit.flags |= MDP_COMMIT_WAIT_FOR_FINISH; } + if (bl_update_commit && bl_level_update_commit >= 0) { + mdp_commit.bl_level = (uint32_t)bl_level_update_commit; + mdp_commit.flags |= MDP_COMMIT_UPDATE_BRIGHTNESS; + } if (Sys::ioctl_(device_fd_, INT(MSMFB_ATOMIC_COMMIT), &mdp_disp_commit_) < 0) { if (errno == ESHUTDOWN) { DLOGI_IF(kTagDriverConfig, "Driver is processing shutdown sequence"); @@ -539,6 +543,9 @@ DisplayError HWDevice::Commit(HWLayers *hw_layers) { synchronous_commit_ = false; } + if (bl_update_commit) + bl_update_commit = false; + return kErrorNone; } @@ -1180,6 +1187,10 @@ DisplayError HWDevice::SetPanelBrightness(int level) { return kErrorNotSupported; } +DisplayError HWDevice::CachePanelBrightness(int level) { + return kErrorNotSupported; +} + DisplayError HWDevice::GetHWScanInfo(HWScanInfo *scan_info) { return kErrorNotSupported; } diff --git a/sdm/libs/core/fb/hw_device.h b/sdm/libs/core/fb/hw_device.h index aa73177d..b94a5f36 100644 --- a/sdm/libs/core/fb/hw_device.h +++ b/sdm/libs/core/fb/hw_device.h @@ -85,6 +85,7 @@ class HWDevice : public HWInterface { virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode); virtual DisplayError SetRefreshRate(uint32_t refresh_rate); virtual DisplayError SetPanelBrightness(int level); + virtual DisplayError CachePanelBrightness(int level); virtual DisplayError GetHWScanInfo(HWScanInfo *scan_info); virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format); virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format); @@ -156,6 +157,8 @@ class HWDevice : public HWInterface { HWDisplayAttributes display_attributes_ = {}; HWMixerAttributes mixer_attributes_ = {}; std::vector<mdp_destination_scaler_data> mdp_dest_scalar_data_; + int bl_level_update_commit = -1; + bool bl_update_commit = false; }; } // namespace sdm diff --git a/sdm/libs/core/fb/hw_primary.cpp b/sdm/libs/core/fb/hw_primary.cpp index 1e6f37de..8102e5f7 100644 --- a/sdm/libs/core/fb/hw_primary.cpp +++ b/sdm/libs/core/fb/hw_primary.cpp @@ -570,6 +570,12 @@ DisplayError HWPrimary::GetPanelBrightness(int *level) { return kErrorNone; } +DisplayError HWPrimary::CachePanelBrightness(int level) { + bl_level_update_commit = level; + bl_update_commit = true; + return kErrorNone; +} + DisplayError HWPrimary::SetAutoRefresh(bool enable) { const int kWriteLength = 2; char buffer[kWriteLength] = {'\0'}; diff --git a/sdm/libs/core/fb/hw_primary.h b/sdm/libs/core/fb/hw_primary.h index bd6ea2f9..38b3b9ac 100644 --- a/sdm/libs/core/fb/hw_primary.h +++ b/sdm/libs/core/fb/hw_primary.h @@ -55,6 +55,7 @@ class HWPrimary : public HWDevice { virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode); virtual DisplayError SetRefreshRate(uint32_t refresh_rate); virtual DisplayError SetPanelBrightness(int level); + virtual DisplayError CachePanelBrightness(int level); virtual DisplayError GetPPFeaturesVersion(PPFeatureVersion *vers); virtual DisplayError SetPPFeatures(PPFeaturesConfig *feature_list); virtual DisplayError GetPanelBrightness(int *level); diff --git a/sdm/libs/core/hw_interface.h b/sdm/libs/core/hw_interface.h index fbebb136..23c6114a 100644 --- a/sdm/libs/core/hw_interface.h +++ b/sdm/libs/core/hw_interface.h @@ -96,6 +96,7 @@ class HWInterface { virtual DisplayError SetDisplayMode(const HWDisplayMode hw_display_mode) = 0; virtual DisplayError SetRefreshRate(uint32_t refresh_rate) = 0; virtual DisplayError SetPanelBrightness(int level) = 0; + virtual DisplayError CachePanelBrightness(int level) = 0; virtual DisplayError GetHWScanInfo(HWScanInfo *scan_info) = 0; virtual DisplayError GetVideoFormat(uint32_t config_index, uint32_t *video_format) = 0; virtual DisplayError GetMaxCEAFormat(uint32_t *max_cea_format) = 0; diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp index c1e41345..b0d2c7c0 100644 --- a/sdm/libs/hwc/hwc_display.cpp +++ b/sdm/libs/hwc/hwc_display.cpp @@ -1377,6 +1377,16 @@ int HWCDisplay::GetPanelBrightness(int *level) { return display_intf_->GetPanelBrightness(level); } +int HWCDisplay::CachePanelBrightness(int level) { + int ret = 0; + if (display_intf_) + ret = display_intf_->CachePanelBrightness(level); + else + ret = -EINVAL; + + return ret; +} + int HWCDisplay::ToggleScreenUpdates(bool enable) { const hwc_procs_t *hwc_procs = *hwc_procs_; display_paused_ = enable ? false : true; diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h index 56529962..b0a40d5b 100644 --- a/sdm/libs/hwc/hwc_display.h +++ b/sdm/libs/hwc/hwc_display.h @@ -141,6 +141,7 @@ class HWCDisplay : public DisplayEventHandler { int SetPanelBrightness(int level); int GetPanelBrightness(int *level); + int CachePanelBrightness(int level); int ToggleScreenUpdates(bool enable); int ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload, PPDisplayAPIPayload *out_payload, diff --git a/sdm/libs/hwc/hwc_session.cpp b/sdm/libs/hwc/hwc_session.cpp index a3248568..e6aa70f5 100644 --- a/sdm/libs/hwc/hwc_session.cpp +++ b/sdm/libs/hwc/hwc_session.cpp @@ -1358,6 +1358,16 @@ android::status_t HWCSession::QdcmCMDHandler(const android::Parcel *input_parcel hwc_display_[HWC_DISPLAY_PRIMARY]); hwc_procs_->invalidate(hwc_procs_); break; + case kInvalidatingAndkSetPanelBrightness: + brightness_value = reinterpret_cast<int32_t*>(resp_payload.payload); + if (brightness_value == NULL) { + DLOGE("Brightness value is Null"); + return -EINVAL; + } + if (HWC_DISPLAY_PRIMARY == display_id) + ret = hwc_display_[HWC_DISPLAY_PRIMARY]->CachePanelBrightness(*brightness_value); + hwc_procs_->invalidate(hwc_procs_); + break; case kNoAction: break; default: |