hwc_utils.h revision 27c1d65113aaac5c577523132b5b990552284ba9
129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed/*
229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * you may not use this file except in compliance with the License.
729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * You may obtain a copy of the License at
829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
1029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed *
1129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * Unless required by applicable law or agreed to in writing, software
1229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
1329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * See the License for the specific language governing permissions and
1529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed * limitations under the License.
1629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed */
1729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#ifndef HWC_UTILS_H
1929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define HWC_UTILS_H
2072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
215b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed#define HWC_REMOVE_DEPRECATED_VERSIONS 1
223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah#include <fcntl.h>
2329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#include <hardware/hwcomposer.h>
2432ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed#include <gr.h>
2572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <gralloc_priv.h>
2629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
2731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
2829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
2929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
3031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F
315b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed#define MAX_NUM_DISPLAYS 4 //Yes, this is ambitious
3229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
3372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//Fwrd decls
3429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t;
3572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedstruct framebuffer_device_t;
3672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
3756f610dd235b577725198e9341caae92379fdf23Saurabh Shahnamespace qService {
3856f610dd235b577725198e9341caae92379fdf23Saurabh Shahclass QService;
3956f610dd235b577725198e9341caae92379fdf23Saurabh Shah}
4056f610dd235b577725198e9341caae92379fdf23Saurabh Shah
4172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmednamespace overlay {
4272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass Overlay;
4372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed}
4472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
4529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace qhwc {
4672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//fwrd decl
4772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass QueuedBufferStore;
4896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedclass ExternalDisplay;
4996c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed
5096c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedstruct MDPInfo {
5196c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    int version;
5296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    char panel;
5396c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    bool hasOverlay;
5496c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed};
5529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct DisplayAttributes {
573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t vsync_period; //nanos
583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t xres;
593e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    uint32_t yres;
607b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float xdpi;
617b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed    float ydpi;
623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd;
63c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    bool connected; //Applies only to pluggable disp.
64c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //Connected does not mean it ready to use.
65c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    //It should be active also. (UNBLANKED)
663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    bool isActive;
6731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
693e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct ListStats {
703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int numAppLayers; //Total - 1, excluding FB layer.
713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int skipCount;
723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fbLayerIndex; //Always last for now. = numAppLayers
733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    //Video specific
743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvCount;
753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int yuvIndex;
7631da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed};
7731da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
787c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedenum {
797c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    HWC_MDPCOMP = 0x00000002,
807c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    HWC_LAYER_RESERVED_0 = 0x00000004,
817c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    HWC_LAYER_RESERVED_1 = 0x00000008
827c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed};
837c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed
8431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
8529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
8629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Utility functions - implemented in hwc_utils.cpp
875b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l);
883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list,
893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah        int dpy);
9029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx);
9129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx);
92f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries
93f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
9427c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah        const int fbWidth, const int fbHeight, int orient);
9529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool isExternalActive(hwc_context_t* ctx);
97fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah
982dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar//Sync point impl.
993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy);
1002dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar
10129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Inline utility functions
1025b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) {
10329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
10429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
10529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
10629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Returns true if the buffer is yuv
10729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
10829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
10929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
11029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
111f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah// Returns true if the buffer is secure
112f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) {
113f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah    return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
114f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah}
11529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//Return true if buffer is marked locked
11629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
11729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
11829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}
11931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
1204c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only
1214c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) {
1224c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY));
1234c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1244c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1254c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag.
1264c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) {
1274c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK));
1284c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1294c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
1304c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag.
1314c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) {
1324c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC));
1334c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed}
1344c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed
13572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed// Initialize uevent thread
13672cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
137ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed// Initialize vsync thread
138ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx);
13929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
1405b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer,
141ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed                               int& width, int& height)
1427c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed{
1437c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
1447c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    width = displayFrame.right - displayFrame.left;
1457c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed    height = displayFrame.bottom - displayFrame.top;
1467c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}
1473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
1483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic inline int openFb(int dpy) {
1493e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    int fd = -1;
1503e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    const char *devtmpl = "/dev/graphics/fb%u";
1513e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    char name[64] = {0};
1523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    snprintf(name, 64, devtmpl, dpy);
1533e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    fd = open(name, O_RDWR);
1543e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    return fd;
1553e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah}
1563e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
15727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahtemplate <class T>
15827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahinline void swap(T& a, T& b) {
15927c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    T tmp = a;
16027c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    a = b;
16127c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah    b = tmp;
16227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah}
16327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah
164f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //qhwc namespace
16529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
166ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedstruct vsync_state {
167ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    pthread_mutex_t lock;
168ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    pthread_cond_t  cond;
169ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    bool enable;
170ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed};
171ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed
17229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// -----------------------------------------------------------------------------
17329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// HWC context
17429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// This structure contains overall state
17529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t {
1765b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed    hwc_composer_device_1_t device;
1773be78d9816da84e48a40232165189f9deb16808fJesse Hall    const hwc_procs_t* proc;
178e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah
179e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah    //Private hwc handlers
180e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah    struct Callbacks {
181e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah        void (*onExtDisconnect)(const Callbacks& priv_proc);
182e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah        hwc_context_t *ctx;
183e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah    };
184e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah
185e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah    Callbacks priv_proc;
186e4f3f721b557c12832be8492c62e76acfa1579ebSaurabh Shah
187c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    int overlayInUse[HWC_NUM_DISPLAY_TYPES];
18829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
18929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Framebuffer device
19072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    framebuffer_device_t *mFbDev;
19131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed
19229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed    //Overlay object - NULL for non overlay devices
193c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    overlay::Overlay *mOverlay[HWC_NUM_DISPLAY_TYPES];
19429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
19556f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //QService object
19656f610dd235b577725198e9341caae92379fdf23Saurabh Shah    qService::QService *mQService;
19756f610dd235b577725198e9341caae92379fdf23Saurabh Shah
1980c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    // External display related information
19972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
20072cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed
20196c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    qhwc::MDPInfo mMDP;
20296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed
2033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    qhwc::DisplayAttributes dpyAttr[HWC_NUM_DISPLAY_TYPES];
2043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
2053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah    qhwc::ListStats listStats[HWC_NUM_DISPLAY_TYPES];
20656f610dd235b577725198e9341caae92379fdf23Saurabh Shah
20756f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Securing in progress indicator
20856f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecuring;
20956f610dd235b577725198e9341caae92379fdf23Saurabh Shah
21056f610dd235b577725198e9341caae92379fdf23Saurabh Shah    //Display in secure mode indicator
21156f610dd235b577725198e9341caae92379fdf23Saurabh Shah    bool mSecureMode;
21232ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed
21332ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed    //Lock to prevent set from being called while blanking
21432ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed    mutable Locker mBlankLock;
215ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    //Vsync
216ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed    struct vsync_state vstate;
21729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed};
21829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed
21929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif //HWC_UTILS_H
220