1 /* 2 * Copyright (C) 2019 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 #ifndef EXYNOS_DISPLAY_MODULE_H 17 #define EXYNOS_DISPLAY_MODULE_H 18 19 #include <gs101/displaycolor/displaycolor_gs101.h> 20 21 #include "ExynosDeviceModule.h" 22 #include "ExynosDisplay.h" 23 #include "ExynosLayer.h" 24 #include "ExynosPrimaryDisplay.h" 25 26 constexpr char kAtcJsonRaw[] = 27 "{\"version\":\"0.0\",\"modes\":[{\"name\":\"normal\",\"lux_map\":[0,5000,10000," 28 "50000,70000],\"ambient_light_map\":[0,0,12,32,63],\"strength_map\":[0,0,128,128,200]," 29 "\"st_up_step\":2, \"st_down_step\":2," 30 "\"sub_setting\":{\"local_tone_gain\":128,\"noise_suppression_gain\":128,\"dither\":0," 31 "\"plain_weight_1\":10,\"plain_weight_2\":14,\"color_transform_mode\":2,\"preprocessing_" 32 "enable\":1,\"upgrade_on\":0,\"TDR_max\":900,\"TDR_min\":256,\"backlight\":255,\"dimming_" 33 "step\":4,\"scale_mode\":1,\"threshold_1\":1,\"threshold_2\":1,\"threshold_3\":1,\"gain_" 34 "limit\":511,\"lt_calc_ab_shift\":1}}]}"; 35 36 constexpr char kAtcProfilePath[] = "vendor/etc/atc_profile.json"; 37 constexpr char kAtcProfileVersionStr[] = "version"; 38 constexpr char kAtcProfileModesStr[] = "modes"; 39 constexpr char kAtcProfileModeNameStr[] = "name"; 40 constexpr char kAtcProfileLuxMapStr[] = "lux_map"; 41 constexpr char kAtcProfileAlMapStr[] = "ambient_light_map"; 42 constexpr char kAtcProfileStMapStr[] = "strength_map"; 43 constexpr char kAtcProfileSubSettingStr[] = "sub_setting"; 44 constexpr char kAtcProfileStUpStepStr[] = "st_up_step"; 45 constexpr char kAtcProfileStDownStepStr[] = "st_down_step"; 46 constexpr uint32_t kAtcStStep = 2; 47 48 constexpr char kAtcModeNormalStr[] = "normal"; 49 constexpr char kAtcModeHbmStr[] = "hbm"; 50 constexpr char kAtcModePowerSaveStr[] = "power_save"; 51 52 #define ATC_AMBIENT_LIGHT_FILE_NAME "/sys/class/dqe%d/atc/ambient_light" 53 #define ATC_ST_FILE_NAME "/sys/class/dqe%d/atc/st" 54 #define ATC_ENABLE_FILE_NAME "/sys/class/dqe%d/atc/en" 55 #define ATC_LT_FILE_NAME "/sys/class/dqe%d/atc/lt" 56 #define ATC_NS_FILE_NAME "/sys/class/dqe%d/atc/ns" 57 #define ATC_DITHER_FILE_NAME "/sys/class/dqe%d/atc/dither" 58 #define ATC_PL_W1_FILE_NAME "/sys/class/dqe%d/atc/pl_w1" 59 #define ATC_PL_W2_FILE_NAME "/sys/class/dqe%d/atc/pl_w2" 60 #define ATC_CTMODE_FILE_NAME "/sys/class/dqe%d/atc/ctmode" 61 #define ATC_PP_EN_FILE_NAME "/sys/class/dqe%d/atc/pp_en" 62 #define ATC_UPGRADE_ON_FILE_NAME "/sys/class/dqe%d/atc/upgrade_on" 63 #define ATC_TDR_MAX_FILE_NAME "/sys/class/dqe%d/atc/tdr_max" 64 #define ATC_TDR_MIN_FILE_NAME "/sys/class/dqe%d/atc/tdr_min" 65 #define ATC_BACKLIGHT_FILE_NAME "/sys/class/dqe%d/atc/back_light" 66 #define ATC_DSTEP_FILE_NAME "/sys/class/dqe%d/atc/dstep" 67 #define ATC_SCALE_MODE_FILE_NAME "/sys/class/dqe%d/atc/scale_mode" 68 #define ATC_THRESHOLD_1_FILE_NAME "/sys/class/dqe%d/atc/threshold_1" 69 #define ATC_THRESHOLD_2_FILE_NAME "/sys/class/dqe%d/atc/threshold_2" 70 #define ATC_THRESHOLD_3_FILE_NAME "/sys/class/dqe%d/atc/threshold_3" 71 #define ATC_GAIN_LIMIT_FILE_NAME "/sys/class/dqe%d/atc/gain_limit" 72 #define ATC_LT_CALC_AB_SHIFT_FILE_NAME "/sys/class/dqe%d/atc/lt_calc_ab_shift" 73 74 const std::unordered_map<std::string, std::string> kAtcSubSetting = 75 {{"local_tone_gain", ATC_LT_FILE_NAME}, 76 {"noise_suppression_gain", ATC_NS_FILE_NAME}, 77 {"dither", ATC_DITHER_FILE_NAME}, 78 {"plain_weight_1", ATC_PL_W1_FILE_NAME}, 79 {"plain_weight_2", ATC_PL_W2_FILE_NAME}, 80 {"color_transform_mode", ATC_CTMODE_FILE_NAME}, 81 {"preprocessing_enable", ATC_PP_EN_FILE_NAME}, 82 {"upgrade_on", ATC_UPGRADE_ON_FILE_NAME}, 83 {"TDR_max", ATC_TDR_MAX_FILE_NAME}, 84 {"TDR_min", ATC_TDR_MIN_FILE_NAME}, 85 {"backlight", ATC_BACKLIGHT_FILE_NAME}, 86 {"dimming_step", ATC_DSTEP_FILE_NAME}, 87 {"scale_mode", ATC_SCALE_MODE_FILE_NAME}, 88 {"threshold_1", ATC_THRESHOLD_1_FILE_NAME}, 89 {"threshold_2", ATC_THRESHOLD_2_FILE_NAME}, 90 {"threshold_3", ATC_THRESHOLD_3_FILE_NAME}, 91 {"gain_limit", ATC_GAIN_LIMIT_FILE_NAME}, 92 {"lt_calc_ab_shift", ATC_LT_CALC_AB_SHIFT_FILE_NAME}}; 93 94 namespace gs101 { 95 96 using namespace displaycolor; 97 98 class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { 99 public: 100 ExynosPrimaryDisplayModule(uint32_t index, ExynosDevice *device); 101 ~ExynosPrimaryDisplayModule(); 102 void usePreDefinedWindow(bool use); 103 virtual int32_t validateWinConfigData(); 104 void doPreProcessing(); 105 virtual int32_t getColorModes( 106 uint32_t* outNumModes, 107 int32_t* outModes); 108 virtual int32_t setColorMode(int32_t mode); 109 virtual int32_t getRenderIntents(int32_t mode, uint32_t* outNumIntents, 110 int32_t* outIntents); 111 virtual int32_t setColorModeWithRenderIntent(int32_t mode, 112 int32_t intent); 113 virtual int32_t setColorTransform(const float* matrix, int32_t hint); 114 virtual int32_t getClientTargetProperty( 115 hwc_client_target_property_t* outClientTargetProperty, 116 HwcDimmingStage *outDimmingStage = nullptr) override; 117 virtual int deliverWinConfigData(); 118 virtual int32_t updateColorConversionInfo(); 119 virtual int32_t updatePresentColorConversionInfo(); checkRrCompensationEnabled()120 virtual bool checkRrCompensationEnabled() { 121 const DisplayType display = getDisplayTypeFromIndex(mIndex); 122 IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); 123 return displayColorInterface 124 ? displayColorInterface->IsRrCompensationEnabled(display) 125 : false; 126 } 127 128 virtual bool isColorCalibratedByDevice(); 129 130 virtual int32_t getColorAdjustedDbv(uint32_t &dbv_adj); 131 132 virtual void initLbe(); 133 virtual bool isLbeSupported(); 134 virtual void setLbeState(LbeState state); 135 virtual void setLbeAmbientLight(int value); 136 virtual LbeState getLbeState(); 137 138 virtual PanelCalibrationStatus getPanelCalibrationStatus(); 139 140 class DisplaySceneInfo { 141 public: 142 struct LayerMappingInfo { 143 bool operator==(const LayerMappingInfo &rhs) const { 144 return ((dppIdx == rhs.dppIdx) && (planeId == rhs.planeId)); 145 } 146 147 // index in DisplayScene::layer_data 148 uint32_t dppIdx; 149 // assigned drm plane id in last color setting update 150 uint32_t planeId; 151 }; 152 bool colorSettingChanged = false; 153 bool displaySettingDelivered = false; 154 DisplayScene displayScene; 155 156 /* 157 * Index of LayerColorData in DisplayScene::layer_data 158 * and assigned plane id in last color setting update. 159 * for each layer, including client composition 160 * key: ExynosMPPSource* 161 * data: LayerMappingInfo 162 */ 163 std::map<ExynosMPPSource*, LayerMappingInfo> layerDataMappingInfo; 164 std::map<ExynosMPPSource*, LayerMappingInfo> prev_layerDataMappingInfo; 165 reset()166 void reset() { 167 colorSettingChanged = false; 168 prev_layerDataMappingInfo = layerDataMappingInfo; 169 layerDataMappingInfo.clear(); 170 }; 171 172 template <typename T, typename M> updateInfoSingleVal(T & dst,M & src)173 void updateInfoSingleVal(T &dst, M &src) { 174 if (src != dst) { 175 colorSettingChanged = true; 176 dst = src; 177 } 178 }; 179 180 template <typename T, typename M> updateInfoVectorVal(std::vector<T> & dst,M * src,uint32_t size)181 void updateInfoVectorVal(std::vector<T> &dst, M *src, uint32_t size) { 182 if ((dst.size() != size) || 183 !std::equal(dst.begin(), dst.end(), src)) { 184 colorSettingChanged = true; 185 dst.resize(size); 186 for (uint32_t i = 0; i < size; i++) { 187 dst[i] = src[i]; 188 } 189 } 190 }; 191 setColorMode(hwc::ColorMode mode)192 void setColorMode(hwc::ColorMode mode) { 193 updateInfoSingleVal(displayScene.color_mode, mode); 194 }; 195 setRenderIntent(hwc::RenderIntent intent)196 void setRenderIntent(hwc::RenderIntent intent) { 197 updateInfoSingleVal(displayScene.render_intent, intent); 198 }; 199 setColorTransform(const float * matrix)200 void setColorTransform(const float* matrix) { 201 for (uint32_t i = 0; i < displayScene.matrix.size(); i++) { 202 if (displayScene.matrix[i] != matrix[i]) { 203 colorSettingChanged = true; 204 displayScene.matrix[i] = matrix[i]; 205 } 206 } 207 } 208 209 LayerColorData& getLayerColorDataInstance(uint32_t index); 210 int32_t setLayerDataMappingInfo(ExynosMPPSource* layer, uint32_t index); 211 void setLayerDataspace(LayerColorData& layerColorData, 212 hwc::Dataspace dataspace); 213 void disableLayerHdrStaticMetadata(LayerColorData& layerColorData); 214 void setLayerHdrStaticMetadata(LayerColorData& layerColorData, 215 const ExynosHdrStaticInfo& exynosHdrStaticInfo); 216 void setLayerColorTransform(LayerColorData& layerColorData, 217 std::array<float, TRANSFORM_MAT_SIZE> &matrix); 218 void disableLayerHdrDynamicMetadata(LayerColorData& layerColorData); 219 void setLayerHdrDynamicMetadata(LayerColorData& layerColorData, 220 const ExynosHdrDynamicInfo& exynosHdrDynamicInfo); 221 int32_t setLayerColorData(LayerColorData& layerData, 222 ExynosLayer* layer, float dimSdrRatio); 223 int32_t setClientCompositionColorData( 224 const ExynosCompositionInfo& clientCompositionInfo, 225 LayerColorData& layerData, float dimSdrRatio); 226 bool needDisplayColorSetting(); 227 void printDisplayScene(); 228 void printLayerColorData(const LayerColorData& layerData); 229 }; 230 hasDisplayColor()231 bool hasDisplayColor() { 232 IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); 233 return displayColorInterface != nullptr; 234 } 235 236 /* Call getDppForLayer() only if hasDppForLayer() is true */ 237 bool hasDppForLayer(ExynosMPPSource* layer); 238 const IDisplayColorGS101::IDpp& getDppForLayer(ExynosMPPSource* layer); 239 int32_t getDppIndexForLayer(ExynosMPPSource* layer); 240 /* Check if layer's assigned plane id has changed, save the new planeId. 241 * call only if hasDppForLayer is true */ checkAndSaveLayerPlaneId(ExynosMPPSource * layer,uint32_t planeId)242 bool checkAndSaveLayerPlaneId(ExynosMPPSource* layer, uint32_t planeId) { 243 auto &info = mDisplaySceneInfo.layerDataMappingInfo[layer]; 244 bool change = info.planeId != planeId; 245 info.planeId = planeId; 246 return change; 247 } 248 getNumOfDpp()249 size_t getNumOfDpp() { 250 const DisplayType display = getDisplayTypeFromIndex(mIndex); 251 IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); 252 return displayColorInterface->GetPipelineData(display)->Dpp().size(); 253 }; 254 getDqe()255 const IDisplayColorGS101::IDqe& getDqe() 256 { 257 const DisplayType display = getDisplayTypeFromIndex(mIndex); 258 IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); 259 return displayColorInterface->GetPipelineData(display)->Dqe(); 260 }; 261 262 // primary or secondary getBuiltInDisplayType()263 DisplayType getBuiltInDisplayType() { return getDisplayTypeFromIndex(mIndex); } 264 265 private: 266 int32_t setLayersColorData(); 267 DisplaySceneInfo mDisplaySceneInfo; 268 269 struct atc_lux_map { 270 uint32_t lux; 271 uint32_t al; 272 uint32_t st; 273 }; 274 275 struct atc_mode { 276 std::vector<atc_lux_map> lux_map; 277 std::unordered_map<std::string, int32_t> sub_setting; 278 uint32_t st_up_step; 279 uint32_t st_down_step; 280 }; 281 struct atc_sysfs { 282 String8 node; 283 CtrlValue<int32_t> value; 284 }; 285 286 bool parseAtcProfile(); 287 int32_t setAtcMode(std::string mode_name); 288 uint32_t getAtcLuxMapIndex(std::vector<atc_lux_map>, uint32_t lux); 289 int32_t setAtcAmbientLight(uint32_t ambient_light); 290 int32_t setAtcStrength(uint32_t strenght); 291 int32_t setAtcStDimming(uint32_t target); 292 int32_t setAtcEnable(bool enable); 293 void checkAtcAnimation(); isInAtcAnimation()294 bool isInAtcAnimation() { 295 if (mAtcStStepCount > 0) 296 return true; 297 else 298 return false; 299 }; 300 getDisplayColorInterface()301 IDisplayColorGS101* getDisplayColorInterface() { 302 ExynosDeviceModule* device = (ExynosDeviceModule*)mDevice; 303 return device->getDisplayColorInterface(); 304 } 305 isForceColorUpdate()306 bool isForceColorUpdate() const { return mForceColorUpdate; } setForceColorUpdate(bool force)307 void setForceColorUpdate(bool force) { mForceColorUpdate = force; } 308 bool isDisplaySwitched(int32_t mode, int32_t prevMode); 309 310 std::map<std::string, atc_mode> mAtcModeSetting; 311 bool mAtcInit; 312 LbeState mCurrentLbeState = LbeState::OFF; 313 std::string mCurrentAtcModeName; 314 uint32_t mCurrentLux = 0; 315 uint32_t mAtcLuxMapIndex = 0; 316 struct atc_sysfs mAtcAmbientLight; 317 struct atc_sysfs mAtcStrength; 318 struct atc_sysfs mAtcEnable; 319 std::unordered_map<std::string, struct atc_sysfs> mAtcSubSetting; 320 uint32_t mAtcStStepCount = 0; 321 uint32_t mAtcStTarget = 0; 322 uint32_t mAtcStUpStep; 323 uint32_t mAtcStDownStep; 324 Mutex mAtcStMutex; 325 bool mPendingAtcOff; 326 bool mForceColorUpdate = false; 327 bool mLbeSupported = false; 328 329 protected: 330 virtual int32_t setPowerMode(int32_t mode) override; 331 }; 332 333 } // namespace gs101 334 335 #endif 336