129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
36371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran * Copyright (C)2012-2013, The Linux Foundation. All rights reserved.
46c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R *
56c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained
66c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * for attribution purposes only.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License.
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License.
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
2029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#ifndef HWC_UTILS_H
2229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define HWC_UTILS_H
2372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
245b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed#define HWC_REMOVE_DEPRECATED_VERSIONS 1
253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah#include <fcntl.h>
2683f9f73c45da200a06244749e4f21a632ecc01baJesse Hall#include <math.h>
2729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <hardware/hwcomposer.h>
2832ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed#include <gr.h>
2972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <gralloc_priv.h>
303b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed#include <utils/String8.h>
3193393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran#include <linux/fb.h>
3236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include "qdMetaData.h"
3336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include <overlayUtils.h>
3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
3729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
380f47bb43e032f6396d9496c1ecb254c9aa7e94baRamkumar Radhakrishnan#define MAX_NUM_APP_LAYERS 32
3929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
403a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar// For support of virtual displays
415fcdd463b18bc1796d57fde7d2876a32a816d7c5Jesse Hall#define MAX_DISPLAYS            (HWC_NUM_DISPLAY_TYPES)
423a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar
4372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//Fwrd decls
4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t;
4572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
4636963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace ovutils = overlay::utils;
4736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
4872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmednamespace overlay {
4972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass Overlay;
5036963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass Rotator;
5136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass RotMgr;
5272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
5372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
5429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace qhwc {
5572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//fwrd decl
5672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass QueuedBufferStore;
5796c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedclass ExternalDisplay;
586457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahclass IFBUpdate;
5936963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass IVideoOverlay;
60bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahclass MDPComp;
616c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rclass CopyBit;
62d80659c540b719660c7af9f530445268bc409db6Saurabh Shahclass AssertiveDisplay;
6396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed
646195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
6596c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedstruct MDPInfo {
6696c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    int version;
6796c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    char panel;
6896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    bool hasOverlay;
6996c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed};
7029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct DisplayAttributes {
723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t vsync_period; //nanos
733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t xres;
743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t yres;
7565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    uint32_t stride;
767b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float xdpi;
777b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float ydpi;
783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd;
79fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah    bool connected; //Applies only to secondary displays
80c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //Connected does not mean it ready to use.
81c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //It should be active also. (UNBLANKED)
823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    bool isActive;
833a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    // In pause state, composition is bypassed
843a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    // used for WFD displays only
853a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    bool isPause;
86fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah    //Secondary displays will have this set until they are able to acquire
87fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah    //pipes.
88fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah    bool isConfiguring;
8931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct ListStats {
923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int numAppLayers; //Total - 1, excluding FB layer.
933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int skipCount;
943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fbLayerIndex; //Always last for now. = numAppLayers
953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //Video specific
963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvCount;
970f47bb43e032f6396d9496c1ecb254c9aa7e94baRamkumar Radhakrishnan    int yuvIndices[MAX_NUM_APP_LAYERS];
9853bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    bool needsAlphaScale;
990edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N    bool preMultipliedAlpha;
100ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed    bool planeAlpha;
101b5199b08a351177e2d572b29d04f5a05069b3c2aSaurabh Shah    bool isSecurePresent;
10231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
10331da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
10465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedstruct LayerProp {
10565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    uint32_t mFlags; //qcom specific layer flags
10665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    LayerProp():mFlags(0) {};
10765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed};
10865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
109c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmedstruct VsyncState {
110c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed    bool enable;
111c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed    bool fakevsync;
112c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed};
113c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed
1147d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shahstruct BwcPM {
1157d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah    static void setBwc(hwc_context_t *ctx, const hwc_rect_t& crop,
1167d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah            const hwc_rect_t& dst, const int& transform,
1177d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah            ovutils::eMdpFlags& mdpFlags);
1187d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah};
1197d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah
12065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed// LayerProp::flag values
1217c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedenum {
12265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    HWC_MDPCOMP = 0x00000001,
1236195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    HWC_COPYBIT = 0x00000002,
1247c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed};
1257c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
1261e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahclass LayerRotMap {
1271e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahpublic:
1281e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    LayerRotMap() { reset(); }
1291e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    enum { MAX_SESS = 3 };
1301e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    void add(hwc_layer_1_t* layer, overlay::Rotator *rot);
1311e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    void reset();
1321e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    uint32_t getCount() const;
1331e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    hwc_layer_1_t* getLayer(uint32_t index) const;
1341e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    overlay::Rotator* getRot(uint32_t index) const;
1351e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    void setReleaseFd(const int& fence);
1361e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahprivate:
1371e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    hwc_layer_1_t* mLayer[MAX_SESS];
1381e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    overlay::Rotator* mRot[MAX_SESS];
1391e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    uint32_t mCount;
1401e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah};
1411e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
1421e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahinline uint32_t LayerRotMap::getCount() const {
1431e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    return mCount;
1441e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}
1451e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
1461e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahinline hwc_layer_1_t* LayerRotMap::getLayer(uint32_t index) const {
1471e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    if(index >= mCount) return NULL;
1481e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    return mLayer[index];
1491e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}
1501e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
1511e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahinline overlay::Rotator* LayerRotMap::getRot(uint32_t index) const {
1521e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    if(index >= mCount) return NULL;
1531e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    return mRot[index];
1541e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}
1551e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah
15683f9f73c45da200a06244749e4f21a632ecc01baJesse Hallinline hwc_rect_t integerizeSourceCrop(const hwc_frect_t& cropF) {
15783f9f73c45da200a06244749e4f21a632ecc01baJesse Hall    hwc_rect_t cropI = {0};
15883f9f73c45da200a06244749e4f21a632ecc01baJesse Hall    cropI.left = int(ceilf(cropF.left));
15983f9f73c45da200a06244749e4f21a632ecc01baJesse Hall    cropI.top = int(ceilf(cropF.top));
16083f9f73c45da200a06244749e4f21a632ecc01baJesse Hall    cropI.right = int(floorf(cropF.right));
16183f9f73c45da200a06244749e4f21a632ecc01baJesse Hall    cropI.bottom = int(floorf(cropF.bottom));
16283f9f73c45da200a06244749e4f21a632ecc01baJesse Hall    return cropI;
16383f9f73c45da200a06244749e4f21a632ecc01baJesse Hall}
16483f9f73c45da200a06244749e4f21a632ecc01baJesse Hall
16543b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmedinline bool isNonIntegralSourceCrop(const hwc_frect_t& cropF) {
16643b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed    if(cropF.left - roundf(cropF.left)     ||
16743b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed       cropF.top - roundf(cropF.top)       ||
16843b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed       cropF.right - roundf(cropF.right)   ||
16943b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed       cropF.bottom - roundf(cropF.bottom))
17043b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed        return true;
17143b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed    else
17243b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed        return false;
17343b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed}
17443b3bfe2cb5b924dd3fb9718e27eadebe6f04e19Naseer Ahmed
17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
17629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Utility functions - implemented in hwc_utils.cpp
1775b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l);
1783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list,
1793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        int dpy);
18029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx);
18129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx);
182f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries
183f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
1846371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                         const hwc_rect_t& scissor, int orient);
1856195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedvoid getNonWormholeRegion(hwc_display_contents_1_t* list,
1866195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed                              hwc_rect_t& nwr);
187b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumarbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer);
18808cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhanbool isSecureModePolicy(int mdpVersion);
1895238cc1d48c93d1e00d11a87ee2693e071af7588Saurabh Shahbool needsScaling(hwc_context_t* ctx, hwc_layer_1_t const* layer, const int& dpy);
19027962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.Nbool isAlphaPresent(hwc_layer_1_t const* layer);
19105207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmedint hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable);
19218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedint getBlending(int blending);
193b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shahbool isGLESOnlyComp(hwc_context_t *ctx, const int& dpy);
194fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah
1953b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed//Helper function to dump logs
1963b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...);
1973b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed
1984012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R/* Calculates the destination position based on the action safe rectangle */
1994012258b6b344adccf19973602c4d092e2403053Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, uint32_t& x,
2004012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R                                        uint32_t& y, uint32_t& w, uint32_t& h);
2014012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
2020859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah//Close acquireFenceFds of all layers of incoming list
203b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shahvoid closeAcquireFds(hwc_display_contents_1_t* list, int dpy);
2040859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
2052dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar//Sync point impl.
2066c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy,
20736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        int fd);
20836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
20936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Trims a layer's source crop which is outside of screen boundary.
21036963690317abceae79621f14ba41ff62b3ff489Saurabh Shahvoid trimLayer(hwc_context_t *ctx, const int& dpy, const int& transform,
21136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        hwc_rect_t& crop, hwc_rect_t& dst);
21236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
21336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Sets appropriate mdp flags for a layer.
21436963690317abceae79621f14ba41ff62b3ff489Saurabh Shahvoid setMdpFlags(hwc_layer_1_t *layer,
21536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ovutils::eMdpFlags &mdpFlags,
216c0f8e4f46400eaad2406af24561eb4ea61e99b68Ramkumar Radhakrishnan        int rotDownscale);
21736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
218d527210b2308a79ee6211b93356fda472438e211Sushil Chauhanint configRotator(overlay::Rotator *rot, const ovutils::Whf& whf,
219d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan        hwc_rect_t& crop, const ovutils::eMdpFlags& mdpFlags,
220d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan        const ovutils::eTransform& orient, const int& downscale);
221d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan
222d527210b2308a79ee6211b93356fda472438e211Sushil Chauhanint configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg,
223d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan        const ovutils::eTransform& orient, const hwc_rect_t& crop,
224d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan        const hwc_rect_t& pos, const MetaData_t *metadata,
225d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan        const ovutils::eDest& dest);
226d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan
227d527210b2308a79ee6211b93356fda472438e211Sushil Chauhanvoid updateSource(ovutils::eTransform& orient, ovutils::Whf& whf,
228d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan        hwc_rect_t& crop);
229d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan
23036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Routine to configure low resolution panels (<= 2048 width)
23136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahint configureLowRes(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy,
23236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ovutils::eMdpFlags& mdpFlags, const ovutils::eZorder& z,
23336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const ovutils::eIsFg& isFg, const ovutils::eDest& dest,
23436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        overlay::Rotator **rot);
23536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah
23636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Routine to configure high resolution panels (> 2048 width)
23736963690317abceae79621f14ba41ff62b3ff489Saurabh Shahint configureHighRes(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy,
23836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        ovutils::eMdpFlags& mdpFlags, const ovutils::eZorder& z,
23936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const ovutils::eIsFg& isFg, const ovutils::eDest& lDest,
24036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah        const ovutils::eDest& rDest, overlay::Rotator **rot);
2412dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
24220de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//On certain targets DMA pipes are used for rotation and they won't be available
24320de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//for line operations. On a per-target basis we can restrict certain use cases
24420de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//from using rotator, since we know before-hand that such scenarios can lead to
24520de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//extreme unavailability of pipes. This can also be done via hybrid calculations
24620de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//also involving many more variables like number of write-back interfaces etc,
24720de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//but the variety of scenarios is too high to warrant that.
2481c3402c355c966bb443139b5becb1fe092815855Saurabh Shahbool canUseRotator(hwc_context_t *ctx, int dpy);
24920de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah
250517e8b0015001fed3ea1d7bbeeda421de7fdeb2eSaurabh Shahint getLeftSplit(hwc_context_t *ctx, const int& dpy);
251517e8b0015001fed3ea1d7bbeeda421de7fdeb2eSaurabh Shah
2529e3d34120ce5f349322a8ffe41d9655a183a8202Saurabh Shah//Sets up composition objects for secondary displays when they are added.
2539e3d34120ce5f349322a8ffe41d9655a183a8202Saurabh Shah//Should be called with extlock held.
2549e3d34120ce5f349322a8ffe41d9655a183a8202Saurabh Shahvoid setupSecondaryObjs(hwc_context_t *ctx, const int& dpy);
2559e3d34120ce5f349322a8ffe41d9655a183a8202Saurabh Shahvoid clearSecondaryObjs(hwc_context_t *ctx, const int& dpy);
2569e3d34120ce5f349322a8ffe41d9655a183a8202Saurabh Shah
25729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Inline utility functions
2585b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) {
25929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
26029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
26129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
26229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Returns true if the buffer is yuv
26329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
26429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
26529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
26629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
267f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah// Returns true if the buffer is secure
268f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) {
269f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah    return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
270873a69a63909b570e687817ac61684fb4a199c28Naseer Ahmed}
271873a69a63909b570e687817ac61684fb4a199c28Naseer Ahmed
272873a69a63909b570e687817ac61684fb4a199c28Naseer Ahmed// Returns true if the buffer is marked for L3 DRM
273873a69a63909b570e687817ac61684fb4a199c28Naseer Ahmedstatic inline bool isL3SecureBuffer(const private_handle_t* hnd) {
274873a69a63909b570e687817ac61684fb4a199c28Naseer Ahmed    return (hnd &&
275873a69a63909b570e687817ac61684fb4a199c28Naseer Ahmed            (private_handle_t::PRIV_FLAGS_L3_SECURE_BUFFER & hnd->flags));
276f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah}
27729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//Return true if buffer is marked locked
27829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
27929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
28029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
28131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
2824c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only
2834c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) {
2844c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY));
2854c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
2864c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
2874c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag.
2884c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) {
2894c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK));
2904c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
2914c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
2924c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag.
2934c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) {
2944c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC));
2954c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
2964c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
297bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmedstatic inline int getWidth(const private_handle_t* hnd) {
298bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed    if(isYuvBuffer(hnd)) {
299bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed        MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
300bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed        if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
301bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed            return metadata->bufferDim.sliceWidth;
302bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed        }
303bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed    }
304bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed    return hnd->width;
305bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed}
306bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed
307bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmedstatic inline int getHeight(const private_handle_t* hnd) {
308bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed    if(isYuvBuffer(hnd)) {
309bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed        MetaData_t *metadata = (MetaData_t *)hnd->base_metadata;
310bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed        if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) {
311bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed            return metadata->bufferDim.sliceHeight;
312bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed        }
313bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed    }
314bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed    return hnd->height;
315bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed}
316bf3b12bcc5a565d76f29e75d40baacc0718db2bcNaseer Ahmed
3176195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedtemplate<typename T> inline T max(T a, T b) { return (a > b) ? a : b; }
3186195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedtemplate<typename T> inline T min(T a, T b) { return (a < b) ? a : b; }
3196195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
32072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed// Initialize uevent thread
32172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
322ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed// Initialize vsync thread
323ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx);
32429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3255b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer,
32618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                               int& width, int& height) {
3277c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
3287c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    width = displayFrame.right - displayFrame.left;
3297c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    height = displayFrame.bottom - displayFrame.top;
3307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
3313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
3323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic inline int openFb(int dpy) {
3333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd = -1;
3343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    const char *devtmpl = "/dev/graphics/fb%u";
3353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    char name[64] = {0};
3363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    snprintf(name, 64, devtmpl, dpy);
3373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    fd = open(name, O_RDWR);
3383e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return fd;
3393e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
3403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
34127c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahtemplate <class T>
34227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahinline void swap(T& a, T& b) {
34327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    T tmp = a;
34427c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    a = b;
34527c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    b = tmp;
34627c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah}
34727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
348f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //qhwc namespace
34929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
35029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
35129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// HWC context
35229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// This structure contains overall state
35329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t {
3545b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    hwc_composer_device_1_t device;
3553be78d9816da84e48a40232165189f9deb16808fJesse Hall    const hwc_procs_t* proc;
3566c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
3576c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    //CopyBit objects
3583a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::CopyBit *mCopyBit[MAX_DISPLAYS];
3596c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
36029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Overlay object - NULL for non overlay devices
361d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    overlay::Overlay *mOverlay;
36236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    //Holds a few rot objects
36336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah    overlay::RotMgr *mRotMgr;
3646457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
3656457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //Primary and external FB updater
3663a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::IFBUpdate *mFBUpdate[MAX_DISPLAYS];
3670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    // External display related information
36872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
36996c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    qhwc::MDPInfo mMDP;
370c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed    qhwc::VsyncState vstate;
3713a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::DisplayAttributes dpyAttr[MAX_DISPLAYS];
3723a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::ListStats listStats[MAX_DISPLAYS];
3733a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::LayerProp *layerProp[MAX_DISPLAYS];
3741e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah    qhwc::LayerRotMap *mLayerRotMap[MAX_DISPLAYS];
37585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    qhwc::MDPComp *mMDPComp[MAX_DISPLAYS];
376d80659c540b719660c7af9f530445268bc409db6Saurabh Shah    qhwc::AssertiveDisplay *mAD;
37789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
37856f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Securing in progress indicator
37956f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecuring;
38056f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Display in secure mode indicator
38156f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecureMode;
38201f9a13e06f5b25788dfb042d20583ce2f974579Saurabh Shah    //Lock to protect drawing data structures
38301f9a13e06f5b25788dfb042d20583ce2f974579Saurabh Shah    mutable Locker mDrawLock;
3845a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah    //Drawing round when we use GPU
3855a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah    bool isPaddingRound;
38604af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah    //Flags the transition of a video session
38704af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah    bool mVideoTransFlag;
38829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
38929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
39036963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace qhwc {
391bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) {
392bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return  ctx->listStats[dpy].skipCount;
393bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
394bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
395bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) {
396bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return  ctx->listStats[dpy].yuvCount;
397bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
398625e0a798a84c476f8cab99bb34b6f2df336aa6cSaurabh Shah
399625e0a798a84c476f8cab99bb34b6f2df336aa6cSaurabh Shahstatic inline bool has90Transform(hwc_layer_1_t *layer) {
400625e0a798a84c476f8cab99bb34b6f2df336aa6cSaurabh Shah    return (layer->transform & HWC_TRANSFORM_ROT_90);
401625e0a798a84c476f8cab99bb34b6f2df336aa6cSaurabh Shah}
402625e0a798a84c476f8cab99bb34b6f2df336aa6cSaurabh Shah
403b5199b08a351177e2d572b29d04f5a05069b3c2aSaurabh Shahinline bool isSecurePresent(hwc_context_t *ctx, int dpy) {
404b5199b08a351177e2d572b29d04f5a05069b3c2aSaurabh Shah    return ctx->listStats[dpy].isSecurePresent;
405b5199b08a351177e2d572b29d04f5a05069b3c2aSaurabh Shah}
406b5199b08a351177e2d572b29d04f5a05069b3c2aSaurabh Shah
407b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shahstatic inline bool isSecondaryConfiguring(hwc_context_t* ctx) {
408b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah    return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring ||
409b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring);
410b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah}
411b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah
412b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shahstatic inline bool isSecondaryConnected(hwc_context_t* ctx) {
413b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah    return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected ||
414b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah            ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected);
415b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah}
416b434b98715e4bfe9b8bfb0ac34f33e695aa9891dSaurabh Shah
41736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah};
418bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
41929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif //HWC_UTILS_H
420