12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* Copyright (c) 2015-2016, The Linux Foundataion. All rights reserved.
22ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without
42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* modification, are permitted provided that the following conditions are
52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* met:
62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*     * Redistributions of source code must retain the above copyright
72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*       notice, this list of conditions and the following disclaimer.
82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*     * Redistributions in binary form must reproduce the above
92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*       copyright notice, this list of conditions and the following
102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*       disclaimer in the documentation and/or other materials provided
112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*       with the distribution.
122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*     * Neither the name of The Linux Foundation nor the names of its
132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*       contributors may be used to endorse or promote products derived
142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*       from this software without specific prior written permission.
152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*
282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/
292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#ifndef __HWC_COLOR_MANAGER_H__
312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __HWC_COLOR_MANAGER_H__
322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <stdlib.h>
342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <binder/Parcel.h>
352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <binder/BinderService.h>
362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <core/sdm_types.h>
372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/locker.h>
382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm {
402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// This macro defines name for display APIs interface wrapper library.
422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// This macro shall be used to load library using dlopen().
432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define DISPLAY_API_INTERFACE_LIBRARY_NAME "libsdm-disp-apis.so"
442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// This macro defines variable name of display color APIs function tables
462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// This macro shall be used to specify name of the variable in dlsym().
472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define DISPLAY_API_FUNC_TABLES "display_color_apis_ftables"
482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define QDCM_DIAG_CLIENT_LIBRARY_NAME "libsdm-diag.so"
492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define INIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagInit"
502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define DEINIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagDeInit"
512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeltypedef int (*QDCMDiagInit)(void *ftables);
532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudeltypedef int (*QDCMDiagDeInit)(void);
552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Class to encapsulte all details of managing QDCM operating mode.
572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass HWCQDCMModeManager {
582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel public:
592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const uint32_t kSocketCMDMaxLength = 4096;
602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const uint32_t kFullWakeLock = 0x0000001a;
612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const uint32_t kAcquireCauseWakeup = 0x10000000;
622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const uint32_t kONAfterRelease = 0x20000000;
632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  enum ActiveFeatureID {
642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    kCABLFeature,
652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    kADFeature,
662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    kSVIFeature,
672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    kMaxNumActiveFeature,
682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  };
692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  struct ActiveFeatureCMD {
712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    const char *cmd_on = NULL;
722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    const char *cmd_off = NULL;
732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    const char *cmd_query_status = NULL;
742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    const char *running = NULL;
752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel    ActiveFeatureCMD(const char *arg1, const char *arg2, const char *arg3, const char *arg4)
762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel        : cmd_on(arg1), cmd_off(arg2), cmd_query_status(arg3), running(arg4) {}
772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  };
782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const ActiveFeatureCMD kActiveFeatureCMD[kMaxNumActiveFeature];
802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel public:
822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static HWCQDCMModeManager *CreateQDCMModeMgr();
832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  ~HWCQDCMModeManager();
842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);
852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel protected:
872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool SendSocketCmd();
882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int AcquireAndroidWakeLock(bool enable);
892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int EnableActiveFeatures(bool enable);
902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int EnableActiveFeatures(bool enable, const ActiveFeatureCMD &cmds, bool *was_running);
912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel private:
932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  bool cabl_was_running_ = false;
942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int socket_fd_ = -1;
952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  android::sp<android::IBinder> wakelock_token_ = NULL;
962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  uint32_t entry_timeout_ = 0;
972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const char *const kSocketName;
982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const char *const kTagName;
992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const char *const kPackageName;
1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel};
1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel// Class to encapsulte all HWC/OS specific behaviours for ColorManager.
1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass HWCColorManager {
1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel public:
1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static const int kNumSolidFillLayers = 2;
106cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  static HWCColorManager *CreateColorManager(HWCBufferAllocator *buffer_allocator);
1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static int CreatePayloadFromParcel(const android::Parcel &in, uint32_t *disp_id,
1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                     PPDisplayAPIPayload *sink);
1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static void MarshallStructIntoParcel(const PPDisplayAPIPayload &data,
1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel                                       android::Parcel *out_parcel);
1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
112cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel  explicit HWCColorManager(HWCBufferAllocator *buffer_allocator);
1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  ~HWCColorManager();
1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void DestroyColorManager();
1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);
1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int SetSolidFill(const void *params, bool enable, HWCDisplay *hwc_display);
1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_display);
118fa3d1d389b731aa86b376da4d8d23cfb0039c81dThierry Strudel  int SetDetailedEnhancer(void *params, HWCDisplay *hwc_display);
119b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  void SetColorModeDetailEnhancer(HWCDisplay *hwc_display);
120b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel  int SetHWDetailedEnhancerConfig(void *params, HWCDisplay *hwc_display);
1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel protected:
1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  int CreateSolidFillLayers(HWCDisplay *hwc_display);
1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void DestroySolidFillLayers();
1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  static uint32_t Get8BitsARGBColorValue(const PPColorFillParams &params);
1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel private:
1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DynLib color_apis_lib_;
1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  DynLib diag_client_lib_;
1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  void *color_apis_ = NULL;
1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  QDCMDiagInit qdcm_diag_init_ = NULL;
1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  QDCMDiagDeInit qdcm_diag_deinit_ = NULL;
1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWCQDCMModeManager *qdcm_mode_mgr_ = NULL;
1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  PPColorFillParams solid_fill_params_;
1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  HWCBufferAllocator *buffer_allocator_ = NULL;
1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  BufferInfo buffer_info;
1382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel  Locker locker_;
1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel};
1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}  // namespace sdm
1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel
1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#endif  // __HWC_COLOR_MANAGER_H__
144