hwc.cpp revision 3d3705af561ebe7182b23fdc81e0b755d22b11eb
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" 41140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan#include "hwc_virtual.h" 42befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedusing namespace qhwc; 4411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 4511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 4647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#define VSYNC_DEBUG 0 472a9082bf46b3de9f997036a53a97834bcef170d9Ramkumar Radhakrishnan#define BLANK_DEBUG 1 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 49befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, 50befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed const char* name, 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device); 52befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 53befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic struct hw_module_methods_t hwc_module_methods = { 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed open: hwc_device_open 55befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 56befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 5727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev); 5827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 59befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedhwc_module_t HAL_MODULE_INFO_SYM = { 60befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed common: { 61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed tag: HARDWARE_MODULE_TAG, 62befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 2, 63befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 64befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: HWC_HARDWARE_MODULE_ID, 65befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "Qualcomm Hardware Composer Module", 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "CodeAurora Forum", 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: &hwc_module_methods, 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dso: 0, 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved: {0}, 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed}; 72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 73bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal/* In case of non-hybrid WFD session, we are fooling SF by piggybacking on 74361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * HDMI display ID for virtual. This helper is needed to differentiate their 75361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * paths in HAL. 76361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran * TODO: Not needed once we have WFD client working on top of Google API's */ 77361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 78bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamalstatic int getDpyforExternalDisplay(hwc_context_t *ctx, int dpy) { 79361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(dpy == HWC_DISPLAY_EXTERNAL && ctx->mVirtualonExtActive) 80361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return HWC_DISPLAY_VIRTUAL; 81361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return dpy; 82361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran} 83361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed/* 85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Save callback functions registered to HWC 86befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed */ 87660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic void hwc_registerProcs(struct hwc_composer_device_1* dev, 88befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_procs_t const* procs) 89befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 908eb66cfb97ccc186e9f4ae5f38e8d8f6087ae5b7Iliyan Malchev ALOGI("%s", __FUNCTION__); 91befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 92befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!ctx) { 93befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed ALOGE("%s: Invalid context", __FUNCTION__); 94befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return; 95befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 96359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc = procs; 97359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall 98aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // Now that we have the functions needed, kick off 99aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed // the uevent & vsync threads 100359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall init_uevent_thread(ctx); 101aff82051a79fbaf752d3769667d34828cee2841dNaseer Ahmed init_vsync_thread(ctx); 102befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 103befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 1042a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setPaddingRound(hwc_context_t *ctx, int numDisplays, 1052a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t** displays) { 10603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal ctx->isPaddingRound = false; 1072a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(int i = 0; i < numDisplays; i++) { 1082a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t *list = displays[i]; 1092a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 1102a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if((ctx->mPrevHwLayerCount[i] == 1 or 1112a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->mPrevHwLayerCount[i] == 0) and 1122a345b980298c7623e553634ff56cf5f619765d9Raj Kamal (list->numHwLayers > 1)) { 1132a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* If the previous cycle for dpy 'i' has 0 AppLayers and the 1142a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * current cycle has atleast 1 AppLayer, padding round needs 1152a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * to be invoked in current cycle on all the active displays 1162a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * to free up the resources. 1172a345b980298c7623e553634ff56cf5f619765d9Raj Kamal */ 1182a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->isPaddingRound = true; 1192a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1202a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers; 1212a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } else { 1222a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->mPrevHwLayerCount[i] = 0; 1232a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1242a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1252a345b980298c7623e553634ff56cf5f619765d9Raj Kamal} 1262a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1272a345b980298c7623e553634ff56cf5f619765d9Raj Kamal/* Based on certain conditions, isPaddingRound will be set 1282a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * to make this function self-contained */ 1292a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setDMAState(hwc_context_t *ctx, int numDisplays, 1302a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t** displays) { 1312a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1322a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mRotMgr->getNumActiveSessions() == 0) 1332a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Overlay::setDMAMode(Overlay::DMA_LINE_MODE); 13403514577d0c705056352898f66ed2a8e9b131df8Raj Kamal 135404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R for(int i = 0; i < numDisplays; i++) { 1369f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed hwc_display_contents_1_t *list = displays[i]; 1374c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 1383d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for(size_t j = 0; j < list->numHwLayers; j++) { 1399f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 1402a345b980298c7623e553634ff56cf5f619765d9Raj Kamal { 1412a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_layer_1_t const* layer = &list->hwLayers[i]; 1422a345b980298c7623e553634ff56cf5f619765d9Raj Kamal private_handle_t *hnd = (private_handle_t *)layer->handle; 1432a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1442a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* If a video layer requires rotation, set the DMA state 1452a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * to BLOCK_MODE */ 1462a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1472a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if (UNLIKELY(isYuvBuffer(hnd)) && canUseRotator(ctx,i) && 1482a345b980298c7623e553634ff56cf5f619765d9Raj Kamal (layer->transform & HWC_TRANSFORM_ROT_90)) { 1492a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(not qdutils::MDPVersion::getInstance().is8x26()) { 1502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mOverlay->isPipeTypeAttached( 1512a345b980298c7623e553634ff56cf5f619765d9Raj Kamal overlay::utils::OV_MDP_PIPE_DMA)) 1522a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->isPaddingRound = true; 1532a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1542a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 1552a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1562a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1579f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1582a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(i) { 1592a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* Uncomment the below code for testing purpose. 1602a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Assuming the orientation value is in terms of HAL_TRANSFORM, 1612a345b980298c7623e553634ff56cf5f619765d9Raj Kamal this needs mapping to HAL, if its in different convention */ 1622a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1632a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* char value[PROPERTY_VALUE_MAX]; 1642a345b980298c7623e553634ff56cf5f619765d9Raj Kamal property_get("sys.ext_orientation", value, "0"); 1652a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->mExtOrientation = atoi(value);*/ 1662a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1672a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mExtOrientation || ctx->mBufferMirrorMode) { 1682a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mOverlay->isPipeTypeAttached( 1692a345b980298c7623e553634ff56cf5f619765d9Raj Kamal overlay::utils::OV_MDP_PIPE_DMA)) { 1702a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->isPaddingRound = true; 1712a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1722a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 1732a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1742a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1752a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1762a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1772a345b980298c7623e553634ff56cf5f619765d9Raj Kamal} 1782a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1792a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays, 1802a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t** displays) { 1814c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal 1822a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->numActiveDisplays = 0; 1832a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(int i = 0; i < numDisplays; i++) { 1842a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t *list = displays[i]; 1852a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 1864c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal /* For display devices like SSD and screenrecord, we cannot 1874c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * rely on isActive and connected attributes of dpyAttr to 1884c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * determine if the displaydevice is active. Hence in case if 1894c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * the layer-list is non-null and numHwLayers > 0, we assume 1904c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * the display device to be active. 1914c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal */ 1924c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal ctx->numActiveDisplays += 1; 1932a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1942a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1952a345b980298c7623e553634ff56cf5f619765d9Raj Kamal} 19603514577d0c705056352898f66ed2a8e9b131df8Raj Kamal 1972a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void reset(hwc_context_t *ctx, int numDisplays, 1982a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t** displays) { 1992a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 2002a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 2012a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(int i = 0; i < numDisplays; i++) { 2022a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t *list = displays[i]; 2032a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // XXX:SurfaceFlinger no longer guarantees that this 2042a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // value is reset on every prepare. However, for the layer 2052a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // cache we need to reset it. 2062a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // We can probably rethink that later on 2072a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 2082a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(size_t j = 0; j < list->numHwLayers; j++) { 2092a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 2102a345b980298c7623e553634ff56cf5f619765d9Raj Kamal list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 21103514577d0c705056352898f66ed2a8e9b131df8Raj Kamal } 2123d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers; 2133d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu } else { 2143d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu ctx->mPrevHwLayerCount[i] = 0; 2159f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 216640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 217640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(ctx->mFBUpdate[i]) 218640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mFBUpdate[i]->reset(); 2194019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[i]) 2204019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R ctx->mCopyBit[i]->reset(); 221bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar if(ctx->mLayerRotMap[i]) 222bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar ctx->mLayerRotMap[i]->reset(); 2232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 224f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 225f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah ctx->mAD->reset(); 2268eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah MDPComp::reset(); 227140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 228140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mHWCVirtual->destroy(ctx, numDisplays, displays); 22916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 23016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 231f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddibool isEqual(float f1, float f2) { 232f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi return ((int)(f1*100) == (int)(f2*100)) ? true : false; 233f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi} 234f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 235f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddistatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy, 236f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_display_contents_1_t *list) { 2373d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t origXres = ctx->dpyAttr[dpy].xres_orig; 2383d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t origYres = ctx->dpyAttr[dpy].yres_orig; 2393d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t fakeXres = ctx->dpyAttr[dpy].xres; 2403d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t fakeYres = ctx->dpyAttr[dpy].yres; 2413d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu float xresRatio = (float)origXres / (float)fakeXres; 2423d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu float yresRatio = (float)origYres / (float)fakeYres; 243f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi for (size_t i = 0; i < list->numHwLayers; i++) { 244f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_layer_1_t *layer = &list->hwLayers[i]; 245f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_rect_t& displayFrame = layer->displayFrame; 246f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 2473d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t layerWidth = displayFrame.right - displayFrame.left; 2483d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t layerHeight = displayFrame.bottom - displayFrame.top; 2493d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t sourceWidth = sourceCrop.right - sourceCrop.left; 2503d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t sourceHeight = sourceCrop.bottom - sourceCrop.top; 251f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2523d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu if (isEqual(((float)layerWidth / (float)sourceWidth), xresRatio) && 2533d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu isEqual(((float)layerHeight / (float)sourceHeight), yresRatio)) 254f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi break; 255f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2563d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.left = (int)(xresRatio * (float)displayFrame.left); 2573d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.top = (int)(yresRatio * (float)displayFrame.top); 2583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.right = (int)((float)displayFrame.left + 2593d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu (float)layerWidth * xresRatio); 2603d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.bottom = (int)((float)displayFrame.top + 2613d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu (float)layerHeight * yresRatio); 262f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi } 263f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi} 264f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 2662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 2673156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 2682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 269640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 270b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam bool fbComp = false; 27154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 27254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 273f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 274f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi if (ctx->dpyAttr[dpy].customFBSize) 275f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi scaleDisplayFrame(ctx, dpy, list); 276f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2773d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 278c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 279b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 28001cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0); 281b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 282b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam if (fbComp) { 283c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 2841029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ); 285c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 286b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 287c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if (ctx->mMDP.version < qdutils::MDP_V4_0) { 288c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mCopyBit[dpy]) 289c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 2902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2919c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed setGPUHint(ctx, list); 2922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 2942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 2962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 297361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 2983156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 300361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 30176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 30254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 30354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 30454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 3053d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 30690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 307c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->dpyAttr[dpy].isConfiguring = false; 308c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 309c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 310c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 3111029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ); 312c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 31390571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 314b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal /* External Display is in Pause state. 315b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * Mark all application layers as OVERLAY so that 316b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * GPU will not compose. 317b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal */ 318b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) { 319b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal hwc_layer_1_t *layer = &list->hwLayers[i]; 320b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal layer->compositionType = HWC_OVERLAY; 321b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal } 32276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 3232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 3242e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 32525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 32625322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 327660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 328660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 329befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 3302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 331befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 33227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 33327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ctx->mPanelResetStatus) { 33427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__); 33527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran reset_panel(dev); 33627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 33727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 3387351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 3391a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 3402a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setPaddingRound(ctx,numDisplays,displays); 3412a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setDMAState(ctx,numDisplays,displays); 3422a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setNumActiveDisplays(ctx,numDisplays,displays); 3432a345b980298c7623e553634ff56cf5f619765d9Raj Kamal reset(ctx, (int)numDisplays, displays); 344bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 34547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 346327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 34776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 34876a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 3493d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) { 35016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 351bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 352361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 35316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 35416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 35516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 35616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 357361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 358361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 35990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 360140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 361140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->prepare(dev, list); 36216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 36316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 36416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 365befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 366befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 36747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 368640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 369327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 37076a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 371327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 3722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 373befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 374befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 375660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 37655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 3771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3783156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 3801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3811589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 3821589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 38355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 3844267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 38555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 38610d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 38755290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 388dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 38955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 390dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 391f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 392a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 393a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 3941a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 395a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 396a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 397a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 398a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 399f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 4001589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4011589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 4021589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4031589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 4041589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4051589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 406660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 407660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 40804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4091ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 410c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 412361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 413bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 414bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* In case of non-hybrid WFD session, we are fooling SF by 415bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * piggybacking on HDMI display ID for virtual. 416bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 417bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * of Google API's. 418bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 419bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal dpy = getDpyforExternalDisplay(ctx,dpy); 420bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 421f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 42255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 423905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 424905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 425905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 426905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 427905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 428905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 429905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 4305f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // If VDS is connected, do not clear WB object as it 4315f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // will end up detaching IOMMU. This is required 4325f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // to send black frame to WFD sink on power suspend. 4335f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // Note: With this change, we keep the WriteBack object 4345f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // alive on power suspend for AD use case. 435905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 4362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 437361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 438361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK; 439361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 440361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to handle blank event(%d) for Primary!!", 441361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, blank ); 442361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -1; 443361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 444361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 445361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!blank) { 446361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Enable HPD here, as during bootup unblank is called 447361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 448361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 449361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 450361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 451bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 452bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 453bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(ctx->mVirtualonExtActive) { 454bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* if mVirtualonExtActive is true, display hal will 455bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * receive unblank calls for non-hybrid WFD solution 456bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * since we piggyback on HDMI. 457bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 458bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal of Google API's */ 459bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal break; 460bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal } 461bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal case HWC_DISPLAY_VIRTUAL: 462bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* There are two ways to reach this block of code. 463bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 464bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL 465bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and ctx->mVirtualonExtActive is true. In this case, non-hybrid 466bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD is active. If so, getDpyforExternalDisplay will return dpy 467bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal as HWC_DISPLAY_VIRTUAL. 468bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 469bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_PRIMARY 470bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and since SF is not aware of VIRTUAL DISPLAY being handle by HWC, 471bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal it wont send blank / unblank events for it. We piggyback on 472bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal PRIMARY DISPLAY events to release mdp pipes and 473bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal activate/deactivate VIRTUAL DISPLAY. 474bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 475bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: This separate case statement is not needed once we have 476bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD client working on top of Google API's. 477bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 478bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 479361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 480361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 481bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) { 4828f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar int dpy = HWC_DISPLAY_VIRTUAL; 4838f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4848f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for virtual!", __FUNCTION__); 4858f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4868f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 4878f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 488361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 489361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 490361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 491361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 492361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(blank) { 4938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4948f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for external!", __FUNCTION__); 4958f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4968f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 497361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 498bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 499361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 500361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 501361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 502660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 50355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 504f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 505361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran blank ? "blanking":"unblanking", dpy); 5068f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 507660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 508660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 50927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev) 51027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{ 51127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran int ret = 0; 51227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 51327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 51422f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) { 51522f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__); 51622f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar ctx->mPanelResetStatus = false; 51727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran return; 51822f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar } 51927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 52027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__); 52127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1); 52227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 52327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to BLANK: %s", __FUNCTION__, 52427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 52527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 52627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 52727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__); 52827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0); 52927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 53027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__, 53127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 53227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 53327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1); 53427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 53527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ctx->mPanelResetStatus = false; 53627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran} 53727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 53827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 539660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 5401589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 5411589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 5421589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 5432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 5441589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 5451589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 5461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 5471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 5491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 5502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 551140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDP.hasOverlay) { 552140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_VIRTUAL_BIT; 553a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna if(!(qdutils::MDPVersion::getInstance().is8x26() || 554a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna qdutils::MDPVersion::getInstance().is8x16())) 555140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_EXTERNAL_BIT; 556140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 5572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 5582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 559f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan case HWC_FORMAT_RB_SWAP: 560f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan value[0] = 1; 561f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan break; 562905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan case HWC_COLOR_FILL: 563905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan value[0] = 1; 564905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan break; 5651589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 5661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 5671589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 5681589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 5691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 5701589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 5711589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 572c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 57404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 5753475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 576640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 577e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 5783d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu size_t last = list->numHwLayers - 1; 57976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5804019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 58104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 5824019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 58304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 584e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 585e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 587c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 588c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 589c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 590c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 59101cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 592327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 59316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 59416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 59516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 5962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 5972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 59854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 599ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) { 60004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 60104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 60254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 60354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 60454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 60554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 60654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 60716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 6082a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 609c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 610bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, 611bc037e0bbb3d1778fb4bde55582fd1d4e666f957Jeykumar Sankaran ctx->listStats[dpy].roi)) { 6128f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 61350c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 6142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 615b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 6162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 617a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 618a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 6193475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 6202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 623361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 62404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 62504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 6263475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 62776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 628361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 629361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 630361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 631e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 6324d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 6334d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 6343d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu size_t last = list->numHwLayers - 1; 6354d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 6364d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 6374d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 6384d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 6394d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 64076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6414d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 6424d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 64376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6444d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 6454d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 6464d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 647eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 6484d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 6494d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 6504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 6514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 65204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 6534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 6544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 6554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 6564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 6574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 6584d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 6594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 6604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 6614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 6624d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 6634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 6644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 6654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 6664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 6674d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 6683475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 6693475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 670c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 6718f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 6728f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 67354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 6742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 6752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 676a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 677a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 6783475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 6792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 681660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 682660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 683660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 684befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 685befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 686befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 6873d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for (int i = 0; i < (int)numDisplays; i++) { 688660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 689bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 690361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 6912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 6922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 69376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 695361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 696361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 69790571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 698140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 699140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->set(ctx, list); 70076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 7012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 703660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 7042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 70595eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 70695eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 70795eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 70833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 70956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 7107351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 7111a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 714ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 7152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 7162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 7172e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 71876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 719bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 7222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 7232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 72476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 72576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 72676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 72776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 72876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 7292e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 7310df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 73276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 7330df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 73476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 73576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 73676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 73876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 73976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 741660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 742befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 743befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 744befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 7452e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 746404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R uint32_t /*config*/, const uint32_t* attributes, int32_t* values) { 7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 749bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7500df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 751361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 75276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 75376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 75476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 7552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 7562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 7572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 7592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 7602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 7612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 7622e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 7642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7653d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 7692e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 7702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 7712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 7722e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 77576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 77676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 78076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 78176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 78479e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 7852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 78779e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 7882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 7912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 7922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 7932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 7952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 7962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 7972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 79893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 79993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 80093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 8011a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 802a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 803a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 804a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 805a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 8060df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 807f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 808f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 810a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 811a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 812a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 813327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 8144762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 815327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 816d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah ovDump[0] = '\0'; 817ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah if(Writeback::getDump(ovDump, 1024)) { 818ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah dumpsys_log(aBuf, ovDump); 819ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah ovDump[0] = '\0'; 820ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah } 821a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 82293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 82393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 824befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 825befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 826befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 8271589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 828befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 829befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 830befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 831befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 832befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 833befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 834befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 835befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 836befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 837befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 838befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 839befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 840befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 841befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 842befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 843befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 844c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan if(dev == NULL) 845c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan return status; 846befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 8471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 849befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 8501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 8522e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 8538f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_3; 8542e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 8552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 8562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 8572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 8582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 8592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 8602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 8612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 86293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 8632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 8642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 8652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 866befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 867befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 868befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 869befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 870