Merge "display/config: Add libdisplayconfig in PRODUCT_PACKAGES"
diff --git a/config/display-product.mk b/config/display-product.mk
index f0c5afc..141cd74 100644
--- a/config/display-product.mk
+++ b/config/display-product.mk
@@ -28,9 +28,15 @@
#QDCM calibration xml file for 2k panel
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35597_video_mode_dsi_truly_panel_with_DSC.xml
+
+#QDCM calibration xml file for 2k dual dsi panel
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_cmd_mode_dsi_truly_panel_without_DSC.xml.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_video_mode_dsi_truly_panel_without_DSC.xml.xml
+
#QDCM calibration xml file for 4k panel
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_Sharp_4k_cmd_mode_dsc_dsi_panel.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Sharp_4k_cmd_mode_dsc_dsi_panel.xml
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_Sharp_4k_cmd_mode_dsc_dsi_panel.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Sharp_4k_video_mode_dsc_dsi_panel.xml
+
#QDCM calibration xml file for amoled panel
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_sw43404_amoled_cmd_mode_dsi_boe_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_sw43404_amoled_cmd_mode_dsi_boe_panel_with_DSC.xml
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_sw43404_amoled_cmd_mode_dsi_boe_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_sw43404_amoled_video_mode_dsi_boe_panel_with_DSC.xml
@@ -42,16 +48,32 @@
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35695b_truly_fhd_command_mode_dsi_panel.xml
PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt35695b_truly_fhd_video_mode_dsi_panel.xml
-#QDCM calibration xml file for 2k dual dsi panel
-PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_cmd_mode_dsi_truly_panel_without_DSC.xml.xml
-PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_nt35597_cmd_mode_dsi_truly_panel_with_DSC.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_nt35597_video_mode_dsi_truly_panel_without_DSC.xml.xml
+#QDCM calibration xml file base on Talos panel type hx83112a
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_talos_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_hx83112a_video_mode_dsi_truly_panel.xml
+
+#QDCM calibration xml file base on Talos panel type td4328
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_talos_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4328_cmd_mode_dsi_truly_panel.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_talos_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4328_video_mode_dsi_truly_panel.xml
+
+#QDCM calibration xml file base on Moorea panel type fhd+
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_sw43404_amoled_boe_fhd+_panel_with_DSC.xml
+
+#QDCM calibration xml file base on td4330
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_trinket_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4330_cmd_mode_dsi_truly_panel.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_trinket_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_td4330_video_mode_dsi_truly_panel.xml
+
+#QDCM calibration xml file base on Moorea panel type wqhd
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_Sharp_WQHD_cmd_mode_dsi_panel.xml
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_Dual_Sharp_wqhd_video_mode_dsi_panel.xml
+
+#QDCM calibration xml file base on nt36672
+PRODUCT_COPY_FILES += hardware/qcom/display/config/qdcm_calib_data_trinket_default.xml:$(TARGET_COPY_OUT_VENDOR)/etc/qdcm_calib_data_nt36672_truly_fhd_video_mode_dsi_panel.xml
PRODUCT_PROPERTY_OVERRIDES += \
persist.demo.hdmirotationlock=false \
persist.sys.sf.color_saturation=1.0 \
debug.sf.hw=0 \
debug.egl.hw=0 \
- debug.sf.latch_unsignaled=1 \
debug.mdpcomp.logs=0 \
vendor.gralloc.disable_ubwc=0 \
vendor.display.disable_scaler=0 \
diff --git a/gralloc/QtiMapper.cpp b/gralloc/QtiMapper.cpp
index dc1b40c..dba446a 100644
--- a/gralloc/QtiMapper.cpp
+++ b/gralloc/QtiMapper.cpp
@@ -266,30 +266,30 @@
Return<void> QtiMapper::getMapSecureBufferFlag(void *buffer, getMapSecureBufferFlag_cb hidl_cb) {
auto err = Error::BAD_BUFFER;
auto hnd = static_cast<private_handle_t *>(buffer);
- int *map_secure_buffer = 0;
+ int map_secure_buffer = 0;
if (buffer != nullptr && private_handle_t::validate(hnd) == 0) {
- if (getMetaData(hnd, GET_MAP_SECURE_BUFFER, map_secure_buffer) != 0) {
- *map_secure_buffer = 0;
+ if (getMetaData(hnd, GET_MAP_SECURE_BUFFER, &map_secure_buffer) != 0) {
+ map_secure_buffer = 0;
} else {
err = Error::NONE;
}
}
- hidl_cb(err, *map_secure_buffer != 0);
+ hidl_cb(err, map_secure_buffer != 0);
return Void();
}
Return<void> QtiMapper::getInterlacedFlag(void *buffer, getInterlacedFlag_cb hidl_cb) {
auto err = Error::BAD_BUFFER;
auto hnd = static_cast<private_handle_t *>(buffer);
- int *interlaced_flag = nullptr;
+ int interlaced_flag = 0;
if (buffer != nullptr && private_handle_t::validate(hnd) == 0) {
- if (getMetaData(hnd, GET_PP_PARAM_INTERLACED, interlaced_flag) != 0) {
- *interlaced_flag = 0;
+ if (getMetaData(hnd, GET_PP_PARAM_INTERLACED, &interlaced_flag) != 0) {
+ interlaced_flag = 0;
} else {
err = Error::NONE;
}
}
- hidl_cb(err, *interlaced_flag != 0);
+ hidl_cb(err, interlaced_flag != 0);
return Void();
}
diff --git a/gralloc/gr_utils.cpp b/gralloc/gr_utils.cpp
index eb455ff..656ddec 100644
--- a/gralloc/gr_utils.cpp
+++ b/gralloc/gr_utils.cpp
@@ -1166,6 +1166,8 @@
} else if (usage & BufferUsage::VIDEO_ENCODER) {
if (usage & GRALLOC_USAGE_PRIVATE_VIDEO_NV21_ENCODER) {
gr_format = HAL_PIXEL_FORMAT_NV21_ENCODEABLE; // NV21
+ } else if (usage & GRALLOC_USAGE_PRIVATE_HEIF) {
+ gr_format = HAL_PIXEL_FORMAT_NV12_HEIF;
} else if (format == HAL_PIXEL_FORMAT_YCbCr_420_888) {
gr_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_VENUS;
} else {
diff --git a/sdm/include/core/display_interface.h b/sdm/include/core/display_interface.h
index c744fea..922d7ba 100644
--- a/sdm/include/core/display_interface.h
+++ b/sdm/include/core/display_interface.h
@@ -625,12 +625,6 @@
*/
virtual DisplayError GetDefaultColorMode(std::string *color_mode) = 0;
- /*! @brief Method to request applying default display mode.
-
- @return \link DisplayError \endlink
- */
- virtual DisplayError ApplyDefaultDisplayMode() = 0;
-
/*! @brief Method to set the position of the hw cursor.
@param[in] x \link x position \endlink
diff --git a/sdm/include/private/color_interface.h b/sdm/include/private/color_interface.h
index b9e287d..d7b5e5f 100644
--- a/sdm/include/private/color_interface.h
+++ b/sdm/include/private/color_interface.h
@@ -74,8 +74,6 @@
PPFeaturesConfig *out_features,
PPPendingParams *pending_action) = 0;
- virtual DisplayError ApplyDefaultDisplayMode(PPFeaturesConfig *out_features) = 0;
-
virtual DisplayError ColorIntfSetColorTransform(PPFeaturesConfig *out_features,
uint32_t disp_id, uint32_t length,
const double *trans_data) = 0;
@@ -84,12 +82,11 @@
uint32_t disp_id, int32_t mode_id) = 0;
virtual DisplayError ColorIntfGetNumDisplayModes(PPFeaturesConfig *out_features,
- uint32_t disp_id, bool enum_user_modes,
- uint32_t *mode_cnt) = 0;
+ uint32_t disp_id, uint32_t *mode_cnt) = 0;
virtual DisplayError ColorIntfEnumerateDisplayModes(PPFeaturesConfig *out_features,
- uint32_t disp_id, bool enum_user_modes,
- SDEDisplayMode *modes, uint32_t *mode_cnt) = 0;
+ uint32_t disp_id, SDEDisplayMode *modes,
+ uint32_t *mode_cnt) = 0;
virtual DisplayError ColorIntfGetModeInfo(PPFeaturesConfig *out_features,
uint32_t disp_id, int32_t mode_id,
AttrVal *query) = 0;
diff --git a/sdm/libs/core/color_manager.cpp b/sdm/libs/core/color_manager.cpp
index ed80e2c..fe42556 100644
--- a/sdm/libs/core/color_manager.cpp
+++ b/sdm/libs/core/color_manager.cpp
@@ -168,15 +168,6 @@
return ret;
}
-DisplayError ColorManagerProxy::ApplyDefaultDisplayMode(void) {
- DisplayError ret = kErrorNone;
-
- // On POR, will be invoked from prepare<> request once bootanimation is done.
- ret = color_intf_->ApplyDefaultDisplayMode(&pp_features_);
-
- return ret;
-}
-
bool ColorManagerProxy::NeedsPartialUpdateDisable() {
Locker &locker(pp_features_.GetLocker());
SCOPE_LOCK(locker);
@@ -224,15 +215,13 @@
}
}
-DisplayError ColorManagerProxy::ColorMgrGetNumOfModes(bool enum_user_modes,
- uint32_t *mode_cnt) {
- return color_intf_->ColorIntfGetNumDisplayModes(&pp_features_, 0, enum_user_modes, mode_cnt);
+DisplayError ColorManagerProxy::ColorMgrGetNumOfModes(uint32_t *mode_cnt) {
+ return color_intf_->ColorIntfGetNumDisplayModes(&pp_features_, 0, mode_cnt);
}
-DisplayError ColorManagerProxy::ColorMgrGetModes(bool enum_user_modes, uint32_t *mode_cnt,
+DisplayError ColorManagerProxy::ColorMgrGetModes(uint32_t *mode_cnt,
SDEDisplayMode *modes) {
- return color_intf_->ColorIntfEnumerateDisplayModes(&pp_features_, 0, enum_user_modes,
- modes, mode_cnt);
+ return color_intf_->ColorIntfEnumerateDisplayModes(&pp_features_, 0, modes, mode_cnt);
}
DisplayError ColorManagerProxy::ColorMgrSetMode(int32_t color_mode_id) {
diff --git a/sdm/libs/core/color_manager.h b/sdm/libs/core/color_manager.h
index 24237f8..5b604b7 100644
--- a/sdm/libs/core/color_manager.h
+++ b/sdm/libs/core/color_manager.h
@@ -65,9 +65,8 @@
DisplayError ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload,
PPDisplayAPIPayload *out_payload,
PPPendingParams *pending_action);
- DisplayError ApplyDefaultDisplayMode();
- DisplayError ColorMgrGetNumOfModes(bool enum_user_modes, uint32_t *mode_cnt);
- DisplayError ColorMgrGetModes(bool enum_user_modes, uint32_t *mode_cnt, SDEDisplayMode *modes);
+ DisplayError ColorMgrGetNumOfModes(uint32_t *mode_cnt);
+ DisplayError ColorMgrGetModes(uint32_t *mode_cnt, SDEDisplayMode *modes);
DisplayError ColorMgrSetMode(int32_t color_mode_id);
DisplayError ColorMgrGetModeInfo(int32_t mode_id, AttrVal *query);
DisplayError ColorMgrSetColorTransform(uint32_t length, const double *trans_data);
diff --git a/sdm/libs/core/comp_manager.cpp b/sdm/libs/core/comp_manager.cpp
index b0322f1..4780370 100644
--- a/sdm/libs/core/comp_manager.cpp
+++ b/sdm/libs/core/comp_manager.cpp
@@ -568,8 +568,8 @@
case kStateOn:
case kStateDoze:
- // Get active display count.
- if (powered_on_displays_.size()) {
+ // Setting safe mode if there are multiple displays and one of display is already active.
+ if ((registered_displays_.size() > 1) && powered_on_displays_.size()) {
safe_mode_ = true;
DLOGV_IF(kTagCompManager, "safe_mode = %d", safe_mode_);
}
diff --git a/sdm/libs/core/display_base.cpp b/sdm/libs/core/display_base.cpp
old mode 100644
new mode 100755
index f9aa06b..ea48884
--- a/sdm/libs/core/display_base.cpp
+++ b/sdm/libs/core/display_base.cpp
@@ -135,7 +135,7 @@
display_attributes_, hw_panel_info_);
if (color_mgr_) {
- if (InitializeColorModes(false) != kErrorNone) {
+ if (InitializeColorModes() != kErrorNone) {
DLOGW("InitColorModes failed for display %d-%d", display_id_, display_type_);
}
color_mgr_->ColorMgrCombineColorModes();
@@ -1056,38 +1056,6 @@
return kErrorNotSupported;
}
-DisplayError DisplayBase::ApplyDefaultDisplayMode() {
- lock_guard<recursive_mutex> obj(recursive_mutex_);
- DisplayError error = kErrorNone;
- if (color_mgr_) {
- error = color_mgr_->ApplyDefaultDisplayMode();
- // Apply default mode failed
- if (error != kErrorNone) {
- DLOGI("default mode not found");
- return error;
- }
- DeInitializeColorModes();
- // Default mode apply is called during first frame, if file system
- // where mode files is present, ColorManager will not find any modes.
- // Once boot animation is complete we re-try to apply the modes, since
- // file system should be mounted. InitColorModes needs to called again
- error = InitializeColorModes(true);
- if (error != kErrorNone) {
- DLOGE("failed to initial modes\n");
- return error;
- }
- if (color_modes_cs_.size() > 0) {
- error = comp_manager_->SetColorModesInfo(display_comp_ctx_, color_modes_cs_);
- if (error) {
- DLOGW("SetColorModesInfo failed on display = %d", display_type_);
- }
- }
- } else {
- return kErrorParameters;
- }
- return kErrorNone;
-}
-
DisplayError DisplayBase::SetCursorPosition(int x, int y) {
lock_guard<recursive_mutex> obj(recursive_mutex_);
if (state_ != kStateOn) {
@@ -1549,12 +1517,12 @@
return;
}
-DisplayError DisplayBase::InitializeColorModes(bool enum_user_modes) {
+DisplayError DisplayBase::InitializeColorModes() {
if (!color_mgr_) {
return kErrorNotSupported;
}
- DisplayError error = color_mgr_->ColorMgrGetNumOfModes(enum_user_modes, &num_color_modes_);
+ DisplayError error = color_mgr_->ColorMgrGetNumOfModes(&num_color_modes_);
if (error != kErrorNone || !num_color_modes_) {
DLOGV_IF(kTagQDCM, "GetNumModes failed = %d count = %d", error, num_color_modes_);
return kErrorNotSupported;
@@ -1564,8 +1532,7 @@
if (!color_modes_.size()) {
color_modes_.resize(num_color_modes_);
- DisplayError error = color_mgr_->ColorMgrGetModes(enum_user_modes,
- &num_color_modes_, color_modes_.data());
+ DisplayError error = color_mgr_->ColorMgrGetModes(&num_color_modes_, color_modes_.data());
if (error != kErrorNone) {
color_modes_.clear();
DLOGE("Failed");
diff --git a/sdm/libs/core/display_base.h b/sdm/libs/core/display_base.h
old mode 100644
new mode 100755
index 47c872d..9039aff
--- a/sdm/libs/core/display_base.h
+++ b/sdm/libs/core/display_base.h
@@ -111,7 +111,6 @@
virtual DisplayError GetColorModeName(int32_t mode_id, std::string *mode_name);
virtual DisplayError SetColorTransform(const uint32_t length, const double *color_transform);
virtual DisplayError GetDefaultColorMode(std::string *color_mode);
- virtual DisplayError ApplyDefaultDisplayMode(void);
virtual DisplayError SetCursorPosition(int x, int y);
virtual DisplayError GetRefreshRateRange(uint32_t *min_refresh_rate, uint32_t *max_refresh_rate);
virtual DisplayError GetPanelBrightness(int *level) {
@@ -140,7 +139,7 @@
}
virtual DisplayError SetQSyncMode(QSyncMode qsync_mode) { return kErrorNotSupported; }
virtual std::string Dump();
- virtual DisplayError InitializeColorModes(bool enum_user_modes);
+ virtual DisplayError InitializeColorModes();
virtual DisplayError ControlIdlePowerCollapse(bool enable, bool synchronous) {
return kErrorNotSupported;
}
diff --git a/sdm/libs/core/display_pluggable.cpp b/sdm/libs/core/display_pluggable.cpp
index 54bb497..5bed20a 100644
--- a/sdm/libs/core/display_pluggable.cpp
+++ b/sdm/libs/core/display_pluggable.cpp
@@ -126,7 +126,7 @@
DLOGE("Failed to create hardware events interface. Error = %d", error);
}
- InitializeColorModes(false);
+ InitializeColorModes();
current_refresh_rate_ = hw_panel_info_.max_fps;
@@ -316,7 +316,7 @@
return kErrorNone;
}
-DisplayError DisplayPluggable::InitializeColorModes(bool enum_user_modes) {
+DisplayError DisplayPluggable::InitializeColorModes() {
PrimariesTransfer pt = {};
AttrVal var;
if (!hw_panel_info_.hdr_enabled) {
diff --git a/sdm/libs/core/display_pluggable.h b/sdm/libs/core/display_pluggable.h
index 92bb890..c75388a 100644
--- a/sdm/libs/core/display_pluggable.h
+++ b/sdm/libs/core/display_pluggable.h
@@ -48,7 +48,7 @@
virtual DisplayError SetRefreshRate(uint32_t refresh_rate, bool final_rate);
virtual bool IsUnderscanSupported();
virtual DisplayError OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
- virtual DisplayError InitializeColorModes(bool enum_user_modes);
+ virtual DisplayError InitializeColorModes();
virtual DisplayError SetColorMode(const std::string &color_mode);
virtual DisplayError GetColorModeCount(uint32_t *mode_count);
virtual DisplayError GetColorModes(uint32_t *mode_count, std::vector<std::string> *color_modes);
diff --git a/sdm/libs/core/drm/hw_device_drm.cpp b/sdm/libs/core/drm/hw_device_drm.cpp
index aa6d28c..2d9a8c8 100644
--- a/sdm/libs/core/drm/hw_device_drm.cpp
+++ b/sdm/libs/core/drm/hw_device_drm.cpp
@@ -833,6 +833,18 @@
return kErrorParameters;
}
+ drmModeModeInfo to_set = connector_info_.modes[index].mode;
+ uint64_t current_bit_clk = connector_info_.modes[current_mode_index_].bit_clk_rate;
+ for (uint32_t mode_index = 0; mode_index < connector_info_.modes.size(); mode_index++) {
+ if ((to_set.vdisplay == connector_info_.modes[mode_index].mode.vdisplay) &&
+ (to_set.hdisplay == connector_info_.modes[mode_index].mode.hdisplay) &&
+ (to_set.vrefresh == connector_info_.modes[mode_index].mode.vrefresh) &&
+ (current_bit_clk == connector_info_.modes[mode_index].bit_clk_rate)) {
+ index = mode_index;
+ break;
+ }
+ }
+
current_mode_index_ = index;
PopulateHWPanelInfo();
UpdateMixerAttributes();
diff --git a/sdm/libs/hwc2/display_null.h b/sdm/libs/hwc2/display_null.h
index 1d54f65..7d31c6b 100644
--- a/sdm/libs/hwc2/display_null.h
+++ b/sdm/libs/hwc2/display_null.h
@@ -89,7 +89,6 @@
MAKE_NO_OP(GetColorModeName(int32_t, string *))
MAKE_NO_OP(SetColorTransform(const uint32_t, const double *))
MAKE_NO_OP(GetDefaultColorMode(string *))
- MAKE_NO_OP(ApplyDefaultDisplayMode())
MAKE_NO_OP(SetCursorPosition(int, int))
MAKE_NO_OP(SetRefreshRate(uint32_t, bool))
MAKE_NO_OP(GetPanelBrightness(int *))
@@ -113,7 +112,7 @@
protected:
DisplayConfigVariableInfo default_variable_config_ = {};
DisplayConfigFixedInfo default_fixed_config_ = {};
- // 1920x1080 60fps panel of name Null Display with PnPID QCM for Qualcomm
+ // 1920x1080 60fps panel of name Null Display with PnPID QCM
// Contains many 'don't-care' fields and valid checksum bytes
const vector<uint8_t> edid_{
0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0x6D, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index a118c32..8c88a1c 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -183,6 +183,10 @@
std::string mode_string = preferred_mode_[current_color_mode_][curr_dynamic_range_];
if (mode_string.empty()) {
mode_string = color_mode_map_[current_color_mode_][current_render_intent_][curr_dynamic_range_];
+ if (mode_string.empty() && hdr_present) {
+ // Use the colorimetric HDR mode, if an HDR mode with the current render intent is not present
+ mode_string = color_mode_map_[current_color_mode_][RenderIntent::COLORIMETRIC][kHdrType];
+ }
if (mode_string.empty() &&
current_color_mode_ == ColorMode::DISPLAY_P3 &&
curr_dynamic_range_ == kHdrType) {
@@ -407,40 +411,6 @@
}
}
-HWC2::Error HWCColorMode::ApplyDefaultColorMode() {
- auto color_mode = ColorMode::NATIVE;
- if (color_mode_map_.size() == 1U) {
- color_mode = color_mode_map_.begin()->first;
- } else if (color_mode_map_.size() > 1U) {
- std::string default_color_mode;
- bool found = false;
- DisplayError error = display_intf_->GetDefaultColorMode(&default_color_mode);
- if (error == kErrorNone) {
- // get the default mode corresponding android_color_mode_t
- for (auto &it_mode : color_mode_map_) {
- for (auto &it : it_mode.second) {
- for (auto &it_range : it.second) {
- if (it_range.second == default_color_mode) {
- found = true;
- break;
- }
- }
- }
- if (found) {
- color_mode = it_mode.first;
- break;
- }
- }
- }
-
- // return the first color mode we encounter if not found
- if (!found) {
- color_mode = color_mode_map_.begin()->first;
- }
- }
- return SetColorModeWithRenderIntent(color_mode, RenderIntent::COLORIMETRIC);
-}
-
void HWCColorMode::Dump(std::ostringstream* os) {
*os << "color modes supported: \n";
for (auto it : color_mode_map_) {
@@ -2122,7 +2092,6 @@
validated_ = false;
display_intf_->SetActiveConfig(config);
- callbacks_->Refresh(id_);
return 0;
}
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index 53eccae..b1951ef 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -94,7 +94,6 @@
output_matrix[i] = static_cast<double>(input_matrix[i]);
}
}
- HWC2::Error ApplyDefaultColorMode();
HWC2::Error ValidateColorModeWithRenderIntent(ColorMode mode, RenderIntent intent);
HWC2::Error SetPreferredColorModeInternal(const std::string &mode_string, bool from_client,
ColorMode *color_mode, DynamicRangeType *dynamic_range);
diff --git a/sdm/libs/hwc2/hwc_display_builtin.h b/sdm/libs/hwc2/hwc_display_builtin.h
index 2cca040..0b5cd99 100644
--- a/sdm/libs/hwc2/hwc_display_builtin.h
+++ b/sdm/libs/hwc2/hwc_display_builtin.h
@@ -102,7 +102,6 @@
void SetMetaDataRefreshRateFlag(bool enable);
virtual DisplayError SetDisplayMode(uint32_t mode);
virtual DisplayError DisablePartialUpdateOneFrame();
- void ProcessBootAnimCompleted(void);
void SetQDCMSolidFillInfo(bool enable, const LayerSolidFill &color);
void ToggleCPUHint(bool set);
void ForceRefreshRate(uint32_t refresh_rate);
diff --git a/sdm/libs/hwc2/hwc_session.cpp b/sdm/libs/hwc2/hwc_session.cpp
index 83afed5..1c1ea99 100644
--- a/sdm/libs/hwc2/hwc_session.cpp
+++ b/sdm/libs/hwc2/hwc_session.cpp
@@ -341,6 +341,9 @@
for (auto &map_info : map_info_virtual_) {
map_info.client_id = base_id++;
}
+
+ // resize HDR supported map to total number of displays.
+ is_hdr_display_.resize(UINT32(base_id));
}
int HWCSession::GetDisplayIndex(int dpy) {
@@ -1206,6 +1209,10 @@
case HWC2::FunctionDescriptor::GetDisplayIdentificationData:
return AsFP<HWC2_PFN_GET_DISPLAY_IDENTIFICATION_DATA>
(HWCSession::GetDisplayIdentificationData);
+ case HWC2::FunctionDescriptor::GetDisplayCapabilities:
+ return AsFP<HWC2_PFN_GET_DISPLAY_CAPABILITIES>(HWCSession::GetDisplayCapabilities);
+ case HWC2::FunctionDescriptor::GetDisplayBrightnessSupport:
+ return AsFP<HWC2_PFN_GET_DISPLAY_BRIGHTNESS_SUPPORT>(HWCSession::GetDisplayBrightnessSupport);
default:
DLOGD("Unknown/Unimplemented function descriptor: %d (%s)", int_descriptor,
to_string(descriptor).c_str());
@@ -1275,6 +1282,7 @@
return HWC2::Error::NoResources;
}
+ is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display);
DLOGI("Created virtual display id:% " PRIu64 " with res: %dx%d", client_id, width, height);
*out_display_id = client_id;
@@ -2419,6 +2427,7 @@
}
if (!status) {
+ is_hdr_display_[UINT32(client_id)] = HasHDRSupport(*hwc_display);
DLOGI("Primary display created.");
map_info_primary_.disp_type = info.display_type;
map_info_primary_.sdm_id = info.display_id;
@@ -2478,6 +2487,7 @@
DLOGE("Builtin display creation failed.");
break;
}
+ is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display_[client_id]);
DLOGI("Builtin display created: sdm id = %d, client id = %d", info.display_id, client_id);
map_info.disp_type = info.display_type;
map_info.sdm_id = info.display_id;
@@ -2627,6 +2637,7 @@
break;
}
+ is_hdr_display_[UINT32(client_id)] = HasHDRSupport(hwc_display);
DLOGI("Created pluggable display successfully: sdm id = %d, client id = %d",
info.display_id, client_id);
}
@@ -2673,6 +2684,21 @@
return status;
}
+bool HWCSession::HasHDRSupport(HWCDisplay *hwc_display) {
+ // query number of hdr types
+ uint32_t out_num_types = 0;
+ float out_max_luminance = 0.0f;
+ float out_max_average_luminance = 0.0f;
+ float out_min_luminance = 0.0f;
+ if (hwc_display->GetHdrCapabilities(&out_num_types, nullptr, &out_max_luminance,
+ &out_max_average_luminance, &out_min_luminance)
+ != HWC2::Error::None) {
+ return false;
+ }
+
+ return (out_num_types > 0);
+}
+
int HWCSession::HandleDisconnectedDisplays(HWDisplaysInfo *hw_displays_info) {
// Destroy pluggable displays which were connected earlier but got disconnected now.
for (auto &map_info : map_info_pluggable_) {
@@ -2730,6 +2756,7 @@
DLOGI("Destroy display %d-%d, client id = %d", map_info->sdm_id, map_info->disp_type,
client_id);
+ is_hdr_display_[UINT32(client_id)] = false;
if (!map_info->test_pattern) {
HWCDisplayPluggable::Destroy(hwc_display);
} else {
@@ -2751,6 +2778,7 @@
}
DLOGI("Destroy display %d-%d, client id = %d", map_info->sdm_id, map_info->disp_type,
client_id);
+ is_hdr_display_[UINT32(client_id)] = false;
switch (map_info->disp_type) {
case kBuiltIn:
HWCDisplayBuiltIn::Destroy(hwc_display);
@@ -3062,6 +3090,63 @@
outDataSize, outData);
}
+int32_t HWCSession::GetDisplayCapabilities(hwc2_device_t *device, hwc2_display_t display,
+ uint32_t *outNumCapabilities,
+ uint32_t *outCapabilities) {
+ if (!outNumCapabilities || !device) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (display >= HWCCallbacks::kNumDisplays) {
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ HWCSession *hwc_session = static_cast<HWCSession *>(device);
+ HWCDisplay *hwc_display = hwc_session->hwc_display_[display];
+ if (!hwc_display) {
+ DLOGE("Expected valid hwc_display");
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+ bool isBuiltin = (hwc_display->GetDisplayClass() == DISPLAY_CLASS_BUILTIN);
+ if (!outCapabilities) {
+ *outNumCapabilities = 0;
+ if (isBuiltin) {
+ *outNumCapabilities = 2;
+ }
+ return HWC2_ERROR_NONE;
+ } else {
+ if (isBuiltin) {
+ // TODO(user): Handle SKIP_CLIENT_COLOR_TRANSFORM based on DSPP availability
+ outCapabilities[0] = HWC2_DISPLAY_CAPABILITY_SKIP_CLIENT_COLOR_TRANSFORM;
+ outCapabilities[1] = HWC2_DISPLAY_CAPABILITY_DOZE;
+ *outNumCapabilities = 2;
+ }
+ return HWC2_ERROR_NONE;
+ }
+}
+
+int32_t HWCSession::GetDisplayBrightnessSupport(hwc2_device_t *device, hwc2_display_t display,
+ bool *outSupport) {
+ if (!device || !outSupport) {
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+
+ if (display >= HWCCallbacks::kNumDisplays) {
+ return HWC2_ERROR_BAD_DISPLAY;
+ }
+
+ HWCSession *hwc_session = static_cast<HWCSession *>(device);
+ HWCDisplay *hwc_display = hwc_session->hwc_display_[display];
+ if (!hwc_display) {
+ DLOGE("Expected valid hwc_display");
+ return HWC2_ERROR_BAD_PARAMETER;
+ }
+ // This function isn't actually used in the framework
+ // The capability is used instead
+ *outSupport = false;
+ return HWC2_ERROR_NONE;
+}
+
android::status_t HWCSession::SetQSyncMode(const android::Parcel *input_parcel) {
auto mode = input_parcel->readInt32();
auto device = static_cast<hwc2_device_t *>(this);
diff --git a/sdm/libs/hwc2/hwc_session.h b/sdm/libs/hwc2/hwc_session.h
index c82cc12..1d546cc 100644
--- a/sdm/libs/hwc2/hwc_session.h
+++ b/sdm/libs/hwc2/hwc_session.h
@@ -218,6 +218,10 @@
static int32_t GetDisplayIdentificationData(hwc2_device_t *device, hwc2_display_t display,
uint8_t *outPort, uint32_t *outDataSize,
uint8_t *outData);
+ static int32_t GetDisplayCapabilities(hwc2_device_t *device, hwc2_display_t display,
+ uint32_t *outNumCapabilities, uint32_t *outCapabilities);
+ static int32_t GetDisplayBrightnessSupport(hwc2_device_t *device, hwc2_display_t display,
+ bool *outSupport);
// HWCDisplayEventHandler
virtual void DisplayPowerReset();
@@ -279,6 +283,7 @@
int32_t MinHdcpEncryptionLevelChanged(int disp_id, uint32_t min_enc_level);
int32_t IsWbUbwcSupported(int *value);
int32_t SetDynamicDSIClock(int64_t disp_id, uint32_t bitrate);
+ bool HasHDRSupport(HWCDisplay *hwc_display);
// service methods
void StartServices();
@@ -404,6 +409,7 @@
std::vector<DisplayMapInfo> map_info_builtin_; // Builtin displays excluding primary
std::vector<DisplayMapInfo> map_info_pluggable_; // Pluggable displays excluding primary
std::vector<DisplayMapInfo> map_info_virtual_; // Virtual displays
+ std::vector<bool> is_hdr_display_; // info on HDR supported
bool reset_panel_ = false;
bool client_connected_ = false;
bool new_bw_mode_ = false;
diff --git a/sdm/libs/hwc2/hwc_session_services.cpp b/sdm/libs/hwc2/hwc_session_services.cpp
index a1eec83..2a8d631 100644
--- a/sdm/libs/hwc2/hwc_session_services.cpp
+++ b/sdm/libs/hwc2/hwc_session_services.cpp
@@ -675,25 +675,11 @@
}
Return<bool> HWCSession::isHDRSupported(uint32_t disp_id) {
- SCOPE_LOCK(locker_[disp_id]);
- HWCDisplay *hwc_display = hwc_display_[disp_id];
- if (!hwc_display) {
- DLOGW("Display = %d is not connected.", disp_id);
+ if (disp_id < 0 || disp_id >= HWCCallbacks::kNumDisplays) {
+ DLOGE("Not valid display");
return false;
}
-
- // query number of hdr types
- uint32_t out_num_types = 0;
- float out_max_luminance = 0.0f;
- float out_max_average_luminance = 0.0f;
- float out_min_luminance = 0.0f;
- if (hwc_display->GetHdrCapabilities(&out_num_types, nullptr, &out_max_luminance,
- &out_max_average_luminance, &out_min_luminance)
- != HWC2::Error::None) {
- return false;
- }
-
- return (out_num_types > 0);
+ return static_cast<bool>(is_hdr_display_[disp_id]);
}
Return<bool> HWCSession::isWCGSupported(uint32_t disp_id) {