summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hwc3/Android.mk1
-rw-r--r--libhwc2.1/Android.mk3
-rw-r--r--libhwc2.1/libdevice/DisplayColorLoader.h100
3 files changed, 104 insertions, 0 deletions
diff --git a/hwc3/Android.mk b/hwc3/Android.mk
index f233aab..dff9b73 100644
--- a/hwc3/Android.mk
+++ b/hwc3/Android.mk
@@ -66,6 +66,7 @@ LOCAL_C_INCLUDES := \
$(TOP)/hardware/google/graphics/common/libhwc2.1/libresource \
$(TOP)/hardware/google/graphics/$(soc_ver)/include \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1 \
+ $(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libcolormanager \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libdevice \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libmaindisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource
diff --git a/libhwc2.1/Android.mk b/libhwc2.1/Android.mk
index 1f9e4cf..e8dd290 100644
--- a/libhwc2.1/Android.mk
+++ b/libhwc2.1/Android.mk
@@ -97,6 +97,7 @@ LOCAL_C_INCLUDES += \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libexternaldisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libvirtualdisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource \
+ $(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libcolormanager \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libdevice \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libdisplayinterface \
@@ -176,6 +177,7 @@ LOCAL_C_INCLUDES += \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libexternaldisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libvirtualdisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource \
+ $(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libcolormanager \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libdevice \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource \
$(TOP)/hardware/google/graphics/common/libhwc2.1/libhwcService \
@@ -247,6 +249,7 @@ LOCAL_C_INCLUDES += \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libmaindisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libexternaldisplay \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libvirtualdisplay \
+ $(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libcolormanager \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libdevice \
$(TOP)/hardware/google/graphics/$(soc_ver)/libhwc2.1/libresource \
diff --git a/libhwc2.1/libdevice/DisplayColorLoader.h b/libhwc2.1/libdevice/DisplayColorLoader.h
new file mode 100644
index 0000000..02bbbf8
--- /dev/null
+++ b/libhwc2.1/libdevice/DisplayColorLoader.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef DISPLAY_COLOR_LOADER_H
+#define DISPLAY_COLOR_LOADER_H
+
+#include <dlfcn.h>
+#include <log/log.h>
+#include <string>
+#include <vector>
+
+template <typename GsInterfaceType, const char *entry>
+class DisplayColorLoader {
+ static_assert(entry != nullptr);
+ public:
+ DisplayColorLoader(const DisplayColorLoader &) = delete;
+ DisplayColorLoader& operator=(const DisplayColorLoader &) = delete;
+
+ DisplayColorLoader(const std::string &libName) {
+ libHandle = dlopen(libName.c_str(), RTLD_LAZY);
+
+ if (libHandle == nullptr) {
+ ALOGE("%s: failed to load library %s\n", __func__, libName.c_str());
+ getDisplayColor = nullptr;
+ return;
+ }
+
+ const displaycolor::DisplayColorIntfVer *(*getVersion)();
+ getVersion = reinterpret_cast<decltype(getVersion)>(dlsym(libHandle, "GetInterfaceVersion"));
+ if (getVersion == nullptr) {
+ ALOGE("%s: prebuilt lib is not versioned", __func__);
+ return;
+ }
+
+ auto intfVer = getVersion();
+
+ if (intfVer != nullptr &&
+ displaycolor::kInterfaceVersion.Compatible(*intfVer)) {
+ getDisplayColor = reinterpret_cast<decltype(getDisplayColor)>(dlsym(libHandle, entry));
+
+ if (getDisplayColor == nullptr) {
+ ALOGE("%s: failed to get %s\n", __func__, entry);
+ } else if (!(displaycolor::kInterfaceVersion == *intfVer)) {
+ ALOGW("%s: different hwc/displaycolor patch level %u.%u.%u vs .%u",
+ __func__,
+ intfVer->major,
+ intfVer->minor,
+ displaycolor::kInterfaceVersion.patch,
+ intfVer->patch);
+ }
+ } else {
+ if (intfVer != nullptr) {
+ ALOGE("%s: prebuilt lib version %u.%u.%u expected %u.%u.%u",
+ __func__,
+ intfVer->major,
+ intfVer->minor,
+ intfVer->patch,
+ displaycolor::kInterfaceVersion.major,
+ displaycolor::kInterfaceVersion.minor,
+ displaycolor::kInterfaceVersion.patch);
+ } else {
+ ALOGE("%s: prebult lib getVersion returns null", __func__);
+ }
+ }
+ }
+
+ GsInterfaceType *GetDisplayColor(
+ const std::vector<displaycolor::DisplayInfo> &display_info) {
+ if (getDisplayColor != nullptr) {
+ return getDisplayColor(display_info);
+ }
+
+ return nullptr;
+ }
+
+ ~DisplayColorLoader() {
+ if (libHandle != nullptr) {
+ dlclose(libHandle);
+ }
+ }
+
+ private:
+ void *libHandle;
+ GsInterfaceType *(*getDisplayColor)(const std::vector<displaycolor::DisplayInfo> &);
+};
+
+#endif //DISPLAY_COLOR_LOADER_H