summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXin Li <delphij@google.com>2022-02-11 06:57:38 +0000
committerXin Li <delphij@google.com>2022-02-11 06:57:38 +0000
commit11624674dd9bfb5922cb3843eca66ee1230c1013 (patch)
tree6e1ea25f335cce476b5bf7b23c6d9ee1283281a9
parent64f6d7cf1bba2443fb2a8d240ea7a3cbe94dd4f7 (diff)
parentee64a0a29da2b38e98fcfb57bf04ecff98e3dabf (diff)
downloadgs101-11624674dd9bfb5922cb3843eca66ee1230c1013.tar.gz
Merge sc-v2-dev-plus-aosp-without-vendor@8084891
Bug: 214455710 Merged-In: Id89a0a3a2f9c6a8c8a6d7b1be0401a84185f7073 Change-Id: I497d6de61bbe268d1162c132c662efc5145236b7
-rw-r--r--include/gs101/displaycolor/displaycolor_gs101.h3
-rw-r--r--libhwc2.1/DeconHeader.h1
-rw-r--r--libhwc2.1/ExynosHWCModule.h6
-rw-r--r--libhwc2.1/ExynosResourceRestriction.h1
-rw-r--r--libhwc2.1/libdevice/ExynosDeviceModule.cpp29
-rw-r--r--libhwc2.1/libdevice/ExynosDeviceModule.h19
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.cpp32
-rw-r--r--libhwc2.1/libdisplayinterface/ExynosDisplayDrmInterfaceModule.h10
-rw-r--r--libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.cpp2
-rw-r--r--libhwc2.1/libexternaldisplay/ExynosExternalDisplayModule.h4
-rw-r--r--libhwc2.1/libmaindisplay/DisplayColorLoader.h54
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.cpp122
-rw-r--r--libhwc2.1/libmaindisplay/ExynosPrimaryDisplayModule.h53
-rw-r--r--libhwc2.1/libresource/ExynosMPPModule.cpp6
-rw-r--r--libhwc2.1/libresource/ExynosMPPModule.h4
-rw-r--r--libhwc2.1/libresource/ExynosResourceManagerModule.cpp2
-rw-r--r--libhwc2.1/libresource/ExynosResourceManagerModule.h4
-rw-r--r--libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.cpp2
-rw-r--r--libhwc2.1/libvirtualdisplay/ExynosVirtualDisplayModule.h4
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