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_DISPLAY_H__ 21 #define __HWC_DISPLAY_H__ 22 23 #include <QService.h> 24 #include <core/core_interface.h> 25 #include <hardware/hwcomposer.h> 26 #include <private/color_params.h> 27 #include <qdMetaData.h> 28 #include <map> 29 #include <queue> 30 #include <set> 31 #include <string> 32 #include <utility> 33 #include <vector> 34 35 #include "hwc_buffer_allocator.h" 36 #include "hwc_callbacks.h" 37 #include "hwc_layers.h" 38 39 namespace sdm { 40 41 class BlitEngine; 42 class HWCToneMapper; 43 44 // Subclasses set this to their type. This has to be different from DisplayType. 45 // This is to avoid RTTI and dynamic_cast 46 enum DisplayClass { 47 DISPLAY_CLASS_PRIMARY, 48 DISPLAY_CLASS_EXTERNAL, 49 DISPLAY_CLASS_VIRTUAL, 50 DISPLAY_CLASS_NULL 51 }; 52 53 class HWCColorMode { 54 public: 55 explicit HWCColorMode(DisplayInterface *display_intf); 56 ~HWCColorMode() {} 57 HWC2::Error Init(); 58 HWC2::Error DeInit(); 59 void Dump(std::ostringstream* os); 60 uint32_t GetColorModeCount(); 61 HWC2::Error GetColorModes(uint32_t *out_num_modes, android_color_mode_t *out_modes); 62 HWC2::Error SetColorMode(android_color_mode_t mode); 63 HWC2::Error SetColorModeById(int32_t color_mode_id); 64 HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint); 65 66 private: 67 static const uint32_t kColorTransformMatrixCount = 16; 68 69 HWC2::Error HandleColorModeTransform(android_color_mode_t mode, 70 android_color_transform_t hint, const double *matrix); 71 void PopulateColorModes(); 72 void PopulateTransform(const android_color_mode_t &mode, 73 const std::string &color_mode, const std::string &color_transform); 74 template <class T> 75 void CopyColorTransformMatrix(const T *input_matrix, double *output_matrix) { 76 for (uint32_t i = 0; i < kColorTransformMatrixCount; i++) { 77 output_matrix[i] = static_cast<double>(input_matrix[i]); 78 } 79 } 80 HWC2::Error ApplyDefaultColorMode(); 81 82 DisplayInterface *display_intf_ = NULL; 83 android_color_mode_t current_color_mode_ = HAL_COLOR_MODE_NATIVE; 84 android_color_transform_t current_color_transform_ = HAL_COLOR_TRANSFORM_IDENTITY; 85 typedef std::map<android_color_transform_t, std::string> TransformMap; 86 std::map<android_color_mode_t, TransformMap> color_mode_transform_map_ = {}; 87 double color_matrix_[kColorTransformMatrixCount] = { 1.0, 0.0, 0.0, 0.0, \ 88 0.0, 1.0, 0.0, 0.0, \ 89 0.0, 0.0, 1.0, 0.0, \ 90 0.0, 0.0, 0.0, 1.0 }; 91 }; 92 93 class HWCDisplay : public DisplayEventHandler { 94 public: 95 virtual ~HWCDisplay() {} 96 virtual int Init(); 97 virtual int Deinit(); 98 99 // Framebuffer configurations 100 virtual void SetIdleTimeoutMs(uint32_t timeout_ms); 101 virtual void SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type); 102 virtual DisplayError SetMaxMixerStages(uint32_t max_mixer_stages); 103 virtual DisplayError ControlPartialUpdate(bool enable, uint32_t *pending) { 104 return kErrorNotSupported; 105 } 106 virtual HWC2::PowerMode GetLastPowerMode(); 107 virtual int SetFrameBufferResolution(uint32_t x_pixels, uint32_t y_pixels); 108 virtual void GetFrameBufferResolution(uint32_t *x_pixels, uint32_t *y_pixels); 109 virtual int SetDisplayStatus(uint32_t display_status); 110 virtual int OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level); 111 virtual int Perform(uint32_t operation, ...); 112 virtual void SetSecureDisplay(bool secure_display_active); 113 virtual DisplayError SetMixerResolution(uint32_t width, uint32_t height); 114 virtual DisplayError GetMixerResolution(uint32_t *width, uint32_t *height); 115 virtual void GetPanelResolution(uint32_t *width, uint32_t *height); 116 virtual std::string Dump(void); 117 118 // Captures frame output in the buffer specified by output_buffer_info. The API is 119 // non-blocking and the client is expected to check operation status later on. 120 // Returns -1 if the input is invalid. 121 virtual int FrameCaptureAsync(const BufferInfo &output_buffer_info, bool post_processed) { 122 return -1; 123 } 124 // Returns the status of frame capture operation requested with FrameCaptureAsync(). 125 // -EAGAIN : No status obtain yet, call API again after another frame. 126 // < 0 : Operation happened but failed. 127 // 0 : Success. 128 virtual int GetFrameCaptureStatus() { return -EAGAIN; } 129 130 virtual DisplayError SetDetailEnhancerConfig(const DisplayDetailEnhancerData &de_data) { 131 return kErrorNotSupported; 132 } 133 134 // Display Configurations 135 virtual int SetActiveDisplayConfig(int config); 136 virtual int GetActiveDisplayConfig(uint32_t *config); 137 virtual int GetDisplayConfigCount(uint32_t *count); 138 virtual int GetDisplayAttributesForConfig(int config, 139 DisplayConfigVariableInfo *display_attributes); 140 141 int SetPanelBrightness(int level); 142 int GetPanelBrightness(int *level); 143 int ToggleScreenUpdates(bool enable); 144 int ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload, PPDisplayAPIPayload *out_payload, 145 PPPendingParams *pending_action); 146 void SolidFillPrepare(); 147 void SolidFillCommit(); 148 DisplayClass GetDisplayClass(); 149 int GetVisibleDisplayRect(hwc_rect_t *rect); 150 void BuildLayerStack(void); 151 void BuildSolidFillStack(void); 152 HWCLayer *GetHWCLayer(hwc2_layer_t layer); 153 154 // HWC2 APIs 155 virtual HWC2::Error AcceptDisplayChanges(void); 156 virtual HWC2::Error GetActiveConfig(hwc2_config_t *out_config); 157 virtual HWC2::Error SetActiveConfig(hwc2_config_t config); 158 virtual HWC2::Error SetClientTarget(buffer_handle_t target, int32_t acquire_fence, 159 int32_t dataspace, hwc_region_t damage); 160 virtual HWC2::Error SetColorMode(android_color_mode_t mode) { 161 return HWC2::Error::Unsupported; 162 } 163 virtual HWC2::Error SetColorModeById(int32_t color_mode_id) { 164 return HWC2::Error::Unsupported; 165 } 166 virtual HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint) { 167 return HWC2::Error::Unsupported; 168 } 169 virtual HWC2::Error HandleColorModeTransform(android_color_mode_t mode, 170 android_color_transform_t hint, 171 const double *matrix) { 172 return HWC2::Error::Unsupported; 173 } 174 virtual HWC2::Error GetDisplayConfigs(uint32_t *out_num_configs, hwc2_config_t *out_configs); 175 virtual HWC2::Error GetDisplayAttribute(hwc2_config_t config, HWC2::Attribute attribute, 176 int32_t *out_value); 177 virtual HWC2::Error GetClientTargetSupport(uint32_t width, uint32_t height, int32_t format, 178 int32_t dataspace); 179 virtual HWC2::Error GetColorModes(uint32_t *outNumModes, android_color_mode_t *outModes); 180 virtual HWC2::Error GetChangedCompositionTypes(uint32_t *out_num_elements, 181 hwc2_layer_t *out_layers, int32_t *out_types); 182 virtual HWC2::Error GetDisplayRequests(int32_t *out_display_requests, uint32_t *out_num_elements, 183 hwc2_layer_t *out_layers, int32_t *out_layer_requests); 184 virtual HWC2::Error GetDisplayName(uint32_t *out_size, char *out_name); 185 virtual HWC2::Error GetDisplayType(int32_t *out_type); 186 virtual HWC2::Error SetCursorPosition(hwc2_layer_t layer, int x, int y); 187 virtual HWC2::Error SetVsyncEnabled(HWC2::Vsync enabled); 188 virtual HWC2::Error SetPowerMode(HWC2::PowerMode mode); 189 virtual HWC2::Error CreateLayer(hwc2_layer_t *out_layer_id); 190 virtual HWC2::Error DestroyLayer(hwc2_layer_t layer_id); 191 virtual HWC2::Error SetLayerZOrder(hwc2_layer_t layer_id, uint32_t z); 192 virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests) = 0; 193 virtual HWC2::Error GetReleaseFences(uint32_t *out_num_elements, hwc2_layer_t *out_layers, 194 int32_t *out_fences); 195 virtual HWC2::Error Present(int32_t *out_retire_fence) = 0; 196 virtual HWC2::Error GetHdrCapabilities(uint32_t *out_num_types, int32_t* out_types, 197 float* out_max_luminance, 198 float* out_max_average_luminance, 199 float* out_min_luminance); 200 201 bool validated_ = false; 202 bool skip_validate_ = false; 203 uint32_t geometry_changes_ = GeometryChanges::kNone; 204 205 protected: 206 enum DisplayStatus { 207 kDisplayStatusOffline = 0, 208 kDisplayStatusOnline, 209 kDisplayStatusPause, 210 kDisplayStatusResume, 211 }; 212 213 // Maximum number of layers supported by display manager. 214 static const uint32_t kMaxLayerCount = 32; 215 216 HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, DisplayType type, hwc2_display_t id, 217 bool needs_blit, qService::QService *qservice, DisplayClass display_class, 218 BufferAllocator *buffer_allocator); 219 220 // DisplayEventHandler methods 221 virtual DisplayError VSync(const DisplayEventVSync &vsync); 222 virtual DisplayError Refresh(); 223 virtual DisplayError CECMessage(char *message); 224 virtual void DumpOutputBuffer(const BufferInfo &buffer_info, void *base, int fence); 225 virtual HWC2::Error PrepareLayerStack(uint32_t *out_num_types, uint32_t *out_num_requests); 226 virtual HWC2::Error CommitLayerStack(void); 227 virtual HWC2::Error PostCommitLayerStack(int32_t *out_retire_fence); 228 virtual DisplayError DisablePartialUpdateOneFrame() { 229 return kErrorNotSupported; 230 } 231 LayerBufferFormat GetSDMFormat(const int32_t &source, const int flags); 232 const char *GetDisplayString(); 233 void MarkLayersForGPUBypass(void); 234 void MarkLayersForClientComposition(void); 235 virtual void ApplyScanAdjustment(hwc_rect_t *display_frame); 236 bool SingleLayerUpdating(void); 237 bool IsSurfaceUpdated(const std::vector<LayerRect> &dirty_regions); 238 bool IsLayerUpdating(const Layer *layer); 239 uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate); 240 virtual void CloseAcquireFds(); 241 virtual void GetUnderScanConfig() { } 242 243 enum { 244 INPUT_LAYER_DUMP, 245 OUTPUT_LAYER_DUMP, 246 }; 247 248 CoreInterface *core_intf_ = nullptr; 249 HWCCallbacks *callbacks_ = nullptr; 250 HWCBufferAllocator *buffer_allocator_ = NULL; 251 DisplayType type_; 252 hwc2_display_t id_; 253 bool needs_blit_ = false; 254 DisplayInterface *display_intf_ = NULL; 255 LayerStack layer_stack_; 256 HWCLayer *client_target_ = nullptr; // Also known as framebuffer target 257 std::map<hwc2_layer_t, HWCLayer *> layer_map_; // Look up by Id - TODO 258 std::multiset<HWCLayer *, SortLayersByZ> layer_set_; // Maintain a set sorted by Z 259 std::map<hwc2_layer_t, HWC2::Composition> layer_changes_; 260 std::map<hwc2_layer_t, HWC2::LayerRequest> layer_requests_; 261 bool flush_on_error_ = false; 262 bool flush_ = false; 263 uint32_t dump_frame_count_ = 0; 264 uint32_t dump_frame_index_ = 0; 265 bool dump_input_layers_ = false; 266 HWC2::PowerMode last_power_mode_; 267 bool swap_interval_zero_ = false; 268 bool display_paused_ = false; 269 uint32_t min_refresh_rate_ = 0; 270 uint32_t max_refresh_rate_ = 0; 271 uint32_t current_refresh_rate_ = 0; 272 bool use_metadata_refresh_rate_ = false; 273 uint32_t metadata_refresh_rate_ = 0; 274 uint32_t force_refresh_rate_ = 0; 275 bool boot_animation_completed_ = false; 276 bool shutdown_pending_ = false; 277 bool use_blit_comp_ = false; 278 bool secure_display_active_ = false; 279 bool skip_prepare_ = false; 280 bool solid_fill_enable_ = false; 281 Layer *solid_fill_layer_ = NULL; 282 LayerRect solid_fill_rect_ = {}; 283 uint32_t solid_fill_color_ = 0; 284 LayerRect display_rect_; 285 bool color_tranform_failed_ = false; 286 HWCColorMode *color_mode_ = NULL; 287 HWCToneMapper *tone_mapper_ = nullptr; 288 int disable_hdr_handling_ = 0; // disables HDR handling. 289 290 private: 291 void DumpInputBuffers(void); 292 bool CanSkipValidate(); 293 qService::QService *qservice_ = NULL; 294 DisplayClass display_class_; 295 }; 296 297 inline int HWCDisplay::Perform(uint32_t operation, ...) { 298 return 0; 299 } 300 301 } // namespace sdm 302 303 #endif // __HWC_DISPLAY_H__ 304