1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 3f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R * Copyright (C)2012-2014, The Linux Foundation. All rights reserved. 44019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * 54019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained 64019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * for attribution purposes only. 7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License. 10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at 11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and 18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License. 19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#ifndef HWC_UTILS_H 22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define HWC_UTILS_H 231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 24660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define HWC_REMOVE_DEPRECATED_VERSIONS 1 252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah#include <fcntl.h> 268f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah#include <math.h> 27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <hardware/hwcomposer.h> 2877d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed#include <gr.h> 291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h> 3093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed#include <utils/String8.h> 31327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include "qdMetaData.h" 32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayUtils.h> 339c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed#include <EGL/egl.h> 345a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed#include <QService.h> 359c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed 36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 37bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define ALIGN_TO(x, align) (((x) + ((align)-1)) & ~((align)-1)) 38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 39befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 40d9381b134ed518570554296fbfab8fd1175ecdb8Ramkumar Radhakrishnan#define MAX_NUM_APP_LAYERS 32 41f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi#define MIN_DISPLAY_XRES 200 42f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi#define MIN_DISPLAY_YRES 200 43e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal#define HWC_WFDDISPSYNC_LOG 0 44e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal#define STR(f) #f; 45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//Fwrd decls 47befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t; 481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 49327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace ovutils = overlay::utils; 50327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmednamespace overlay { 521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass Overlay; 53327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahclass Rotator; 54327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahclass RotMgr; 551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace qhwc { 581589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//fwrd decl 591589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass QueuedBufferStore; 60b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedclass ExternalDisplay; 61361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranclass VirtualDisplay; 62640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahclass IFBUpdate; 63327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahclass IVideoOverlay; 64c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahclass MDPComp; 654019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.Rclass CopyBit; 66c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnanclass HwcDebug; 67f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shahclass AssertiveDisplay; 68140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanclass HWCVirtualBase; 69b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed 7004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 71b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedstruct MDPInfo { 72b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed int version; 73b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed char panel; 74b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed bool hasOverlay; 75b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed}; 76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct DisplayAttributes { 782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t vsync_period; //nanos 792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t xres; 802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t yres; 8116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed uint32_t stride; 8279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed float xdpi; 8379e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed float ydpi; 842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fd; 8576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah bool connected; //Applies only to pluggable disp. 8676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //Connected does not mean it ready to use. 8776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //It should be active also. (UNBLANKED) 882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah bool isActive; 8990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // In pause state, composition is bypassed 9090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // used for WFD displays only 9190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar bool isPause; 92361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // To trigger padding round to clean up mdp 93361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // pipes 94361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran bool isConfiguring; 95fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // External Display is in MDP Downscale mode indicator 96fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar bool mDownScaleMode; 97ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R // Ext dst Rect 98ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R hwc_rect_t mDstRect; 99ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan //Action safe attributes 100ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan // Flag to indicate the presence of action safe dimensions for external 101ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan bool mActionSafePresent; 102ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan int mAsWidthRatio; 103ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan int mAsHeightRatio; 104f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 105f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi //If property fbsize set via adb shell debug.hwc.fbsize = XRESxYRES 106f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi //following fields are used. 107f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi bool customFBSize; 108f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi uint32_t xres_orig; 109f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi uint32_t yres_orig; 110f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 111bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; 1122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 1132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct ListStats { 1142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int numAppLayers; //Total - 1, excluding FB layer. 1152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int skipCount; 1162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fbLayerIndex; //Always last for now. = numAppLayers 1172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //Video specific 1182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int yuvCount; 119d9381b134ed518570554296fbfab8fd1175ecdb8Ramkumar Radhakrishnan int yuvIndices[MAX_NUM_APP_LAYERS]; 120eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R int extOnlyLayerIndex; 1215c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N bool preMultipliedAlpha; 12215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int yuv4k2kIndices[MAX_NUM_APP_LAYERS]; 12315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int yuv4k2kCount; 124a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // Notifies hwcomposer about the start and end of animation 125a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // This will be set to true during animation, otherwise false. 126a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan bool isDisplayAnimating; 1271b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan bool secureUI; // Secure display layer 12894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah bool isSecurePresent; 129c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t lRoi; //left ROI 130c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran hwc_rect_t rRoi; //right ROI. Unused in single DSI panels. 131bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; 132bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 13316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedstruct LayerProp { 13416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed uint32_t mFlags; //qcom specific layer flags 135bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran LayerProp():mFlags(0){}; 13616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}; 13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 13810d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmedstruct VsyncState { 13910d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed bool enable; 14010d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed bool fakevsync; 14110d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed}; 14210d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed 143f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shahstruct BwcPM { 144404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R static void setBwc(const hwc_rect_t& crop, 145f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah const hwc_rect_t& dst, const int& transform, 146f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah ovutils::eMdpFlags& mdpFlags); 147f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah}; 148f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah 14916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed// LayerProp::flag values 150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedenum { 15116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed HWC_MDPCOMP = 0x00000001, 15204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed HWC_COPYBIT = 0x00000002, 153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; 154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 155f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan// HAL specific features 156f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhanenum { 157905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan HWC_COLOR_FILL = 0x00000008, 158f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan HWC_FORMAT_RB_SWAP = 0x00000040, 159f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan}; 160f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan 161e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal/* External Display states */ 162e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamalenum { 163e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal EXTERNAL_OFFLINE = 0, 164e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal EXTERNAL_ONLINE, 165e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal EXTERNAL_PAUSE, 166e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal EXTERNAL_RESUME, 167e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal EXTERNAL_MAXSTATES 168e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal}; 169e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal 17043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahclass LayerRotMap { 17143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahpublic: 17243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah LayerRotMap() { reset(); } 17343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah enum { MAX_SESS = 3 }; 17443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah void add(hwc_layer_1_t* layer, overlay::Rotator *rot); 175b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //Resets the mapping of layer to rotator 17643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah void reset(); 177b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //Clears mappings and existing rotator fences 178b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //Intended to be used during errors 179b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah void clear(); 18043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah uint32_t getCount() const; 18143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah hwc_layer_1_t* getLayer(uint32_t index) const; 18243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah overlay::Rotator* getRot(uint32_t index) const; 18343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah void setReleaseFd(const int& fence); 18443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahprivate: 18543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah hwc_layer_1_t* mLayer[MAX_SESS]; 18643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah overlay::Rotator* mRot[MAX_SESS]; 18743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah uint32_t mCount; 18843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah}; 18943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 19043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahinline uint32_t LayerRotMap::getCount() const { 19143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah return mCount; 19243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah} 19343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 19443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahinline hwc_layer_1_t* LayerRotMap::getLayer(uint32_t index) const { 19543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah if(index >= mCount) return NULL; 19643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah return mLayer[index]; 19743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah} 19843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 19943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahinline overlay::Rotator* LayerRotMap::getRot(uint32_t index) const { 20043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah if(index >= mCount) return NULL; 20143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah return mRot[index]; 20243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah} 20343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 2048f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shahinline hwc_rect_t integerizeSourceCrop(const hwc_frect_t& cropF) { 2053d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu hwc_rect_t cropI = {0,0,0,0}; 2068f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.left = int(ceilf(cropF.left)); 2078f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.top = int(ceilf(cropF.top)); 2088f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.right = int(floorf(cropF.right)); 2098f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.bottom = int(floorf(cropF.bottom)); 2108f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah return cropI; 2118f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah} 2128f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah 21380864f9daffae7750e05efe41f63e029f5699511Naseer Ahmedinline bool isNonIntegralSourceCrop(const hwc_frect_t& cropF) { 21480864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed if(cropF.left - roundf(cropF.left) || 21580864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed cropF.top - roundf(cropF.top) || 21680864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed cropF.right - roundf(cropF.right) || 21780864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed cropF.bottom - roundf(cropF.bottom)) 21880864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return true; 21980864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed else 22080864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return false; 22180864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed} 22280864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed 223befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// ----------------------------------------------------------------------------- 224befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Utility functions - implemented in hwc_utils.cpp 225660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l); 2261e8bb08f0275c3acef37838114ab2b37ae814f13Ramkumar Radhakrishnan 2271e8bb08f0275c3acef37838114ab2b37ae814f13Ramkumar Radhakrishnan// Calculate viewframe for external/primary display from primary resolution and 2281e8bb08f0275c3acef37838114ab2b37ae814f13Ramkumar Radhakrishnan// primary device orientation 2291e8bb08f0275c3acef37838114ab2b37ae814f13Ramkumar Radhakrishnanhwc_rect_t calculateDisplayViewFrame(hwc_context_t *ctx, int dpy); 2301e8bb08f0275c3acef37838114ab2b37ae814f13Ramkumar Radhakrishnan 2316289b315a26aede5ac12b89e65d8024b1ed0dd05Saurabh Shahvoid setListStats(hwc_context_t *ctx, hwc_display_contents_1_t *list, 2322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int dpy); 233befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid initContext(hwc_context_t *ctx); 234befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid closeContext(hwc_context_t *ctx); 235ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed//Crops source buffer against destination and FB boundaries 236ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 237c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran const hwc_rect_t& scissor, int orient); 23804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedvoid getNonWormholeRegion(hwc_display_contents_1_t* list, 23904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hwc_rect_t& nwr); 240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer); 2416b90a0c838871669457f5f81361ec062feb7539dSushil Chauhanbool isSecureModePolicy(int mdpVersion); 2422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahbool isExternalActive(hwc_context_t* ctx); 24386c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool isAlphaScaled(hwc_layer_1_t const* layer); 24486c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool needsScaling(hwc_layer_1_t const* layer); 24586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool isDownscaleRequired(hwc_layer_1_t const* layer); 24644625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhanbool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer, 24744625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan const int& dpy); 24844625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhanvoid sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR, 24944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan private_handle_t *hnd); 250a6b4d9570f8cc6d57f8b4f724c06e6ec6877b4a4Sravan Kumar D.V.Nbool isAlphaPresent(hwc_layer_1_t const* layer); 25155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmedint hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable); 25212a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmedint getBlending(int blending); 253140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanbool isGLESOnlyComp(hwc_context_t *ctx, const int& dpy); 254140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanvoid reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers); 255a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah 2564c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamalbool canUseMDPforVirtualDisplay(hwc_context_t* ctx, 2574c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal const hwc_display_contents_1_t *list); 2584c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal 25993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed//Helper function to dump logs 26093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...); 26193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 26297c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnanint getExtOrientation(hwc_context_t* ctx); 263f13681b96223de6b84461174aa08fe6d2959ced0Jeykumar Sankaranbool isValidRect(const hwc_rect_t& rect); 264b81222638c632a44d894b15590c9c90b1adc959eJeykumar Sankaranhwc_rect_t deductRect(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 265c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranbool isSameRect(const hwc_rect& rect1, const hwc_rect& rect2); 266253d8a06d8c2b35e8cf22f853a8b2590848b5436Jeykumar Sankaranhwc_rect_t moveRect(const hwc_rect_t& rect, const int& x_off, const int& y_off); 267f13681b96223de6b84461174aa08fe6d2959ced0Jeykumar Sankaranhwc_rect_t getIntersection(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 268f13681b96223de6b84461174aa08fe6d2959ced0Jeykumar Sankaranhwc_rect_t getUnion(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 269404047f2c61687024048b04374ea736285ddded1Arun Kumar K.Rvoid optimizeLayerRects(const hwc_display_contents_1_t *list); 27036035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool areLayersIntersecting(const hwc_layer_1_t* layer1, 27136035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula const hwc_layer_1_t* layer2); 27277846b8bdb582d03273ccaf9be58f8544659cd10Prabhanjan Kandula 273ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan// returns true if Action safe dimensions are set and target supports Actionsafe 274ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnanbool isActionSafePresent(hwc_context_t *ctx, int dpy); 275ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan 2760ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R/* Calculates the destination position based on the action safe rectangle */ 27723421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& dst); 2780ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 27923421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid getAspectRatioPosition(int destWidth, int destHeight, int srcWidth, 28023421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R int srcHeight, hwc_rect_t& rect); 2813b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 28223421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid getAspectRatioPosition(hwc_context_t* ctx, int dpy, int extOrientation, 28323421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R hwc_rect_t& inRect, hwc_rect_t& outRect); 28423421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R 28523421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rbool isPrimaryPortrait(hwc_context_t *ctx); 28623421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R 287fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumarbool isOrientationPortrait(hwc_context_t *ctx); 288fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar 28923421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid calcExtDisplayPosition(hwc_context_t *ctx, 29097c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan private_handle_t *hnd, 291fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar int dpy, 292fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar hwc_rect_t& sourceCrop, 29397c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan hwc_rect_t& displayFrame, 29497c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan int& transform, 29597c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ovutils::eTransform& orient); 29697c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan 297effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R// Returns the orientation that needs to be set on external for 298effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R// BufferMirrirMode(Sidesync) 299effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.Rint getMirrorModeOrientation(hwc_context_t *ctx); 3003b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 301e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal/* Get External State names */ 302e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamalconst char* getExternalDisplayState(uint32_t external_state); 303e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal 304c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran// Resets display ROI to full panel resoluion 305c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranvoid resetROI(hwc_context_t *ctx, const int dpy); 306c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 307d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran// Aligns updating ROI to panel restrictions 308c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaranhwc_rect_t getSanitizeROI(struct hwc_rect roi, hwc_rect boundary); 309d50e2fa08aa8e3d3ae103cd9d878af97ea496851Jeykumar Sankaran 310f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R// Handles wfd Pause and resume events 311f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.Rvoid handle_pause(hwc_context_t *ctx, int dpy); 312f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.Rvoid handle_resume(hwc_context_t *ctx, int dpy); 313f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R 314a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah//Close acquireFenceFds of all layers of incoming list 315a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shahvoid closeAcquireFds(hwc_display_contents_1_t* list); 316a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 31733147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar//Sync point impl. 3184019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 319327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd); 320327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 321327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Sets appropriate mdp flags for a layer. 322327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid setMdpFlags(hwc_layer_1_t *layer, 323327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovutils::eMdpFlags &mdpFlags, 3243e76f19cb2c0441315ebe54110f7b452d2932f52Ramkumar Radhakrishnan int rotDownscale, int transform); 325327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 3265365726ef260406513c4787b6ed253eda754370cPrabhanjan Kandulaint configRotator(overlay::Rotator *rot, ovutils::Whf& whf, 327e2f07405d2d04aaf5577080761cd2b11a9e3c736Sushil Chauhan hwc_rect_t& crop, const ovutils::eMdpFlags& mdpFlags, 3283b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const ovutils::eTransform& orient, const int& downscale); 3293b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 3303b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rint configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg, 3313b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const ovutils::eTransform& orient, const hwc_rect_t& crop, 3323b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const hwc_rect_t& pos, const MetaData_t *metadata, 3333b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const ovutils::eDest& dest); 3343b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 33508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhanint configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 33608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 33708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ovutils::eIsFg& isFg, const ovutils::eDest& dest); 33808cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan 3393b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rvoid updateSource(ovutils::eTransform& orient, ovutils::Whf& whf, 3403b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R hwc_rect_t& crop); 3413b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 342327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Routine to configure low resolution panels (<= 2048 width) 343f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 344a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 345a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eIsFg& isFg, const ovutils::eDest& dest, 346327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah overlay::Rotator **rot); 347327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 348327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Routine to configure high resolution panels (> 2048 width) 349f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 350a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 351a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eIsFg& isFg, const ovutils::eDest& lDest, 352327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah const ovutils::eDest& rDest, overlay::Rotator **rot); 35333147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar 35415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna//Routine to split and configure high resolution YUV layer (> 2048 width) 35515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint configureSourceSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 35615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int& dpy, 35715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 35815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eIsFg& isFg, const ovutils::eDest& lDest, 35915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const ovutils::eDest& rDest, overlay::Rotator **rot); 36015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 361e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//On certain targets DMA pipes are used for rotation and they won't be available 362e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//for line operations. On a per-target basis we can restrict certain use cases 363e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//from using rotator, since we know before-hand that such scenarios can lead to 364e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//extreme unavailability of pipes. This can also be done via hybrid calculations 365e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//also involving many more variables like number of write-back interfaces etc, 366e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//but the variety of scenarios is too high to warrant that. 36786adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumarbool canUseRotator(hwc_context_t *ctx, int dpy); 368e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah 3699640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shahint getLeftSplit(hwc_context_t *ctx, const int& dpy); 3709640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 371f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool isDisplaySplit(hwc_context_t* ctx, int dpy); 372f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah 3739c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed// Set the GPU hint flag to high for MIXED/GPU composition only for 3749c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed// first frame after MDP to GPU/MIXED mode transition. 3759c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed// Set the GPU hint to default if the current composition type is GPU 3769c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed// due to idle fallback or MDP composition. 3779c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmedvoid setGPUHint(hwc_context_t* ctx, hwc_display_contents_1_t* list); 3789c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed 379befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Inline utility functions 380660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) { 381befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER))); 382befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 383befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 384befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Returns true if the buffer is yuv 385befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) { 386befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO)); 387befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 388befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 38915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna// Returns true if the buffer is yuv 39015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnastatic inline bool is4kx2kYuvBuffer(const private_handle_t* hnd) { 39115c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO) && 39215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (hnd->width > 2048)); 39315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 39415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 395ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah// Returns true if the buffer is secure 396ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) { 397ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags)); 398ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah} 399c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 400c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMstatic inline bool isTileRendered(const private_handle_t* hnd) { 401c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return (hnd && (private_handle_t::PRIV_FLAGS_TILE_RENDERED & hnd->flags)); 402c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 403c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 404befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed//Return true if buffer is marked locked 405befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) { 406befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags)); 407befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 408bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 4095d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only 4105d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) { 4115d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY)); 4125d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 4135d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 4141b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan//Return true if the buffer is intended for Secure Display 4151b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnanstatic inline bool isSecureDisplayBuffer(const private_handle_t* hnd) { 4161b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY)); 4171b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan} 4181b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan 4190d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnanstatic inline int getWidth(const private_handle_t* hnd) { 4200d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(isYuvBuffer(hnd)) { 421404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R MetaData_t *metadata = reinterpret_cast<MetaData_t*>(hnd->base_metadata); 4220d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 4230d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return metadata->bufferDim.sliceWidth; 4240d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 4250d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 4260d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return hnd->width; 4270d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan} 4280d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan 4290d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnanstatic inline int getHeight(const private_handle_t* hnd) { 4300d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(isYuvBuffer(hnd)) { 431404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R MetaData_t *metadata = reinterpret_cast<MetaData_t*>(hnd->base_metadata); 4320d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 4330d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return metadata->bufferDim.sliceHeight; 4340d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 4350d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 4360d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return hnd->height; 4370d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan} 4380d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan 43904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedtemplate<typename T> inline T max(T a, T b) { return (a > b) ? a : b; } 44004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedtemplate<typename T> inline T min(T a, T b) { return (a < b) ? a : b; } 44104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 4421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed// Initialize uevent thread 4431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx); 444aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed// Initialize vsync thread 445aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx); 446befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 447660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer, 44812a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed int& width, int& height) { 449c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 450c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed width = displayFrame.right - displayFrame.left; 451c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed height = displayFrame.bottom - displayFrame.top; 452c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 4542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic inline int openFb(int dpy) { 4552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fd = -1; 4562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const char *devtmpl = "/dev/graphics/fb%u"; 4572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah char name[64] = {0}; 4582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah snprintf(name, 64, devtmpl, dpy); 4592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fd = open(name, O_RDWR); 4602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return fd; 4612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 4622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 4639a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shahtemplate <class T> 4649a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shahinline void swap(T& a, T& b) { 4659a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah T tmp = a; 4669a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah a = b; 4679a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah b = tmp; 4689a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah} 4699a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah 470ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}; //qhwc namespace 471befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 472c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnanenum eAnimationState{ 473c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ANIMATION_STOPPED, 474c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ANIMATION_STARTED, 475c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan}; 476c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan 4779c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed// Structure holds the information about the GPU hint. 4789c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmedstruct gpu_hint_info { 4799c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed // system level flag to enable gpu_perf_mode 4809c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed bool mGpuPerfModeEnable; 4819c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed // Stores the current GPU performance mode DEFAULT/HIGH 4829c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed bool mCurrGPUPerfMode; 4839c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed // true if previous composition used GPU 4849c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed bool mPrevCompositionGLES; 4859c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed // Stores the EGLContext of current process 4869c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed EGLContext mEGLContext; 4879c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed // Stores the EGLDisplay of current process 4889c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed EGLDisplay mEGLDisplay; 4899c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed}; 4909c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed 491befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// ----------------------------------------------------------------------------- 492befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// HWC context 493befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// This structure contains overall state 494befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t { 495660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_composer_device_1_t device; 496359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall const hwc_procs_t* proc; 4974019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R 4984019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R //CopyBit objects 4990df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::CopyBit *mCopyBit[HWC_NUM_DISPLAY_TYPES]; 5004019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R 501befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed //Overlay object - NULL for non overlay devices 50247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed overlay::Overlay *mOverlay; 503327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah //Holds a few rot objects 504327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah overlay::RotMgr *mRotMgr; 505640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 506640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah //Primary and external FB updater 5070df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::IFBUpdate *mFBUpdate[HWC_NUM_DISPLAY_TYPES]; 508ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // External display related information 5091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed qhwc::ExternalDisplay *mExtDisplay; 510361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran qhwc::VirtualDisplay *mVirtualDisplay; 511b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed qhwc::MDPInfo mMDP; 51210d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed qhwc::VsyncState vstate; 5130df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::DisplayAttributes dpyAttr[HWC_NUM_DISPLAY_TYPES]; 5140df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::ListStats listStats[HWC_NUM_DISPLAY_TYPES]; 5150df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::LayerProp *layerProp[HWC_NUM_DISPLAY_TYPES]; 5160df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::MDPComp *mMDPComp[HWC_NUM_DISPLAY_TYPES]; 5170df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::HwcDebug *mHwcDebug[HWC_NUM_DISPLAY_TYPES]; 518456d555b1dc25dd1891ab7e38494d057b6bdf82eRamkumar Radhakrishnan hwc_rect_t mViewFrame[HWC_NUM_DISPLAY_TYPES]; 519f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah qhwc::AssertiveDisplay *mAD; 520c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan eAnimationState mAnimationState[HWC_NUM_DISPLAY_TYPES]; 521140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan qhwc::HWCVirtualBase *mHWCVirtual; 5229f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed 52303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal // stores the #numHwLayers of the previous frame 52403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal // for each display device 52503514577d0c705056352898f66ed2a8e9b131df8Raj Kamal int mPrevHwLayerCount[HWC_NUM_DISPLAY_TYPES]; 52603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal 527c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // stores the primary device orientation 528a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan int deviceOrientation; 529bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah //Securing in progress indicator 530bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah bool mSecuring; 531361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran //WFD on proprietary stack 532361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran bool mVirtualonExtActive; 533bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah //Display in secure mode indicator 534bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah bool mSecureMode; 5351a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Lock to protect drawing data structures 5361a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mutable Locker mDrawLock; 537586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah //Drawing round when we use GPU 538586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah bool isPaddingRound; 5393b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R // External Orientation 5403b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R int mExtOrientation; 54156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //Flags the transition of a video session 54256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah bool mVideoTransFlag; 543effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R //Used for SideSync feature 544effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R //which overrides the mExtOrientation 545effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R bool mBufferMirrorMode; 546e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal // Used to synchronize between WFD and Display modules 547e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal mutable Locker mWfdSyncLock; 548e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal 5490df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::LayerRotMap *mLayerRotMap[HWC_NUM_DISPLAY_TYPES]; 55027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran // Panel reset flag will be set if BTA check fails 55127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran bool mPanelResetStatus; 5524c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal // number of active Displays 5534c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal int numActiveDisplays; 554e21110177d7605c4668bad3e2de85c8bb2a531f7Raj kamal // Downscale feature switch, set via system property 555bad2217825fe0a98d9c4a987a139f4d7a0e05a2fTatenda Chipeperekwa // sys.hwc.mdp_downscale_enabled 556bad2217825fe0a98d9c4a987a139f4d7a0e05a2fTatenda Chipeperekwa bool mMDPDownscaleEnabled; 5579c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed struct gpu_hint_info mGPUHintInfo; 5585a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed // Display binder service 5595a7d156b76908b60b72d1acc1d4b5959e7a9647cNaseer Ahmed qService::QService* mQService; 560befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 561befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 562327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 563c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) { 564c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return ctx->listStats[dpy].skipCount; 565c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 566c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 567c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) { 568c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return ctx->listStats[dpy].yuvCount; 569c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 570efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 571efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahstatic inline bool has90Transform(hwc_layer_1_t *layer) { 57208cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return ((layer->transform & HWC_TRANSFORM_ROT_90) && 57308cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan !(layer->flags & HWC_COLOR_FILL)); 574efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 575efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 57694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahinline bool isSecurePresent(hwc_context_t *ctx, int dpy) { 57794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return ctx->listStats[dpy].isSecurePresent; 57894f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 57994f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 580140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanstatic inline bool isSecondaryConfiguring(hwc_context_t* ctx) { 581140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 582140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring); 583140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 584140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 585140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanstatic inline bool isSecondaryConnected(hwc_context_t* ctx) { 586140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected || 587140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected); 588140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 589140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 590327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}; 591c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 592befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif //HWC_UTILS_H 593