diff options
author | Xin Li <delphij@google.com> | 2022-02-11 06:57:38 +0000 |
---|---|---|
committer | Xin Li <delphij@google.com> | 2022-02-11 06:57:38 +0000 |
commit | 11624674dd9bfb5922cb3843eca66ee1230c1013 (patch) | |
tree | 6e1ea25f335cce476b5bf7b23c6d9ee1283281a9 | |
parent | 64f6d7cf1bba2443fb2a8d240ea7a3cbe94dd4f7 (diff) | |
parent | ee64a0a29da2b38e98fcfb57bf04ecff98e3dabf (diff) | |
download | gs101-11624674dd9bfb5922cb3843eca66ee1230c1013.tar.gz |
Merge sc-v2-dev-plus-aosp-without-vendor@8084891
Bug: 214455710
Merged-In: Id89a0a3a2f9c6a8c8a6d7b1be0401a84185f7073
Change-Id: I497d6de61bbe268d1162c132c662efc5145236b7
19 files changed, 295 insertions, 63 deletions
diff --git a/include/gs101/displaycolor/displaycolor_gs101.h b/include/gs101/displaycolor/displaycolor_gs101.h index b2ef7f9..5c89d76 100644 --- a/include/gs101/displaycolor/displaycolor_gs101.h +++ b/include/gs101/displaycolor/displaycolor_gs101.h @@ -293,8 +293,7 @@ class IDisplayColorGS101 : public IDisplayColorGeneric { extern "C" { /// Get the GS101 instance. -IDisplayColorGS101* GetDisplayColorGS101(size_t display_num); - +IDisplayColorGS101* GetDisplayColorGS101(const std::vector<DisplayInfo> &display_info); } } // namespace displaycolor diff --git a/libhwc2.1/DeconHeader.h b/libhwc2.1/DeconHeader.h index 327a5fb..6892c0e 100644 --- a/libhwc2.1/DeconHeader.h +++ b/libhwc2.1/DeconHeader.h @@ -27,4 +27,5 @@ enum decon_idma_type { ODMA_WB, MAX_DECON_DMA_TYPE, }; + #endif diff --git a/libhwc2.1/ExynosHWCModule.h b/libhwc2.1/ExynosHWCModule.h index 0f8dcd9..0b71845 100644 --- a/libhwc2.1/ExynosHWCModule.h +++ b/libhwc2.1/ExynosHWCModule.h @@ -30,8 +30,10 @@ #define DP_LINK_NAME "130b0000.displayport" #define DP_UEVENT_NAME "change@/devices/platform/%s/extcon/extcon0" #define DP_CABLE_STATE_NAME "/sys/devices/platform/%s/extcon/extcon0/cable.0/state" -#define BRIGHTNESS_NODE_BASE "/sys/class/backlight/panel0-backlight/brightness" -#define MAX_BRIGHTNESS_NODE_BASE "/sys/class/backlight/panel0-backlight/max_brightness" +#define BRIGHTNESS_NODE_0_BASE "/sys/class/backlight/panel0-backlight/brightness" +#define MAX_BRIGHTNESS_NODE_0_BASE "/sys/class/backlight/panel0-backlight/max_brightness" +#define BRIGHTNESS_NODE_1_BASE "/sys/class/backlight/panel1-backlight/brightness" +#define MAX_BRIGHTNESS_NODE_1_BASE "/sys/class/backlight/panel1-backlight/max_brightness" #define EARLY_WAKUP_NODE_BASE "/sys/devices/platform/1c300000.drmdecon/early_wakeup" #define IDMA(x) static_cast<decon_idma_type>(x) diff --git a/libhwc2.1/ExynosResourceRestriction.h b/libhwc2.1/ExynosResourceRestriction.h index 7b6fd8b..bcb15ef 100644 --- a/libhwc2.1/ExynosResourceRestriction.h +++ b/libhwc2.1/ExynosResourceRestriction.h @@ -18,6 +18,7 @@ #define EXYNOS_RESOURCE_RESTRICTION_H_ #include "ExynosHWCModule.h" + /******************************************************************* * Structures for restrictions * ****************************************************************/ diff --git a/libhwc2.1/libdevice/ExynosDeviceModule.cpp b/libhwc2.1/libdevice/ExynosDeviceModule.cpp index 39b7ac4..b8d31da 100644 --- a/libhwc2.1/libdevice/ExynosDeviceModule.cpp +++ b/libhwc2.1/libdevice/ExynosDeviceModule.cpp @@ -16,12 +16,35 @@ #include "ExynosDeviceModule.h" +#include "ExynosDisplayDrmInterfaceModule.h" + extern struct exynos_hwc_control exynosHWCControl; -ExynosDeviceModule::ExynosDeviceModule() - : ExynosDevice() -{ + +using namespace gs101; + +ExynosDeviceModule::ExynosDeviceModule() : ExynosDevice(), mDisplayColorLoader(DISPLAY_COLOR_LIB) { exynosHWCControl.skipStaticLayers = false; + + std::vector<displaycolor::DisplayInfo> display_info; + for (uint32_t i = 0; i < mDisplays.size(); i++) { + ExynosDisplay* display = mDisplays[i]; + ExynosDisplayDrmInterfaceModule* moduleDisplayInterface = + (ExynosDisplayDrmInterfaceModule*)(display->mDisplayInterface.get()); + + moduleDisplayInterface->getDisplayInfo(display_info); + } + initDisplayColor(display_info); } ExynosDeviceModule::~ExynosDeviceModule() { } + +int ExynosDeviceModule::initDisplayColor( + const std::vector<displaycolor::DisplayInfo>& display_info) { + mDisplayColorInterface = mDisplayColorLoader.GetDisplayColorGS101(display_info); + if (mDisplayColorInterface == nullptr) { + ALOGW("%s failed to load displaycolor", __func__); + } + + return NO_ERROR; +} diff --git a/libhwc2.1/libdevice/ExynosDeviceModule.h b/libhwc2.1/libdevice/ExynosDeviceModule.h index 478f145..ba37e29 100644 --- a/libhwc2.1/libdevice/ExynosDeviceModule.h +++ b/libhwc2.1/libdevice/ExynosDeviceModule.h @@ -17,13 +17,32 @@ #ifndef EXYNOS_DEVICE_MODULE_H #define EXYNOS_DEVICE_MODULE_H +#include <gs101/displaycolor/displaycolor_gs101.h> + +#include "DisplayColorLoader.h" #include "ExynosDevice.h" +using namespace displaycolor; + +namespace gs101 { + class ExynosDeviceModule : public ExynosDevice { public: ExynosDeviceModule(); virtual ~ExynosDeviceModule(); + IDisplayColorGS101* getDisplayColorInterface() { return mDisplayColorInterface; } + void setActiveDisplay(uint32_t index) { mActiveDisplay = index; } + uint32_t getActiveDisplay() const { return mActiveDisplay; } + + private: + int initDisplayColor(const std::vector<displaycolor::DisplayInfo>& display_info); + + IDisplayColorGS101* mDisplayColorInterface; + DisplayColorLoader mDisplayColorLoader; + uint32_t mActiveDisplay; }; +} // namespace gs101 + #endif diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp index b68f448..dcf7cc3 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp @@ -41,6 +41,8 @@ int32_t convertDqeMatrixDataToMatrix(T &colorMatrix, M &mat, return NO_ERROR; } +using namespace gs101; + /////////////////////////////////////////////////// ExynosDisplayDrmInterfaceModule ////////////////////////////////////////////////////////////////// ExynosDisplayDrmInterfaceModule::ExynosDisplayDrmInterfaceModule(ExynosDisplay *exynosDisplay) : ExynosDisplayDrmInterface(exynosDisplay) @@ -77,15 +79,6 @@ int32_t ExynosDisplayDrmInterfaceModule::initDrmDevice(DrmDevice *drmDevice) mOldDqeBlobs.init(drmDevice); - ExynosPrimaryDisplayModule* display = - (ExynosPrimaryDisplayModule*)mExynosDisplay; - - ret = display->initDisplayColor(); - if (ret != NO_ERROR) { - HWC_LOGE(mExynosDisplay, "Failed to load displaycolor %d", ret); - return ret; - } - initOldDppBlobs(drmDevice); if (mDrmCrtc->force_bpc_property().id()) parseBpcEnums(mDrmCrtc->force_bpc_property()); @@ -491,7 +484,8 @@ int32_t ExynosDisplayDrmInterfaceModule::setDisplayColorSetting( int ret = NO_ERROR; const IDisplayColorGS101::IDqe &dqe = display->getDqe(); - if ((ret = setDisplayColorBlob(mDrmCrtc->cgc_lut_property(), + if ((mDrmCrtc->cgc_lut_property().id() != 0) && + (ret = setDisplayColorBlob(mDrmCrtc->cgc_lut_property(), static_cast<uint32_t>(DqeBlobs::CGC), dqe.Cgc(), dqe, drmReq) != NO_ERROR)) { HWC_LOGE(mExynosDisplay, "%s: set Cgc blob fail", __func__); @@ -749,6 +743,24 @@ uint32_t ExynosDisplayDrmInterfaceModule::SaveBlob::getBlob(uint32_t type) return blobs[type]; } +void ExynosDisplayDrmInterfaceModule::getDisplayInfo( + std::vector<displaycolor::DisplayInfo> &display_info) { + displaycolor::DisplayInfo primary_display; + auto &tb = primary_display.brightness_table; + + tb.nbm_nits_min = mBrightnessTable[BrightnessRange::NORMAL].mNitsStart; + tb.nbm_nits_max = mBrightnessTable[BrightnessRange::NORMAL].mNitsEnd; + tb.nbm_dbv_min = mBrightnessTable[BrightnessRange::NORMAL].mBklStart; + tb.nbm_dbv_max = mBrightnessTable[BrightnessRange::NORMAL].mBklEnd; + + tb.hbm_nits_min = mBrightnessTable[BrightnessRange::HBM].mNitsStart; + tb.hbm_nits_max = mBrightnessTable[BrightnessRange::HBM].mNitsEnd; + tb.hbm_dbv_min = mBrightnessTable[BrightnessRange::HBM].mBklStart; + tb.hbm_dbv_max = mBrightnessTable[BrightnessRange::HBM].mBklEnd; + + display_info.push_back(primary_display); +} + //////////////////////////////////////////////////// ExynosPrimaryDisplayDrmInterfaceModule ////////////////////////////////////////////////////////////////// ExynosPrimaryDisplayDrmInterfaceModule::ExynosPrimaryDisplayDrmInterfaceModule(ExynosDisplay *exynosDisplay) : ExynosDisplayDrmInterfaceModule(exynosDisplay) diff --git a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h index 36efc8c..0ba995a 100644 --- a/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h +++ b/libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h @@ -21,6 +21,8 @@ #include "ExynosDisplayDrmInterface.h" +namespace gs101 { + using namespace displaycolor; class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface { @@ -64,7 +66,10 @@ class ExynosDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface { uint32_t &blobId); int32_t createOetfBlobFromIDpp(const IDisplayColorGS101::IDpp &dpp, uint32_t &blobId); - private: + + void getDisplayInfo(std::vector<displaycolor::DisplayInfo> &display_info); + + protected: class SaveBlob { public: ~SaveBlob(); @@ -154,4 +159,7 @@ class ExynosExternalDisplayDrmInterfaceModule : public ExynosDisplayDrmInterface ExynosExternalDisplayDrmInterfaceModule(ExynosDisplay *exynosDisplay); virtual ~ExynosExternalDisplayDrmInterfaceModule(); }; + +} // namespace gs101 + #endif diff --git a/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.cpp b/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.cpp index 6c103a3..7b3be9f 100644 --- a/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.cpp +++ b/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.cpp @@ -26,6 +26,8 @@ #define SKIP_FRAME_COUNT 3 +using namespace gs101; + ExynosExternalDisplayModule::ExynosExternalDisplayModule(uint32_t index, ExynosDevice *device) : ExynosExternalDisplay(index, device) { diff --git a/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.h b/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.h index ff36c28..d2db8e6 100644 --- a/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.h +++ b/libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.h @@ -19,6 +19,8 @@ #include "ExynosDisplay.h" #include "ExynosExternalDisplay.h" +namespace gs101 { + class ExynosExternalDisplayModule : public ExynosExternalDisplay { public: ExynosExternalDisplayModule(uint32_t index, ExynosDevice *device); @@ -26,4 +28,6 @@ class ExynosExternalDisplayModule : public ExynosExternalDisplay { virtual int32_t validateWinConfigData(); }; +} // namespace gs101 + #endif diff --git a/libhwc2.1/libmaindisplay/DisplayColorLoader.h b/libhwc2.1/libmaindisplay/DisplayColorLoader.h index 95eaffe..e5a241d 100644 --- a/libhwc2.1/libmaindisplay/DisplayColorLoader.h +++ b/libhwc2.1/libmaindisplay/DisplayColorLoader.h @@ -21,6 +21,9 @@ #include <gs101/displaycolor/displaycolor_gs101.h> #include <log/log.h> #include <string> +#include <vector> + +namespace gs101 { class DisplayColorLoader { public: @@ -28,11 +31,44 @@ class DisplayColorLoader { lib_handle = dlopen(lib_name, RTLD_LAZY); if (lib_handle != nullptr) { - get_display_color_gs101 = (decltype(get_display_color_gs101)) - dlsym(lib_handle, "GetDisplayColorGS101"); + const displaycolor::DisplayColorIntfVer *(*get_version)(); + get_version = (decltype(get_version)) + dlsym(lib_handle, "GetInterfaceVersion"); + if (get_version == nullptr) { + ALOGE("%s: prebuilt lib is not versioned", __func__); + } else { + auto intf_ver = get_version(); + + if (intf_ver != nullptr && + displaycolor::kInterfaceVersion.Compatible(*intf_ver)) { + get_display_color_gs101 = + (decltype(get_display_color_gs101))dlsym(lib_handle, + "GetDisplayColorGS101"); - if (get_display_color_gs101 == nullptr) { - ALOGE("%s: failed to get GetDisplayColorGS101\n", __func__); + if (get_display_color_gs101 == nullptr) { + ALOGE("%s: failed to get GetDisplayColorGS101\n", __func__); + } else if (!(displaycolor::kInterfaceVersion == *intf_ver)) { + ALOGW("%s: different hwc/displaycolor patch level %u.%u.%u/%u", + __func__, + intf_ver->major, + intf_ver->minor, + displaycolor::kInterfaceVersion.patch, + intf_ver->patch); + } + } else { + if (intf_ver != nullptr) { + ALOGE("%s: prebuilt lib version %u.%u.%u expected %u.%u.%u", + __func__, + intf_ver->major, + intf_ver->minor, + intf_ver->patch, + displaycolor::kInterfaceVersion.major, + displaycolor::kInterfaceVersion.minor, + displaycolor::kInterfaceVersion.patch); + } else { + ALOGE("%s: prebult lib get_version returns null", __func__); + } + } } } else { ALOGE("%s: failed to load library %s\n", __func__, lib_name); @@ -40,9 +76,10 @@ class DisplayColorLoader { } } - displaycolor::IDisplayColorGS101* GetDisplayColorGS101(size_t display_num) { + displaycolor::IDisplayColorGS101 *GetDisplayColorGS101( + const std::vector<displaycolor::DisplayInfo> &display_info) { if (get_display_color_gs101 != nullptr) { - return get_display_color_gs101(display_num); + return get_display_color_gs101(display_info); } return nullptr; @@ -56,7 +93,10 @@ class DisplayColorLoader { private: void *lib_handle; - displaycolor::IDisplayColorGS101* (*get_display_color_gs101)(size_t); + displaycolor::IDisplayColorGS101 *(*get_display_color_gs101)( + const std::vector<displaycolor::DisplayInfo> &); }; +} // namespace gs101 + #endif //DISPLAY_COLOR_LOADER_H diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp index a05ac07..117dd25 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp @@ -39,25 +39,19 @@ mpp_phycal_type_t getMPPTypeFromDPPChannel(uint32_t channel) { return MPP_P_TYPE_MAX; } +using namespace gs101; + // enable map layerDataMappingInfo comparison in needDisplayColorSetting() inline bool operator==(const ExynosPrimaryDisplayModule::DisplaySceneInfo::LayerMappingInfo &lm1, const ExynosPrimaryDisplayModule::DisplaySceneInfo::LayerMappingInfo &lm2) { return lm1.dppIdx == lm2.dppIdx && lm1.planeId == lm2.planeId; } -ExynosPrimaryDisplayModule::ExynosPrimaryDisplayModule(uint32_t index, ExynosDevice *device) - : ExynosPrimaryDisplay(index, device), mDisplayColorLoader(DISPLAY_COLOR_LIB) -{ +ExynosPrimaryDisplayModule::ExynosPrimaryDisplayModule(uint32_t index, ExynosDevice* device) + : ExynosPrimaryDisplay(index, device) { #ifdef FORCE_GPU_COMPOSITION exynosHWCControl.forceGpu = true; #endif - - mDisplaySceneInfo.displayScene.dpu_bit_depth = BitDepth::kTen; -} - -int ExynosPrimaryDisplayModule::initDisplayColor() { - mDisplayColorInterface = mDisplayColorLoader.GetDisplayColorGS101(1); - return mDisplayColorInterface == nullptr ? -EINVAL : NO_ERROR; } ExynosPrimaryDisplayModule::~ExynosPrimaryDisplayModule () { @@ -128,8 +122,11 @@ void ExynosPrimaryDisplayModule::doPreProcessing() { int32_t ExynosPrimaryDisplayModule::getColorModes( uint32_t* outNumModes, int32_t* outModes) { - const ColorModesMap colorModeMap = - mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + const ColorModesMap colorModeMap = displayColorInterface == nullptr + ? ColorModesMap() + : displayColorInterface->ColorModesAndRenderIntents(display); ALOGD("%s: size(%zu)", __func__, colorModeMap.size()); if (outModes == nullptr) { *outNumModes = colorModeMap.size(); @@ -155,8 +152,11 @@ int32_t ExynosPrimaryDisplayModule::getColorModes( int32_t ExynosPrimaryDisplayModule::setColorMode(int32_t mode) { ALOGD("%s: mode(%d)", __func__, mode); - const ColorModesMap colorModeMap = - mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + const ColorModesMap colorModeMap = displayColorInterface == nullptr + ? ColorModesMap() + : displayColorInterface->ColorModesAndRenderIntents(display); hwc::ColorMode colorMode = static_cast<hwc::ColorMode>(mode); const auto it = colorModeMap.find(colorMode); @@ -176,8 +176,11 @@ int32_t ExynosPrimaryDisplayModule::setColorMode(int32_t mode) int32_t ExynosPrimaryDisplayModule::getRenderIntents(int32_t mode, uint32_t* outNumIntents, int32_t* outIntents) { - const ColorModesMap colorModeMap = - mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + const ColorModesMap colorModeMap = displayColorInterface == nullptr + ? ColorModesMap() + : displayColorInterface->ColorModesAndRenderIntents(display); ALOGD("%s, size(%zu)", __func__, colorModeMap.size()); hwc::ColorMode colorMode = static_cast<hwc::ColorMode>(mode); @@ -211,8 +214,11 @@ int32_t ExynosPrimaryDisplayModule::setColorModeWithRenderIntent(int32_t mode, int32_t intent) { ALOGD("%s: mode(%d), intent(%d)", __func__, mode, intent); - const ColorModesMap colorModeMap = - mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + const ColorModesMap colorModeMap = displayColorInterface == nullptr + ? ColorModesMap() + : displayColorInterface->ColorModesAndRenderIntents(display); hwc::ColorMode colorMode = static_cast<hwc::ColorMode>(mode); hwc::RenderIntent renderIntent = @@ -323,11 +329,17 @@ int32_t ExynosPrimaryDisplayModule::setLayersColorData() bool ExynosPrimaryDisplayModule::hasDppForLayer(ExynosMPPSource* layer) { + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + if (displayColorInterface == nullptr) { + return false; + } + if (mDisplaySceneInfo.layerDataMappingInfo.count(layer) == 0) return false; uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer].dppIdx; - auto size = mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dpp().size(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + auto size = displayColorInterface->GetPipelineData(display)->Dpp().size(); if (index >= size) { DISPLAY_LOGE("%s: invalid dpp index(%d) dpp size(%zu)", __func__, index, size); return false; @@ -339,7 +351,9 @@ bool ExynosPrimaryDisplayModule::hasDppForLayer(ExynosMPPSource* layer) const IDisplayColorGS101::IDpp& ExynosPrimaryDisplayModule::getDppForLayer(ExynosMPPSource* layer) { uint32_t index = mDisplaySceneInfo.layerDataMappingInfo[layer].dppIdx; - return mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dpp()[index].get(); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + return displayColorInterface->GetPipelineData(display)->Dpp()[index].get(); } int32_t ExynosPrimaryDisplayModule::getDppIndexForLayer(ExynosMPPSource* layer) @@ -356,14 +370,19 @@ int ExynosPrimaryDisplayModule::deliverWinConfigData() int ret = 0; ExynosDisplayDrmInterfaceModule *moduleDisplayInterface = (ExynosDisplayDrmInterfaceModule*)(mDisplayInterface.get()); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); bool forceDisplayColorSetting = false; - if (!mDisplaySceneInfo.displaySettingDelivered) + if (!mDisplaySceneInfo.displaySettingDelivered || isForceColorUpdate()) forceDisplayColorSetting = true; - moduleDisplayInterface->setColorSettingChanged( + setForceColorUpdate(false); + + if (displayColorInterface != nullptr) { + moduleDisplayInterface->setColorSettingChanged( mDisplaySceneInfo.needDisplayColorSetting(), forceDisplayColorSetting); + } ret = ExynosDisplay::deliverWinConfigData(); @@ -617,6 +636,11 @@ int32_t ExynosPrimaryDisplayModule::DisplaySceneInfo::setLayerColorData( int32_t ExynosPrimaryDisplayModule::updateColorConversionInfo() { int ret = 0; + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + if (displayColorInterface == nullptr) { + return ret; + } + /* clear flag and layer mapping info before setting */ mDisplaySceneInfo.reset(); @@ -637,8 +661,8 @@ int32_t ExynosPrimaryDisplayModule::updateColorConversionInfo() if (hwcCheckDebugMessages(eDebugColorManagement)) mDisplaySceneInfo.printDisplayScene(); - if ((ret = mDisplayColorInterface->Update(DisplayType::DISPLAY_PRIMARY, - mDisplaySceneInfo.displayScene)) != 0) { + const DisplayType display = getDisplayTypeFromIndex(mIndex); + if ((ret = displayColorInterface->Update(display, mDisplaySceneInfo.displayScene)) != 0) { DISPLAY_LOGE("Display Scene update error (%d)", ret); return ret; } @@ -648,6 +672,12 @@ int32_t ExynosPrimaryDisplayModule::updateColorConversionInfo() int32_t ExynosPrimaryDisplayModule::updatePresentColorConversionInfo() { + int ret = NO_ERROR; + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + if (displayColorInterface == nullptr) { + return ret; + } + ExynosDisplayDrmInterfaceModule *moduleDisplayInterface = (ExynosDisplayDrmInterfaceModule*)(mDisplayInterface.get()); auto refresh_rate = moduleDisplayInterface->getDesiredRefreshRate(); @@ -655,9 +685,9 @@ int32_t ExynosPrimaryDisplayModule::updatePresentColorConversionInfo() mDisplaySceneInfo.displayScene.refresh_rate = refresh_rate; } - int ret = OK; - if ((ret = mDisplayColorInterface->UpdatePresent(DisplayType::DISPLAY_PRIMARY, - mDisplaySceneInfo.displayScene)) != 0) { + const DisplayType display = getDisplayTypeFromIndex(mIndex); + if ((ret = displayColorInterface->UpdatePresent(display, mDisplaySceneInfo.displayScene)) != + 0) { DISPLAY_LOGE("Display Scene update error (%d)", ret); return ret; } @@ -666,9 +696,13 @@ int32_t ExynosPrimaryDisplayModule::updatePresentColorConversionInfo() } int32_t ExynosPrimaryDisplayModule::getColorAdjustedDbv(uint32_t &dbv_adj) { - dbv_adj = mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY) - ->Panel() - .GetAdjustedBrightnessLevel(); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + if (displayColorInterface == nullptr) { + return NO_ERROR; + } + + const DisplayType display = getDisplayTypeFromIndex(mIndex); + dbv_adj = displayColorInterface->GetPipelineData(display)->Panel().GetAdjustedBrightnessLevel(); return NO_ERROR; } @@ -1041,3 +1075,31 @@ void ExynosPrimaryDisplayModule::checkAtcAnimation() { mDevice->invalidate(); } + +int32_t ExynosPrimaryDisplayModule::setPowerMode(int32_t mode) { + hwc2_power_mode_t prevPowerModeState = mPowerModeState; + int32_t ret; + + ret = ExynosPrimaryDisplay::setPowerMode(mode); + + if ((ret == HWC2_ERROR_NONE) && isDisplaySwitched(mode, prevPowerModeState)) { + ExynosDeviceModule* device = static_cast<ExynosDeviceModule*>(mDevice); + + device->setActiveDisplay(mIndex); + setForceColorUpdate(true); + } + return ret; +} + +bool ExynosPrimaryDisplayModule::isDisplaySwitched(int32_t mode, int32_t prevMode) { + ExynosDeviceModule* device = static_cast<ExynosDeviceModule*>(mDevice); + + return (device->getActiveDisplay() != mIndex) && (prevMode == HWC_POWER_MODE_OFF) && + (mode != HWC_POWER_MODE_OFF); +} + +bool ExynosPrimaryDisplayModule::isColorCalibratedByDevice() { + const DisplayType display = getDisplayTypeFromIndex(mIndex); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + return displayColorInterface->GetCalibrationInfo(display).factory_cal_loaded; +}; diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h index 1b80d2c..0339526 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h @@ -18,10 +18,10 @@ #include <gs101/displaycolor/displaycolor_gs101.h> -#include "DisplayColorLoader.h" +#include "ExynosDeviceModule.h" #include "ExynosDisplay.h" -#include "ExynosPrimaryDisplay.h" #include "ExynosLayer.h" +#include "ExynosPrimaryDisplay.h" constexpr char kAtcJsonRaw[] = "{\"version\":\"0.0\",\"modes\":[{\"name\":\"normal\",\"lux_map\":[0,5000,10000," @@ -91,6 +91,8 @@ const std::unordered_map<std::string, std::string> kAtcSubSetting = {"gain_limit", ATC_GAIN_LIMIT_FILE_NAME}, {"lt_calc_ab_shift", ATC_LT_CALC_AB_SHIFT_FILE_NAME}}; +namespace gs101 { + using namespace displaycolor; class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { @@ -113,8 +115,13 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { virtual int32_t updateColorConversionInfo(); virtual int32_t updatePresentColorConversionInfo(); virtual bool checkRrCompensationEnabled() { - return mDisplayColorInterface->IsRrCompensationEnabled(DisplayType::DISPLAY_PRIMARY); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + return displayColorInterface->IsRrCompensationEnabled(display); } + + virtual bool isColorCalibratedByDevice(); + virtual int32_t getColorAdjustedDbv(uint32_t &dbv_adj); virtual void initLbe(); @@ -125,6 +132,10 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { class DisplaySceneInfo { public: struct LayerMappingInfo { + bool operator==(const LayerMappingInfo &rhs) const { + return ((dppIdx == rhs.dppIdx) && (planeId == rhs.planeId)); + } + // index in DisplayScene::layer_data uint32_t dppIdx; // assigned drm plane id in last color setting update @@ -209,7 +220,11 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { void printLayerColorData(const LayerColorData& layerData); }; - int initDisplayColor(); + bool hasDisplayColor() { + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + return displayColorInterface != nullptr; + } + /* Call getDppForLayer() only if hasDppForLayer() is true */ bool hasDppForLayer(ExynosMPPSource* layer); const IDisplayColorGS101::IDpp& getDppForLayer(ExynosMPPSource* layer); @@ -224,19 +239,21 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { } size_t getNumOfDpp() { - return mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dpp().size(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + return displayColorInterface->GetPipelineData(display)->Dpp().size(); }; const IDisplayColorGS101::IDqe& getDqe() { - return mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY)->Dqe(); + const DisplayType display = getDisplayTypeFromIndex(mIndex); + IDisplayColorGS101* displayColorInterface = getDisplayColorInterface(); + return displayColorInterface->GetPipelineData(display)->Dqe(); }; private: int32_t setLayersColorData(); - IDisplayColorGS101 *mDisplayColorInterface; DisplaySceneInfo mDisplaySceneInfo; - DisplayColorLoader mDisplayColorLoader; struct atc_lux_map { uint32_t lux; @@ -266,6 +283,20 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { return false; }; + DisplayType getDisplayTypeFromIndex(uint32_t index) { + return (index >= DisplayType::DISPLAY_MAX) ? DisplayType::DISPLAY_PRIMARY + : DisplayType(mIndex); + }; + + IDisplayColorGS101* getDisplayColorInterface() { + ExynosDeviceModule* device = (ExynosDeviceModule*)mDevice; + return device->getDisplayColorInterface(); + } + + bool isForceColorUpdate() const { return mForceColorUpdate; } + void setForceColorUpdate(bool force) { mForceColorUpdate = force; } + bool isDisplaySwitched(int32_t mode, int32_t prevMode); + std::map<std::string, atc_mode> mAtcModeSetting; bool mAtcInit; LbeState mCurrentLbeState = LbeState::OFF; @@ -282,6 +313,12 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { uint32_t mAtcStDownStep; Mutex mAtcStMutex; bool mPendingAtcOff; + bool mForceColorUpdate = false; + + protected: + virtual int32_t setPowerMode(int32_t mode) override; }; +} // namespace gs101 + #endif diff --git a/libhwc2.1/libresource/ExynosMPPModule.cpp b/libhwc2.1/libresource/ExynosMPPModule.cpp index 504c02d..bc435ad 100644 --- a/libhwc2.1/libresource/ExynosMPPModule.cpp +++ b/libhwc2.1/libresource/ExynosMPPModule.cpp @@ -19,6 +19,8 @@ #include "ExynosResourceManager.h" #include "ExynosPrimaryDisplayModule.h" +using namespace gs101; + ExynosMPPModule::ExynosMPPModule(ExynosResourceManager* resourceManager, uint32_t physicalType, uint32_t logicalType, const char *name, uint32_t physicalIndex, uint32_t logicalIndex, uint32_t preAssignInfo) @@ -51,6 +53,10 @@ int32_t ExynosMPPModule::setColorConversionInfo() ExynosPrimaryDisplayModule* primaryDisplay = (ExynosPrimaryDisplayModule*)mAssignedDisplay; + if (!primaryDisplay->hasDisplayColor()) { + return NO_ERROR; + } + for (size_t i = 0; i < mAssignedSources.size(); i++) { auto mppSource = mAssignedSources[i]; ExynosLayer* layer = (ExynosLayer*)mppSource; diff --git a/libhwc2.1/libresource/ExynosMPPModule.h b/libhwc2.1/libresource/ExynosMPPModule.h index e78d961..4bcfa4b 100644 --- a/libhwc2.1/libresource/ExynosMPPModule.h +++ b/libhwc2.1/libresource/ExynosMPPModule.h @@ -20,6 +20,8 @@ #define MAX_DPP_ROT_SRC_SIZE (3040*1440) +namespace gs101 { + class ExynosMPPModule : public ExynosMPP { public: ExynosMPPModule(ExynosResourceManager* resourceManager, uint32_t physicalType, uint32_t logicalType, const char *name, @@ -31,4 +33,6 @@ class ExynosMPPModule : public ExynosMPP { uint32_t mChipId; }; +} // namespace gs101 + #endif diff --git a/libhwc2.1/libresource/ExynosResourceManagerModule.cpp b/libhwc2.1/libresource/ExynosResourceManagerModule.cpp index 365ad48..6c6cc83 100644 --- a/libhwc2.1/libresource/ExynosResourceManagerModule.cpp +++ b/libhwc2.1/libresource/ExynosResourceManagerModule.cpp @@ -17,6 +17,8 @@ #include "ExynosMPPModule.h" #define CHIP_ID_PATH "/sys/devices/system/chip-id/revision" +using namespace gs101; + ExynosResourceManagerModule::ExynosResourceManagerModule(ExynosDevice* device) : ExynosResourceManager(device) { diff --git a/libhwc2.1/libresource/ExynosResourceManagerModule.h b/libhwc2.1/libresource/ExynosResourceManagerModule.h index 19da403..addbd7b 100644 --- a/libhwc2.1/libresource/ExynosResourceManagerModule.h +++ b/libhwc2.1/libresource/ExynosResourceManagerModule.h @@ -18,10 +18,14 @@ #include "ExynosResourceManager.h" +namespace gs101 { + class ExynosResourceManagerModule : public ExynosResourceManager { public: ExynosResourceManagerModule(ExynosDevice* device); ~ExynosResourceManagerModule(); }; +} // namespace gs101 + #endif // _EXYNOS_RESOURCE_MANAGER_MODULE_H diff --git a/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.cpp b/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.cpp index a8d209d..a74312b 100644 --- a/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.cpp +++ b/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.cpp @@ -18,6 +18,8 @@ #include "ExynosVirtualDisplayModule.h" +using namespace gs101; + ExynosVirtualDisplayModule::ExynosVirtualDisplayModule(uint32_t index, ExynosDevice *device) : ExynosVirtualDisplay(index, device) { diff --git a/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.h b/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.h index 398441b..9d68c2d 100644 --- a/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.h +++ b/libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.h @@ -19,6 +19,8 @@ #include "ExynosDisplay.h" #include "ExynosVirtualDisplay.h" +namespace gs101 { + class ExynosVirtualDisplayModule : public ExynosVirtualDisplay { public: ExynosVirtualDisplayModule(uint32_t displayId, ExynosDevice *device); @@ -33,4 +35,6 @@ public: int32_t /*hwc2_attribute_t*/ attribute, int32_t* outValue); }; +} + #endif |