hwc.cpp revision 1029ad2b12d5f30e77b2c2f85da891f2d1842424
1befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 2befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 3f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 4befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * 54019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * Not a Contribution, Apache license notifications and license are retained 64019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * for attribution purposes only. 74019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R * 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 */ 203156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed#define ATRACE_TAG (ATRACE_TAG_GRAPHICS | ATRACE_TAG_HAL) 21befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <fcntl.h> 22befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <errno.h> 23befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 24befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/log.h> 25befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include <cutils/atomic.h> 261589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <EGL/egl.h> 2704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed#include <utils/Trace.h> 28c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran#include <sys/ioctl.h> 291589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <overlay.h> 30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 3176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah#include <overlayWriteback.h> 32b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed#include <mdp_version.h> 33befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed#include "hwc_utils.h" 3447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h" 3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include "hwc_mdpcomp.h" 36c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan#include "hwc_dump_layers.h" 37bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 384019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R#include "hwc_copybit.h" 39f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah#include "hwc_ad.h" 4095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed#include "profiler.h" 41c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#include "hwc_vpuclient.h" 42140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_virtual.h" 43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc; 4511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 4611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 4747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0 482a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1 49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const char* name, 52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device); 53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed open: hwc_device_open 56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 5827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev); 5927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed common: { 62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed tag: HARDWARE_MODULE_TAG, 63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 2, 64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: HWC_HARDWARE_MODULE_ID, 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "Qualcomm Hardware Composer Module", 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "CodeAurora Forum", 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: &hwc_module_methods, 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dso: 0, 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved: {0}, 71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 74bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on 75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their 76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL. 77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */ 78361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 79bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) { 80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive) 81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return HWC_DISPLAY_VIRTUAL; 82361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return dpy; 83361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 84361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC 87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 88660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_procs_t const* procs) 90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 918eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev ALOGI("%s", __FUNCTION__); 92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!ctx) { 94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return; 96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 97359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc = procs; 98359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall 99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // Now that we have the functions needed, kick off 100aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // the uevent & vsync threads 101359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall init_uevent_thread(ctx); 102aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed init_vsync_thread(ctx); 103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 104befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 10525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah//Helper 1069f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmedstatic void reset(hwc_context_t *ctx, int numDisplays, 1079f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t** displays) { 1084c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal 1094c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal ctx->numActiveDisplays = 0; 1100df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int i = 0; i < HWC_NUM_DISPLAY_TYPES; i++) { 1119f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 1129f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // XXX:SurfaceFlinger no longer guarantees that this 1139f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // value is reset on every prepare. However, for the layer 1149f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // cache we need to reset it. 1159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed // We can probably rethink that later on 1164c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 1179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed for(uint32_t j = 0; j < list->numHwLayers; j++) { 1189f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 1199f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 1209f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1214c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal 1224c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal /* For display devices like SSD and screenrecord, we cannot 1234c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * rely on isActive and connected attributes of dpyAttr to 1244c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * determine if the displaydevice is active. Hence in case if 1254c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * the layer-list is non-null and numHwLayers > 0, we assume 1264c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * the display device to be active. 1274c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal */ 1284c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal ctx->numActiveDisplays += 1; 1299f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 130640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 131640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(ctx->mFBUpdate[i]) 132640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mFBUpdate[i]->reset(); 1334019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[i]) 1344019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R ctx->mCopyBit[i]->reset(); 135bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar if(ctx->mLayerRotMap[i]) 136bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar ctx->mLayerRotMap[i]->reset(); 1374c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal 1382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 139f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 140f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah ctx->mAD->reset(); 1418eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah MDPComp::reset(); 142140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 143140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mHWCVirtual->destroy(ctx, numDisplays, displays); 14416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 14516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 146f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddibool isEqual(float f1, float f2) { 147f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi return ((int)(f1*100) == (int)(f2*100)) ? true : false; 148f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi} 149f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 150f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddistatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy, 151f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_display_contents_1_t *list) { 152f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float origXres = ctx->dpyAttr[dpy].xres_orig; 153f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float origYres = ctx->dpyAttr[dpy].yres_orig; 154f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float fakeXres = ctx->dpyAttr[dpy].xres; 155f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float fakeYres = ctx->dpyAttr[dpy].yres; 156f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float xresRatio = origXres / fakeXres; 157f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float yresRatio = origYres / fakeYres; 158f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi for (size_t i = 0; i < list->numHwLayers; i++) { 159f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_layer_1_t *layer = &list->hwLayers[i]; 160f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_rect_t& displayFrame = layer->displayFrame; 161f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 162f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float layerWidth = displayFrame.right - displayFrame.left; 163f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float layerHeight = displayFrame.bottom - displayFrame.top; 164f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float sourceWidth = sourceCrop.right - sourceCrop.left; 165f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi float sourceHeight = sourceCrop.bottom - sourceCrop.top; 166f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 167f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi if (isEqual(layerWidth / sourceWidth, xresRatio) && 168f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi isEqual(layerHeight / sourceHeight, yresRatio)) 169f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi break; 170f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 171f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi displayFrame.left = xresRatio * displayFrame.left; 172f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi displayFrame.top = yresRatio * displayFrame.top; 173f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi displayFrame.right = displayFrame.left + layerWidth * xresRatio; 174f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi displayFrame.bottom = displayFrame.top + layerHeight * yresRatio; 175f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi } 176f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi} 177f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 1782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 1792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 1803156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 1812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 182640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 183b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam bool fbComp = false; 18454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 18554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 186f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 187f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi if (ctx->dpyAttr[dpy].customFBSize) 188f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi scaleDisplayFrame(ctx, dpy, list); 189f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 19054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 191c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 192b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 193b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam if (ctx->mVPUClient == NULL) 194b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0); 195c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#ifdef VPU_TARGET 196b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam else 197b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam fbComp = (ctx->mVPUClient->prepare(ctx, dpy, list) < 0); 198c439b604bcd6441e3706fdcaa5084ec58cbaf16dNaseer Ahmed#endif 199b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 200b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam if (fbComp) { 201c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 2021029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ); 203c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 204b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 205c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if (ctx->mMDP.version < qdutils::MDP_V4_0) { 206c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mCopyBit[dpy]) 207c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 2082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 2112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 2122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 2132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 214361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 2153156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 2162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 217361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 21876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 21954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 22054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 22154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 22254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah reset_layer_prop(ctx, dpy, list->numHwLayers - 1); 22390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 224c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->dpyAttr[dpy].isConfiguring = false; 225c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 226c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 227c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 2281029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ); 229c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 23090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 231b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal /* External Display is in Pause state. 232b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * Mark all application layers as OVERLAY so that 233b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * GPU will not compose. 234b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal */ 235b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) { 236b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal hwc_layer_1_t *layer = &list->hwLayers[i]; 237b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal layer->compositionType = HWC_OVERLAY; 238b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal } 23976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 2402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 24225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 24325322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 244660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 245660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 246befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 2472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 248befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 24927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 25027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ctx->mPanelResetStatus) { 25127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__); 25227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran reset_panel(dev); 25327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 25427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 2557351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 2561a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 2579f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed reset(ctx, numDisplays, displays); 258bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 25947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 260327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 26176a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 26276a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 2634c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal for (int32_t i = (numDisplays-1); i >= 0; i--) { 26416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 265bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 266361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 26716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 26816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 26916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 27016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 271361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 272361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 27390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 274140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 275140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->prepare(dev, list); 27616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 27716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 27816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 279befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 280befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 28147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 282640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 283327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 28476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 285327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 2862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 287befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 288befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 289660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 29055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 2911589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 2923156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 2931589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 2941589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 2951589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 2961589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 29755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 2984267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 29955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 30010d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 30155290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 302dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 30355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 304dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 305f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 306a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 307a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 3081a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 309a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 310a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 311a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 312a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 313f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 3141589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 3151589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 3161589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 3171589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 3181589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 3191589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 320660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 321660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 32204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 3231ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 324c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 3251a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 326361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 327bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 328bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* In case of non-hybrid WFD session, we are fooling SF by 329bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * piggybacking on HDMI display ID for virtual. 330bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 331bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * of Google API's. 332bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 333bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal dpy = getDpyforExternalDisplay(ctx,dpy); 334bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 335f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 33655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 337905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 338905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 339905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 340905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 341905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 342905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 343905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 34476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::clear(); 345905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 3462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 347361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 348361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK; 349361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 350361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to handle blank event(%d) for Primary!!", 351361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, blank ); 352361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -1; 353361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 354361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 355361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!blank) { 356361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Enable HPD here, as during bootup unblank is called 357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 360361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 361bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 362bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 363bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(ctx->mVirtualonExtActive) { 364bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* if mVirtualonExtActive is true, display hal will 365bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * receive unblank calls for non-hybrid WFD solution 366bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * since we piggyback on HDMI. 367bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 368bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal of Google API's */ 369bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal break; 370bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal } 371bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal case HWC_DISPLAY_VIRTUAL: 372bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* There are two ways to reach this block of code. 373bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 374bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL 375bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and ctx->mVirtualonExtActive is true. In this case, non-hybrid 376bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD is active. If so, getDpyforExternalDisplay will return dpy 377bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal as HWC_DISPLAY_VIRTUAL. 378bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 379bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_PRIMARY 380bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and since SF is not aware of VIRTUAL DISPLAY being handle by HWC, 381bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal it wont send blank / unblank events for it. We piggyback on 382bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal PRIMARY DISPLAY events to release mdp pipes and 383bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal activate/deactivate VIRTUAL DISPLAY. 384bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 385bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: This separate case statement is not needed once we have 386bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD client working on top of Google API's. 387bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 388bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 389361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 390361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 391bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) { 3928f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar int dpy = HWC_DISPLAY_VIRTUAL; 3938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 3948f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for virtual!", __FUNCTION__); 3958f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 3968f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 3978f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 398361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 399361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 400361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 401361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 402361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(blank) { 4038f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4048f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for external!", __FUNCTION__); 4058f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4068f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 407361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 408bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 409361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 410361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 411361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 412660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 41355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 414f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 415361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran blank ? "blanking":"unblanking", dpy); 4168f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 417660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 418660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 41927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev) 42027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{ 42127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran int ret = 0; 42227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 42327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 42427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (!ctx->mPanelResetStatus) 42527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran return; 42627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 42727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__); 42827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1); 42927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 43027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to BLANK: %s", __FUNCTION__, 43127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 43227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 43327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 43427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__); 43527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0); 43627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 43727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__, 43827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 43927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 44027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1); 44127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 44227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ctx->mPanelResetStatus = false; 44327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran} 44427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 44527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 446660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 4471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 4481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 4491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 4502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 4511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 4531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 4541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 4551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 4561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 4572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 458140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDP.hasOverlay) { 459140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_VIRTUAL_BIT; 460140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(!qdutils::MDPVersion::getInstance().is8x26()) 461140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_EXTERNAL_BIT; 462140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 4632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 4642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 465f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan case HWC_FORMAT_RB_SWAP: 466f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan value[0] = 1; 467f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan break; 468905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan case HWC_COLOR_FILL: 469905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan value[0] = 1; 470905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan break; 4711589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4721589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 4731589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 4751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 4761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 478c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 48004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4813475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 482640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 483e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 48476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah uint32_t last = list->numHwLayers - 1; 48576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 4864019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 48704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 4884019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 48904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 490e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 491e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 492f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 493c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 494c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 495c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 496c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 497b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam if (ctx->mVPUClient != NULL) { 498b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#ifdef VPU_TARGET 499b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam ctx->mVPUClient->predraw(ctx, dpy, list); 500b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#endif 501b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam } 502b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam else if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 503327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 50416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 50516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 50616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 5072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 5082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 50954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 510ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) { 51104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 51204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 51354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 51454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 51554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 51654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 51754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 51816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 5192a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 520c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 521bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, 522bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[dpy].roi)) { 5238f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 52450c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 5252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 526b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 527b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#ifdef VPU_TARGET 528b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam if (ctx->mVPUClient != NULL) 529b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam ctx->mVPUClient->draw(ctx, dpy, list); 530b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam#endif 5312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 532a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 533a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5343475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 5372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 538361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 53904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 54004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 5413475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 54276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 543361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 544361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 545361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 546e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 5474d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 5484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 5494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar uint32_t last = list->numHwLayers - 1; 5504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 5524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 5534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 5544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 55576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 5574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 55876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 5594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 5604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 5614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 562eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 5634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 5644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 5654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 56704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 5684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 5694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 5704d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5714d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 5724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 5734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 5744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 5754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 5764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 5774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 5784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 5794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 5804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 5814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 5824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 5833475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 5843475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 585c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 5878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 58854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 5892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 5902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 591a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 592a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 5933475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 5942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 5952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 596660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 597660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 598660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 599befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 600befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 601befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 6024c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal for (uint32_t i = 0; i < numDisplays; i++) { 603660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 604bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 605361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 6062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 6072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 60876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 610361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 611361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 61290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 613140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 614140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->set(ctx, list); 61576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 6172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 618660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 6192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 62095eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 62195eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 62295eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 62333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 62456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 6253aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah if(ctx->mRotMgr->getNumActiveSessions() == 0) 6263aaa003801643146fe86e91364c5ad9493ad40d7Saurabh Shah Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 6277351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 6281a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 6292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 6302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 631ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 63576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 636bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 6372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 64176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 64276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 64376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 64476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 64576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 6462e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 6472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 6480df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 64976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 6500df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 65176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 65276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 65376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 65476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 65576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 65676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 6572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 658660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 659befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 660befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 661befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 6622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 6632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t config, const uint32_t* attributes, int32_t* values) { 6642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 666bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 6670df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 668361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 66976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 67076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 67176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 6732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 6742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 6762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 6772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 6782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 6812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah const int NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 6832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 6842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 6862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 6872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 6882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 6892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 6902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 6912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 69276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 69376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 6952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 6962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 69776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 69876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 70179e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 70479e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 7052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 7082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 7142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 71593138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 71693138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 71793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7181a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 719a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 720a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 721a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 722a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 7230df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 727a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 728a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 729a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 730327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 7314762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 732327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 733d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah ovDump[0] = '\0'; 734ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah if(Writeback::getDump(ovDump, 1024)) { 735ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah dumpsys_log(aBuf, ovDump); 736ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah ovDump[0] = '\0'; 737ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah } 738a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 73993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 74093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 741befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 7441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 745befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 746befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 747befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 748befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 749befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 750befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 751befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 752befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 753befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 754befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 755befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 756befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 757befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 758befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 759befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 760befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 7621589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 7631589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 764befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 7651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 7661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 7688f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_3; 7692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 77793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 781befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 782befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 783befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 784befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 785