Home | History | Annotate | Download | only in hwc2
      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 
     35 namespace sdm {
     36 
     37 class 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