/* Copyright (c) 2015-2017, The Linux Foundataion. 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. * */ #ifndef __HWC_COLOR_MANAGER_H__ #define __HWC_COLOR_MANAGER_H__ #include #include #include #include #include namespace sdm { // This macro defines name for display APIs interface wrapper library. // This macro shall be used to load library using dlopen(). #define DISPLAY_API_INTERFACE_LIBRARY_NAME "libsdm-disp-vndapis.so" // This macro defines variable name of display color APIs function tables // This macro shall be used to specify name of the variable in dlsym(). #define DISPLAY_API_FUNC_TABLES "display_color_apis_ftables" #define QDCM_DIAG_CLIENT_LIBRARY_NAME "libsdm-diag.so" #define INIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagInit" #define DEINIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagDeInit" typedef void (*QDCMDiagInit)(void *ftables); typedef void (*QDCMDiagDeInit)(void); // Class to encapsulte all details of managing QDCM operating mode. class HWCQDCMModeManager { public: static const uint32_t kSocketCMDMaxLength = 4096; static const uint32_t kFullWakeLock = 0x0000001a; static const uint32_t kAcquireCauseWakeup = 0x10000000; static const uint32_t kONAfterRelease = 0x20000000; enum ActiveFeatureID { kCABLFeature, kADFeature, kSVIFeature, kMaxNumActiveFeature, }; struct ActiveFeatureCMD { const char *cmd_on = NULL; const char *cmd_off = NULL; const char *cmd_query_status = NULL; const char *running = NULL; ActiveFeatureCMD(const char *arg1, const char *arg2, const char *arg3, const char *arg4) : cmd_on(arg1), cmd_off(arg2), cmd_query_status(arg3), running(arg4) {} }; static const ActiveFeatureCMD kActiveFeatureCMD[kMaxNumActiveFeature]; public: static HWCQDCMModeManager *CreateQDCMModeMgr(); ~HWCQDCMModeManager(); int EnableQDCMMode(bool enable, HWCDisplay *hwc_display); protected: bool SendSocketCmd(); int AcquireAndroidWakeLock(bool enable); int EnableActiveFeatures(bool enable); int EnableActiveFeatures(bool enable, const ActiveFeatureCMD &cmds, bool *was_running); private: bool cabl_was_running_ = false; int socket_fd_ = -1; android::sp wakelock_token_ = NULL; uint32_t entry_timeout_ = 0; static const char *const kSocketName; static const char *const kTagName; static const char *const kPackageName; }; // Class to encapsulte all HWC/OS specific behaviours for ColorManager. class HWCColorManager { public: static const int kNumSolidFillLayers = 2; static HWCColorManager *CreateColorManager(HWCBufferAllocator *buffer_allocator); static int CreatePayloadFromParcel(const android::Parcel &in, uint32_t *disp_id, PPDisplayAPIPayload *sink); static void MarshallStructIntoParcel(const PPDisplayAPIPayload &data, android::Parcel *out_parcel); explicit HWCColorManager(HWCBufferAllocator *buffer_allocator); ~HWCColorManager(); void DestroyColorManager(); int EnableQDCMMode(bool enable, HWCDisplay *hwc_display); int SetSolidFill(const void *params, bool enable, HWCDisplay *hwc_display); int SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_display); int SetDetailedEnhancer(void *params, HWCDisplay *hwc_display); void SetColorModeDetailEnhancer(HWCDisplay *hwc_display); int SetHWDetailedEnhancerConfig(void *params, HWCDisplay *hwc_display); protected: int CreateSolidFillLayers(HWCDisplay *hwc_display); void DestroySolidFillLayers(); static uint32_t Get8BitsARGBColorValue(const PPColorFillParams ¶ms); private: DynLib color_apis_lib_; DynLib diag_client_lib_; void *color_apis_ = NULL; QDCMDiagInit qdcm_diag_init_ = NULL; QDCMDiagDeInit qdcm_diag_deinit_ = NULL; HWCQDCMModeManager *qdcm_mode_mgr_ = NULL; PPColorFillParams solid_fill_params_; HWCBufferAllocator *buffer_allocator_ = NULL; BufferInfo buffer_info; Locker locker_; }; } // namespace sdm #endif // __HWC_COLOR_MANAGER_H__