hwc_utils.h revision 5fcdd463b18bc1796d57fde7d2876a32a816d7c5
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> 3093393d36207ef501e851c98491befd9e528b6b1aJeykumar Sankaran#include <linux/fb.h> 3136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include "qdMetaData.h" 3236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include <overlayUtils.h> 3329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 3431da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed#define ALIGN_TO(x, align) (((x) + ((align)-1)) & ~((align)-1)) 3529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 3629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 370f47bb43e032f6396d9496c1ecb254c9aa7e94baRamkumar Radhakrishnan#define MAX_NUM_APP_LAYERS 32 3829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 393a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar// For support of virtual displays 405fcdd463b18bc1796d57fde7d2876a32a816d7c5Jesse Hall#define MAX_DISPLAYS (HWC_NUM_DISPLAY_TYPES) 413a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar 4272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//Fwrd decls 4329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t; 4472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 4536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace ovutils = overlay::utils; 4636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 4772cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmednamespace overlay { 4872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass Overlay; 4936963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass Rotator; 5036963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass RotMgr; 5172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed} 5272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed 5329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmednamespace qhwc { 5472cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed//fwrd decl 5572cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedclass QueuedBufferStore; 5696c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedclass ExternalDisplay; 576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahclass IFBUpdate; 5836963690317abceae79621f14ba41ff62b3ff489Saurabh Shahclass IVideoOverlay; 59bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahclass MDPComp; 606c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rclass CopyBit; 61d80659c540b719660c7af9f530445268bc409db6Saurabh Shahclass AssertiveDisplay; 6296c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed 636195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed 6496c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmedstruct MDPInfo { 6596c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed int version; 6696c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed char panel; 6796c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed bool hasOverlay; 6896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed}; 6929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 703e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct DisplayAttributes { 713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t vsync_period; //nanos 723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t xres; 733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah uint32_t yres; 7465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed uint32_t stride; 757b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed float xdpi; 767b80d9c8cb345f7020093e0afb691bf3a72deec6Naseer Ahmed float ydpi; 773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int fd; 78fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah bool connected; //Applies only to secondary displays 79c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah //Connected does not mean it ready to use. 80c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah //It should be active also. (UNBLANKED) 813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah bool isActive; 823a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // In pause state, composition is bypassed 833a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar // used for WFD displays only 843a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar bool isPause; 85fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah //Secondary displays will have this set until they are able to acquire 86fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah //pipes. 87fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah bool isConfiguring; 8831da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; 893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstruct ListStats { 913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int numAppLayers; //Total - 1, excluding FB layer. 923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int skipCount; 933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int fbLayerIndex; //Always last for now. = numAppLayers 943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //Video specific 953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int yuvCount; 960f47bb43e032f6396d9496c1ecb254c9aa7e94baRamkumar Radhakrishnan int yuvIndices[MAX_NUM_APP_LAYERS]; 9753bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed bool needsAlphaScale; 980edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N bool preMultipliedAlpha; 99ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed bool planeAlpha; 10031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed}; 10131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 10265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedstruct LayerProp { 10365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed uint32_t mFlags; //qcom specific layer flags 10465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed LayerProp():mFlags(0) {}; 10565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed}; 10665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 107c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmedstruct VsyncState { 108c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed bool enable; 109c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed bool fakevsync; 110c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed}; 111c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed 1127d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shahstruct BwcPM { 1137d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah static void setBwc(hwc_context_t *ctx, const hwc_rect_t& crop, 1147d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah const hwc_rect_t& dst, const int& transform, 1157d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah ovutils::eMdpFlags& mdpFlags); 1167d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah}; 1177d6f482d36c30eb0d1954c862b46457bf20658dfSaurabh Shah 11865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed// LayerProp::flag values 1197c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedenum { 12065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed HWC_MDPCOMP = 0x00000001, 1216195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed HWC_COPYBIT = 0x00000002, 1227c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}; 1237c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 1241e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahclass LayerRotMap { 1251e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahpublic: 1261e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah LayerRotMap() { reset(); } 1271e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah enum { MAX_SESS = 3 }; 1281e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah void add(hwc_layer_1_t* layer, overlay::Rotator *rot); 1291e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah void reset(); 1301e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah uint32_t getCount() const; 1311e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah hwc_layer_1_t* getLayer(uint32_t index) const; 1321e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah overlay::Rotator* getRot(uint32_t index) const; 1331e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah void setReleaseFd(const int& fence); 1341e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahprivate: 1351e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah hwc_layer_1_t* mLayer[MAX_SESS]; 1361e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah overlay::Rotator* mRot[MAX_SESS]; 1371e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah uint32_t mCount; 1381e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah}; 1391e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah 1401e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahinline uint32_t LayerRotMap::getCount() const { 1411e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah return mCount; 1421e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah} 1431e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah 1441e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahinline hwc_layer_1_t* LayerRotMap::getLayer(uint32_t index) const { 1451e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah if(index >= mCount) return NULL; 1461e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah return mLayer[index]; 1471e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah} 1481e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah 1491e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shahinline overlay::Rotator* LayerRotMap::getRot(uint32_t index) const { 1501e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah if(index >= mCount) return NULL; 1511e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah return mRot[index]; 1521e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah} 1531e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah 15429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// ----------------------------------------------------------------------------- 15529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Utility functions - implemented in hwc_utils.cpp 1565b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l); 1573e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list, 1583e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int dpy); 15929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid initContext(hwc_context_t *ctx); 16029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedvoid closeContext(hwc_context_t *ctx); 161f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Crops source buffer against destination and FB boundaries 162f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 1636371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran const hwc_rect_t& scissor, int orient); 1646195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedvoid getNonWormholeRegion(hwc_display_contents_1_t* list, 1656195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed hwc_rect_t& nwr); 166b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumarbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer); 16708cced40871ca190d231b39b63bd2d8cd85a32a8Sushil Chauhanbool isSecureModePolicy(int mdpVersion); 168fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah//Secondary display hasnt acquired any pipes yet. 169fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shah//Secondary stands for external as well as virtual 170fcd23276f6846a81a107c52372a9a29cf5dd8b4aSaurabh Shahbool isSecondaryConfiguring(hwc_context_t* ctx); 1715238cc1d48c93d1e00d11a87ee2693e071af7588Saurabh Shahbool needsScaling(hwc_context_t* ctx, hwc_layer_1_t const* layer, const int& dpy); 17227962189f494fada88706e612b1f57263bcca195Sravan Kumar D.V.Nbool isAlphaPresent(hwc_layer_1_t const* layer); 17313389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmedbool setupBasePipe(hwc_context_t *ctx); 17405207f5a7575e59e5f22bb9de46f3b6b6ce2cb8dNaseer Ahmedint hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable); 17518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmedint getBlending(int blending); 176fc2acbe75484dea7197b75d0ef9889f78398b06bSaurabh Shah 1773b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed//Helper function to dump logs 1783b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...); 1793b21dd5bc0f86209d9ea134523a494cfe9da601cNaseer Ahmed 1804012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R/* Calculates the destination position based on the action safe rectangle */ 1814012258b6b344adccf19973602c4d092e2403053Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, uint32_t& x, 1824012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R uint32_t& y, uint32_t& w, uint32_t& h); 1834012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R 1840859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah//Close acquireFenceFds of all layers of incoming list 1850859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shahvoid closeAcquireFds(hwc_display_contents_1_t* list); 1860859ab4be38e5874f6990c6d8b41b2576a7375a3Saurabh Shah 1872dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar//Sync point impl. 1886c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 18936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah int fd); 19036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 19136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Trims a layer's source crop which is outside of screen boundary. 19236963690317abceae79621f14ba41ff62b3ff489Saurabh Shahvoid trimLayer(hwc_context_t *ctx, const int& dpy, const int& transform, 19336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah hwc_rect_t& crop, hwc_rect_t& dst); 19436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 19536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Sets appropriate mdp flags for a layer. 19636963690317abceae79621f14ba41ff62b3ff489Saurabh Shahvoid setMdpFlags(hwc_layer_1_t *layer, 19736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ovutils::eMdpFlags &mdpFlags, 198c0f8e4f46400eaad2406af24561eb4ea61e99b68Ramkumar Radhakrishnan int rotDownscale); 19936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 200d527210b2308a79ee6211b93356fda472438e211Sushil Chauhanint configRotator(overlay::Rotator *rot, const ovutils::Whf& whf, 201d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan hwc_rect_t& crop, const ovutils::eMdpFlags& mdpFlags, 202d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan const ovutils::eTransform& orient, const int& downscale); 203d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan 204d527210b2308a79ee6211b93356fda472438e211Sushil Chauhanint configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg, 205d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan const ovutils::eTransform& orient, const hwc_rect_t& crop, 206d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan const hwc_rect_t& pos, const MetaData_t *metadata, 207d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan const ovutils::eDest& dest); 208d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan 209d527210b2308a79ee6211b93356fda472438e211Sushil Chauhanvoid updateSource(ovutils::eTransform& orient, ovutils::Whf& whf, 210d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan hwc_rect_t& crop); 211d527210b2308a79ee6211b93356fda472438e211Sushil Chauhan 21236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Routine to configure low resolution panels (<= 2048 width) 21336963690317abceae79621f14ba41ff62b3ff489Saurabh Shahint configureLowRes(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 21436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ovutils::eMdpFlags& mdpFlags, const ovutils::eZorder& z, 21536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah const ovutils::eIsFg& isFg, const ovutils::eDest& dest, 21636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah overlay::Rotator **rot); 21736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 21836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah//Routine to configure high resolution panels (> 2048 width) 21936963690317abceae79621f14ba41ff62b3ff489Saurabh Shahint configureHighRes(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 22036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ovutils::eMdpFlags& mdpFlags, const ovutils::eZorder& z, 22136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah const ovutils::eIsFg& isFg, const ovutils::eDest& lDest, 22236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah const ovutils::eDest& rDest, overlay::Rotator **rot); 2232dd04a873bc3d4b3ca50121347a8c702d097a2dfKinjal Bhavsar 22420de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//On certain targets DMA pipes are used for rotation and they won't be available 22520de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//for line operations. On a per-target basis we can restrict certain use cases 22620de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//from using rotator, since we know before-hand that such scenarios can lead to 22720de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//extreme unavailability of pipes. This can also be done via hybrid calculations 22820de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//also involving many more variables like number of write-back interfaces etc, 22920de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah//but the variety of scenarios is too high to warrant that. 23020de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shahbool canUseRotator(hwc_context_t *ctx); 23120de52e98f608ed30049d7add296ef2a6f134a24Saurabh Shah 232517e8b0015001fed3ea1d7bbeeda421de7fdeb2eSaurabh Shahint getLeftSplit(hwc_context_t *ctx, const int& dpy); 233517e8b0015001fed3ea1d7bbeeda421de7fdeb2eSaurabh Shah 23429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Inline utility functions 2355b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) { 23629a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER))); 23729a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 23829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 23929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// Returns true if the buffer is yuv 24029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) { 24129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO)); 24229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 24329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 244f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah// Returns true if the buffer is secure 245f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) { 246f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags)); 247f395d09031d07ea4836f4c6e0e597aee1830bac6Saurabh Shah} 24829a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed//Return true if buffer is marked locked 24929a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) { 25029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags)); 25129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed} 25231da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed 2534c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only 2544c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) { 2554c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY)); 2564c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed} 2574c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed 2584c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag. 2594c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) { 2604c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK)); 2614c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed} 2624c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed 2634c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag. 2644c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) { 2654c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC)); 2664c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed} 2674c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed 2686195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedtemplate<typename T> inline T max(T a, T b) { return (a > b) ? a : b; } 2696195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedtemplate<typename T> inline T min(T a, T b) { return (a < b) ? a : b; } 2706195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed 27172cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed// Initialize uevent thread 27272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx); 273ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmed// Initialize vsync thread 274ff4f0254be575a264504687c407e0db2fd5573d7Naseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx); 27529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 2765b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer, 27718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed int& width, int& height) { 2787c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 2797c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed width = displayFrame.right - displayFrame.left; 2807c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed height = displayFrame.bottom - displayFrame.top; 2817c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 2823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 2833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahstatic inline int openFb(int dpy) { 2843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int fd = -1; 2853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah const char *devtmpl = "/dev/graphics/fb%u"; 2863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah char name[64] = {0}; 2873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah snprintf(name, 64, devtmpl, dpy); 2883e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah fd = open(name, O_RDWR); 2893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return fd; 2903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah} 2913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 29227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahtemplate <class T> 29327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shahinline void swap(T& a, T& b) { 29427c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah T tmp = a; 29527c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah a = b; 29627c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah b = tmp; 29727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah} 29827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah 299f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //qhwc namespace 30029a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 30129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// ----------------------------------------------------------------------------- 30229a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// HWC context 30329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed// This structure contains overall state 30429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmedstruct hwc_context_t { 3055b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_composer_device_1_t device; 3063be78d9816da84e48a40232165189f9deb16808fJesse Hall const hwc_procs_t* proc; 3076c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R 3086c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R //CopyBit objects 3093a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar qhwc::CopyBit *mCopyBit[MAX_DISPLAYS]; 3106c43ebed229c5d1e00c6d41638cd2f8e3cb979b7Arun Kumar K.R 31129a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed //Overlay object - NULL for non overlay devices 312d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed overlay::Overlay *mOverlay; 31336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah //Holds a few rot objects 31436963690317abceae79621f14ba41ff62b3ff489Saurabh Shah overlay::RotMgr *mRotMgr; 3156457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah 3166457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah //Primary and external FB updater 3173a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar qhwc::IFBUpdate *mFBUpdate[MAX_DISPLAYS]; 3180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed // External display related information 31972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed qhwc::ExternalDisplay *mExtDisplay; 32096c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed qhwc::MDPInfo mMDP; 321c2f61ab1d7cc647126b30c4793d700299e90f192Naseer Ahmed qhwc::VsyncState vstate; 3223a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar qhwc::DisplayAttributes dpyAttr[MAX_DISPLAYS]; 3233a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar qhwc::ListStats listStats[MAX_DISPLAYS]; 3243a85d3e5b8f689cb3a3ef7ef1ce50c1e01afae1aAmara Venkata Mastan Manoj Kumar qhwc::LayerProp *layerProp[MAX_DISPLAYS]; 3251e2af0f047ca851e6063729239bc82c6b4a78b42Saurabh Shah qhwc::LayerRotMap *mLayerRotMap[MAX_DISPLAYS]; 32685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah qhwc::MDPComp *mMDPComp[MAX_DISPLAYS]; 327d80659c540b719660c7af9f530445268bc409db6Saurabh Shah qhwc::AssertiveDisplay *mAD; 32889f9d5d65dc4f3ef2bea3d3b091069cb6af0fc38Naseer Ahmed 32956f610dd235b577725198e9341caae92379fdf23Saurabh Shah //Securing in progress indicator 33056f610dd235b577725198e9341caae92379fdf23Saurabh Shah bool mSecuring; 33156f610dd235b577725198e9341caae92379fdf23Saurabh Shah //Display in secure mode indicator 33256f610dd235b577725198e9341caae92379fdf23Saurabh Shah bool mSecureMode; 33332ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed //Lock to prevent set from being called while blanking 33432ff225e6d77baeb38925faba4b6b8457fab6b7bNaseer Ahmed mutable Locker mBlankLock; 335843b225b518ca5495aab3a4a5eddba5fb60381ecRaj kamal //Lock to protect prepare & set when detaching external disp 336843b225b518ca5495aab3a4a5eddba5fb60381ecRaj kamal mutable Locker mExtLock; 33713389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed //Check if base pipe is set up 33813389e567b043f692ee60c3f0d7a43cb8b11a024Naseer Ahmed bool mBasePipeSetup; 3395a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah //Drawing round when we use GPU 3405a4b615e1d04b0b9f3572530b330dda4f10853d0Saurabh Shah bool isPaddingRound; 34104af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah //Flags the transition of a video session 34204af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah bool mVideoTransFlag; 34329a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed}; 34429a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed 34536963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace qhwc { 346bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) { 347bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah return ctx->listStats[dpy].skipCount; 348bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah} 349bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 350bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) { 351bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah return ctx->listStats[dpy].yuvCount; 352bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah} 35336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah}; 354bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 35529a26818d7294055539167b2fbfdaa168bcf725cNaseer Ahmed#endif //HWC_UTILS_H 356