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