hwc_utils.h revision 6195b7af4c83ba34d713d8e2dd5b075a8896f61e
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>
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
393a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar// For support of virtual displays
403a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar#define HWC_DISPLAY_VIRTUAL     (HWC_DISPLAY_EXTERNAL+1)
413a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar#define MAX_DISPLAYS            (HWC_NUM_DISPLAY_TYPES+1)
423a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar
4372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//Fwrd decls
4429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t;
4572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedstruct framebuffer_device_t;
4672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
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
596195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
6096c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedstruct MDPInfo {
6196c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    int version;
6296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    char panel;
6396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    bool hasOverlay;
6496c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed};
6529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct DisplayAttributes {
673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t vsync_period; //nanos
683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t xres;
693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t yres;
7065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    uint32_t stride;
717b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float xdpi;
727b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float ydpi;
733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd;
74c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    bool connected; //Applies only to pluggable disp.
75c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //Connected does not mean it ready to use.
76c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //It should be active also. (UNBLANKED)
773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    bool isActive;
783a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    // In pause state, composition is bypassed
793a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    // used for WFD displays only
803a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    bool isPause;
8131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct ListStats {
843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int numAppLayers; //Total - 1, excluding FB layer.
853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int skipCount;
863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fbLayerIndex; //Always last for now. = numAppLayers
873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //Video specific
883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvCount;
8943d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran    int yuvIndices[MAX_NUM_LAYERS];
9053bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed    bool needsAlphaScale;
9131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
9231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
9365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedstruct LayerProp {
9465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    uint32_t mFlags; //qcom specific layer flags
9565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    LayerProp():mFlags(0) {};
9665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed};
9765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
9865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed// LayerProp::flag values
997c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedenum {
10065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed    HWC_MDPCOMP = 0x00000001,
1016195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    HWC_COPYBIT = 0x00000002,
1027c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed};
1037c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
10489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmedclass LayerCache {
10589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    public:
10689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    LayerCache() {
10789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        canUseLayerCache = false;
10889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        numHwLayers = 0;
10989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        for(uint32_t i = 0; i < MAX_NUM_LAYERS; i++) {
11089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed            hnd[i] = NULL;
11189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed        }
11289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    }
11389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    //LayerCache optimization
11489f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    void updateLayerCache(hwc_display_contents_1_t* list);
11589f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    void resetLayerCache(int num);
11689f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    void markCachedLayersAsOverlay(hwc_display_contents_1_t* list);
11789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    private:
11889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    uint32_t numHwLayers;
11989f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    bool canUseLayerCache;
12089f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed    buffer_handle_t hnd[MAX_NUM_LAYERS];
12189f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
12289f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed};
12389f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
12431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
12565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
12665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed
12729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
12829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Utility functions - implemented in hwc_utils.cpp
1295b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l);
1303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list,
1313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        int dpy);
13229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx);
13329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx);
134f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries
135f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
1366371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran                         const hwc_rect_t& scissor, int orient);
1376195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedvoid getNonWormholeRegion(hwc_display_contents_1_t* list,
1386195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed                              hwc_rect_t& nwr);
13965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedbool isSecuring(hwc_context_t* ctx);
14008cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhanbool isSecureModePolicy(int mdpVersion);
1413e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool isExternalActive(hwc_context_t* ctx);
1426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool needsScaling(hwc_layer_1_t const* layer);
143fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah
1443b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed//Helper function to dump logs
1453b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...);
1463b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed
1474012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R/* Calculates the destination position based on the action safe rectangle */
1484012258b6b344adccf19973602c4d092e2403053Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, uint32_t& x,
1494012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R                                        uint32_t& y, uint32_t& w, uint32_t& h);
1504012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R
1510859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah//Close acquireFenceFds of all layers of incoming list
1520859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shahvoid closeAcquireFds(hwc_display_contents_1_t* list);
1530859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah
1542dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar//Sync point impl.
1556c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy,
1566c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R                                                    int fd);
1572dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
15829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Inline utility functions
1595b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) {
16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
16129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
16229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
16329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Returns true if the buffer is yuv
16429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
16629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
16729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
168f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah// Returns true if the buffer is secure
169f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) {
170f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah    return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
171f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah}
17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//Return true if buffer is marked locked
17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
17631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
1774c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only
1784c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) {
1794c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY));
1804c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1814c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1824c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag.
1834c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) {
1844c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK));
1854c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1864c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1874c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag.
1884c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) {
1894c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC));
1904c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1914c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1926195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedtemplate<typename T> inline T max(T a, T b) { return (a > b) ? a : b; }
1936195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedtemplate<typename T> inline T min(T a, T b) { return (a < b) ? a : b; }
1946195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed
19572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed// Initialize uevent thread
19672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
197ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed// Initialize vsync thread
198ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx);
19929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2005b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer,
201ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed                               int& width, int& height)
2027c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed{
2037c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
2047c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    width = displayFrame.right - displayFrame.left;
2057c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    height = displayFrame.bottom - displayFrame.top;
2067c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
2073e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
2083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic inline int openFb(int dpy) {
2093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd = -1;
2103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    const char *devtmpl = "/dev/graphics/fb%u";
2113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    char name[64] = {0};
2123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    snprintf(name, 64, devtmpl, dpy);
2133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    fd = open(name, O_RDWR);
2143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return fd;
2153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
2163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
21727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahtemplate <class T>
21827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahinline void swap(T& a, T& b) {
21927c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    T tmp = a;
22027c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    a = b;
22127c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    b = tmp;
22227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah}
22327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
224f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //qhwc namespace
22529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
226ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedstruct vsync_state {
227ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    pthread_mutex_t lock;
228ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    pthread_cond_t  cond;
229ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    bool enable;
230ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed};
231ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed
23229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
23329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// HWC context
23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// This structure contains overall state
23529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t {
2365b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    hwc_composer_device_1_t device;
2373be78d9816da84e48a40232165189f9deb16808fJesse Hall    const hwc_procs_t* proc;
23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Framebuffer device
23972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    framebuffer_device_t *mFbDev;
2406c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
2416c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R    //CopyBit objects
2423a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::CopyBit *mCopyBit[MAX_DISPLAYS];
2436c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R
24429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Overlay object - NULL for non overlay devices
245d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    overlay::Overlay *mOverlay;
2466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    //Primary and external FB updater
2483a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::IFBUpdate *mFBUpdate[MAX_DISPLAYS];
2490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    // External display related information
25072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
25196c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    qhwc::MDPInfo mMDP;
2523a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::DisplayAttributes dpyAttr[MAX_DISPLAYS];
2533a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::ListStats listStats[MAX_DISPLAYS];
2543a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::LayerCache *mLayerCache[MAX_DISPLAYS];
2553a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar    qhwc::LayerProp *layerProp[MAX_DISPLAYS];
256bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    qhwc::MDPComp *mMDPComp;
25789f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed
25856f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Securing in progress indicator
25956f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecuring;
260f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar    //External Display configuring progress indicator
261f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar    bool mExtDispConfiguring;
26256f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Display in secure mode indicator
26356f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecureMode;
26432ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed    //Lock to prevent set from being called while blanking
26532ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed    mutable Locker mBlankLock;
266f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar    //Lock to protect set when detaching external disp
267f83d4480f2c7e37374c4516750aae79c6b12eb79Kinjal Bhavsar    mutable Locker mExtSetLock;
268ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    //Vsync
269ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    struct vsync_state vstate;
2706371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    //DMA used for rotator
2716371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran    bool mDMAInUse;
27229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
27329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
274bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) {
275bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return  ctx->listStats[dpy].skipCount;
276bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
277bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
278bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) {
279bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah    return  ctx->listStats[dpy].yuvCount;
280bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah}
281bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah
28229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif //HWC_UTILS_H
283