1 /* 2 * Copyright (C) 2010 The Android Open Source Project 3 * Copyright (C)2012-2016, The Linux Foundation. All rights reserved. 4 * 5 * Not a Contribution, Apache license notifications and license are retained 6 * for attribution purposes only. 7 * 8 * Licensed under the Apache License, Version 2.0 (the "License"); 9 * you may not use this file except in compliance with the License. 10 * You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, software 15 * distributed under the License is distributed on an "AS IS" BASIS, 16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17 * See the License for the specific language governing permissions and 18 * limitations under the License. 19 */ 20 21 #ifndef HWC_UTILS_H 22 #define HWC_UTILS_H 23 24 #define DEBUG_MDPDOWNSCALE 0 25 #define HWC_REMOVE_DEPRECATED_VERSIONS 1 26 27 #include <fcntl.h> 28 #include <math.h> 29 #include <hardware/hwcomposer.h> 30 #include <gr.h> 31 #include <gralloc_priv.h> 32 #include <utils/String8.h> 33 #include "qdMetaData.h" 34 #include "mdp_version.h" 35 #include <overlayUtils.h> 36 #include <overlayRotator.h> 37 #include <EGL/egl.h> 38 39 40 #define ALIGN_TO(x, align) (((x) + ((align)-1)) & ~((align)-1)) 41 #define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 42 #define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 43 #define MAX_NUM_APP_LAYERS 32 44 #define MIN_DISPLAY_XRES 200 45 #define MIN_DISPLAY_YRES 200 46 #define HWC_WFDDISPSYNC_LOG 0 47 #define STR(f) #f; 48 // Max number of PTOR layers handled 49 #define MAX_PTOR_LAYERS 2 50 51 #ifdef QTI_BSP 52 #include <exhwcomposer_defs.h> 53 #endif 54 55 //Fwrd decls 56 struct hwc_context_t; 57 58 namespace ovutils = overlay::utils; 59 60 namespace qmode { 61 class ModeManager; 62 } 63 64 namespace overlay { 65 class Overlay; 66 class Rotator; 67 class RotMgr; 68 } 69 70 namespace qhwc { 71 //fwrd decl 72 class QueuedBufferStore; 73 class HDMIDisplay; 74 class VirtualDisplay; 75 class IFBUpdate; 76 class IVideoOverlay; 77 class MDPComp; 78 class CopyBit; 79 class HwcDebug; 80 class AssertiveDisplay; 81 class HWCVirtualVDS; 82 83 84 struct MDPInfo { 85 int version; 86 char panel; 87 bool hasOverlay; 88 }; 89 90 struct DisplayAttributes { 91 uint32_t refreshRate; 92 uint32_t dynRefreshRate; 93 uint32_t vsync_period; //nanos 94 uint32_t xres; 95 uint32_t yres; 96 uint32_t stride; 97 float xdpi; 98 float ydpi; 99 uint32_t fbformat; 100 int fd; 101 bool connected; //Applies only to pluggable disp. 102 //Connected does not mean it ready to use. 103 //It should be active also. (UNBLANKED) 104 bool isActive; 105 // In pause state, composition is bypassed 106 // used for WFD displays and in QDCM calibration mode 107 bool isPause; 108 // To trigger padding round to clean up mdp 109 // pipes 110 bool isConfiguring; 111 // Indicates whether external/virtual display is in MDP scaling mode 112 bool mMDPScalingMode; 113 // Ext dst Rect 114 hwc_rect_t mDstRect; 115 //Action safe attributes 116 // Flag to indicate the presence of action safe dimensions for external 117 bool mActionSafePresent; 118 int mAsWidthRatio; 119 int mAsHeightRatio; 120 121 //If property fbsize set via adb shell debug.hwc.fbsize = XRESxYRES 122 //following fields are used. 123 bool customFBSize; 124 uint32_t xres_new; 125 uint32_t yres_new; 126 127 }; 128 129 struct ListStats { 130 int numAppLayers; //Total - 1, excluding FB layer. 131 int skipCount; 132 int fbLayerIndex; //Always last for now. = numAppLayers 133 //Video specific 134 int yuvCount; 135 int yuvIndices[MAX_NUM_APP_LAYERS]; 136 bool preMultipliedAlpha; 137 int yuv4k2kIndices[MAX_NUM_APP_LAYERS]; 138 int yuv4k2kCount; 139 // Notifies hwcomposer about the start and end of animation 140 // This will be set to true during animation, otherwise false. 141 bool isDisplayAnimating; 142 bool secureUI; // Secure display layer 143 bool isSecurePresent; 144 hwc_rect_t lRoi; //left ROI 145 hwc_rect_t rRoi; //right ROI. Unused in single DSI panels. 146 //App Buffer Composition index 147 int renderBufIndexforABC; 148 // Secure RGB specific 149 int secureRGBCount; 150 int secureRGBIndices[MAX_NUM_APP_LAYERS]; 151 //dyn refresh rate-Client requested refreshrate 152 uint32_t refreshRateRequest; 153 // Flag related to windowboxing feature 154 bool mAIVVideoMode; 155 }; 156 157 //PTOR Comp info 158 struct PtorInfo { 159 int count; 160 int layerIndex[MAX_PTOR_LAYERS]; 161 hwc_rect_t displayFrame[MAX_PTOR_LAYERS]; 162 bool isActive() { return (count>0); } 163 int getPTORArrayIndex(int index) { 164 int idx = -1; 165 for(int i = 0; i < count; i++) { 166 if(index == layerIndex[i]) 167 idx = i; 168 } 169 return idx; 170 } 171 }; 172 173 struct LayerProp { 174 uint32_t mFlags; //qcom specific layer flags 175 LayerProp():mFlags(0){}; 176 }; 177 178 struct VsyncState { 179 bool enable; 180 bool fakevsync; 181 bool debug; 182 }; 183 184 struct BwcPM { 185 static void setBwc(const hwc_rect_t& crop, const hwc_rect_t& dst, 186 const int& transform, const int& downscale, 187 ovutils::eMdpFlags& mdpFlags); 188 }; 189 190 // LayerProp::flag values 191 enum { 192 HWC_MDPCOMP = 0x00000001, 193 HWC_COPYBIT = 0x00000002, 194 }; 195 196 // AIV specific flags 197 enum { 198 HWC_AIV_VIDEO = 0x80000000, 199 HWC_AIV_CC = 0x40000000, 200 }; 201 202 // HAL specific features 203 enum { 204 HWC_COLOR_FILL = 0x00000008, 205 HWC_FORMAT_RB_SWAP = 0x00000040, 206 }; 207 208 /* External Display states */ 209 enum { 210 EXTERNAL_OFFLINE = 0, 211 EXTERNAL_ONLINE, 212 EXTERNAL_PAUSE, 213 EXTERNAL_RESUME, 214 EXTERNAL_MAXSTATES 215 }; 216 217 class LayerRotMap { 218 public: 219 LayerRotMap() { reset(); } 220 void add(hwc_layer_1_t* layer, overlay::Rotator *rot); 221 //Resets the mapping of layer to rotator 222 void reset(); 223 //Clears mappings and existing rotator fences 224 //Intended to be used during errors 225 void clear(); 226 uint32_t getCount() const; 227 hwc_layer_1_t* getLayer(uint32_t index) const; 228 overlay::Rotator* getRot(uint32_t index) const; 229 bool isRotCached(uint32_t index) const; 230 void setReleaseFd(const int& fence); 231 private: 232 hwc_layer_1_t* mLayer[overlay::RotMgr::MAX_ROT_SESS]; 233 overlay::Rotator* mRot[overlay::RotMgr::MAX_ROT_SESS]; 234 uint32_t mCount; 235 }; 236 237 inline uint32_t LayerRotMap::getCount() const { 238 return mCount; 239 } 240 241 inline hwc_layer_1_t* LayerRotMap::getLayer(uint32_t index) const { 242 if(index >= mCount) return NULL; 243 return mLayer[index]; 244 } 245 246 inline overlay::Rotator* LayerRotMap::getRot(uint32_t index) const { 247 if(index >= mCount) return NULL; 248 return mRot[index]; 249 } 250 251 inline hwc_rect_t integerizeSourceCrop(const hwc_frect_t& cropF) { 252 hwc_rect_t cropI = {0,0,0,0}; 253 cropI.left = int(ceilf(cropF.left)); 254 cropI.top = int(ceilf(cropF.top)); 255 cropI.right = int(floorf(cropF.right)); 256 cropI.bottom = int(floorf(cropF.bottom)); 257 return cropI; 258 } 259 260 inline bool isNonIntegralSourceCrop(const hwc_frect_t& cropF) { 261 if(cropF.left - roundf(cropF.left) || 262 cropF.top - roundf(cropF.top) || 263 cropF.right - roundf(cropF.right) || 264 cropF.bottom - roundf(cropF.bottom)) 265 return true; 266 else 267 return false; 268 } 269 270 // ----------------------------------------------------------------------------- 271 // Utility functions - implemented in hwc_utils.cpp 272 void dumpLayer(hwc_layer_1_t const* l); 273 void setListStats(hwc_context_t *ctx, hwc_display_contents_1_t *list, 274 int dpy); 275 void initContext(hwc_context_t *ctx); 276 void closeContext(hwc_context_t *ctx); 277 //Crops source buffer against destination and FB boundaries 278 void calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 279 const hwc_rect_t& scissor, int orient); 280 void getNonWormholeRegion(hwc_display_contents_1_t* list, 281 hwc_rect_t& nwr); 282 bool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer); 283 bool isSecureModePolicy(int mdpVersion); 284 // Returns true, if the input layer format is supported by rotator 285 bool isRotatorSupportedFormat(private_handle_t *hnd); 286 //Returns true, if the layer is YUV or the layer has been rendered by CPU 287 bool isRotationDoable(hwc_context_t *ctx, private_handle_t *hnd); 288 bool isExternalActive(hwc_context_t* ctx); 289 bool isAlphaScaled(hwc_layer_1_t const* layer); 290 bool needsScaling(hwc_layer_1_t const* layer); 291 bool isDownscaleRequired(hwc_layer_1_t const* layer); 292 bool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer, 293 const int& dpy); 294 void sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR, 295 private_handle_t *hnd); 296 bool isAlphaPresent(hwc_layer_1_t const* layer); 297 bool isAlphaPresentinFB(hwc_context_t* ctx, int dpy); 298 int hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable); 299 int getBlending(int blending); 300 bool isGLESOnlyComp(hwc_context_t *ctx, const int& dpy); 301 void reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers); 302 bool isAbcInUse(hwc_context_t *ctx); 303 304 void dumpBuffer(private_handle_t *ohnd, char *bufferName); 305 void updateDisplayInfo(hwc_context_t* ctx, int dpy); 306 void resetDisplayInfo(hwc_context_t* ctx, int dpy); 307 void initCompositionResources(hwc_context_t* ctx, int dpy); 308 void destroyCompositionResources(hwc_context_t* ctx, int dpy); 309 void clearPipeResources(hwc_context_t* ctx, int dpy); 310 311 //Helper function to dump logs 312 void dumpsys_log(android::String8& buf, const char* fmt, ...); 313 314 int getExtOrientation(hwc_context_t* ctx); 315 bool isValidRect(const hwc_rect_t& rect); 316 hwc_rect_t deductRect(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 317 bool isSameRect(const hwc_rect& rect1, const hwc_rect& rect2); 318 hwc_rect_t moveRect(const hwc_rect_t& rect, const int& x_off, const int& y_off); 319 hwc_rect_t getIntersection(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 320 hwc_rect_t getUnion(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 321 void optimizeLayerRects(const hwc_display_contents_1_t *list); 322 bool areLayersIntersecting(const hwc_layer_1_t* layer1, 323 const hwc_layer_1_t* layer2); 324 bool operator ==(const hwc_rect_t& lhs, const hwc_rect_t& rhs); 325 bool layerUpdating(const hwc_layer_1_t* layer); 326 /* Calculates the dirtyRegion for the given layer */ 327 hwc_rect_t calculateDirtyRect(const hwc_layer_1_t* layer, 328 hwc_rect_t& scissor); 329 330 331 // returns true if Action safe dimensions are set and target supports Actionsafe 332 bool isActionSafePresent(hwc_context_t *ctx, int dpy); 333 334 /* Calculates the destination position based on the action safe rectangle */ 335 void getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& dst); 336 337 void getAspectRatioPosition(hwc_context_t* ctx, int dpy, int extOrientation, 338 hwc_rect_t& inRect, hwc_rect_t& outRect); 339 340 uint32_t getRefreshRate(hwc_context_t* ctx, uint32_t requestedRefreshRate); 341 342 uint32_t roundOff(uint32_t refreshRate); 343 344 void setRefreshRate(hwc_context_t *ctx, int dpy, uint32_t refreshRate); 345 346 bool isPrimaryPortrait(hwc_context_t *ctx); 347 348 bool isOrientationPortrait(hwc_context_t *ctx); 349 350 void calcExtDisplayPosition(hwc_context_t *ctx, 351 private_handle_t *hnd, 352 int dpy, 353 hwc_rect_t& sourceCrop, 354 hwc_rect_t& displayFrame, 355 int& transform, 356 ovutils::eTransform& orient); 357 358 // Returns the orientation that needs to be set on external for 359 // BufferMirrirMode(Sidesync) 360 int getMirrorModeOrientation(hwc_context_t *ctx); 361 362 /* Get External State names */ 363 const char* getExternalDisplayState(uint32_t external_state); 364 365 // Resets display ROI to full panel resoluion 366 void resetROI(hwc_context_t *ctx, const int dpy); 367 368 // Aligns updating ROI to panel restrictions 369 hwc_rect_t getSanitizeROI(struct hwc_rect roi, hwc_rect boundary); 370 371 // Handles wfd Pause and resume events 372 void handle_pause(hwc_context_t *ctx, int dpy); 373 void handle_resume(hwc_context_t *ctx, int dpy); 374 375 // Handle ONLINE/OFFLINE for HDMI display 376 void handle_online(hwc_context_t* ctx, int dpy); 377 void handle_offline(hwc_context_t* ctx, int dpy); 378 379 //Close acquireFenceFds of all layers of incoming list 380 void closeAcquireFds(hwc_display_contents_1_t* list); 381 382 //Sync point impl. 383 int hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 384 int fd); 385 386 //Sets appropriate mdp flags for a layer. 387 void setMdpFlags(hwc_context_t *ctx, hwc_layer_1_t *layer, 388 ovutils::eMdpFlags &mdpFlags, 389 int rotDownscale, int transform); 390 391 int configRotator(overlay::Rotator *rot, ovutils::Whf& whf, 392 hwc_rect_t& crop, const ovutils::eMdpFlags& mdpFlags, 393 const ovutils::eTransform& orient, const int& downscale); 394 395 int configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg, 396 const ovutils::eTransform& orient, const hwc_rect_t& crop, 397 const hwc_rect_t& pos, const MetaData_t *metadata, 398 const ovutils::eDest& dest); 399 400 int configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 401 ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 402 const ovutils::eDest& dest); 403 404 void updateSource(ovutils::eTransform& orient, ovutils::Whf& whf, 405 hwc_rect_t& crop, overlay::Rotator *rot); 406 407 bool isZoomModeEnabled(hwc_rect_t crop); 408 void updateCropAIVVideoMode(hwc_context_t *ctx, hwc_rect_t& crop, int dpy); 409 void updateDestAIVVideoMode(hwc_context_t *ctx, hwc_rect_t& dst, int dpy); 410 void updateCoordinates(hwc_context_t *ctx, hwc_rect_t& crop, 411 hwc_rect_t& dst, int dpy); 412 413 //Routine to configure low resolution panels (<= 2048 width) 414 int configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 415 ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 416 const ovutils::eDest& dest, 417 overlay::Rotator **rot); 418 419 //Routine to configure high resolution panels (> 2048 width) 420 int configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 421 ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 422 const ovutils::eDest& lDest, 423 const ovutils::eDest& rDest, overlay::Rotator **rot); 424 425 //Routine to split and configure high resolution YUV layer (> 2048 width) 426 int configureSourceSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 427 const int& dpy, 428 ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 429 const ovutils::eDest& lDest, 430 const ovutils::eDest& rDest, overlay::Rotator **rot); 431 432 //On certain targets DMA pipes are used for rotation and they won't be available 433 //for line operations. On a per-target basis we can restrict certain use cases 434 //from using rotator, since we know before-hand that such scenarios can lead to 435 //extreme unavailability of pipes. This can also be done via hybrid calculations 436 //also involving many more variables like number of write-back interfaces etc, 437 //but the variety of scenarios is too high to warrant that. 438 bool canUseRotator(hwc_context_t *ctx, int dpy); 439 440 int getLeftSplit(hwc_context_t *ctx, const int& dpy); 441 442 bool isDisplaySplit(hwc_context_t* ctx, int dpy); 443 444 int getRotDownscale(hwc_context_t *ctx, const hwc_layer_1_t *layer); 445 446 // Set the GPU hint flag to high for MIXED/GPU composition only for 447 // first frame after MDP to GPU/MIXED mode transition. 448 // Set the GPU hint to default if the current composition type is GPU 449 // due to idle fallback or MDP composition. 450 void setGPUHint(hwc_context_t* ctx, hwc_display_contents_1_t* list); 451 452 bool loadEglLib(hwc_context_t* ctx); 453 454 // Returns true if rect1 is peripheral to rect2, false otherwise. 455 bool isPeripheral(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 456 457 // Checks if boot animation has completed and applies default mode 458 void processBootAnimCompleted(hwc_context_t *ctx); 459 460 // Inline utility functions 461 static inline bool isSkipLayer(const hwc_layer_1_t* l) { 462 return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER))); 463 } 464 465 static inline bool isAIVVideoLayer(const hwc_layer_1_t* l) { 466 return (UNLIKELY(l && (l->flags & HWC_AIV_VIDEO))); 467 } 468 469 static inline bool isAIVCCLayer(const hwc_layer_1_t* l) { 470 return (UNLIKELY(l && (l->flags & HWC_AIV_CC))); 471 } 472 473 // Returns true if the buffer is yuv 474 static inline bool isYuvBuffer(const private_handle_t* hnd) { 475 return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO)); 476 } 477 478 // Returns true if the buffer is yuv and exceeds the mixer width 479 static inline bool isYUVSplitNeeded(const private_handle_t* hnd) { 480 int maxMixerWidth = qdutils::MDPVersion::getInstance().getMaxMixerWidth(); 481 return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO) && 482 (hnd->width > maxMixerWidth)); 483 } 484 485 // Returns true if the buffer is secure 486 static inline bool isSecureBuffer(const private_handle_t* hnd) { 487 return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags)); 488 } 489 490 static inline bool isTileRendered(const private_handle_t* hnd) { 491 return (hnd && (private_handle_t::PRIV_FLAGS_TILE_RENDERED & hnd->flags)); 492 } 493 494 static inline bool isCPURendered(const private_handle_t* hnd) { 495 return (hnd && (private_handle_t::PRIV_FLAGS_CPU_RENDERED & hnd->flags)); 496 } 497 498 //Return true if the buffer is intended for Secure Display 499 static inline bool isSecureDisplayBuffer(const private_handle_t* hnd) { 500 return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY)); 501 } 502 503 static inline int getWidth(const private_handle_t* hnd) { 504 MetaData_t *metadata = reinterpret_cast<MetaData_t*>(hnd->base_metadata); 505 if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 506 return metadata->bufferDim.sliceWidth; 507 } 508 return hnd->width; 509 } 510 511 static inline int getHeight(const private_handle_t* hnd) { 512 MetaData_t *metadata = reinterpret_cast<MetaData_t*>(hnd->base_metadata); 513 if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 514 return metadata->bufferDim.sliceHeight; 515 } 516 return hnd->height; 517 } 518 519 template<typename T> inline T max(T a, T b) { return (a > b) ? a : b; } 520 template<typename T> inline T min(T a, T b) { return (a < b) ? a : b; } 521 522 // Initialize uevent thread 523 void init_uevent_thread(hwc_context_t* ctx); 524 // Initialize vsync thread 525 void init_vsync_thread(hwc_context_t* ctx); 526 527 inline void getLayerResolution(const hwc_layer_1_t* layer, 528 int& width, int& height) { 529 hwc_rect_t displayFrame = layer->displayFrame; 530 width = displayFrame.right - displayFrame.left; 531 height = displayFrame.bottom - displayFrame.top; 532 } 533 534 static inline int openFb(int dpy) { 535 int fd = -1; 536 const char *devtmpl = "/dev/graphics/fb%u"; 537 char name[64] = {0}; 538 snprintf(name, 64, devtmpl, dpy); 539 fd = open(name, O_RDWR); 540 return fd; 541 } 542 543 template <class T> 544 inline void swap(T& a, T& b) { 545 T tmp = a; 546 a = b; 547 b = tmp; 548 } 549 550 }; //qhwc namespace 551 552 enum eAnimationState{ 553 ANIMATION_STOPPED, 554 ANIMATION_STARTED, 555 }; 556 557 enum eCompositionState { 558 COMPOSITION_STATE_MDP = 0, // Set if composition type is MDP 559 COMPOSITION_STATE_GPU, // Set if composition type is GPU or MIXED 560 COMPOSITION_STATE_IDLE_FALLBACK, // Set if it is idlefallback 561 }; 562 563 // Structure holds the information about the GPU hint. 564 struct gpu_hint_info { 565 // system level flag to enable gpu_perf_mode 566 bool mGpuPerfModeEnable; 567 // Stores the current GPU performance mode DEFAULT/HIGH 568 uint32_t mCurrGPUPerfMode; 569 // Stores the compositon state GPU, MDP or IDLE_FALLBACK 570 bool mCompositionState; 571 // Stores the EGLContext of current process 572 EGLContext mEGLContext; 573 // Stores the EGLDisplay of current process 574 EGLDisplay mEGLDisplay; 575 }; 576 577 //struct holds the information about libmm-qdcm.so 578 struct qdcm_info { 579 qmode::ModeManager *mQdcmMode; 580 void *mQdcmLib; 581 bool mBootAnimCompleted; 582 }; 583 584 // ----------------------------------------------------------------------------- 585 // HWC context 586 // This structure contains overall state 587 struct hwc_context_t { 588 hwc_composer_device_1_t device; 589 const hwc_procs_t* proc; 590 591 //CopyBit objects 592 qhwc::CopyBit *mCopyBit[HWC_NUM_DISPLAY_TYPES]; 593 594 //Overlay object - NULL for non overlay devices 595 overlay::Overlay *mOverlay; 596 //Holds a few rot objects 597 overlay::RotMgr *mRotMgr; 598 599 //Primary and external FB updater 600 qhwc::IFBUpdate *mFBUpdate[HWC_NUM_DISPLAY_TYPES]; 601 // HDMI display related object. Used to configure/teardown 602 // HDMI when it is connected as primary or external. 603 qhwc::HDMIDisplay *mHDMIDisplay; 604 qhwc::MDPInfo mMDP; 605 qhwc::VsyncState vstate; 606 qhwc::DisplayAttributes dpyAttr[HWC_NUM_DISPLAY_TYPES]; 607 qhwc::ListStats listStats[HWC_NUM_DISPLAY_TYPES]; 608 qhwc::LayerProp *layerProp[HWC_NUM_DISPLAY_TYPES]; 609 qhwc::MDPComp *mMDPComp[HWC_NUM_DISPLAY_TYPES]; 610 qhwc::HwcDebug *mHwcDebug[HWC_NUM_DISPLAY_TYPES]; 611 hwc_rect_t mViewFrame[HWC_NUM_DISPLAY_TYPES]; 612 qhwc::AssertiveDisplay *mAD; 613 eAnimationState mAnimationState[HWC_NUM_DISPLAY_TYPES]; 614 qhwc::HWCVirtualVDS *mHWCVirtual; 615 616 // stores the #numHwLayers of the previous frame 617 // for each display device 618 int mPrevHwLayerCount[HWC_NUM_DISPLAY_TYPES]; 619 620 // stores the primary device orientation 621 int deviceOrientation; 622 //Securing in progress indicator 623 bool mSecuring; 624 //Display in secure mode indicator 625 bool mSecureMode; 626 //Lock to protect drawing data structures 627 mutable Locker mDrawLock; 628 //Drawing round when we use GPU 629 bool isPaddingRound; 630 // External Orientation 631 int mExtOrientation; 632 //Flags the transition of a video session 633 bool mVideoTransFlag; 634 //Used for SideSync feature 635 //which overrides the mExtOrientation 636 bool mBufferMirrorMode; 637 // Used to synchronize between WFD and Display modules 638 mutable Locker mWfdSyncLock; 639 640 qhwc::LayerRotMap *mLayerRotMap[HWC_NUM_DISPLAY_TYPES]; 641 // Panel reset flag will be set if BTA check fails 642 bool mPanelResetStatus; 643 // number of active Displays 644 int numActiveDisplays; 645 #ifdef QTI_BSP 646 void *mEglLib; 647 EGLBoolean (*mpfn_eglGpuPerfHintQCOM)(EGLDisplay, EGLContext, EGLint *); 648 EGLDisplay (*mpfn_eglGetCurrentDisplay)(); 649 EGLContext (*mpfn_eglGetCurrentContext)(); 650 struct gpu_hint_info mGPUHintInfo; 651 #endif 652 //App Buffer Composition 653 bool enableABC; 654 // PTOR Info 655 qhwc::PtorInfo mPtorInfo; 656 //Running in Thermal burst mode 657 bool mThermalBurstMode; 658 //Layers out of ROI 659 bool copybitDrop[MAX_NUM_APP_LAYERS]; 660 // Flag related to windowboxing feature 661 bool mWindowboxFeature; 662 // This denotes the tolerance between video layer and external display 663 // aspect ratio 664 float mAspectRatioToleranceLevel; 665 //Used to notify that boot has completed 666 bool mBootAnimCompleted; 667 // Provides a way for OEM's to disable setting dynfps via metadata. 668 bool mUseMetaDataRefreshRate; 669 //struct holds the information about display tuning service library. 670 struct qdcm_info mQdcmInfo; 671 }; 672 673 namespace qhwc { 674 static inline bool isSkipPresent (hwc_context_t *ctx, int dpy) { 675 return ctx->listStats[dpy].skipCount; 676 } 677 678 static inline bool isYuvPresent (hwc_context_t *ctx, int dpy) { 679 return ctx->listStats[dpy].yuvCount; 680 } 681 682 static inline bool has90Transform(hwc_layer_1_t const* layer) { 683 return ((layer->transform & HWC_TRANSFORM_ROT_90) && 684 !(layer->flags & HWC_COLOR_FILL)); 685 } 686 687 inline bool isSecurePresent(hwc_context_t *ctx, int dpy) { 688 return ctx->listStats[dpy].isSecurePresent; 689 } 690 691 static inline bool isSecondaryConfiguring(hwc_context_t* ctx) { 692 return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 693 ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring); 694 } 695 696 static inline bool isSecondaryConnected(hwc_context_t* ctx) { 697 return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected || 698 ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected); 699 } 700 701 static inline bool isSecondaryAnimating(hwc_context_t* ctx) { 702 return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected && 703 (!ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isPause) && 704 ctx->listStats[HWC_DISPLAY_EXTERNAL].isDisplayAnimating) 705 || 706 (ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected && 707 (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause) && 708 ctx->listStats[HWC_DISPLAY_VIRTUAL].isDisplayAnimating); 709 } 710 711 /* Return Virtual Display connection status */ 712 static inline bool isVDConnected(hwc_context_t* ctx) { 713 return ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected; 714 } 715 716 }; 717 718 #endif //HWC_UTILS_H 719