hwc_color_manager.h revision fa3d1d389b731aa86b376da4d8d23cfb0039c81d
12a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber/* Copyright (c) 2015-2016, The Linux Foundataion. All rights reserved.
22a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*
32a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* Redistribution and use in source and binary forms, with or without
42a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* modification, are permitted provided that the following conditions are
52a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* met:
62a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*     * Redistributions of source code must retain the above copyright
72a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*       notice, this list of conditions and the following disclaimer.
82a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*     * Redistributions in binary form must reproduce the above
92a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*       copyright notice, this list of conditions and the following
102a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*       disclaimer in the documentation and/or other materials provided
112a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*       with the distribution.
122a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*     * Neither the name of The Linux Foundation nor the names of its
132a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*       contributors may be used to endorse or promote products derived
142a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*       from this software without specific prior written permission.
152a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*
162a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
172a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
182a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
192a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
202a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
212a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
222a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23d3eaeefb1bac68bc1fee91b794be2c2c3bea6d94Andreas Huber* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
241472eb39f7516faa26de200d8592464c8aaac38eAndreas Huber* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25d3eaeefb1bac68bc1fee91b794be2c2c3bea6d94Andreas Huber* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
262a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*
282a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber*/
292a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber
302a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber#ifndef __HWC_COLOR_MANAGER_H__
312a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber#define __HWC_COLOR_MANAGER_H__
322a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber
332a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber#include <stdlib.h>
342a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber#include <binder/Parcel.h>
352a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber#include <powermanager/IPowerManager.h>
365343bc86119430e55fe43e132242291a74164f27Chong Zhang#include <binder/BinderService.h>
375343bc86119430e55fe43e132242291a74164f27Chong Zhang#include <core/sdm_types.h>
381472eb39f7516faa26de200d8592464c8aaac38eAndreas Huber#include <utils/locker.h>
39f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
40f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Hubernamespace sdm {
41f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
42f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber// This macro defines name for display APIs interface wrapper library.
43f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber// This macro shall be used to load library using dlopen().
44f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber#define DISPLAY_API_INTERFACE_LIBRARY_NAME "libsdm-disp-apis.so"
45f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
46f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber// This macro defines variable name of display color APIs function tables
472a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber// This macro shall be used to specify name of the variable in dlsym().
482a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber#define DISPLAY_API_FUNC_TABLES "display_color_apis_ftables"
49f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber#define QDCM_DIAG_CLIENT_LIBRARY_NAME "libsdm-diag.so"
50f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber#define INIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagInit"
51f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber#define DEINIT_QDCM_DIAG_CLIENT_NAME "QDCMDiagDeInit"
52f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
53f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Hubertypedef int (*QDCMDiagInit)(void *ftables);
54026d520295b52d136a6962a05882a696fe620725Chong Zhang
55026d520295b52d136a6962a05882a696fe620725Chong Zhangtypedef int (*QDCMDiagDeInit)(void);
56f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
57f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber// Class to encapsulte all details of managing QDCM operating mode.
58f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huberclass HWCQDCMModeManager {
59f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber public:
60f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber  static const uint32_t kSocketCMDMaxLength = 4096;
61026d520295b52d136a6962a05882a696fe620725Chong Zhang  static const uint32_t kFullWakeLock = 0x0000001a;
62f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber  static const uint32_t kAcquireCauseWakeup = 0x10000000;
63f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber  static const uint32_t kONAfterRelease = 0x20000000;
64026d520295b52d136a6962a05882a696fe620725Chong Zhang  enum ActiveFeatureID {
65f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    kCABLFeature,
66f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    kADFeature,
672a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber    kSVIFeature,
682a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber    kMaxNumActiveFeature,
692a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber  };
702a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber
712a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber  struct ActiveFeatureCMD {
721472eb39f7516faa26de200d8592464c8aaac38eAndreas Huber    const char *cmd_on = NULL;
73f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    const char *cmd_off = NULL;
742a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber    const char *cmd_query_status = NULL;
751472eb39f7516faa26de200d8592464c8aaac38eAndreas Huber    const char *running = NULL;
76f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    ActiveFeatureCMD(const char *arg1, const char *arg2, const char *arg3, const char *arg4)
772a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber        : cmd_on(arg1), cmd_off(arg2), cmd_query_status(arg3), running(arg4) {}
784fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang  };
794fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang
804fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang  static const ActiveFeatureCMD kActiveFeatureCMD[kMaxNumActiveFeature];
812d2a2967ce29281816b9ddb9434b3c0084e4ce52Chong Zhang
822d2a2967ce29281816b9ddb9434b3c0084e4ce52Chong Zhang public:
832d2a2967ce29281816b9ddb9434b3c0084e4ce52Chong Zhang  static HWCQDCMModeManager *CreateQDCMModeMgr();
844fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang  ~HWCQDCMModeManager();
854fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang  int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);
864fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang
874fdc4ce9d1a9d94801faf904ebf4f11e009fdec7Chong Zhang protected:
88d36af484a8dd3bbaf7ed7de31852c9f802243392Hangyu Kuang  bool SendSocketCmd();
89d36af484a8dd3bbaf7ed7de31852c9f802243392Hangyu Kuang  int AcquireAndroidWakeLock(bool enable);
901472eb39f7516faa26de200d8592464c8aaac38eAndreas Huber  int EnableActiveFeatures(bool enable);
91f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber  int EnableActiveFeatures(bool enable, const ActiveFeatureCMD &cmds, bool *was_running);
922a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber
931472eb39f7516faa26de200d8592464c8aaac38eAndreas Huber private:
94f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber  bool cabl_was_running_ = false;
951c8ed2e906576fd8d7fa03f577bdec518cbe13d7Andreas Huber  int socket_fd_ = -1;
96cb62bc3fe54222cf05824e6f98fefafee552049aAnu Sundararajan  android::sp<android::IBinder> wakelock_token_ = NULL;
97cb62bc3fe54222cf05824e6f98fefafee552049aAnu Sundararajan  android::sp<android::IPowerManager> power_mgr_ = NULL;
98cb62bc3fe54222cf05824e6f98fefafee552049aAnu Sundararajan  uint32_t entry_timeout_ = 0;
992a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber  static const char *const kSocketName;
1002a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber  static const char *const kTagName;
1012a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber  static const char *const kPackageName;
1022a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber};
1032a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber
1042a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huber// Class to encapsulte all HWC/OS specific behaviours for ColorManager.
1052a4a7d5af053a17586a262a1267ba993e31790f1Andreas Huberclass HWCColorManager {
106 public:
107  static const int kNumSolidFillLayers = 2;
108  static HWCColorManager *CreateColorManager();
109  static int CreatePayloadFromParcel(const android::Parcel &in, uint32_t *disp_id,
110                                     PPDisplayAPIPayload *sink);
111  static void MarshallStructIntoParcel(const PPDisplayAPIPayload &data,
112                                       android::Parcel *out_parcel);
113
114  ~HWCColorManager();
115  void DestroyColorManager();
116  int EnableQDCMMode(bool enable, HWCDisplay *hwc_display);
117  int SetSolidFill(const void *params, bool enable, HWCDisplay *hwc_display);
118  int SetFrameCapture(void *params, bool enable, HWCDisplay *hwc_display);
119  int SetDetailedEnhancer(void *params, HWCDisplay *hwc_display);
120
121 protected:
122  int CreateSolidFillLayers(HWCDisplay *hwc_display);
123  void DestroySolidFillLayers();
124  static uint32_t Get8BitsARGBColorValue(const PPColorFillParams &params);
125
126 private:
127  DynLib color_apis_lib_;
128  DynLib diag_client_lib_;
129  void *color_apis_ = NULL;
130  QDCMDiagInit qdcm_diag_init_ = NULL;
131  QDCMDiagDeInit qdcm_diag_deinit_ = NULL;
132  HWCQDCMModeManager *qdcm_mode_mgr_ = NULL;
133
134  PPColorFillParams solid_fill_params_;
135  HWCBufferAllocator *buffer_allocator_ = NULL;
136  BufferInfo buffer_info;
137  Locker locker_;
138};
139
140}  // namespace sdm
141
142#endif  // __HWC_COLOR_MANAGER_H__
143