diff options
author | Dileep Marchya <dmarchya@codeaurora.org> | 2017-04-07 15:56:47 +0530 |
---|---|---|
committer | Uday Kiran Pichika <pichika@codeaurora.org> | 2017-06-30 11:43:58 +0530 |
commit | 6860b2b92ebaed1fd14e4c93b895470d28c33153 (patch) | |
tree | 3fbf84a41eeefe783975af40bc5c6abf71de9d43 /libdisplayconfig | |
parent | 22b34aee508323cd29b22219941c6230081e9f21 (diff) | |
download | display-6860b2b92ebaed1fd14e4c93b895470d28c33153.tar.gz |
hwc2: Implement IDisplayConfig HIDL service.
- Add IDisplayConfig service in composer process.
- Add DisplayConfig wrapper to abstract
IDisplayConfig interfaces.
CRs-Fixed: 2036340
Change-Id: I54535e7224ee842b761509268ebaa2e8425bc8d7
Diffstat (limited to 'libdisplayconfig')
-rw-r--r-- | libdisplayconfig/Android.mk | 12 | ||||
-rw-r--r-- | libdisplayconfig/DisplayConfig.cpp | 363 | ||||
-rw-r--r-- | libdisplayconfig/DisplayConfig.h | 110 |
3 files changed, 485 insertions, 0 deletions
diff --git a/libdisplayconfig/Android.mk b/libdisplayconfig/Android.mk new file mode 100644 index 00000000..fae7f85c --- /dev/null +++ b/libdisplayconfig/Android.mk @@ -0,0 +1,12 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := libdisplayconfig +LOCAL_MODULE_TAGS := optional +LOCAL_HEADER_LIBRARIES := display_headers +LOCAL_COPY_HEADERS := DisplayConfig.h +LOCAL_SRC_FILES := DisplayConfig.cpp +LOCAL_SHARED_LIBRARIES := libhidlbase libhidltransport libutils \ + vendor.display.config@1.0 android.hidl.base@1.0 + +include $(BUILD_SHARED_LIBRARY) diff --git a/libdisplayconfig/DisplayConfig.cpp b/libdisplayconfig/DisplayConfig.cpp new file mode 100644 index 00000000..c55715bd --- /dev/null +++ b/libdisplayconfig/DisplayConfig.cpp @@ -0,0 +1,363 @@ +/* +* Copyright (c) 2017 The Linux Foundation. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following +* disclaimer in the documentation and/or other materials provided +* with the distribution. +* * Neither the name of The Linux Foundation. nor the names of its +* contributors may be used to endorse or promote products derived +* from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#include <vendor/display/config/1.0/IDisplayConfig.h> + +#include "DisplayConfig.h" + +namespace display { + +using vendor::display::config::V1_0::IDisplayConfig; + +//============================================================================= +// The functions below run in the client process and wherever necessary +// do a binder call to HWC to get/set data. + +IDisplayConfig::DisplayType MapDisplayType(int dpy) { + switch (dpy) { + case DISPLAY_PRIMARY: + return IDisplayConfig::DisplayType::DISPLAY_PRIMARY; + + case DISPLAY_EXTERNAL: + return IDisplayConfig::DisplayType::DISPLAY_EXTERNAL; + + case DISPLAY_VIRTUAL: + return IDisplayConfig::DisplayType::DISPLAY_VIRTUAL; + + default: + break; + } + + return IDisplayConfig::DisplayType::INVALID; +} + +IDisplayConfig::DisplayExternalStatus MapExternalStatus(uint32_t status) { + switch (status) { + case EXTERNAL_OFFLINE: + return IDisplayConfig::DisplayExternalStatus::EXTERNAL_OFFLINE; + + case EXTERNAL_ONLINE: + return IDisplayConfig::DisplayExternalStatus::EXTERNAL_ONLINE; + + case EXTERNAL_PAUSE: + return IDisplayConfig::DisplayExternalStatus::EXTERNAL_PAUSE; + + case EXTERNAL_RESUME: + return IDisplayConfig::DisplayExternalStatus::EXTERNAL_RESUME; + + default: + break; + } + + return IDisplayConfig::DisplayExternalStatus::INVALID; +} + +IDisplayConfig::DisplayDynRefreshRateOp MapDynRefreshRateOp(uint32_t op) { + switch (op) { + case DISABLE_METADATA_DYN_REFRESH_RATE: + return IDisplayConfig::DisplayDynRefreshRateOp::DISABLE_METADATA_DYN_REFRESH_RATE; + + case ENABLE_METADATA_DYN_REFRESH_RATE: + return IDisplayConfig::DisplayDynRefreshRateOp::ENABLE_METADATA_DYN_REFRESH_RATE; + + case SET_BINDER_DYN_REFRESH_RATE: + return IDisplayConfig::DisplayDynRefreshRateOp::SET_BINDER_DYN_REFRESH_RATE; + + default: + break; + } + + return IDisplayConfig::DisplayDynRefreshRateOp::INVALID; +} + +int MapDisplayPortType(IDisplayConfig::DisplayPortType panelType) { + switch (panelType) { + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DEFAULT: + return DISPLAY_PORT_DEFAULT; + + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DSI: + return DISPLAY_PORT_DSI; + + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DTV: + return DISPLAY_PORT_DTV; + + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_WRITEBACK: + return DISPLAY_PORT_WRITEBACK; + + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_LVDS: + return DISPLAY_PORT_LVDS; + + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_EDP: + return DISPLAY_PORT_EDP; + + case IDisplayConfig::DisplayPortType::DISPLAY_PORT_DP: + return DISPLAY_PORT_DP; + + default: + break; + } + + return -1; +} + +int isExternalConnected() { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return 0; + } + + int connected = 0; + intf->isDisplayConnected(IDisplayConfig::DisplayType::DISPLAY_EXTERNAL, + [&](const auto &tmpError, const auto &tmpStatus) { + if (tmpError) { + return; + } + + connected = tmpStatus; + }); + + return connected; +} + +int setSecondayDisplayStatus(int dpy, uint32_t status) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->setSecondayDisplayStatus(MapDisplayType(dpy), MapExternalStatus(status)); +} + +int configureDynRefeshRate(uint32_t op, uint32_t refreshRate) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->configureDynRefeshRate(MapDynRefreshRateOp(op), refreshRate); +} + +int getConfigCount(int dpy) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + int count = 0; + intf->getActiveConfig(MapDisplayType(dpy), + [&](const auto &tmpError, const auto &tmpCount) { + if (tmpError) { + return; + } + + count = tmpCount; + }); + + return count; +} + +int getActiveConfig(int dpy) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + int config = 0; + intf->getActiveConfig(MapDisplayType(dpy), + [&](const auto &tmpError, const auto &tmpConfig) { + if (tmpError) { + return; + } + + config = tmpConfig; + }); + + return config; +} + +int setActiveConfig(int dpy, uint32_t config) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->setActiveConfig(MapDisplayType(dpy), config); +} + +DisplayAttributes getDisplayAttributes(uint32_t configIndex, int dpy) { + DisplayAttributes attributes; + + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return attributes; + } + + intf->getDisplayAttributes(configIndex, MapDisplayType(dpy), + [&](const auto &tmpError, const auto &tmpAttributes) { + if (tmpError) { + return; + } + + attributes.vsync_period = tmpAttributes.vsyncPeriod; + attributes.xres = tmpAttributes.xRes; + attributes.yres = tmpAttributes.yRes; + attributes.xdpi = tmpAttributes.xDpi; + attributes.ydpi = tmpAttributes.yDpi; + attributes.panel_type = MapDisplayPortType(tmpAttributes.panelType); + attributes.is_yuv = tmpAttributes.isYuv; + }); + + return attributes; +} + +int setPanelBrightness(uint32_t level) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->setPanelBrightness(level); +} + +uint32_t getPanelBrightness() { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return 0; + } + + int level = 0; + intf->getPanelBrightness( + [&](const auto &tmpError, const auto &tmpLevel) { + if (tmpError) { + return; + } + + level = tmpLevel; + }); + + return level; +} + +int minHdcpEncryptionLevelChanged(int dpy, uint32_t min_enc_level) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->minHdcpEncryptionLevelChanged(MapDisplayType(dpy), min_enc_level); +} + +int refreshScreen() { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->refreshScreen(); +} + +int controlPartialUpdate(int dpy, bool enable) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->controlPartialUpdate(MapDisplayType(dpy), enable); +} + +int toggleScreenUpdate(uint32_t on) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->toggleScreenUpdate(on == 1); +} + +int setIdleTimeout(uint32_t value) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->setIdleTimeout(value); +} + +int getHDRCapabilities(int dpy, DisplayHDRCapabilities *caps) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL || caps == NULL) { + return -1; + } + + int error = -1; + intf->getHDRCapabilities(MapDisplayType(dpy), + [&](const auto &tmpError, const auto &tmpCaps) { + error = tmpError; + if (error) { + return; + } + + caps->supported_hdr_types = tmpCaps.supportedHdrTypes; + caps->max_luminance = tmpCaps.maxLuminance; + caps->max_avg_luminance = tmpCaps.maxAvgLuminance; + caps->min_luminance = tmpCaps.minLuminance; + }); + + return error; +} + +int setCameraLaunchStatus(uint32_t on) { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return -1; + } + + return intf->setCameraLaunchStatus(on); +} + +bool displayBWTransactionPending() { + android::sp<IDisplayConfig> intf = IDisplayConfig::getService(); + if (intf == NULL) { + return 0; + } + + int status = 0; + intf->displayBWTransactionPending( + [&](const auto &tmpError, const auto &tmpStatus) { + if (tmpError) { + return; + } + + status = tmpStatus; + }); + + return status; +} + +} // namespace display diff --git a/libdisplayconfig/DisplayConfig.h b/libdisplayconfig/DisplayConfig.h new file mode 100644 index 00000000..69a542a3 --- /dev/null +++ b/libdisplayconfig/DisplayConfig.h @@ -0,0 +1,110 @@ +/* + * Copyight (c) 2017 The Linux Foundation. All ights reserved. + * + * Redistibution and use in souce and binary forms, with or without + * modification, ae pemitted provided that the following conditions are + * met: + * * Redistibutions of souce code must retain the above copyright + * notice, this list of conditions and the following disclaime. + * * Redistibutions in binay form must reproduce the above + * copyight notice, this list of conditions and the following + * disclaime in the documentation and/o other materials provided + * with the distibution. + * * Neither the name of The Linux Foundation. no the names of its + * contibutos may be used to endorse or promote products derived + * fom this softwae without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __DISPLAY_CONFIG_H__ +#define __DISPLAY_CONFIG_H__ + +#include <stdint.h> +#include <vector> + +// This header is for clients to use to set/get global display configuration. + +namespace display { + +enum { + DISPLAY_PRIMARY = 0, + DISPLAY_EXTERNAL, + DISPLAY_VIRTUAL, +}; + +enum { + EXTERNAL_OFFLINE = 0, + EXTERNAL_ONLINE, + EXTERNAL_PAUSE, + EXTERNAL_RESUME, +}; + +enum { + DISABLE_METADATA_DYN_REFRESH_RATE = 0, + ENABLE_METADATA_DYN_REFRESH_RATE, + SET_BINDER_DYN_REFRESH_RATE, +}; + +enum { + DISPLAY_PORT_DEFAULT = 0, + DISPLAY_PORT_DSI, + DISPLAY_PORT_DTV, + DISPLAY_PORT_WRITEBACK, + DISPLAY_PORT_LVDS, + DISPLAY_PORT_EDP, + DISPLAY_PORT_DP, +}; + +struct DisplayAttributes { + uint32_t vsync_period = 0; //nanoseconds + uint32_t xres = 0; + uint32_t yres = 0; + float xdpi = 0.0f; + float ydpi = 0.0f; + int panel_type = DISPLAY_PORT_DEFAULT; + bool is_yuv = false; +}; + +struct DisplayHDRCapabilities { + std::vector<int32_t> supported_hdr_types; + float max_luminance = 0.0f; + float max_avg_luminance = 0.0f; + float min_luminance = 0.0f; +}; + +//============================================================================= +// The functions below run in the client pocess and wherever necessary +// do a binder call to HWC to get/set data. + +int isExternalConnected(); +int setSecondayDisplayStatus(int dpy, uint32_t status); +int configureDynRefeshRate(uint32_t op, uint32_t refreshRate); +int getConfigCount(int dpy); +int getActiveConfig(int dpy); +int setActiveConfig(int dpy, uint32_t config); +DisplayAttributes getDisplayAttributes(uint32_t configIndex, int dpy); +int setPanelBrightness(uint32_t level); +uint32_t getPanelBrightness(); +int minHdcpEncryptionLevelChanged(int dpy, uint32_t min_enc_level); +int refreshScreen(); +int controlPartialUpdate(int dpy, bool enable); +int toggleScreenUpdate(uint32_t on); +int setIdleTimeout(uint32_t value); +int getHDRCapabilities(int dpy, DisplayHDRCapabilities *caps); +int setCameraLaunchStatus(uint32_t on); +bool displayBWTransactionPending(); + +} // namespace display + +#endif // __DISPLAY_CONFIG_H__ |