hwc_utils.h revision 4012258b6b344adccf19973602c4d092e2403053
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
36c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R * 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>
2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <hardware/hwcomposer.h>
2732ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed#include <gr.h>
2872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <gralloc_priv.h>
293b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed#include <utils/String8.h>
3029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
3431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F
355b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed#define MAX_NUM_DISPLAYS 4 //Yes, this is ambitious
3689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed#define MAX_NUM_LAYERS 32
376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah#define MAX_DISPLAY_DIM 2048
3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//Fwrd decls
4029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t;
4172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedstruct framebuffer_device_t;
4272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
4356f610dd235b577725198e9341caae92379fdf23Saurabh Shahnamespace qService {
4456f610dd235b577725198e9341caae92379fdf23Saurabh Shahclass QService;
4556f610dd235b577725198e9341caae92379fdf23Saurabh Shah}
4656f610dd235b577725198e9341caae92379fdf23Saurabh Shah
4772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmednamespace overlay {
4872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass Overlay;
4972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
5072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
5129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace qhwc {
5272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//fwrd decl
5372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass QueuedBufferStore;
5496c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedclass ExternalDisplay;
556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahclass IFBUpdate;
56bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahclass MDPComp;
576c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rclass CopyBit;
5896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed
5996c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedstruct MDPInfo {
6096c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    int version;
6196c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    char panel;
6296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    bool hasOverlay;
6396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed};
6429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct DisplayAttributes {
663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t vsync_period; //nanos
673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t xres;
683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t yres;
6965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    uint32_t stride;
707b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float xdpi;
717b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float ydpi;
723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd;
73c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    bool connected; //Applies only to pluggable disp.
74c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //Connected does not mean it ready to use.
75c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //It should be active also. (UNBLANKED)
763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    bool isActive;
7731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct ListStats {
803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int numAppLayers; //Total - 1, excluding FB layer.
813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int skipCount;
823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fbLayerIndex; //Always last for now. = numAppLayers
833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //Video specific
843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvCount;
8543d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran    int yuvIndices[MAX_NUM_LAYERS];
8653bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    bool needsAlphaScale;
8731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
8831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
8965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedstruct LayerProp {
9065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    uint32_t mFlags; //qcom specific layer flags
9165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    LayerProp():mFlags(0) {};
9265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed};
9365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
9465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed// LayerProp::flag values
957c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedenum {
9665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    HWC_MDPCOMP = 0x00000001,
977c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed};
987c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
9989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmedclass LayerCache {
10089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    public:
10189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    LayerCache() {
10289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        canUseLayerCache = false;
10389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        numHwLayers = 0;
10489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        for(uint32_t i = 0; i < MAX_NUM_LAYERS; i++) {
10589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed            hnd[i] = NULL;
10689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        }
10789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    }
10889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    //LayerCache optimization
10989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    void updateLayerCache(hwc_display_contents_1_t* list);
11089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    void resetLayerCache(int num);
11189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    void markCachedLayersAsOverlay(hwc_display_contents_1_t* list);
11289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    private:
11389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    uint32_t numHwLayers;
11489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    bool canUseLayerCache;
11589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    buffer_handle_t hnd[MAX_NUM_LAYERS];
11689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
11789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed};
11889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
11931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
12065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
12165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
12229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
12329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Utility functions - implemented in hwc_utils.cpp
1245b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l);
1253e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list,
1263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        int dpy);
12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx);
12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx);
129f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries
130f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
13127c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah        const int fbWidth, const int fbHeight, int orient);
13265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedbool isSecuring(hwc_context_t* ctx);
13308cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhanbool isSecureModePolicy(int mdpVersion);
1343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool isExternalActive(hwc_context_t* ctx);
135fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah
1363b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed//Helper function to dump logs
1373b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...);
1383b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed
1394012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R/* Calculates the destination position based on the action safe rectangle */
1404012258b6b344adccf19973602c4d092e2403053Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, uint32_t& x,
1414012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R                                        uint32_t& y, uint32_t& w, uint32_t& h);
1424012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
1432dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar//Sync point impl.
1446c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy,
1456c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                                    int fd);
1462dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
14729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Inline utility functions
1485b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) {
14929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
15029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
15129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
15229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Returns true if the buffer is yuv
15329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
15429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
15629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
157f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah// Returns true if the buffer is secure
158f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) {
159f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah    return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
160f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah}
16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//Return true if buffer is marked locked
16229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
16531da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
1664c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only
1674c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) {
1684c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY));
1694c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1704c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1714c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag.
1724c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) {
1734c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK));
1744c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1754c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1764c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag.
1774c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) {
1784c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC));
1794c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1804c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
18172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed// Initialize uevent thread
18272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
183ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed// Initialize vsync thread
184ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx);
18529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1865b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer,
187ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed                               int& width, int& height)
1887c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed{
1897c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
1907c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    width = displayFrame.right - displayFrame.left;
1917c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    height = displayFrame.bottom - displayFrame.top;
1927c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
1933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
1943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic inline int openFb(int dpy) {
1953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd = -1;
1963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    const char *devtmpl = "/dev/graphics/fb%u";
1973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    char name[64] = {0};
1983e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    snprintf(name, 64, devtmpl, dpy);
1993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    fd = open(name, O_RDWR);
2003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return fd;
2013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
2023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
20327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahtemplate <class T>
20427c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahinline void swap(T& a, T& b) {
20527c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    T tmp = a;
20627c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    a = b;
20727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    b = tmp;
20827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah}
20927c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
210f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //qhwc namespace
21129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
212ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedstruct vsync_state {
213ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    pthread_mutex_t lock;
214ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    pthread_cond_t  cond;
215ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    bool enable;
216ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed};
217ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed
21829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
21929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// HWC context
22029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// This structure contains overall state
22129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t {
2225b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    hwc_composer_device_1_t device;
2233be78d9816da84e48a40232165189f9deb16808fJesse Hall    const hwc_procs_t* proc;
22429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Framebuffer device
22572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    framebuffer_device_t *mFbDev;
2266c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
2276c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    //CopyBit objects
2286c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    qhwc::CopyBit *mCopyBit[HWC_NUM_DISPLAY_TYPES];
2296c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
23029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Overlay object - NULL for non overlay devices
231d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    overlay::Overlay *mOverlay;
23256f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //QService object
23356f610dd235b577725198e9341caae92379fdf23Saurabh Shah    qService::QService *mQService;
2346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //Primary and external FB updater
2366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    qhwc::IFBUpdate *mFBUpdate[HWC_NUM_DISPLAY_TYPES];
2370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    // External display related information
23872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
23996c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    qhwc::MDPInfo mMDP;
2403e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    qhwc::DisplayAttributes dpyAttr[HWC_NUM_DISPLAY_TYPES];
2413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    qhwc::ListStats listStats[HWC_NUM_DISPLAY_TYPES];
24233ecf33ed4881d0b76ceffb8a6f34dc8fa775ed2Naseer Ahmed    qhwc::LayerCache *mLayerCache[HWC_NUM_DISPLAY_TYPES];
24365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    qhwc::LayerProp *layerProp[HWC_NUM_DISPLAY_TYPES];
244bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    qhwc::MDPComp *mMDPComp;
24589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
24656f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Securing in progress indicator
24756f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecuring;
248f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar    //External Display configuring progress indicator
249f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar    bool mExtDispConfiguring;
25056f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Display in secure mode indicator
25156f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecureMode;
25232ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed    //Lock to prevent set from being called while blanking
25332ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed    mutable Locker mBlankLock;
254f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar    //Lock to protect set when detaching external disp
255f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar    mutable Locker mExtSetLock;
256ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    //Vsync
257ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    struct vsync_state vstate;
25829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
25929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
260bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) {
261bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return  ctx->listStats[dpy].skipCount;
262bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
263bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
264bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) {
265bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return  ctx->listStats[dpy].yuvCount;
266bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
267bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
26829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif //HWC_UTILS_H
269