18089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch/*
28089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
38089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Not a Contribution.
48089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
58089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Copyright 2015 The Android Open Source Project
68089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
78089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Licensed under the Apache License, Version 2.0 (the "License");
88089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * you may not use this file except in compliance with the License.
98089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * You may obtain a copy of the License at
108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *      http://www.apache.org/licenses/LICENSE-2.0
128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Unless required by applicable law or agreed to in writing, software
148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * distributed under the License is distributed on an "AS IS" BASIS,
158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * See the License for the specific language governing permissions and
178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * limitations under the License.
188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch */
198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#ifndef __HWC_DISPLAY_H__
218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#define __HWC_DISPLAY_H__
228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <QService.h>
2452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <core/core_interface.h>
2552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <hardware/hwcomposer.h>
268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <private/color_params.h>
2752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <qdMetaData.h>
288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <map>
298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <queue>
3052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <set>
3152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <string>
328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <utility>
3352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <vector>
3452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
356457d5b6b5201fc37f9c9b01b1f4102f338a2fdfNaseer Ahmed#include "hwc_buffer_allocator.h"
368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_callbacks.h"
378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_layers.h"
388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschnamespace sdm {
408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschclass BlitEngine;
428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch// Subclasses set this to their type. This has to be different from DisplayType.
448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch// This is to avoid RTTI and dynamic_cast
458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschenum DisplayClass {
468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DISPLAY_CLASS_PRIMARY,
478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DISPLAY_CLASS_EXTERNAL,
488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DISPLAY_CLASS_VIRTUAL,
498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DISPLAY_CLASS_NULL
508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch};
518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschclass HWCColorMode {
5352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch public:
5452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  explicit HWCColorMode(DisplayInterface *display_intf);
5552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  ~HWCColorMode() {}
5652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  HWC2::Error Init();
5752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  HWC2::Error DeInit();
5852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  uint32_t GetColorModeCount();
59efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  HWC2::Error GetColorModes(uint32_t *out_num_modes, android_color_mode_t *out_modes);
60efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  HWC2::Error SetColorMode(android_color_mode_t mode);
6152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint);
6252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
6352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch private:
6452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  static const uint32_t kColorTransformMatrixCount = 16;
6552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
66efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  HWC2::Error HandleColorModeTransform(android_color_mode_t mode,
6752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                       android_color_transform_t hint, const double *matrix);
6852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  void PopulateColorModes();
69efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  void PopulateTransform(const android_color_mode_t &mode, const std::string &color_mode);
7052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  template <class T>
7152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  void CopyColorTransformMatrix(const T *input_matrix, double *output_matrix) {
7252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    for (uint32_t i = 0; i < kColorTransformMatrixCount; i++) {
7352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch      output_matrix[i] = static_cast<double>(input_matrix[i]);
7452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    }
7552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  }
7652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
7752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  DisplayInterface *display_intf_ = NULL;
78efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  android_color_mode_t current_color_mode_ = HAL_COLOR_MODE_NATIVE;
7952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  android_color_transform_t current_color_transform_ = HAL_COLOR_TRANSFORM_IDENTITY;
8052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  typedef std::map<android_color_transform_t, std::string> TransformMap;
81efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  std::map<android_color_mode_t, TransformMap> color_mode_transform_map_ = {};
8252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  double color_matrix_[kColorTransformMatrixCount] = {0};
8352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch};
8452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschclass HWCDisplay : public DisplayEventHandler {
868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch public:
878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual ~HWCDisplay() {}
888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int Init();
898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int Deinit();
908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Framebuffer configurations
928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void SetIdleTimeoutMs(uint32_t timeout_ms);
938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void SetFrameDumpConfig(uint32_t count, uint32_t bit_mask_layer_type);
948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual DisplayError SetMaxMixerStages(uint32_t max_mixer_stages);
9529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  virtual DisplayError ControlPartialUpdate(bool enable, uint32_t *pending) {
9629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    return kErrorNotSupported;
9729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  }
988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::PowerMode GetLastPowerMode();
998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int SetFrameBufferResolution(uint32_t x_pixels, uint32_t y_pixels);
1008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void GetFrameBufferResolution(uint32_t *x_pixels, uint32_t *y_pixels);
1018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int SetDisplayStatus(uint32_t display_status);
1028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int OnMinHdcpEncryptionLevelChange(uint32_t min_enc_level);
1038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int Perform(uint32_t operation, ...);
1048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void SetSecureDisplay(bool secure_display_active);
10529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  virtual DisplayError SetMixerResolution(uint32_t width, uint32_t height);
10629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  virtual DisplayError GetMixerResolution(uint32_t *width, uint32_t *height);
10729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  virtual void GetPanelResolution(uint32_t *width, uint32_t *height);
10852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  virtual std::string Dump(void);
1098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Captures frame output in the buffer specified by output_buffer_info. The API is
1118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // non-blocking and the client is expected to check operation status later on.
1128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Returns -1 if the input is invalid.
1138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int FrameCaptureAsync(const BufferInfo &output_buffer_info, bool post_processed) {
1148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -1;
1158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Returns the status of frame capture operation requested with FrameCaptureAsync().
1178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // -EAGAIN : No status obtain yet, call API again after another frame.
1188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // < 0 : Operation happened but failed.
1198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // 0 : Success.
1208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int GetFrameCaptureStatus() { return -EAGAIN; }
1218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Display Configurations
1238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int SetActiveDisplayConfig(int config);
1248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int GetActiveDisplayConfig(uint32_t *config);
1258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual int GetDisplayConfigCount(uint32_t *count);
12629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  virtual int GetDisplayAttributesForConfig(int config,
12729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                            DisplayConfigVariableInfo *display_attributes);
1288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int SetPanelBrightness(int level);
1308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int GetPanelBrightness(int *level);
1318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ToggleScreenUpdates(bool enable);
1328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ColorSVCRequestRoute(const PPDisplayAPIPayload &in_payload, PPDisplayAPIPayload *out_payload,
1338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                           PPPendingParams *pending_action);
13476b754cff2be01f754ec43e021b86d92f4922d06Naseer Ahmed  void SolidFillPrepare();
13576b754cff2be01f754ec43e021b86d92f4922d06Naseer Ahmed  void SolidFillCommit();
1368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayClass GetDisplayClass();
1378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int GetVisibleDisplayRect(hwc_rect_t *rect);
1388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  void BuildLayerStack(void);
13976b754cff2be01f754ec43e021b86d92f4922d06Naseer Ahmed  void BuildSolidFillStack(void);
1408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCLayer *GetHWCLayer(hwc2_layer_t layer);
1418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // HWC2 APIs
1438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error AcceptDisplayChanges(void);
1448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetActiveConfig(hwc2_config_t *out_config);
1458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error SetActiveConfig(hwc2_config_t config);
1468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error SetClientTarget(buffer_handle_t target, int32_t acquire_fence,
14729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                      int32_t dataspace, hwc_region_t damage);
148efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  virtual HWC2::Error SetColorMode(android_color_mode_t mode) {
14952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    return HWC2::Error::Unsupported;
15052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  }
15152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  virtual HWC2::Error SetColorTransform(const float *matrix, android_color_transform_t hint) {
15252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    return HWC2::Error::Unsupported;
15352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  }
154efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  virtual HWC2::Error HandleColorModeTransform(android_color_mode_t mode,
15552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                               android_color_transform_t hint,
15652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                               const double *matrix) {
15752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    return HWC2::Error::Unsupported;
15852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  }
1598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetDisplayConfigs(uint32_t *out_num_configs, hwc2_config_t *out_configs);
1608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetDisplayAttribute(hwc2_config_t config, HWC2::Attribute attribute,
1618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                          int32_t *out_value);
1628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetClientTargetSupport(uint32_t width, uint32_t height, int32_t format,
1638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                             int32_t dataspace);
164efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  virtual HWC2::Error GetColorModes(uint32_t *outNumModes, android_color_mode_t *outModes);
1658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetChangedCompositionTypes(uint32_t *out_num_elements,
1668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                 hwc2_layer_t *out_layers, int32_t *out_types);
1678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetDisplayRequests(int32_t *out_display_requests, uint32_t *out_num_elements,
1688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         hwc2_layer_t *out_layers, int32_t *out_layer_requests);
1698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetDisplayName(uint32_t *out_size, char *out_name);
1708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetDisplayType(int32_t *out_type);
1718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error SetCursorPosition(hwc2_layer_t layer, int x, int y);
1728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error SetVsyncEnabled(HWC2::Vsync enabled);
1738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error SetPowerMode(HWC2::PowerMode mode);
1748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error CreateLayer(hwc2_layer_t *out_layer_id);
1758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error DestroyLayer(hwc2_layer_t layer_id);
1768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error SetLayerZOrder(hwc2_layer_t layer_id, uint32_t z);
1778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error Validate(uint32_t *out_num_types, uint32_t *out_num_requests) = 0;
1788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error GetReleaseFences(uint32_t *out_num_elements, hwc2_layer_t *out_layers,
1798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       int32_t *out_fences);
1808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error Present(int32_t *out_retire_fence) = 0;
1818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
182503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed bool validated_ = false;
183503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed bool skip_validate_ = false;
184503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed uint32_t geometry_changes_ = GeometryChanges::kNone;
185503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed
1868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch protected:
1878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  enum DisplayStatus {
1888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    kDisplayStatusOffline = 0,
1898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    kDisplayStatusOnline,
1908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    kDisplayStatusPause,
1918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    kDisplayStatusResume,
1928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  };
1938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Maximum number of layers supported by display manager.
1958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  static const uint32_t kMaxLayerCount = 32;
1968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCDisplay(CoreInterface *core_intf, HWCCallbacks *callbacks, DisplayType type, hwc2_display_t id,
198b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed             bool needs_blit, qService::QService *qservice, DisplayClass display_class,
199b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed             BufferAllocator *buffer_allocator);
2008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // DisplayEventHandler methods
2028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual DisplayError VSync(const DisplayEventVSync &vsync);
2038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual DisplayError Refresh();
2048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual DisplayError CECMessage(char *message);
2058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void DumpOutputBuffer(const BufferInfo &buffer_info, void *base, int fence);
2068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error PrepareLayerStack(uint32_t *out_num_types, uint32_t *out_num_requests);
2078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error CommitLayerStack(void);
2088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual HWC2::Error PostCommitLayerStack(int32_t *out_retire_fence);
20929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  virtual DisplayError DisablePartialUpdateOneFrame() {
21029e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    return kErrorNotSupported;
21129e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  }
2128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  LayerBufferFormat GetSDMFormat(const int32_t &source, const int flags);
2138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  const char *GetHALPixelFormatString(int format);
2148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  const char *GetDisplayString();
2158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  void MarkLayersForGPUBypass(void);
21652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  void MarkLayersForClientComposition(void);
2178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void ApplyScanAdjustment(hwc_rect_t *display_frame);
2188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool SingleLayerUpdating(void);
21929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  bool IsSurfaceUpdated(const std::vector<LayerRect> &dirty_regions);
22029e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  bool IsLayerUpdating(const Layer *layer);
2218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate);
2228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  virtual void CloseAcquireFds();
2238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  enum {
2258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    INPUT_LAYER_DUMP,
2268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    OUTPUT_LAYER_DUMP,
2278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  };
2288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
22975223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch  CoreInterface *core_intf_ = nullptr;
23075223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch  HWCCallbacks *callbacks_  = nullptr;
2316457d5b6b5201fc37f9c9b01b1f4102f338a2fdfNaseer Ahmed  HWCBufferAllocator *buffer_allocator_ = NULL;
2328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayType type_;
2338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_display_t id_;
2348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool needs_blit_ = false;
2358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayInterface *display_intf_ = NULL;
2368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  LayerStack layer_stack_;
23775223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch  HWCLayer *client_target_ = nullptr;                   // Also known as framebuffer target
2388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  std::map<hwc2_layer_t, HWCLayer *> layer_map_;        // Look up by Id - TODO
2398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  std::multiset<HWCLayer *, SortLayersByZ> layer_set_;  // Maintain a set sorted by Z
2408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  std::map<hwc2_layer_t, HWC2::Composition> layer_changes_;
2418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  std::map<hwc2_layer_t, HWC2::LayerRequest> layer_requests_;
2428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool flush_on_error_ = false;
2438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool flush_ = false;
2448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t dump_frame_count_ = 0;
2458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t dump_frame_index_ = 0;
2468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool dump_input_layers_ = false;
2478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWC2::PowerMode last_power_mode_;
2488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool swap_interval_zero_ = false;
2498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool display_paused_ = false;
2508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t min_refresh_rate_ = 0;
2518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t max_refresh_rate_ = 0;
2528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t current_refresh_rate_ = 0;
2538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool use_metadata_refresh_rate_ = false;
2548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t metadata_refresh_rate_ = 0;
2558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t force_refresh_rate_ = 0;
2568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool boot_animation_completed_ = false;
2578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool shutdown_pending_ = false;
2588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool use_blit_comp_ = false;
2598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool secure_display_active_ = false;
2608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool skip_prepare_ = false;
2618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool solid_fill_enable_ = false;
26276b754cff2be01f754ec43e021b86d92f4922d06Naseer Ahmed  Layer *solid_fill_layer_ = NULL;
26376b754cff2be01f754ec43e021b86d92f4922d06Naseer Ahmed  LayerRect solid_fill_rect_ = {};
2648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t solid_fill_color_ = 0;
2658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  LayerRect display_rect_;
26652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  bool color_tranform_failed_ = false;
26752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  HWCColorMode *color_mode_ = NULL;
2688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch private:
2708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  void DumpInputBuffers(void);
271503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed  bool CanSkipValidate();
2728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  qService::QService *qservice_ = NULL;
2738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayClass display_class_;
2748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch};
2758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschinline int HWCDisplay::Perform(uint32_t operation, ...) {
2778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
2788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}  // namespace sdm
2818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#endif  // __HWC_DISPLAY_H__
283