hwc_utils.h revision ee0d135b8a226b5844fd569fb166a90aa55bbba0
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/*
2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
3bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved.
4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
5befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
6befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * you may not use this file except in compliance with the License.
7befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * You may obtain a copy of the License at
8befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
9befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
10befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed *
11befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
12befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
13befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * See the License for the specific language governing permissions and
15befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * limitations under the License.
16befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */
17befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
18befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#ifndef HWC_UTILS_H
19befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define HWC_UTILS_H
201589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
21660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define HWC_REMOVE_DEPRECATED_VERSIONS 1
222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah#include <fcntl.h>
23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <hardware/hwcomposer.h>
2477d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed#include <gr.h>
251589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h>
26befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
27bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define ALIGN_TO(x, align)     (((x) + ((align)-1)) & ~((align)-1))
28befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define LIKELY( exp )       (__builtin_expect( (exp) != 0, true  ))
29befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#define UNLIKELY( exp )     (__builtin_expect( (exp) != 0, false ))
30bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F
31660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed#define MAX_NUM_DISPLAYS 4 //Yes, this is ambitious
32befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
331589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//Fwrd decls
34befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t;
351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedstruct framebuffer_device_t;
361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
37bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahnamespace qService {
38bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shahclass QService;
39bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
40bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmednamespace overlay {
421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass Overlay;
431589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed}
441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmednamespace qhwc {
461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed//fwrd decl
471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedclass QueuedBufferStore;
48b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedclass ExternalDisplay;
49b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed
50b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmedstruct MDPInfo {
51b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    int version;
52b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    char panel;
53b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    bool hasOverlay;
54b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed};
55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct DisplayAttributes {
572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    uint32_t vsync_period; //nanos
582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    uint32_t xres;
592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    uint32_t yres;
6079e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed    float xdpi;
6179e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed    float ydpi;
622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int fd;
6376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    bool connected; //Applies only to pluggable disp.
6476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    //Connected does not mean it ready to use.
6576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    //It should be active also. (UNBLANKED)
662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    bool isActive;
67bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed};
682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstruct ListStats {
702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int numAppLayers; //Total - 1, excluding FB layer.
712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int skipCount;
722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int fbLayerIndex; //Always last for now. = numAppLayers
732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    //Video specific
742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int yuvCount;
752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int yuvIndex;
76bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed};
77bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
78c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedenum {
79c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    HWC_MDPCOMP = 0x00000002,
80c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    HWC_LAYER_RESERVED_0 = 0x00000004,
81c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    HWC_LAYER_RESERVED_1 = 0x00000008
82c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed};
83c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed
84bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// -----------------------------------------------------------------------------
86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Utility functions - implemented in hwc_utils.cpp
87660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid dumpLayer(hwc_layer_1_t const* l);
882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahvoid setListStats(hwc_context_t *ctx, const hwc_display_contents_1_t *list,
892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah        int dpy);
90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid initContext(hwc_context_t *ctx);
91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedvoid closeContext(hwc_context_t *ctx);
92ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed//Crops source buffer against destination and FB boundaries
93ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmedvoid calculate_crop_rects(hwc_rect_t& crop, hwc_rect_t& dst,
94ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed        const int fbWidth, const int fbHeight);
95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahbool isExternalActive(hwc_context_t* ctx);
97a71a7ecd0323a16fe7728271474f8b7056c679d8Saurabh Shah
9833147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar//Sync point impl.
992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_sync(hwc_context_t *ctx, hwc_display_contents_1_t* list, int dpy);
10033147743328e88e7859db6c935072f11ca038448Kinjal Bhavsar
101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Inline utility functions
102660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic inline bool isSkipLayer(const hwc_layer_1_t* l) {
103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (UNLIKELY(l && (l->flags & HWC_SKIP_LAYER)));
104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
105befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
106befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// Returns true if the buffer is yuv
107befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isYuvBuffer(const private_handle_t* hnd) {
108befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (hnd && (hnd->bufferType == BUFFER_TYPE_VIDEO));
109befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
110befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
111ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah// Returns true if the buffer is secure
112ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shahstatic inline bool isSecureBuffer(const private_handle_t* hnd) {
113ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah    return (hnd && (private_handle_t::PRIV_FLAGS_SECURE_BUFFER & hnd->flags));
114ed68f0b13f56426735e7897519aa1c43072ceb90Saurabh Shah}
115befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed//Return true if buffer is marked locked
116befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic inline bool isBufferLocked(const private_handle_t* hnd) {
117befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    return (hnd && (private_handle_t::PRIV_FLAGS_HWC_LOCK & hnd->flags));
118befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}
119bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
1205d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only
1215d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtOnly(const private_handle_t* hnd) {
1225d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_ONLY));
1235d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed}
1245d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed
1255d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a BLOCK flag.
1265d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtBlock(const private_handle_t* hnd) {
1275d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_BLOCK));
1285d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed}
1295d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed
1305d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed//Return true if buffer is for external display only with a Close Caption flag.
1315d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmedstatic inline bool isExtCC(const private_handle_t* hnd) {
1325d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed    return (hnd && (hnd->flags & private_handle_t::PRIV_FLAGS_EXTERNAL_CC));
1335d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed}
1345d0935531842ab9cf01775a77e92f204e6d40971Naseer Ahmed
1351589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed// Initialize uevent thread
1361589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmedvoid init_uevent_thread(hwc_context_t* ctx);
137aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed// Initialize vsync thread
138aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmedvoid init_vsync_thread(hwc_context_t* ctx);
139befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
140660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedinline void getLayerResolution(const hwc_layer_1_t* layer,
141aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed                               int& width, int& height)
142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{
143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    hwc_rect_t displayFrame  = layer->displayFrame;
144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    width = displayFrame.right - displayFrame.left;
145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed    height = displayFrame.bottom - displayFrame.top;
146c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}
1472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic inline int openFb(int dpy) {
1492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    int fd = -1;
1502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    const char *devtmpl = "/dev/graphics/fb%u";
1512e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    char name[64] = {0};
1522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    snprintf(name, 64, devtmpl, dpy);
1532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    fd = open(name, O_RDWR);
1542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    return fd;
1552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah}
1562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
157ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed}; //qhwc namespace
158befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
159aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmedstruct vsync_state {
160aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    pthread_mutex_t lock;
161aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    pthread_cond_t  cond;
162aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    bool enable;
163aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed};
164aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed
165befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// -----------------------------------------------------------------------------
166befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// HWC context
167befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed// This structure contains overall state
168befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstruct hwc_context_t {
169660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed    hwc_composer_device_1_t device;
170359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall    const hwc_procs_t* proc;
171ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah
172ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah    //Private hwc handlers
173ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah    struct Callbacks {
174ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah        void (*onExtDisconnect)(const Callbacks& priv_proc);
175ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah        hwc_context_t *ctx;
176ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah    };
177ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah
178ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah    Callbacks priv_proc;
179ee0d135b8a226b5844fd569fb166a90aa55bbba0Saurabh Shah
180befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    int numHwLayers;
18176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    int overlayInUse[HWC_NUM_DISPLAY_TYPES];
182befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
183befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    //Framebuffer device
1841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    framebuffer_device_t *mFbDev;
185bd4704d4b447bd4aa59e4894d68a7162ce4f99fdNaseer Ahmed
186befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed    //Overlay object - NULL for non overlay devices
18776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah    overlay::Overlay *mOverlay[HWC_NUM_DISPLAY_TYPES];
188befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
189bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    //QService object
190bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    qService::QService *mQService;
191bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
192ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    // External display related information
1931589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed    qhwc::ExternalDisplay *mExtDisplay;
1941589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed
195b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    qhwc::MDPInfo mMDP;
196b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed
1972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    qhwc::DisplayAttributes dpyAttr[HWC_NUM_DISPLAY_TYPES];
1982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
1992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah    qhwc::ListStats listStats[HWC_NUM_DISPLAY_TYPES];
200bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
201bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    //Securing in progress indicator
202bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    bool mSecuring;
203bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah
204bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    //Display in secure mode indicator
205bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah    bool mSecureMode;
20677d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed
20777d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed    //Lock to prevent set from being called while blanking
20877d8f24cb4fece120f062f2f997f018372338b66Naseer Ahmed    mutable Locker mBlankLock;
209aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    //Vsync
210aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed    struct vsync_state vstate;
211befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed};
212befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed
213befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#endif //HWC_UTILS_H
214