hwc_utils.h revision c8d563c4df56d25bf6ac6f38fb6703150458737a
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 3c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C)2012-2013, 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> 26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <hardware/hwcomposer.h> 2777d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed#include <gr.h> 281589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h> 2993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed#include <utils/String8.h> 30befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 31bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define ALIGN_TO(x, align) (((x) + ((align)-1)) & ~((align)-1)) 32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) 34bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F 35660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define MAX_NUM_DISPLAYS 4 //Yes, this is ambitious 369f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed#define MAX_NUM_LAYERS 32 37640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah#define MAX_DISPLAY_DIM 2048 38befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 3990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar// For support of virtual displays 4090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar#define HWC_DISPLAY_VIRTUAL (HWC_DISPLAY_EXTERNAL+1) 4190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar#define MAX_DISPLAYS (HWC_NUM_DISPLAY_TYPES+1) 4290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar 431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//Fwrd decls 44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t; 451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedstruct framebuffer_device_t; 461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmednamespace overlay { 481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass Overlay; 491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace qhwc { 521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//fwrd decl 531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass QueuedBufferStore; 54b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedclass ExternalDisplay; 55640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahclass IFBUpdate; 56c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahclass MDPComp; 574019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.Rclass CopyBit; 58b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed 59b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedstruct MDPInfo { 60b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed int version; 61b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed char panel; 62b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed bool hasOverlay; 63b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed}; 64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct DisplayAttributes { 662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t vsync_period; //nanos 672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t xres; 682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t yres; 6916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed uint32_t stride; 7079e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed float xdpi; 7179e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed float ydpi; 722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fd; 7376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah bool connected; //Applies only to pluggable disp. 7476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //Connected does not mean it ready to use. 7576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah //It should be active also. (UNBLANKED) 762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah bool isActive; 7790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // In pause state, composition is bypassed 7890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar // used for WFD displays only 7990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar bool isPause; 80bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; 812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct ListStats { 832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int numAppLayers; //Total - 1, excluding FB layer. 842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int skipCount; 852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fbLayerIndex; //Always last for now. = numAppLayers 862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //Video specific 872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int yuvCount; 885a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran int yuvIndices[MAX_NUM_LAYERS]; 8933650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed bool needsAlphaScale; 90bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed}; 91bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 9216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedstruct LayerProp { 9316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed uint32_t mFlags; //qcom specific layer flags 9416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed LayerProp():mFlags(0) {}; 9516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}; 9616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 9716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed// LayerProp::flag values 98c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedenum { 9916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed HWC_MDPCOMP = 0x00000001, 100c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; 101c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1029f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedclass LayerCache { 1039f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed public: 1049f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed LayerCache() { 1059f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed canUseLayerCache = false; 1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed numHwLayers = 0; 1079f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed for(uint32_t i = 0; i < MAX_NUM_LAYERS; i++) { 1089f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hnd[i] = NULL; 1099f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1109f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed //LayerCache optimization 1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed void updateLayerCache(hwc_display_contents_1_t* list); 1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed void resetLayerCache(int num); 1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed void markCachedLayersAsOverlay(hwc_display_contents_1_t* list); 1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed private: 1169f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed uint32_t numHwLayers; 1179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed bool canUseLayerCache; 1189f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed buffer_handle_t hnd[MAX_NUM_LAYERS]; 1199f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed 1209f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed}; 1219f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed 122bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 12316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 12416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 125befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// ----------------------------------------------------------------------------- 126befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Utility functions - implemented in hwc_utils.cpp 127660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l); 1282e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list, 1292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int dpy); 130befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid initContext(hwc_context_t *ctx); 131befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid closeContext(hwc_context_t *ctx); 132ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed//Crops source buffer against destination and FB boundaries 133ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst, 134c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran const hwc_rect_t& scissor, int orient); 13516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool isSecuring(hwc_context_t* ctx); 1366b90a0c838871669457f5f81361ec062feb7539dSushil Chauhanbool isSecureModePolicy(int mdpVersion); 1372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahbool isExternalActive(hwc_context_t* ctx); 138c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool needsScaling(hwc_layer_1_t const* layer); 139a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah 14093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed//Helper function to dump logs 14193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid dumpsys_log(android::String8& buf, const char* fmt, ...); 14293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 1430ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R/* Calculates the destination position based on the action safe rectangle */ 1440ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.Rvoid getActionSafePosition(hwc_context_t *ctx, int dpy, uint32_t& x, 1450ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R uint32_t& y, uint32_t& w, uint32_t& h); 1460ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R 14733147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar//Sync point impl. 1484019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.Rint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy, 1494019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd); 15033147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar 151befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Inline utility functions 152660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) { 153befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER))); 154befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 155befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 156befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Returns true if the buffer is yuv 157befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) { 158befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO)); 159befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 160befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 161ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah// Returns true if the buffer is secure 162ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) { 163ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags)); 164ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah} 165befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed//Return true if buffer is marked locked 166befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) { 167befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags)); 168befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 169bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed 1705d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only 1715d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) { 1725d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY)); 1735d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 1745d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 1755d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag. 1765d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) { 1775d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK)); 1785d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 1795d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 1805d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag. 1815d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) { 1825d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC)); 1835d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed} 1845d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed 1851589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed// Initialize uevent thread 1861589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx); 187aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed// Initialize vsync thread 188aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx); 189befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 190660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer, 191aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed int& width, int& height) 192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 193c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 194c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed width = displayFrame.right - displayFrame.left; 195c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed height = displayFrame.bottom - displayFrame.top; 196c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 1982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic inline int openFb(int dpy) { 1992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int fd = -1; 2002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const char *devtmpl = "/dev/graphics/fb%u"; 2012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah char name[64] = {0}; 2022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah snprintf(name, 64, devtmpl, dpy); 2032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah fd = open(name, O_RDWR); 2042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return fd; 2052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 2062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 2079a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shahtemplate <class T> 2089a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shahinline void swap(T& a, T& b) { 2099a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah T tmp = a; 2109a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah a = b; 2119a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah b = tmp; 2129a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah} 2139a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah 214ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}; //qhwc namespace 215befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 216aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmedstruct vsync_state { 217aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed pthread_mutex_t lock; 218aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed pthread_cond_t cond; 219aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed bool enable; 220aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed}; 221aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed 222befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// ----------------------------------------------------------------------------- 223befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// HWC context 224befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// This structure contains overall state 225befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t { 226660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_composer_device_1_t device; 227359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall const hwc_procs_t* proc; 228befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed //Framebuffer device 2291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed framebuffer_device_t *mFbDev; 2304019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R 2314019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R //CopyBit objects 23290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar qhwc::CopyBit *mCopyBit[MAX_DISPLAYS]; 2334019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R 234befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed //Overlay object - NULL for non overlay devices 23547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed overlay::Overlay *mOverlay; 236640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 237640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah //Primary and external FB updater 23890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar qhwc::IFBUpdate *mFBUpdate[MAX_DISPLAYS]; 239ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // External display related information 2401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed qhwc::ExternalDisplay *mExtDisplay; 241b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed qhwc::MDPInfo mMDP; 24290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar qhwc::DisplayAttributes dpyAttr[MAX_DISPLAYS]; 24390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar qhwc::ListStats listStats[MAX_DISPLAYS]; 24490571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar qhwc::LayerCache *mLayerCache[MAX_DISPLAYS]; 24590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar qhwc::LayerProp *layerProp[MAX_DISPLAYS]; 246c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah qhwc::MDPComp *mMDPComp; 2479f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed 248bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah //Securing in progress indicator 249bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah bool mSecuring; 250413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar //External Display configuring progress indicator 251413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar bool mExtDispConfiguring; 252bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah //Display in secure mode indicator 253bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah bool mSecureMode; 25477d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed //Lock to prevent set from being called while blanking 25577d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed mutable Locker mBlankLock; 256f6205c18f4bbd23e7f39672f781498c34e6b7494Kinjal Bhavsar //Lock to protect set when detaching external disp 257f6205c18f4bbd23e7f39672f781498c34e6b7494Kinjal Bhavsar mutable Locker mExtSetLock; 258aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed //Vsync 259aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed struct vsync_state vstate; 260c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //DMA used for rotator 261c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran bool mDMAInUse; 262befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 263befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahstatic inline bool isSkipPresent (hwc_context_t *ctx, int dpy) { 265c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return ctx->listStats[dpy].skipCount; 266c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 267c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 268c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahstatic inline bool isYuvPresent (hwc_context_t *ctx, int dpy) { 269c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return ctx->listStats[dpy].yuvCount; 270c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 271c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 272befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif //HWC_UTILS_H 273