1/*
2 * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
3 * Not a Contribution.
4 *
5 * Copyright 2015 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 *      http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20#ifndef __HWC_SESSION_H__
21#define __HWC_SESSION_H__
22
23#include <core/core_interface.h>
24#include <utils/locker.h>
25
26#include "hwc_callbacks.h"
27#include "hwc_layers.h"
28#include "hwc_display.h"
29#include "hwc_display_primary.h"
30#include "hwc_display_external.h"
31#include "hwc_display_virtual.h"
32#include "hwc_color_manager.h"
33#include "hwc_socket_handler.h"
34
35namespace sdm {
36
37class HWCSession : hwc2_device_t, public qClient::BnQClient {
38 public:
39  struct HWCModuleMethods : public hw_module_methods_t {
40    HWCModuleMethods() { hw_module_methods_t::open = HWCSession::Open; }
41  };
42
43  explicit HWCSession(const hw_module_t *module);
44  int Init();
45  int Deinit();
46  HWC2::Error CreateVirtualDisplayObject(uint32_t width, uint32_t height, int32_t *format);
47
48  template <typename... Args>
49  static int32_t CallDisplayFunction(hwc2_device_t *device, hwc2_display_t display,
50                                     HWC2::Error (HWCDisplay::*member)(Args...), Args... args) {
51    if (!device) {
52      return HWC2_ERROR_BAD_DISPLAY;
53    }
54
55    HWCSession *hwc_session = static_cast<HWCSession *>(device);
56    auto status = HWC2::Error::BadDisplay;
57    if (hwc_session->hwc_display_[display]) {
58      auto hwc_display = hwc_session->hwc_display_[display];
59      status = (hwc_display->*member)(std::forward<Args>(args)...);
60    }
61    return INT32(status);
62  }
63
64  template <typename... Args>
65  static int32_t CallLayerFunction(hwc2_device_t *device, hwc2_display_t display,
66                                   hwc2_layer_t layer, HWC2::Error (HWCLayer::*member)(Args...),
67                                   Args... args) {
68    if (!device) {
69      return HWC2_ERROR_BAD_DISPLAY;
70    }
71
72    HWCSession *hwc_session = static_cast<HWCSession *>(device);
73    auto status = HWC2::Error::BadDisplay;
74    if (hwc_session->hwc_display_[display]) {
75      status = HWC2::Error::BadLayer;
76      auto hwc_layer = hwc_session->hwc_display_[display]->GetHWCLayer(layer);
77      if (hwc_layer != nullptr) {
78        status = (hwc_layer->*member)(std::forward<Args>(args)...);
79        if (hwc_session->hwc_display_[display]->geometry_changes_) {
80          hwc_session->hwc_display_[display]->validated_ = false;
81        }
82      }
83    }
84    return INT32(status);
85  }
86
87  // HWC2 Functions that require a concrete implementation in hwc session
88  // and hence need to be member functions
89  static int32_t AcceptDisplayChanges(hwc2_device_t *device, hwc2_display_t display);
90  static int32_t CreateLayer(hwc2_device_t *device, hwc2_display_t display,
91                             hwc2_layer_t *out_layer_id);
92  static int32_t CreateVirtualDisplay(hwc2_device_t *device, uint32_t width, uint32_t height,
93                                      int32_t *format, hwc2_display_t *out_display_id);
94  static int32_t DestroyLayer(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer);
95  static int32_t DestroyVirtualDisplay(hwc2_device_t *device, hwc2_display_t display);
96  static void Dump(hwc2_device_t *device, uint32_t *out_size, char *out_buffer);
97  static int32_t PresentDisplay(hwc2_device_t *device, hwc2_display_t display,
98                                int32_t *out_retire_fence);
99  static int32_t RegisterCallback(hwc2_device_t *device, int32_t descriptor,
100                                  hwc2_callback_data_t callback_data,
101                                  hwc2_function_pointer_t pointer);
102  static int32_t SetOutputBuffer(hwc2_device_t *device, hwc2_display_t display,
103                                 buffer_handle_t buffer, int32_t releaseFence);
104  static int32_t SetLayerZOrder(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
105                                uint32_t z);
106  static int32_t SetPowerMode(hwc2_device_t *device, hwc2_display_t display, int32_t int_mode);
107  static int32_t ValidateDisplay(hwc2_device_t *device, hwc2_display_t display,
108                                 uint32_t *out_num_types, uint32_t *out_num_requests);
109  static int32_t SetColorMode(hwc2_device_t *device, hwc2_display_t display,
110                              int32_t /*android_color_mode_t*/ int_mode);
111  static int32_t SetColorTransform(hwc2_device_t *device, hwc2_display_t display,
112                                   const float *matrix, int32_t /*android_color_transform_t*/ hint);
113
114 private:
115  static const int kExternalConnectionTimeoutMs = 500;
116  static const int kPartialUpdateControlTimeoutMs = 100;
117
118  // hwc methods
119  static int Open(const hw_module_t *module, const char *name, hw_device_t **device);
120  static int Close(hw_device_t *device);
121  static void GetCapabilities(struct hwc2_device *device, uint32_t *outCount,
122                              int32_t *outCapabilities);
123  static hwc2_function_pointer_t GetFunction(struct hwc2_device *device, int32_t descriptor);
124
125  // Uevent thread
126  static void *HWCUeventThread(void *context);
127  void *HWCUeventThreadHandler();
128  int GetEventValue(const char *uevent_data, int length, const char *event_info);
129  int HotPlugHandler(bool connected);
130  void ResetPanel();
131  int32_t ConnectDisplay(int disp);
132  int DisconnectDisplay(int disp);
133  int GetVsyncPeriod(int disp);
134
135  // QClient methods
136  virtual android::status_t notifyCallback(uint32_t command, const android::Parcel *input_parcel,
137                                           android::Parcel *output_parcel);
138  void DynamicDebug(const android::Parcel *input_parcel);
139  void SetFrameDumpConfig(const android::Parcel *input_parcel);
140  android::status_t SetMaxMixerStages(const android::Parcel *input_parcel);
141  android::status_t SetDisplayMode(const android::Parcel *input_parcel);
142  android::status_t SetSecondaryDisplayStatus(const android::Parcel *input_parcel,
143                                              android::Parcel *output_parcel);
144  android::status_t ToggleScreenUpdates(const android::Parcel *input_parcel,
145                                        android::Parcel *output_parcel);
146  android::status_t ConfigureRefreshRate(const android::Parcel *input_parcel);
147  android::status_t QdcmCMDHandler(const android::Parcel *input_parcel,
148                                   android::Parcel *output_parcel);
149  android::status_t ControlPartialUpdate(const android::Parcel *input_parcel, android::Parcel *out);
150  android::status_t OnMinHdcpEncryptionLevelChange(const android::Parcel *input_parcel,
151                                                   android::Parcel *output_parcel);
152  android::status_t SetPanelBrightness(const android::Parcel *input_parcel,
153                                       android::Parcel *output_parcel);
154  android::status_t GetPanelBrightness(const android::Parcel *input_parcel,
155                                       android::Parcel *output_parcel);
156  // These functions return the actual display config info as opposed to FB
157  android::status_t HandleSetActiveDisplayConfig(const android::Parcel *input_parcel,
158                                                 android::Parcel *output_parcel);
159  android::status_t HandleGetActiveDisplayConfig(const android::Parcel *input_parcel,
160                                                 android::Parcel *output_parcel);
161  android::status_t HandleGetDisplayConfigCount(const android::Parcel *input_parcel,
162                                                android::Parcel *output_parcel);
163  android::status_t HandleGetDisplayAttributesForConfig(const android::Parcel *input_parcel,
164                                                        android::Parcel *output_parcel);
165  android::status_t GetVisibleDisplayRect(const android::Parcel *input_parcel,
166                                          android::Parcel *output_parcel);
167
168  android::status_t SetDynamicBWForCamera(const android::Parcel *input_parcel,
169                                          android::Parcel *output_parcel);
170  android::status_t GetBWTransactionStatus(const android::Parcel *input_parcel,
171                                           android::Parcel *output_parcel);
172  android::status_t SetMixerResolution(const android::Parcel *input_parcel);
173
174  android::status_t SetColorModeOverride(const android::Parcel *input_parcel);
175
176  android::status_t SetColorModeById(const android::Parcel *input_parcel);
177
178  static Locker locker_;
179  CoreInterface *core_intf_ = NULL;
180  HWCDisplay *hwc_display_[HWC_NUM_DISPLAY_TYPES] = {NULL};
181  HWCCallbacks callbacks_;
182  pthread_t uevent_thread_;
183  bool uevent_thread_exit_ = false;
184  const char *uevent_thread_name_ = "HWC_UeventThread";
185  HWCBufferAllocator *buffer_allocator_;
186  HWCBufferSyncHandler buffer_sync_handler_;
187  HWCColorManager *color_mgr_ = NULL;
188  bool reset_panel_ = false;
189  bool secure_display_active_ = false;
190  bool external_pending_connect_ = false;
191  bool new_bw_mode_ = false;
192  bool need_invalidate_ = false;
193  int bw_mode_release_fd_ = -1;
194  qService::QService *qservice_ = NULL;
195  HWCSocketHandler socket_handler_;
196};
197
198}  // namespace sdm
199
200#endif  // __HWC_SESSION_H__
201