hwc_utils.h revision 140ee6411106722dae886dc8c5b104b72d64dee0
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 3f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R * Copyright (C)2012-2014, The Linux Foundation. All rights reserved. 44019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * 54019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained 64019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * for attribution purposes only. 7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License. 10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at 11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and 18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License. 19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 20befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#ifndef HWC_UTILS_H 22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define HWC_UTILS_H 231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 24660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define HWC_REMOVE_DEPRECATED_VERSIONS 1 252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah#include <fcntl.h> 268f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah#include <math.h> 27befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <hardware/hwcomposer.h> 2877d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed#include <gr.h> 291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h> 3093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed#include <utils/String8.h> 31327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include "qdMetaData.h" 32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayUtils.h> 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 34bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define ALIGN_TO(x, align) (((x) + ((align)-1)) & ~((align)-1)) 35befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 36befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 37d9381b134ed518570554296fbfab8fd1175ecdb8Ramkumar Radhakrishnan#define MAX_NUM_APP_LAYERS 32 38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 391589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//Fwrd decls 40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t; 411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 42327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace ovutils = overlay::utils; 43327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmednamespace overlay { 451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass Overlay; 46327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahclass Rotator; 47327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahclass RotMgr; 481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace qhwc { 511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//fwrd decl 521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass QueuedBufferStore; 53b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedclass ExternalDisplay; 54361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaranclass VirtualDisplay; 55640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahclass IFBUpdate; 56327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahclass IVideoOverlay; 57c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahclass MDPComp; 584019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.Rclass CopyBit; 59c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnanclass HwcDebug; 60f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shahclass AssertiveDisplay; 61c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmedclass VPUClient; 62140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanclass HWCVirtualBase; 63b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed 6404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 65b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedstruct MDPInfo { 66b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed int version; 67b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed char panel; 68b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed bool hasOverlay; 69b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed}; 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct DisplayAttributes { 722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t vsync_period; //nanos 732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t xres; 742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t yres; 7516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed uint32_t stride; 7679e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed float xdpi; 7779e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed float ydpi; 782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fd; 7976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah bool connected; //Applies only to pluggable disp. 8076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //Connected does not mean it ready to use. 8176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //It should be active also. (UNBLANKED) 822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah bool isActive; 8390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // In pause state, composition is bypassed 8490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // used for WFD displays only 8590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar bool isPause; 86361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // To trigger padding round to clean up mdp 87361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // pipes 88361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran bool isConfiguring; 89fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // External Display is in MDP Downscale mode indicator 90fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar bool mDownScaleMode; 91ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R // Ext dst Rect 92ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R hwc_rect_t mDstRect; 93ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan //Action safe attributes 94ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan // Flag to indicate the presence of action safe dimensions for external 95ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan bool mActionSafePresent; 96ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan int mAsWidthRatio; 97ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan int mAsHeightRatio; 98bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; 992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 1002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct ListStats { 1012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int numAppLayers; //Total - 1, excluding FB layer. 1022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int skipCount; 1032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fbLayerIndex; //Always last for now. = numAppLayers 1042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //Video specific 1052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int yuvCount; 106d9381b134ed518570554296fbfab8fd1175ecdb8Ramkumar Radhakrishnan int yuvIndices[MAX_NUM_APP_LAYERS]; 107eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R int extOnlyLayerIndex; 1085c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N bool preMultipliedAlpha; 10915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int yuv4k2kIndices[MAX_NUM_APP_LAYERS]; 11015c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna int yuv4k2kCount; 111a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // Notifies hwcomposer about the start and end of animation 112a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // This will be set to true during animation, otherwise false. 113a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan bool isDisplayAnimating; 114bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ovutils::Dim roi; 1151b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan bool secureUI; // Secure display layer 11694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah bool isSecurePresent; 117bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; 118bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 11916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedstruct LayerProp { 12016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed uint32_t mFlags; //qcom specific layer flags 121bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran LayerProp():mFlags(0){}; 12216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}; 12316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 12410d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmedstruct VsyncState { 12510d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed bool enable; 12610d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed bool fakevsync; 12710d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed}; 12810d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed 129f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shahstruct BwcPM { 130f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah static void setBwc(hwc_context_t *ctx, const hwc_rect_t& crop, 131f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah const hwc_rect_t& dst, const int& transform, 132f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah ovutils::eMdpFlags& mdpFlags); 133f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah}; 134f0a7a20029deae76ea13d90099a09cc5e540f6baSaurabh Shah 13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed// LayerProp::flag values 136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedenum { 13716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed HWC_MDPCOMP = 0x00000001, 13804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed HWC_COPYBIT = 0x00000002, 139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; 140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 141f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan// HAL specific features 142f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhanenum { 143905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan HWC_COLOR_FILL = 0x00000008, 144f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan HWC_FORMAT_RB_SWAP = 0x00000040, 145f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan}; 146f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan 14743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahclass LayerRotMap { 14843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahpublic: 14943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah LayerRotMap() { reset(); } 15043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah enum { MAX_SESS = 3 }; 15143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah void add(hwc_layer_1_t* layer, overlay::Rotator *rot); 152b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //Resets the mapping of layer to rotator 15343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah void reset(); 154b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //Clears mappings and existing rotator fences 155b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //Intended to be used during errors 156b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah void clear(); 15743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah uint32_t getCount() const; 15843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah hwc_layer_1_t* getLayer(uint32_t index) const; 15943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah overlay::Rotator* getRot(uint32_t index) const; 16043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah void setReleaseFd(const int& fence); 16143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahprivate: 16243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah hwc_layer_1_t* mLayer[MAX_SESS]; 16343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah overlay::Rotator* mRot[MAX_SESS]; 16443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah uint32_t mCount; 16543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah}; 16643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 16743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahinline uint32_t LayerRotMap::getCount() const { 16843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah return mCount; 16943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah} 17043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 17143addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahinline hwc_layer_1_t* LayerRotMap::getLayer(uint32_t index) const { 17243addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah if(index >= mCount) return NULL; 17343addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah return mLayer[index]; 17443addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah} 17543addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 17643addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shahinline overlay::Rotator* LayerRotMap::getRot(uint32_t index) const { 17743addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah if(index >= mCount) return NULL; 17843addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah return mRot[index]; 17943addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah} 18043addde8368fa726b6be3ff2194eca4fc0741994Saurabh Shah 1818f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shahinline hwc_rect_t integerizeSourceCrop(const hwc_frect_t& cropF) { 1828f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t cropI = {0}; 1838f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.left = int(ceilf(cropF.left)); 1848f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.top = int(ceilf(cropF.top)); 1858f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.right = int(floorf(cropF.right)); 1868f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah cropI.bottom = int(floorf(cropF.bottom)); 1878f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah return cropI; 1888f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah} 1898f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah 19080864f9daffae7750e05efe41f63e029f5699511Naseer Ahmedinline bool isNonIntegralSourceCrop(const hwc_frect_t& cropF) { 19180864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed if(cropF.left - roundf(cropF.left) || 19280864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed cropF.top - roundf(cropF.top) || 19380864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed cropF.right - roundf(cropF.right) || 19480864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed cropF.bottom - roundf(cropF.bottom)) 19580864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return true; 19680864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed else 19780864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed return false; 19880864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed} 19980864f9daffae7750e05efe41f63e029f5699511Naseer Ahmed 200befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// ----------------------------------------------------------------------------- 201befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Utility functions - implemented in hwc_utils.cpp 202660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l); 2036289b315a26aede5ac12b89e65d8024b1ed0dd05Saurabh Shahvoid setListStats(hwc_context_t *ctx, hwc_display_contents_1_t *list, 2042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int dpy); 205befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid initContext(hwc_context_t *ctx); 206befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid closeContext(hwc_context_t *ctx); 207ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed//Crops source buffer against destination and FB boundaries 208ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 209c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran const hwc_rect_t& scissor, int orient); 21004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedvoid getNonWormholeRegion(hwc_display_contents_1_t* list, 21104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hwc_rect_t& nwr); 212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool isSecuring(hwc_context_t* ctx, hwc_layer_1_t const* layer); 2136b90a0c838871669457f5f81361ec062feb7539dSushil Chauhanbool isSecureModePolicy(int mdpVersion); 2142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahbool isExternalActive(hwc_context_t* ctx); 21586c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool isAlphaScaled(hwc_layer_1_t const* layer); 21686c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool needsScaling(hwc_layer_1_t const* layer); 21786c677669148a60b5d472fba407c2bfcdc0c05bePrabhanjan Kandulabool isDownscaleRequired(hwc_layer_1_t const* layer); 21844625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhanbool needsScalingWithSplit(hwc_context_t* ctx, hwc_layer_1_t const* layer, 21944625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan const int& dpy); 22044625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhanvoid sanitizeSourceCrop(hwc_rect_t& cropL, hwc_rect_t& cropR, 22144625ff6484744d1307c0bb0d00e8c0ad90325ffSushil Chauhan private_handle_t *hnd); 222a6b4d9570f8cc6d57f8b4f724c06e6ec6877b4a4Sravan Kumar D.V.Nbool isAlphaPresent(hwc_layer_1_t const* layer); 22355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmedint hwc_vsync_control(hwc_context_t* ctx, int dpy, int enable); 22412a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmedint getBlending(int blending); 225140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanbool isGLESOnlyComp(hwc_context_t *ctx, const int& dpy); 226140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanvoid reset_layer_prop(hwc_context_t* ctx, int dpy, int numAppLayers); 227a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah 22893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed//Helper function to dump logs 22993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...); 23093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 23197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnanint getExtOrientation(hwc_context_t* ctx); 232f13681b96223de6b84461174aa08fe6d2959ced0Jeykumar Sankaranbool isValidRect(const hwc_rect_t& rect); 233b81222638c632a44d894b15590c9c90b1adc959eJeykumar Sankaranhwc_rect_t deductRect(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 234f13681b96223de6b84461174aa08fe6d2959ced0Jeykumar Sankaranhwc_rect_t getIntersection(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 235f13681b96223de6b84461174aa08fe6d2959ced0Jeykumar Sankaranhwc_rect_t getUnion(const hwc_rect_t& rect1, const hwc_rect_t& rect2); 23677846b8bdb582d03273ccaf9be58f8544659cd10Prabhanjan Kandulavoid optimizeLayerRects(hwc_context_t *ctx, 23736035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula const hwc_display_contents_1_t *list, const int& dpy); 23836035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandulabool areLayersIntersecting(const hwc_layer_1_t* layer1, 23936035afc0c366c26d7c330d004e7ded510c1f88cPrabhanjan Kandula const hwc_layer_1_t* layer2); 24077846b8bdb582d03273ccaf9be58f8544659cd10Prabhanjan Kandula 241ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan// returns true if Action safe dimensions are set and target supports Actionsafe 242ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnanbool isActionSafePresent(hwc_context_t *ctx, int dpy); 243ba3d6165c19bcec9a56eb2db1b13f8f930c5651bRamkumar Radhakrishnan 2440ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R/* Calculates the destination position based on the action safe rectangle */ 24523421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, hwc_rect_t& dst); 2460ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 24723421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid getAspectRatioPosition(int destWidth, int destHeight, int srcWidth, 24823421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R int srcHeight, hwc_rect_t& rect); 2493b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 25023421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid getAspectRatioPosition(hwc_context_t* ctx, int dpy, int extOrientation, 25123421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R hwc_rect_t& inRect, hwc_rect_t& outRect); 25223421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R 25323421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rbool isPrimaryPortrait(hwc_context_t *ctx); 25423421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.R 255fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumarbool isOrientationPortrait(hwc_context_t *ctx); 256fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar 25723421d260e81161813b0d8a14dac30d4d89ed380Arun Kumar K.Rvoid calcExtDisplayPosition(hwc_context_t *ctx, 25897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan private_handle_t *hnd, 259fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar int dpy, 260fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar hwc_rect_t& sourceCrop, 26197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan hwc_rect_t& displayFrame, 26297c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan int& transform, 26397c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ovutils::eTransform& orient); 26497c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan 265effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R// Returns the orientation that needs to be set on external for 266effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R// BufferMirrirMode(Sidesync) 267effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.Rint getMirrorModeOrientation(hwc_context_t *ctx); 2683b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 269f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R// Handles wfd Pause and resume events 270f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.Rvoid handle_pause(hwc_context_t *ctx, int dpy); 271f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.Rvoid handle_resume(hwc_context_t *ctx, int dpy); 272f39af541bb947658b15cda3602beeb0df8cf5c56Arun Kumar K.R 273a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah//Close acquireFenceFds of all layers of incoming list 274a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shahvoid closeAcquireFds(hwc_display_contents_1_t* list); 275a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 27633147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar//Sync point impl. 2774019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 278327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd); 279327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 280327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Sets appropriate mdp flags for a layer. 281327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahvoid setMdpFlags(hwc_layer_1_t *layer, 282327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovutils::eMdpFlags &mdpFlags, 2833e76f19cb2c0441315ebe54110f7b452d2932f52Ramkumar Radhakrishnan int rotDownscale, int transform); 284327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 2855365726ef260406513c4787b6ed253eda754370cPrabhanjan Kandulaint configRotator(overlay::Rotator *rot, ovutils::Whf& whf, 286e2f07405d2d04aaf5577080761cd2b11a9e3c736Sushil Chauhan hwc_rect_t& crop, const ovutils::eMdpFlags& mdpFlags, 2873b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const ovutils::eTransform& orient, const int& downscale); 2883b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 2893b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rint configMdp(overlay::Overlay *ov, const ovutils::PipeArgs& parg, 2903b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const ovutils::eTransform& orient, const hwc_rect_t& crop, 2913b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const hwc_rect_t& pos, const MetaData_t *metadata, 2923b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R const ovutils::eDest& dest); 2933b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 29408cbd816733f17c957411ae915f2543afea70b67Sushil Chauhanint configColorLayer(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 29508cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 29608cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan ovutils::eIsFg& isFg, const ovutils::eDest& dest); 29708cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan 2983b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rvoid updateSource(ovutils::eTransform& orient, ovutils::Whf& whf, 2993b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R hwc_rect_t& crop); 3003b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 301327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Routine to configure low resolution panels (<= 2048 width) 302f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint configureNonSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 303a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 304a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eIsFg& isFg, const ovutils::eDest& dest, 305327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah overlay::Rotator **rot); 306327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 307327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah//Routine to configure high resolution panels (> 2048 width) 308f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahint configureSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, const int& dpy, 309a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 310a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ovutils::eIsFg& isFg, const ovutils::eDest& lDest, 311327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah const ovutils::eDest& rDest, overlay::Rotator **rot); 31233147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar 31315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna//Routine to split and configure high resolution YUV layer (> 2048 width) 31415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnaint configureSourceSplit(hwc_context_t *ctx, hwc_layer_1_t *layer, 31515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const int& dpy, 31615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eMdpFlags& mdpFlags, ovutils::eZorder& z, 31715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna ovutils::eIsFg& isFg, const ovutils::eDest& lDest, 31815c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna const ovutils::eDest& rDest, overlay::Rotator **rot); 31915c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 320e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//On certain targets DMA pipes are used for rotation and they won't be available 321e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//for line operations. On a per-target basis we can restrict certain use cases 322e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//from using rotator, since we know before-hand that such scenarios can lead to 323e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//extreme unavailability of pipes. This can also be done via hybrid calculations 324e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//also involving many more variables like number of write-back interfaces etc, 325e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah//but the variety of scenarios is too high to warrant that. 32686adeda0140053bfc618f5fc087d30c7221459daAmara Venkata Mastan Manoj Kumarbool canUseRotator(hwc_context_t *ctx, int dpy); 327e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah 3289640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shahint getLeftSplit(hwc_context_t *ctx, const int& dpy); 3299640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah 330f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool isDisplaySplit(hwc_context_t* ctx, int dpy); 331f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah 332befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Inline utility functions 333660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) { 334befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER))); 335befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 336befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 337befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Returns true if the buffer is yuv 338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) { 339befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO)); 340befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 341befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 34215c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna// Returns true if the buffer is yuv 34315c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishnastatic inline bool is4kx2kYuvBuffer(const private_handle_t* hnd) { 34415c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO) && 34515c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna (hnd->width > 2048)); 34615c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna} 34715c02b94dcc7d61d4af05ac32b3c4db3b3b8a1e6radhakrishna 348ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah// Returns true if the buffer is secure 349ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) { 350ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags)); 351ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah} 352c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 353c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMstatic inline bool isTileRendered(const private_handle_t* hnd) { 354c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM return (hnd && (private_handle_t::PRIV_FLAGS_TILE_RENDERED & hnd->flags)); 355c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM} 356c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 357befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed//Return true if buffer is marked locked 358befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) { 359befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags)); 360befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 361bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 3625d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only 3635d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) { 3645d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY)); 3655d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 3665d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 3675d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag. 3685d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) { 3695d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK)); 3705d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 3715d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 3725d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag. 3735d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) { 3745d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC)); 3755d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 3765d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 3771b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan//Return true if the buffer is intended for Secure Display 3781b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnanstatic inline bool isSecureDisplayBuffer(const private_handle_t* hnd) { 3791b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_SECURE_DISPLAY)); 3801b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan} 3811b28b60e15c27fee703a16fbd1e42e3b41b031fdRamkumar Radhakrishnan 3820d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnanstatic inline int getWidth(const private_handle_t* hnd) { 3830d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(isYuvBuffer(hnd)) { 3840d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 3850d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 3860d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return metadata->bufferDim.sliceWidth; 3870d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 3880d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 3890d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return hnd->width; 3900d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan} 3910d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan 3920d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnanstatic inline int getHeight(const private_handle_t* hnd) { 3930d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(isYuvBuffer(hnd)) { 3940d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 3950d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan if(metadata && metadata->operation & UPDATE_BUFFER_GEOMETRY) { 3960d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return metadata->bufferDim.sliceHeight; 3970d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 3980d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan } 3990d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan return hnd->height; 4000d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan} 4010d530c8c754e9ccb1f122ee2818d9d1d47d7d4daRamkumar Radhakrishnan 40204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedtemplate<typename T> inline T max(T a, T b) { return (a > b) ? a : b; } 40304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedtemplate<typename T> inline T min(T a, T b) { return (a < b) ? a : b; } 40404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 4051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed// Initialize uevent thread 4061589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx); 407aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed// Initialize vsync thread 408aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx); 409befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 410660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer, 41112a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed int& width, int& height) { 412c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 413c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed width = displayFrame.right - displayFrame.left; 414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed height = displayFrame.bottom - displayFrame.top; 415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 4172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic inline int openFb(int dpy) { 4182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fd = -1; 4192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const char *devtmpl = "/dev/graphics/fb%u"; 4202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah char name[64] = {0}; 4212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah snprintf(name, 64, devtmpl, dpy); 4222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fd = open(name, O_RDWR); 4232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return fd; 4242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 4252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 4269a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shahtemplate <class T> 4279a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shahinline void swap(T& a, T& b) { 4289a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah T tmp = a; 4299a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah a = b; 4309a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah b = tmp; 4319a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah} 4329a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah 433ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}; //qhwc namespace 434befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 435c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnanenum eAnimationState{ 436c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ANIMATION_STOPPED, 437c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan ANIMATION_STARTED, 438c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan}; 439c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan 440befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// ----------------------------------------------------------------------------- 441befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// HWC context 442befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// This structure contains overall state 443befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t { 444660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_composer_device_1_t device; 445359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall const hwc_procs_t* proc; 4464019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R 4474019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R //CopyBit objects 4480df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::CopyBit *mCopyBit[HWC_NUM_DISPLAY_TYPES]; 4494019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R 450befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed //Overlay object - NULL for non overlay devices 45147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed overlay::Overlay *mOverlay; 452327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah //Holds a few rot objects 453327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah overlay::RotMgr *mRotMgr; 454640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 455640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah //Primary and external FB updater 4560df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::IFBUpdate *mFBUpdate[HWC_NUM_DISPLAY_TYPES]; 457ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // External display related information 4581589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed qhwc::ExternalDisplay *mExtDisplay; 459361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran qhwc::VirtualDisplay *mVirtualDisplay; 460b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed qhwc::MDPInfo mMDP; 46110d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed qhwc::VsyncState vstate; 4620df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::DisplayAttributes dpyAttr[HWC_NUM_DISPLAY_TYPES]; 4630df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::ListStats listStats[HWC_NUM_DISPLAY_TYPES]; 4640df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::LayerProp *layerProp[HWC_NUM_DISPLAY_TYPES]; 4650df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::MDPComp *mMDPComp[HWC_NUM_DISPLAY_TYPES]; 4660df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::HwcDebug *mHwcDebug[HWC_NUM_DISPLAY_TYPES]; 467456d555b1dc25dd1891ab7e38494d057b6bdf82eRamkumar Radhakrishnan hwc_rect_t mViewFrame[HWC_NUM_DISPLAY_TYPES]; 468f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah qhwc::AssertiveDisplay *mAD; 469c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed qhwc::VPUClient *mVPUClient; 470c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan eAnimationState mAnimationState[HWC_NUM_DISPLAY_TYPES]; 471140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan qhwc::HWCVirtualBase *mHWCVirtual; 4729f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed 473c3da4cc59d8e21b5905bd0ee3adf556dfe62b0e1Ramkumar Radhakrishnan // stores the primary device orientation 474a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan int deviceOrientation; 475bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah //Securing in progress indicator 476bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah bool mSecuring; 477361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran //WFD on proprietary stack 478361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran bool mVirtualonExtActive; 479bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah //Display in secure mode indicator 480bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah bool mSecureMode; 4811a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah //Lock to protect drawing data structures 4821a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah mutable Locker mDrawLock; 483586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah //Drawing round when we use GPU 484586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah bool isPaddingRound; 4853b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R // External Orientation 4863b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R int mExtOrientation; 48756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //Flags the transition of a video session 48856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah bool mVideoTransFlag; 489effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R 490effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R //Used for SideSync feature 491effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R //which overrides the mExtOrientation 492effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R bool mBufferMirrorMode; 493effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R 4940df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar qhwc::LayerRotMap *mLayerRotMap[HWC_NUM_DISPLAY_TYPES]; 49527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 49627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran // Panel reset flag will be set if BTA check fails 49727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran bool mPanelResetStatus; 498befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 499befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 500327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 501c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) { 502c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return ctx->listStats[dpy].skipCount; 503c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 504c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 505c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) { 506c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return ctx->listStats[dpy].yuvCount; 507c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 508efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 509efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shahstatic inline bool has90Transform(hwc_layer_1_t *layer) { 51008cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan return ((layer->transform & HWC_TRANSFORM_ROT_90) && 51108cbd816733f17c957411ae915f2543afea70b67Sushil Chauhan !(layer->flags & HWC_COLOR_FILL)); 512efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah} 513efab1d5273ce9a284e306f2607e501410cfbc8b9Saurabh Shah 51494f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shahinline bool isSecurePresent(hwc_context_t *ctx, int dpy) { 51594f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah return ctx->listStats[dpy].isSecurePresent; 51694f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah} 51794f50bebdee0b3ab9deb6d51426c542407ced5fdSaurabh Shah 518140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanstatic inline bool isSecondaryConfiguring(hwc_context_t* ctx) { 519140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].isConfiguring || 520140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isConfiguring); 521140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 522140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 523140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnanstatic inline bool isSecondaryConnected(hwc_context_t* ctx) { 524140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan return (ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].connected || 525140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected); 526140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan} 527140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan 528327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah}; 529c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 530befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif //HWC_UTILS_H 531