From ec7abf09b08f2623db043e957177adbbb32700df Mon Sep 17 00:00:00 2001 From: Long Ling Date: Wed, 25 Aug 2021 15:47:40 -0700 Subject: libhwc2.1: check libdisplaycolor version Load displaycolor when version string matches expectation. Otherwise disable displaycolor. Bug: 197758661 Bug: 193068217 Test: boot to home w/o or mismatched libdisplaycolor Change-Id: Ibc23b80f5574d725ff089deeacc2fc9de0f3910f --- libhwc2.1/libmaindisplay/DisplayColorLoader.h | 41 +++++++++++++++++++--- .../libmaindisplay/ExynosPrimaryDisplayModule.cpp | 32 +++++++++++++++-- .../libmaindisplay/ExynosPrimaryDisplayModule.h | 2 ++ 3 files changed, 68 insertions(+), 7 deletions(-) (limited to 'libhwc2.1/libmaindisplay') diff --git a/libhwc2.1/libmaindisplay/DisplayColorLoader.h b/libhwc2.1/libmaindisplay/DisplayColorLoader.h index 95eaffe..9b50a00 100644 --- a/libhwc2.1/libmaindisplay/DisplayColorLoader.h +++ b/libhwc2.1/libmaindisplay/DisplayColorLoader.h @@ -28,11 +28,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 (get_display_color_gs101 == nullptr) { - ALOGE("%s: failed to get GetDisplayColorGS101\n", __func__); + 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__); + } 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); diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp index a05ac07..2467818 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp @@ -57,7 +57,11 @@ ExynosPrimaryDisplayModule::ExynosPrimaryDisplayModule(uint32_t index, ExynosDev int ExynosPrimaryDisplayModule::initDisplayColor() { mDisplayColorInterface = mDisplayColorLoader.GetDisplayColorGS101(1); - return mDisplayColorInterface == nullptr ? -EINVAL : NO_ERROR; + if (mDisplayColorInterface == nullptr) { + ALOGW("%s failed to load displaycolor", __func__); + } + + return NO_ERROR; } ExynosPrimaryDisplayModule::~ExynosPrimaryDisplayModule () { @@ -129,6 +133,7 @@ int32_t ExynosPrimaryDisplayModule::getColorModes( uint32_t* outNumModes, int32_t* outModes) { const ColorModesMap colorModeMap = + mDisplayColorInterface == nullptr ? ColorModesMap() : mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); ALOGD("%s: size(%zu)", __func__, colorModeMap.size()); if (outModes == nullptr) { @@ -156,6 +161,7 @@ int32_t ExynosPrimaryDisplayModule::setColorMode(int32_t mode) { ALOGD("%s: mode(%d)", __func__, mode); const ColorModesMap colorModeMap = + mDisplayColorInterface == nullptr ? ColorModesMap() : mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); hwc::ColorMode colorMode = static_cast(mode); @@ -177,6 +183,7 @@ int32_t ExynosPrimaryDisplayModule::getRenderIntents(int32_t mode, uint32_t* outNumIntents, int32_t* outIntents) { const ColorModesMap colorModeMap = + mDisplayColorInterface == nullptr ? ColorModesMap() : mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); ALOGD("%s, size(%zu)", __func__, colorModeMap.size()); hwc::ColorMode colorMode = @@ -212,6 +219,7 @@ int32_t ExynosPrimaryDisplayModule::setColorModeWithRenderIntent(int32_t mode, { ALOGD("%s: mode(%d), intent(%d)", __func__, mode, intent); const ColorModesMap colorModeMap = + mDisplayColorInterface == nullptr ? ColorModesMap() : mDisplayColorInterface->ColorModesAndRenderIntents(DisplayType::DISPLAY_PRIMARY); hwc::ColorMode colorMode = static_cast(mode); @@ -323,6 +331,10 @@ int32_t ExynosPrimaryDisplayModule::setLayersColorData() bool ExynosPrimaryDisplayModule::hasDppForLayer(ExynosMPPSource* layer) { + if (mDisplayColorInterface == nullptr) { + return false; + } + if (mDisplaySceneInfo.layerDataMappingInfo.count(layer) == 0) return false; @@ -361,9 +373,11 @@ int ExynosPrimaryDisplayModule::deliverWinConfigData() if (!mDisplaySceneInfo.displaySettingDelivered) forceDisplayColorSetting = true; - moduleDisplayInterface->setColorSettingChanged( + if (mDisplayColorInterface != nullptr) { + moduleDisplayInterface->setColorSettingChanged( mDisplaySceneInfo.needDisplayColorSetting(), forceDisplayColorSetting); + } ret = ExynosDisplay::deliverWinConfigData(); @@ -617,6 +631,10 @@ int32_t ExynosPrimaryDisplayModule::DisplaySceneInfo::setLayerColorData( int32_t ExynosPrimaryDisplayModule::updateColorConversionInfo() { int ret = 0; + if (mDisplayColorInterface == nullptr) { + return ret; + } + /* clear flag and layer mapping info before setting */ mDisplaySceneInfo.reset(); @@ -648,6 +666,11 @@ int32_t ExynosPrimaryDisplayModule::updateColorConversionInfo() int32_t ExynosPrimaryDisplayModule::updatePresentColorConversionInfo() { + int ret = NO_ERROR; + if (mDisplayColorInterface == nullptr) { + return ret; + } + ExynosDisplayDrmInterfaceModule *moduleDisplayInterface = (ExynosDisplayDrmInterfaceModule*)(mDisplayInterface.get()); auto refresh_rate = moduleDisplayInterface->getDesiredRefreshRate(); @@ -655,7 +678,6 @@ int32_t ExynosPrimaryDisplayModule::updatePresentColorConversionInfo() mDisplaySceneInfo.displayScene.refresh_rate = refresh_rate; } - int ret = OK; if ((ret = mDisplayColorInterface->UpdatePresent(DisplayType::DISPLAY_PRIMARY, mDisplaySceneInfo.displayScene)) != 0) { DISPLAY_LOGE("Display Scene update error (%d)", ret); @@ -666,6 +688,10 @@ int32_t ExynosPrimaryDisplayModule::updatePresentColorConversionInfo() } int32_t ExynosPrimaryDisplayModule::getColorAdjustedDbv(uint32_t &dbv_adj) { + if (mDisplayColorInterface == nullptr) { + return NO_ERROR; + } + dbv_adj = mDisplayColorInterface->GetPipelineData(DisplayType::DISPLAY_PRIMARY) ->Panel() .GetAdjustedBrightnessLevel(); diff --git a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h index 1b80d2c..d948ca1 100644 --- a/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h +++ b/libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h @@ -210,6 +210,8 @@ class ExynosPrimaryDisplayModule : public ExynosPrimaryDisplay { }; int initDisplayColor(); + bool hasDisplayColor() { return mDisplayColorInterface != nullptr; } + /* Call getDppForLayer() only if hasDppForLayer() is true */ bool hasDppForLayer(ExynosMPPSource* layer); const IDisplayColorGS101::IDpp& getDppForLayer(ExynosMPPSource* layer); -- cgit v1.2.3