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