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