14a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh/* Copyright (c) 2015-2017, The Linux Foundataion. All rights reserved.
24a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
34a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* Redistribution and use in source and binary forms, with or without
44a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* modification, are permitted provided that the following conditions are
54a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* met:
64a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     * Redistributions of source code must retain the above copyright
74a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*       notice, this list of conditions and the following disclaimer.
84a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     * Redistributions in binary form must reproduce the above
94a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*       copyright notice, this list of conditions and the following
104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*       disclaimer in the documentation and/or other materials provided
114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*       with the distribution.
124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*     * Neither the name of The Linux Foundation nor the names of its
134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*       contributors may be used to endorse or promote products derived
144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*       from this software without specific prior written permission.
154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*
284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh*/
294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#ifndef __HWC_COLOR_MANAGER_H__
314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define __HWC_COLOR_MANAGER_H__
324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <stdlib.h>
344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <binder/Parcel.h>
354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <powermanager/IPowerManager.h>
364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <binder/BinderService.h>
374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <core/sdm_types.h>
384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/locker.h>
394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#include <utils/sys.h>
404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhnamespace sdm {
424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh// This macro defines name for display APIs interface wrapper library.
444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh// This macro shall be used to load library using dlopen().
454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define DISPLAY_API_INTERFACE_LIBRARY_NAME "libsdm-disp-vndapis.so"
464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh// This macro defines variable name of display color APIs function tables
484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh// This macro shall be used to specify name of the variable in dlsym().
494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define DISPLAY_API_FUNC_TABLES "display_color_apis_ftables"
504a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define QDCM_DIAG_CLIENT_LIBRARY_NAME "libsdm-diag.so"
514a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define INIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagInit"
524a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#define DEINIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagDeInit"
534a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
544a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhtypedef int (*QDCMDiagInit)(void *ftables);
554a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
564a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhtypedef int (*QDCMDiagDeInit)(void);
574a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
584a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh// Class to encapsulte all details of managing QDCM operating mode.
594a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhclass HWCQDCMModeManager {
604a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh public:
614a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const uint32_t kSocketCMDMaxLength = 4096;
624a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const uint32_t kFullWakeLock = 0x0000001a;
634a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const uint32_t kAcquireCauseWakeup = 0x10000000;
644a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const uint32_t kONAfterRelease = 0x20000000;
654a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  enum ActiveFeatureID {
664a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    kCABLFeature,
674a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    kADFeature,
684a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    kSVIFeature,
694a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    kMaxNumActiveFeature,
704a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  };
714a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
724a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  struct ActiveFeatureCMD {
734a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    const char *cmd_on = NULL;
744a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    const char *cmd_off = NULL;
754a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    const char *cmd_query_status = NULL;
764a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    const char *running = NULL;
774a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh    ActiveFeatureCMD(const char *arg1, const char *arg2, const char *arg3, const char *arg4)
784a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh        : cmd_on(arg1), cmd_off(arg2), cmd_query_status(arg3), running(arg4) {}
794a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  };
804a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
814a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const ActiveFeatureCMD kActiveFeatureCMD[kMaxNumActiveFeature];
824a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
834a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh public:
844a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static HWCQDCMModeManager *CreateQDCMModeMgr();
854a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  ~HWCQDCMModeManager();
864a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);
874a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
884a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh protected:
894a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  bool SendSocketCmd();
904a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int AcquireAndroidWakeLock(bool enable);
914a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int EnableActiveFeatures(bool enable);
924a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int EnableActiveFeatures(bool enable, const ActiveFeatureCMD &cmds, bool *was_running);
934a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
944a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh private:
954a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  bool cabl_was_running_ = false;
964a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int socket_fd_ = -1;
974a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  android::sp<android::IBinder> wakelock_token_ = NULL;
984a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  android::sp<android::IPowerManager> power_mgr_ = NULL;
994a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  uint32_t entry_timeout_ = 0;
1004a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const char *const kSocketName;
1014a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const char *const kTagName;
1024a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const char *const kPackageName;
1034a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh};
1044a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1054a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh// Class to encapsulte all HWC/OS specific behaviours for ColorManager.
1064a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanhclass HWCColorManager {
1074a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh public:
1084a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static const int kNumSolidFillLayers = 2;
1094a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static HWCColorManager *CreateColorManager();
1104a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static int CreatePayloadFromParcel(const android::Parcel &in, uint32_t *disp_id,
1114a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                                     PPDisplayAPIPayload *sink);
1124a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static void MarshallStructIntoParcel(const PPDisplayAPIPayload &data,
1134a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh                                       android::Parcel *out_parcel);
1144a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1154a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  ~HWCColorManager();
1164a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  void DestroyColorManager();
1174a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);
1184a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int SetSolidFill(const void *params, bool enable, HWCDisplay *hwc_display);
1194a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  bool SolidFillLayersPrepare(hwc_display_contents_1_t **displays, HWCDisplay *hwc_display);
1204a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  bool SolidFillLayersSet(hwc_display_contents_1_t **displays, HWCDisplay *hwc_display);
1214a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_display);
1224a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int SetDetailedEnhancer(void *params, HWCDisplay *hwc_display);
1234a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  void SetColorModeDetailEnhancer(HWCDisplay *hwc_display);
1244a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int SetHWDetailedEnhancerConfig(void *params, HWCDisplay *hwc_display);
1254a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1264a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh protected:
1274a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  int CreateSolidFillLayers(HWCDisplay *hwc_display);
1284a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  void DestroySolidFillLayers();
1294a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  static uint32_t Get8BitsARGBColorValue(const PPColorFillParams &params);
1304a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1314a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh private:
1324a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  DynLib color_apis_lib_;
1334a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  DynLib diag_client_lib_;
1344a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  void *color_apis_ = NULL;
1354a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  QDCMDiagInit qdcm_diag_init_ = NULL;
1364a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  QDCMDiagDeInit qdcm_diag_deinit_ = NULL;
1374a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  HWCQDCMModeManager *qdcm_mode_mgr_ = NULL;
1384a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1394a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  bool solid_fill_enable_ = false;
1404a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  PPColorFillParams solid_fill_params_;
1414a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  hwc_display_contents_1_t *solid_fill_layers_ = NULL;
1424a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  HWCBufferAllocator *buffer_allocator_ = NULL;
1434a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  BufferInfo buffer_info;
1444a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh  Locker locker_;
1454a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh};
1464a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1474a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh}  // namespace sdm
1484a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh
1494a1efd0680d2e9b61739e1eaeffd89174d6d2605Alain Vongsouvanh#endif  // __HWC_COLOR_MANAGER_H__
150