summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLong Ling <longling@google.com>2021-08-25 15:47:40 -0700
committerLong Ling <longling@google.com>2021-08-26 16:12:42 -0700
commitec7abf09b08f2623db043e957177adbbb32700df (patch)
treee6ac5389cbe4fe8125ff4a175f497884c61e3f83
parentd91c22c73f5d5788eaf447cbffb4260d6ca8b01e (diff)
downloadgs101-ec7abf09b08f2623db043e957177adbbb32700df.tar.gz
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
-rw-r--r--libhwc2.1/libmaindisplay/DisplayColorLoader.h41
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp32
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h2
-rw-r--r--libhwc2.1/libresource/ExynosMPPModule.cpp4
4 files changed, 72 insertions, 7 deletions
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<hwc::ColorMode>(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<hwc::ColorMode>(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);
diff --git a/libhwc2.1/libresource/ExynosMPPModule.cpp b/libhwc2.1/libresource/ExynosMPPModule.cpp
index 504c02d..a15cf31 100644
--- a/libhwc2.1/libresource/ExynosMPPModule.cpp
+++ b/libhwc2.1/libresource/ExynosMPPModule.cpp
@@ -51,6 +51,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;