hwc.cpp revision e54f8a454099b5773541ecc70bbe3b7579c5d66b
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; 284a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) { 285a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mOverlay->clear(dpy); 286a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mLayerRotMap[dpy]->clear(); 287a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah } 288c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 289b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 290c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if (ctx->mMDP.version < qdutils::MDP_V4_0) { 291c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mCopyBit[dpy]) 292c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 2932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2949c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed setGPUHint(ctx, list); 2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 2972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 300361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 3013156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 303361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 30476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 30554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 30654a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 30754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 3083d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 30990571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 310c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->dpyAttr[dpy].isConfiguring = false; 311c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 312c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 313c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 314a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) 315a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah { 316a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mOverlay->clear(dpy); 317a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mLayerRotMap[dpy]->clear(); 318a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah } 319c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 32090571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 321b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal /* External Display is in Pause state. 322b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * Mark all application layers as OVERLAY so that 323b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * GPU will not compose. 324b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal */ 325b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) { 326b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal hwc_layer_1_t *layer = &list->hwLayers[i]; 327b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal layer->compositionType = HWC_OVERLAY; 328b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal } 32976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 3302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 3312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 33225322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 33325322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 334660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 335660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 336befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 3372e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 33927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 34027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ctx->mPanelResetStatus) { 34127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__); 34227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran reset_panel(dev); 34327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 34427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 3457351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 3461a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 3472a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setPaddingRound(ctx,numDisplays,displays); 3482a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setDMAState(ctx,numDisplays,displays); 3492a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setNumActiveDisplays(ctx,numDisplays,displays); 3502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal reset(ctx, (int)numDisplays, displays); 351bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 35247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 353327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 35476a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 35576a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 3563d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) { 35716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 358bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 359361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 36016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 36116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 36216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 36316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 364361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 365361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 36690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 367140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 368140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->prepare(dev, list); 36916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 37016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 37116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 372befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 373befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 37447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 375640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 376327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 37776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 378327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 3792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 380befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 381befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 382660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 38355290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 3841589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3853156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3861589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 3871589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3881589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 3891589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 39055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 3914267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 39255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 39310d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 39455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 395dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 39655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 397dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 398f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 399a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 400a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 4011a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 402a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 403a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 404a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 405a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 406f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 4071589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4081589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 4091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 413660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_blank(struct hwc_composer_device_1* dev, int dpy, int blank) 414660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 41504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4161ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 417c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 4181a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 419361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 420bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 421bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* In case of non-hybrid WFD session, we are fooling SF by 422bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * piggybacking on HDMI display ID for virtual. 423bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 424bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * of Google API's. 425bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 426bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal dpy = getDpyforExternalDisplay(ctx,dpy); 427bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 428f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: %s display: %d", __FUNCTION__, 42955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed blank==1 ? "Blanking":"Unblanking", dpy); 430905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R if(blank) { 431905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // free up all the overlay pipes in use 432905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // when we get a blank for either display 433905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R // makes sure that all pipes are freed 434905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configBegin(); 435905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mOverlay->configDone(); 436905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R ctx->mRotMgr->clear(); 4375f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // If VDS is connected, do not clear WB object as it 4385f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // will end up detaching IOMMU. This is required 4395f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // to send black frame to WFD sink on power suspend. 4405f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // Note: With this change, we keep the WriteBack object 4415f3876753d4cad8082915ad81c0b463b713ea1a6Tatenda Chipeperekwa // alive on power suspend for AD use case. 442905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 4432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 444361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 445361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran value = blank ? FB_BLANK_POWERDOWN : FB_BLANK_UNBLANK; 446361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 447361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ALOGE("%s: Failed to handle blank event(%d) for Primary!!", 448361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran __FUNCTION__, blank ); 449361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -1; 450361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 451361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 452361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(!blank) { 453361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // Enable HPD here, as during bootup unblank is called 454361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 455361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 456361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 457361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 458bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 459bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 460bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(ctx->mVirtualonExtActive) { 461bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* if mVirtualonExtActive is true, display hal will 462bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * receive unblank calls for non-hybrid WFD solution 463bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * since we piggyback on HDMI. 464bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: Not needed once we have WFD client working on top 465bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal of Google API's */ 466bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal break; 467bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal } 468bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal case HWC_DISPLAY_VIRTUAL: 469bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal /* There are two ways to reach this block of code. 470bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 471bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_EXTERNAL 472bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and ctx->mVirtualonExtActive is true. In this case, non-hybrid 473bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD is active. If so, getDpyforExternalDisplay will return dpy 474bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal as HWC_DISPLAY_VIRTUAL. 475bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 476bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * Display hal has received unblank call on HWC_DISPLAY_PRIMARY 477bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal and since SF is not aware of VIRTUAL DISPLAY being handle by HWC, 478bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal it wont send blank / unblank events for it. We piggyback on 479bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal PRIMARY DISPLAY events to release mdp pipes and 480bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal activate/deactivate VIRTUAL DISPLAY. 481bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 482bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal * TODO: This separate case statement is not needed once we have 483bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal WFD client working on top of Google API's. 484bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 485bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal */ 486361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 487361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 488bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal if(blank and (!ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isPause)) { 4898f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar int dpy = HWC_DISPLAY_VIRTUAL; 4908f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 4918f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for virtual!", __FUNCTION__); 4928f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 4948f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 495361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].isActive = !blank; 496361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 497361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 498361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 499361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(blank) { 5008f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 5018f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for external!", __FUNCTION__); 5028f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 5038f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 504361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 505bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal ctx->dpyAttr[dpy].isActive = !blank; 506361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 507361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 508361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 509660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 51055290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 511f2cd273d336010a91602546685168b4a4907d2daNaseer Ahmed ALOGD_IF(BLANK_DEBUG, "%s: Done %s display: %d", __FUNCTION__, 512361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran blank ? "blanking":"unblanking", dpy); 5138f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 514660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 515660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 51627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev) 51727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{ 51827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran int ret = 0; 51927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 52027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 52122f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) { 52222f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__); 52322f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar ctx->mPanelResetStatus = false; 52427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran return; 52522f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar } 52627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 52727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling BLANK DISPLAY", __FUNCTION__); 52827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 1); 52927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 53027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to BLANK: %s", __FUNCTION__, 53127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 53227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 53327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 53427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGD("%s: calling UNBLANK DISPLAY and enabling vsync", __FUNCTION__); 53527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ret = hwc_blank(dev, HWC_DISPLAY_PRIMARY, 0); 53627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 53727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__, 53827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran strerror(errno)); 53927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 54027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1); 54127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 54227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ctx->mPanelResetStatus = false; 54327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran} 54427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 54527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 546660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 5471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 5491589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 5502e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 5511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 5521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 5531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 5541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 5551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 5561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 5572e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 558140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDP.hasOverlay) { 559140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_VIRTUAL_BIT; 560a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna if(!(qdutils::MDPVersion::getInstance().is8x26() || 561a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna qdutils::MDPVersion::getInstance().is8x16())) 562140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_EXTERNAL_BIT; 563140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 5642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 5652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 566f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan case HWC_FORMAT_RB_SWAP: 567f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan value[0] = 1; 568f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan break; 569905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan case HWC_COLOR_FILL: 570905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan value[0] = 1; 571905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan break; 5721589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 5731589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 5741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 5751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 5761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 5771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 5781589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 579c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 58104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 5823475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 583640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 584e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 5853d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu size_t last = list->numHwLayers - 1; 58676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5874019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 58804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 5894019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 59004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 591e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 592e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 594c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 595c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 596c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 597c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 59801cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 599327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 60016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 60116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 60216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 6032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 6042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 60554a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 606ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) { 60704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 60804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 60954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 61054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 61154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 61254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 61354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 61416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 6152a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 616c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 617c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int lSplit = getLeftSplit(ctx, dpy); 618e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran qhwc::ovutils::Dim lRoi = qhwc::ovutils::Dim( 619c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].lRoi.left, 620c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].lRoi.top, 621c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].lRoi.right - ctx->listStats[dpy].lRoi.left, 622e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran ctx->listStats[dpy].lRoi.bottom - ctx->listStats[dpy].lRoi.top); 623c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 624e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran qhwc::ovutils::Dim rRoi = qhwc::ovutils::Dim( 625c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].rRoi.left - lSplit, 626c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].rRoi.top, 627c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].rRoi.right - ctx->listStats[dpy].rRoi.left, 628e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran ctx->listStats[dpy].rRoi.bottom - ctx->listStats[dpy].rRoi.top); 629c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 630c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, lRoi, rRoi)) { 6318f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 63250c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 6332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 634b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 6352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 636a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 637a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 6383475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 642361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 64304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 64404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 6453475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 64676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 648361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 649361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 650e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 6514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 6524d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 6533d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu size_t last = list->numHwLayers - 1; 6544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 6554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 6564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 6574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 6584d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 65976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 6614d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 66276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 6644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 6654d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 666eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 6674d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 6684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 6694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 6704d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 67104a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 6724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 6734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 6744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 6754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 6764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 6774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 6784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 6794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 6804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 6814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 6824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 6834d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 6844d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 6854d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 6864d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 6873475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 6883475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 689c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 6908f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 6918f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 69254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 6932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 6942e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 695a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 696a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 6973475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 700660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 701660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 702660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 703befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 704befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 705befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7063d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for (int i = 0; i < (int)numDisplays; i++) { 707660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 708bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 709361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 7112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 71276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 7132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 714361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 715361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 71690571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 717140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 718140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->set(ctx, list); 71976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7212e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 722660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 7232e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 72495eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 72595eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 72695eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 72733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 72856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 7297351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 7301a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 7322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 733ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 7342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 7362e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 73776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 738bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //in 1.1 there is no way to choose a config, report as config id # 0 7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //This config is passed to getDisplayAttributes. Ignore for now. 7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 7422e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 74376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 74476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 74576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 74676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 74776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 7500df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 75176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 7520df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 75376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 75476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 75576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 75676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 75776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 75876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 7592e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 760660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 762befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 763befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 7642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 765404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R uint32_t /*config*/, const uint32_t* attributes, int32_t* values) { 7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 768bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7690df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 770361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 77176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 77276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 77376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 7812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 7832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7843d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 7852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 7862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 7882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 7892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 7902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 7912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 7932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 79476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 79576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 7962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 7982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 79976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 80076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 8012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 8022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 80379e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 8042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 8052e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 80679e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 8072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 8082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 8092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 8102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 8112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 8122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 8132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 8142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 8152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 8162e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 81793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 81893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 81993138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 8201a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 821a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 822a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 823a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 824a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 8250df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 826f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf); 828f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 829a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 830a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 831a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 832327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 8334762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 834327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 835d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah ovDump[0] = '\0'; 836ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah if(Writeback::getDump(ovDump, 1024)) { 837ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah dumpsys_log(aBuf, ovDump); 838ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah ovDump[0] = '\0'; 839ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah } 840a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 84193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 84293138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 843befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 844befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 845befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 8461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 847befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 848befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 849befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 850befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 851befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 852befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 853befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 854befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 855befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 856befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 857befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 858befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 859befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 860befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 861befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 862befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 863c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan if(dev == NULL) 864c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan return status; 865befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 8661589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8671589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 868befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 8691589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8701589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 8712e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 8728f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_3; 8732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 8742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 8752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 8762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 8772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 8782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.blank = hwc_blank; 8792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 8802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 88193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 8822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 8832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 8842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 885befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 886befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 887befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 888befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 889