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