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 47304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah#define POWER_MODE_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 1358df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan for(int dpy = 0; dpy < numDisplays; dpy++) { 1368df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan hwc_display_contents_1_t *list = displays[dpy]; 1374c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 1388df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan for(size_t layerIndex = 0; layerIndex < list->numHwLayers; 1398df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan layerIndex++) { 1408df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan if(list->hwLayers[layerIndex].compositionType != 1418df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan HWC_FRAMEBUFFER_TARGET) 1422a345b980298c7623e553634ff56cf5f619765d9Raj Kamal { 1438df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan hwc_layer_1_t const* layer = &list->hwLayers[layerIndex]; 1442a345b980298c7623e553634ff56cf5f619765d9Raj Kamal private_handle_t *hnd = (private_handle_t *)layer->handle; 1452a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1462a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* If a video layer requires rotation, set the DMA state 1472a345b980298c7623e553634ff56cf5f619765d9Raj Kamal * to BLOCK_MODE */ 1482a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1498df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan if (UNLIKELY(isYuvBuffer(hnd)) && canUseRotator(ctx, dpy) && 1502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal (layer->transform & HWC_TRANSFORM_ROT_90)) { 1512a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(not qdutils::MDPVersion::getInstance().is8x26()) { 1522a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mOverlay->isPipeTypeAttached( 1532a345b980298c7623e553634ff56cf5f619765d9Raj Kamal overlay::utils::OV_MDP_PIPE_DMA)) 1542a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->isPaddingRound = true; 1552a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1562a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 1572a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1582a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1599f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 1608df62de616b3025ad53714460320aa100e97165cRamkumar Radhakrishnan if(dpy) { 1612a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* Uncomment the below code for testing purpose. 1622a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Assuming the orientation value is in terms of HAL_TRANSFORM, 1632a345b980298c7623e553634ff56cf5f619765d9Raj Kamal this needs mapping to HAL, if its in different convention */ 1642a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1652a345b980298c7623e553634ff56cf5f619765d9Raj Kamal /* char value[PROPERTY_VALUE_MAX]; 1662a345b980298c7623e553634ff56cf5f619765d9Raj Kamal property_get("sys.ext_orientation", value, "0"); 1672a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->mExtOrientation = atoi(value);*/ 1682a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1692a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mExtOrientation || ctx->mBufferMirrorMode) { 1702a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(ctx->mOverlay->isPipeTypeAttached( 1712a345b980298c7623e553634ff56cf5f619765d9Raj Kamal overlay::utils::OV_MDP_PIPE_DMA)) { 1722a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->isPaddingRound = true; 1732a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1742a345b980298c7623e553634ff56cf5f619765d9Raj Kamal Overlay::setDMAMode(Overlay::DMA_BLOCK_MODE); 1752a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1762a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1772a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1782a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1792a345b980298c7623e553634ff56cf5f619765d9Raj Kamal} 1802a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 1812a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void setNumActiveDisplays(hwc_context_t *ctx, int numDisplays, 1822a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t** displays) { 1834c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal 1842a345b980298c7623e553634ff56cf5f619765d9Raj Kamal ctx->numActiveDisplays = 0; 1852a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(int i = 0; i < numDisplays; i++) { 1862a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t *list = displays[i]; 1872a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 1884c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal /* For display devices like SSD and screenrecord, we cannot 1894c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * rely on isActive and connected attributes of dpyAttr to 1904c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * determine if the displaydevice is active. Hence in case if 1914c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * the layer-list is non-null and numHwLayers > 0, we assume 1924c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal * the display device to be active. 1934c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal */ 1944c087a193c4d6e1b5e20aa8e561bf5eba4592856Raj Kamal ctx->numActiveDisplays += 1; 1952a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1962a345b980298c7623e553634ff56cf5f619765d9Raj Kamal } 1972a345b980298c7623e553634ff56cf5f619765d9Raj Kamal} 19803514577d0c705056352898f66ed2a8e9b131df8Raj Kamal 1992a345b980298c7623e553634ff56cf5f619765d9Raj Kamalstatic void reset(hwc_context_t *ctx, int numDisplays, 2002a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t** displays) { 2012a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 2022a345b980298c7623e553634ff56cf5f619765d9Raj Kamal 2032a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(int i = 0; i < numDisplays; i++) { 2042a345b980298c7623e553634ff56cf5f619765d9Raj Kamal hwc_display_contents_1_t *list = displays[i]; 2052a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // XXX:SurfaceFlinger no longer guarantees that this 2062a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // value is reset on every prepare. However, for the layer 2072a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // cache we need to reset it. 2082a345b980298c7623e553634ff56cf5f619765d9Raj Kamal // We can probably rethink that later on 2092a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if (LIKELY(list && list->numHwLayers > 0)) { 2102a345b980298c7623e553634ff56cf5f619765d9Raj Kamal for(size_t j = 0; j < list->numHwLayers; j++) { 2112a345b980298c7623e553634ff56cf5f619765d9Raj Kamal if(list->hwLayers[j].compositionType != HWC_FRAMEBUFFER_TARGET) 2122a345b980298c7623e553634ff56cf5f619765d9Raj Kamal list->hwLayers[j].compositionType = HWC_FRAMEBUFFER; 21303514577d0c705056352898f66ed2a8e9b131df8Raj Kamal } 2143d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu ctx->mPrevHwLayerCount[i] = (int)list->numHwLayers; 2153d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu } else { 2163d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu ctx->mPrevHwLayerCount[i] = 0; 2179f0b36a26d1c37ad0d31e59136b1e5d6f4d7efdeNaseer Ahmed } 218640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 219640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(ctx->mFBUpdate[i]) 220640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mFBUpdate[i]->reset(); 2214019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[i]) 2224019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R ctx->mCopyBit[i]->reset(); 223bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar if(ctx->mLayerRotMap[i]) 224bef8ca47f3b15f7ae3caa871c1ed5da5508aca3fAmara Venkata Mastan Manoj Kumar ctx->mLayerRotMap[i]->reset(); 2252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 226f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah 227f1c9077e23f3fd814c27445ad73f6967a1ce5d9eSaurabh Shah ctx->mAD->reset(); 2288eeb53efa1e615545f646a14ae2e8157e0a9bae6Saurabh Shah MDPComp::reset(); 229140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 230140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ctx->mHWCVirtual->destroy(ctx, numDisplays, displays); 23116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 23216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 233f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddibool isEqual(float f1, float f2) { 234f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi return ((int)(f1*100) == (int)(f2*100)) ? true : false; 235f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi} 236f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 237f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddistatic void scaleDisplayFrame(hwc_context_t *ctx, int dpy, 238f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_display_contents_1_t *list) { 2393d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t origXres = ctx->dpyAttr[dpy].xres_orig; 2403d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t origYres = ctx->dpyAttr[dpy].yres_orig; 2413d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t fakeXres = ctx->dpyAttr[dpy].xres; 2423d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t fakeYres = ctx->dpyAttr[dpy].yres; 2433d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu float xresRatio = (float)origXres / (float)fakeXres; 2443d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu float yresRatio = (float)origYres / (float)fakeYres; 245f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi for (size_t i = 0; i < list->numHwLayers; i++) { 246f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_layer_1_t *layer = &list->hwLayers[i]; 247f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_rect_t& displayFrame = layer->displayFrame; 248f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 2493d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t layerWidth = displayFrame.right - displayFrame.left; 2503d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t layerHeight = displayFrame.bottom - displayFrame.top; 2513d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t sourceWidth = sourceCrop.right - sourceCrop.left; 2523d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t sourceHeight = sourceCrop.bottom - sourceCrop.top; 253f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2543d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu if (isEqual(((float)layerWidth / (float)sourceWidth), xresRatio) && 2553d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu isEqual(((float)layerHeight / (float)sourceHeight), yresRatio)) 256f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi break; 257f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.left = (int)(xresRatio * (float)displayFrame.left); 2593d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.top = (int)(yresRatio * (float)displayFrame.top); 2603d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.right = (int)((float)displayFrame.left + 2613d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu (float)layerWidth * xresRatio); 2623d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu displayFrame.bottom = (int)((float)displayFrame.top + 2633d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu (float)layerHeight * yresRatio); 264f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi } 265f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi} 266f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_primary(hwc_composer_device_1 *dev, 2682e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t *list) { 2693156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 2702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 271640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 272b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam bool fbComp = false; 27354a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 27454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive) { 275f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 276f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi if (ctx->dpyAttr[dpy].customFBSize) 277f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi scaleDisplayFrame(ctx, dpy, list); 278f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 2793d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 280c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 281b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 28201cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed fbComp = (ctx->mMDPComp[dpy]->prepare(ctx, list) < 0); 283b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 284b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam if (fbComp) { 285c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 286a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) { 287a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mOverlay->clear(dpy); 288a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mLayerRotMap[dpy]->clear(); 289a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah } 290c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 291b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 292c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if (ctx->mMDP.version < qdutils::MDP_V4_0) { 293c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mCopyBit[dpy]) 294c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->mCopyBit[dpy]->prepare(ctx, list, dpy); 2952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2969c2ae1c5238bfa2bfb2fb004fd82534c0460d7f9Naseer Ahmed setGPUHint(ctx, list); 2972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 2982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 2992e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 3002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 3012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_prepare_external(hwc_composer_device_1 *dev, 302361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t *list) { 3033156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 305361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 30676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 30754a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (LIKELY(list && list->numHwLayers > 1) && 30854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].isActive && 30954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ctx->dpyAttr[dpy].connected) { 3103d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu reset_layer_prop(ctx, dpy, (int)list->numHwLayers - 1); 31190571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar if(!ctx->dpyAttr[dpy].isPause) { 312c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah ctx->dpyAttr[dpy].isConfiguring = false; 313c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah setListStats(ctx, list, dpy); 314c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if(ctx->mMDPComp[dpy]->prepare(ctx, list) < 0) { 315c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah const int fbZ = 0; 316a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah if(not ctx->mFBUpdate[dpy]->prepareAndValidate(ctx, list, fbZ)) 317a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah { 318a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mOverlay->clear(dpy); 319a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah ctx->mLayerRotMap[dpy]->clear(); 320a7075caa2020c42d35d48ffa44302a4d92e5ab5aSaurabh Shah } 321c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah } 32290571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar } else { 323b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal /* External Display is in Pause state. 324b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * Mark all application layers as OVERLAY so that 325b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal * GPU will not compose. 326b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal */ 327b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal for(size_t i = 0 ;i < (size_t)(list->numHwLayers - 1); i++) { 328b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal hwc_layer_1_t *layer = &list->hwLayers[i]; 329b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal layer->compositionType = HWC_OVERLAY; 330b2f91c7c700da36fa5bcc5a4fe61b8911bf3fdedRaj Kamal } 33176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 3322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 3332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 33425322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah} 33525322c7f78dfeb2c9c441dc0720dba6c639b198cSaurabh Shah 336660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_prepare(hwc_composer_device_1 *dev, size_t numDisplays, 337660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 338befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 3392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 340befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 34127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 34227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ctx->mPanelResetStatus) { 34327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGW("%s: panel is in bad state. reset the panel", __FUNCTION__); 34427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran reset_panel(dev); 34527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 34627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 3477351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Will be unlocked at the end of set 3481a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.lock(); 3492a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setPaddingRound(ctx,numDisplays,displays); 3502a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setDMAState(ctx,numDisplays,displays); 3512a345b980298c7623e553634ff56cf5f619765d9Raj Kamal setNumActiveDisplays(ctx,numDisplays,displays); 3522a345b980298c7623e553634ff56cf5f619765d9Raj Kamal reset(ctx, (int)numDisplays, displays); 353bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 35447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ctx->mOverlay->configBegin(); 355327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configBegin(); 35676a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configBegin(); 35776a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah 3583d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for (int32_t i = ((int32_t)numDisplays-1); i >=0 ; i--) { 35916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t *list = displays[i]; 360bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 361361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 36216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_PRIMARY: 36316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = hwc_prepare_primary(dev, list); 36416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 36516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case HWC_DISPLAY_EXTERNAL: 366361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_prepare_external(dev, list); 367361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 36890571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 369140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 370140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->prepare(dev, list); 37116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed break; 37216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 37316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -EINVAL; 374befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 375befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 37647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 377640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->configDone(); 378327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ctx->mRotMgr->configDone(); 37976a5cdf91ae7c3f98845c0464dcc49c45d1af10bSaurabh Shah overlay::Writeback::configDone(); 380327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 3812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 382befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 383befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 384660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_eventControl(struct hwc_composer_device_1* dev, int dpy, 38555290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed int event, int enable) 3861589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 3873156a8f38820366117cdd42cb727c7a2e0bc66caNaseer Ahmed ATRACE_CALL(); 3881589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int ret = 0; 3891589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 3901589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch(event) { 3911589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_EVENT_VSYNC: 39255290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed if (ctx->vstate.enable == enable) 3934267d405186dccc076536208c9f428761146bae4Omprakash Dhyade break; 39455290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ret = hwc_vsync_control(ctx, dpy, enable); 39510d293b379d1b8bdaa383b67c05b187365c5d1afNaseer Ahmed if(ret == 0) 39655290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed ctx->vstate.enable = !!enable; 397dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev ALOGD_IF (VSYNC_DEBUG, "VSYNC state changed to %s", 39855290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed (enable)?"ENABLED":"DISABLED"); 399dc8c69a5f00ed27acab3821541e2d41d13b777bcIliyan Malchev break; 400f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#ifdef QCOM_BSP 401a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan case HWC_EVENT_ORIENTATION: 402a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(dpy == HWC_DISPLAY_PRIMARY) { 4031a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 404a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // store the primary display orientation 405a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->deviceOrientation = enable; 406a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 407a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan break; 408f1e233034ba5bc96e32861fa98a5504aad06415bNaseer Ahmed#endif 4091589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 4101589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ret = -EINVAL; 4111589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 4121589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return ret; 4131589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 4141589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 415304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shahstatic int hwc_setPowerMode(struct hwc_composer_device_1* dev, int dpy, 416304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah int mode) 417660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed{ 41804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 4191ddbd4ef2e8a4e14b19e9ce4c9ad00b63b76bbe9Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 420361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran int ret = 0, value = 0; 421bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal 422304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 423304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGD_IF(POWER_MODE_DEBUG, "%s: Setting mode %d on display: %d", 424304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah __FUNCTION__, mode, dpy); 425304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah 426304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah switch(mode) { 427304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah case HWC_POWER_MODE_OFF: 428304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // free up all the overlay pipes in use 429304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // when we get a blank for either display 430304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // makes sure that all pipes are freed 431304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ctx->mOverlay->configBegin(); 432304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ctx->mOverlay->configDone(); 433304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ctx->mRotMgr->clear(); 434304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // If VDS is connected, do not clear WB object as it 435304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // will end up detaching IOMMU. This is required 436304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // to send black frame to WFD sink on power suspend. 437304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // Note: With this change, we keep the WriteBack object 438304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // alive on power suspend for AD use case. 4396d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // Instead, we now clear the writeback and associated pipes 4406d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // when the primary display is unblanking. 441304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah value = FB_BLANK_POWERDOWN; 442304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah break; 443304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah case HWC_POWER_MODE_DOZE: 444304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah case HWC_POWER_MODE_DOZE_SUSPEND: 445304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah value = FB_BLANK_VSYNC_SUSPEND; 446304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah break; 447304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah case HWC_POWER_MODE_NORMAL: 448304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah value = FB_BLANK_UNBLANK; 449304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah break; 450905c994790c2e9ce6aa585cd9d70178db4391cceArun Kumar K.R } 451304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah 4526d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // XXX: Workaround 4536d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // Clear writeback and all overlays when primary is unblanking, 4546d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // since the kernel may have internally reset writeback in XO shutdown. 4556d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // This is to maintain consistency with the kernel's internal state and 4566d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // not assume that we have a valid writeback object when unblanking primary 4576d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // Ideally, we should get an explicit blank on the virtual display 4586d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // or, the blank frames when the virtual display is blanking should 4596d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed // be sent _before_ the primary is unblanked 4606d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed if (dpy == HWC_DISPLAY_PRIMARY && not (mode == HWC_POWER_MODE_OFF)) { 4616d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed ctx->mOverlay->configBegin(); 4626d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed ctx->mOverlay->configDone(); 4636d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed ctx->mRotMgr->clear(); 4646d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed Writeback::clear(); 4656d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed } 4666d1d1d5fe4f4ae7f6ba558f17904aa13b3f0da16Naseer Ahmed 4672e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(dpy) { 468361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_PRIMARY: 469361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ioctl(ctx->dpyAttr[dpy].fd, FBIOBLANK, value) < 0 ) { 470304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGE("%s: ioctl FBIOBLANK failed for Primary with error %s" 471304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah " value %d", __FUNCTION__, strerror(errno), value); 472304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah return -errno; 473361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 474361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 475304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah if(mode == HWC_POWER_MODE_NORMAL) { 476304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah // Enable HPD here, as during bootup POWER_MODE_NORMAL is set 477361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran // when SF is completely initialized 478361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ctx->mExtDisplay->setHPD(1); 479361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 480361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 481304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF); 482304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah //Deliberate fall through since there is no explicit power mode for 483304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah //virtual displays. 484bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal case HWC_DISPLAY_VIRTUAL: 485361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if(ctx->dpyAttr[HWC_DISPLAY_VIRTUAL].connected) { 486304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah const int dpy = HWC_DISPLAY_VIRTUAL; 487304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah if(mode == HWC_POWER_MODE_OFF and 488304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah (not ctx->dpyAttr[dpy].isPause)) { 4898f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 490304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGE("%s: displayCommit failed for virtual", __FUNCTION__); 4918f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 4928f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 4938f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 494304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF); 495361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 496361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 497361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran case HWC_DISPLAY_EXTERNAL: 498304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah if(mode == HWC_POWER_MODE_OFF) { 4998f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 500304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGE("%s: displayCommit failed for external", __FUNCTION__); 5018f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ret = -1; 5028f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar } 503361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran } 504304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ctx->dpyAttr[dpy].isActive = not(mode == HWC_POWER_MODE_OFF); 505361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 506361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran default: 507361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran return -EINVAL; 508660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 50955290a90518c4a8e2cc41d7bdb40918248a9920eNaseer Ahmed 510304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGD_IF(POWER_MODE_DEBUG, "%s: Done setting mode %d on display %d", 511304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah __FUNCTION__, mode, dpy); 5128f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar return ret; 513660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed} 514660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed 51527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaranstatic void reset_panel(struct hwc_composer_device_1* dev) 51627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran{ 51727ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran int ret = 0; 51827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_context_t* ctx = (hwc_context_t*)(dev); 51927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 52022f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar if (!ctx->dpyAttr[HWC_DISPLAY_PRIMARY].isActive) { 52122f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar ALOGD ("%s : Display OFF - Skip BLANK & UNBLANK", __FUNCTION__); 52222f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar ctx->mPanelResetStatus = false; 52327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran return; 52422f9855af73ad424c96023dab90f1d33342df7e2Neti Ravi Kumar } 52527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 526304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGD("%s: setting power mode off", __FUNCTION__); 527304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_OFF); 52827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 52927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to BLANK: %s", __FUNCTION__, 530304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah strerror(errno)); 53127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 53227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 533304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ALOGD("%s: setting power mode normal and enabling vsync", __FUNCTION__); 534304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah ret = hwc_setPowerMode(dev, HWC_DISPLAY_PRIMARY, HWC_POWER_MODE_NORMAL); 53527ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran if (ret < 0) { 53627ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ALOGE("%s: FBIOBLANK failed to UNBLANK : %s", __FUNCTION__, 537304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah strerror(errno)); 53827ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran } 53927ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran hwc_vsync_control(ctx, HWC_DISPLAY_PRIMARY, 1); 54027ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 54127ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran ctx->mPanelResetStatus = false; 54227ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran} 54327ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 54427ed7a681887d87449209c0d3bab4fac6aae8e3cVeera Sankaran 545660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_query(struct hwc_composer_device_1* dev, 5461589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed int param, int* value) 5471589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed{ 5481589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 5492e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int supported = HWC_DISPLAY_PRIMARY_BIT; 5501589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 5511589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed switch (param) { 5521589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed case HWC_BACKGROUND_LAYER_SUPPORTED: 5531589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed // Not supported for now 5541589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed value[0] = 0; 5551589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed break; 5562e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_TYPES_SUPPORTED: 557140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mMDP.hasOverlay) { 558140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_VIRTUAL_BIT; 559a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna if(!(qdutils::MDPVersion::getInstance().is8x26() || 560a85d9f9f2d5cd0555b409b1fc974a9ecec3fee56radhakrishna qdutils::MDPVersion::getInstance().is8x16())) 561140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan supported |= HWC_DISPLAY_EXTERNAL_BIT; 562140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan } 5632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah value[0] = supported; 5642e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 565f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan case HWC_FORMAT_RB_SWAP: 566f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan value[0] = 1; 567f01e10a58786e9cb3200a757f65547868a29773dSushil Chauhan break; 568905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan case HWC_COLOR_FILL: 569905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan value[0] = 1; 570905042d4ea8c4c736ea248b694d93ef2f59866d5Sushil Chauhan break; 5711589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed default: 5721589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return -EINVAL; 5731589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed } 5741589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed return 0; 5751589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 5761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed} 5771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 578c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 5792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_primary(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 58004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 5813475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 582640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 583e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive) { 5843d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu size_t last = list->numHwLayers - 1; 58576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 5864019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R int fd = -1; //FenceFD from the Copybit(valid in async mode) 58704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed bool copybitDone = false; 5884019c64ad8721cd9f3dc5c4e7be260a5f0706e34Arun Kumar K.R if(ctx->mCopyBit[dpy]) 58904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 590e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 591e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 593c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan // Dump the layers for primary 594c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan if(ctx->mHwcDebug[dpy]) 595c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan ctx->mHwcDebug[dpy]->dumpLayers(list); 596c9889a4a83afe2e431bd6982144cee1b6370d451Ramkumar Radhakrishnan 59701cbebaaabd86eb7674a6d4b6939b0899f7bce3fNaseer Ahmed if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 598327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: MDPComp draw failed", __FUNCTION__); 59916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ret = -1; 60016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 60116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 6022e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //TODO We dont check for SKIP flag on this layer because we need PAN 6032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //always. Last layer is always FB 60454a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 605ef49cc7dd1d50a020598a9e821c5aa234503b559Terence Hampson if(copybitDone && ctx->mMDP.version >= qdutils::MDP_V4_0) { 60604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 60704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed } 60854a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah 60954a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if(hnd) { 61054a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 61154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ALOGE("%s: FBUpdate draw failed", __FUNCTION__); 61254a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 61316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 6142a67868e6e048684c4a505f74808c3a2aba63c79Saurabh Shah } 615c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 616c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran int lSplit = getLeftSplit(ctx, dpy); 617e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran qhwc::ovutils::Dim lRoi = qhwc::ovutils::Dim( 618c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].lRoi.left, 619c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].lRoi.top, 620c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].lRoi.right - ctx->listStats[dpy].lRoi.left, 621e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran ctx->listStats[dpy].lRoi.bottom - ctx->listStats[dpy].lRoi.top); 622c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 623e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran qhwc::ovutils::Dim rRoi = qhwc::ovutils::Dim( 624c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].rRoi.left - lSplit, 625c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].rRoi.top, 626c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran ctx->listStats[dpy].rRoi.right - ctx->listStats[dpy].rRoi.left, 627e54f8a454099b5773541ecc70bbe3b7579c5d66bJeykumar Sankaran ctx->listStats[dpy].rRoi.bottom - ctx->listStats[dpy].rRoi.top); 628c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran 629c9b4387ff5af60882a032188b64b85bebad3977aJeykumar Sankaran if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd, lRoi, rRoi)) { 6308f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 63150c8773e2800263be1340a4bae443ddef6d43940Ramkumar Radhakrishnan ret = -1; 6322e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 633b0f5e47fdc9c351d603ba7cc71b4fc61074d797aZohaib Alam 6342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 635a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 636a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 6373475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 6382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6392e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 6402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahstatic int hwc_set_external(hwc_context_t *ctx, 641361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran hwc_display_contents_1_t* list) 64204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{ 64304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed ATRACE_CALL(); 6443475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah int ret = 0; 64576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 646361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran const int dpy = HWC_DISPLAY_EXTERNAL; 647361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 648361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran 649e5287a408d2eae29afa055d6bfd646c250d129fbAmara Venkata Mastan Manoj Kumar if (LIKELY(list) && ctx->dpyAttr[dpy].isActive && 6504d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->dpyAttr[dpy].connected && 6514d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar !ctx->dpyAttr[dpy].isPause) { 6523d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu size_t last = list->numHwLayers - 1; 6534d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *fbLayer = &list->hwLayers[last]; 6544d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int fd = -1; //FenceFD from the Copybit(valid in async mode) 6554d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar bool copybitDone = false; 6564d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mCopyBit[dpy]) 6574d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar copybitDone = ctx->mCopyBit[dpy]->draw(ctx, list, dpy, &fd); 65876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6594d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(list->numHwLayers > 1) 6604d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_sync(ctx, list, dpy, fd); 66176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 6624d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar // Dump the layers for external 6634d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(ctx->mHwcDebug[dpy]) 6644d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->mHwcDebug[dpy]->dumpLayers(list); 665eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 6664d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mMDPComp[dpy]->draw(ctx, list)) { 6674d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: MDPComp draw failed", __FUNCTION__); 6684d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 6694d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 67004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed 6714d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar int extOnlyLayerIndex = 6724d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ctx->listStats[dpy].extOnlyLayerIndex; 6734d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 6744d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar private_handle_t *hnd = (private_handle_t *)fbLayer->handle; 6754d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(extOnlyLayerIndex!= -1) { 6764d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hwc_layer_1_t *extLayer = &list->hwLayers[extOnlyLayerIndex]; 6774d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = (private_handle_t *)extLayer->handle; 6784d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } else if(copybitDone) { 6794d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar hnd = ctx->mCopyBit[dpy]->getCurrentRenderBuffer(); 6804d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar } 6814d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar 6824d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if(hnd && !isYuvBuffer(hnd)) { 6834d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar if (!ctx->mFBUpdate[dpy]->draw(ctx, hnd)) { 6844d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ALOGE("%s: FBUpdate::draw fail!", __FUNCTION__); 6854d0834b7bc85f5130867a704e3e5fbaed5210c3aAmara Venkata Mastan Manoj Kumar ret = -1; 6863475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 6873475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah } 688c567a93cd9ff7079ac03024d4fdb1ddc5683e748Jeykumar Sankaran 6898f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar if(!Overlay::displayCommit(ctx->dpyAttr[dpy].fd)) { 6908f4aa803299924d78caffbb209c16dc5a79486faAmara Venkata Mastan Manoj Kumar ALOGE("%s: display commit fail for %d dpy!", __FUNCTION__, dpy); 69154a4a8e7d7b1aadb06153ee36935860cacf1e643Saurabh Shah ret = -1; 6922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 6932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 694a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah 695a2fbf2e17b5b50016125016f05cb0b52bea5ce5fSaurabh Shah closeAcquireFds(list); 6963475d840ef8603c8e21fe903cb5b17fa4cc948b3Saurabh Shah return ret; 6972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 6982e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 699660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedstatic int hwc_set(hwc_composer_device_1 *dev, 700660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed size_t numDisplays, 701660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t** displays) 702befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 703befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int ret = 0; 704befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 7053d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu for (int i = 0; i < (int)numDisplays; i++) { 706660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_display_contents_1_t* list = displays[i]; 707bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal int dpy = getDpyforExternalDisplay(ctx, i); 708361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran switch(dpy) { 7092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 7102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = hwc_set_primary(ctx, list); 71176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 7122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 713361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran ret = hwc_set_external(ctx, list); 714361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran break; 71590571fc7c38e38858ad22a79e95efcb99c3a8b1dAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 716140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan if(ctx->mHWCVirtual) 717140ee6411106722dae886dc8c5b104b72d64dee0Ramkumar Radhakrishnan ret = ctx->mHWCVirtual->set(ctx, list); 71876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah break; 7192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 7202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ret = -EINVAL; 721660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 7222e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 72395eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // This is only indicative of how many times SurfaceFlinger posts 72495eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed // frames to the display. 72595eb7a8800a05d8a0b6f5ba3f05e48d8dd36705fNaseer Ahmed CALC_FPS(); 72633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah MDPComp::resetIdleFallBack(); 72756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag = false; 7287351e690989ae638e281be1999b002b3333cd403Saurabh Shah //Was locked at the beginning of prepare 7291a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah ctx->mDrawLock.unlock(); 7302e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return ret; 7312e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 732ee7fc0347e52276d43413e91f31d72d6db99dcfbNaseer Ahmed 7332e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayConfigs(struct hwc_composer_device_1* dev, int disp, 7342e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah uint32_t* configs, size_t* numConfigs) { 7352e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int ret = 0; 73676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 737bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 738304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah //Currently we allow only 1 config, reported as config id # 0 739304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah //This config is passed in to getDisplayAttributes. Ignored for now. 7402e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch(disp) { 7412e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_PRIMARY: 74276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 74376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 74476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 74576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 74676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 7472e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7482e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_EXTERNAL: 7490df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar case HWC_DISPLAY_VIRTUAL: 75076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = -1; //Not connected 7510df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar if(ctx->dpyAttr[disp].connected) { 75276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ret = 0; //NO_ERROR 75376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah if(*numConfigs > 0) { 75476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah configs[0] = 0; 75576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah *numConfigs = 1; 75676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 75776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 7582e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 759660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed } 760befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return ret; 761befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 762befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 7632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shahint hwc_getDisplayAttributes(struct hwc_composer_device_1* dev, int disp, 764404047f2c61687024048b04374ea736285ddded1Arun Kumar K.R uint32_t /*config*/, const uint32_t* attributes, int32_t* values) { 7652e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7662e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_context_t* ctx = (hwc_context_t*)(dev); 767bc9577e5f6134bde4c5b650c35c78bc851643ae3Raj Kamal disp = getDpyforExternalDisplay(ctx, disp); 7680df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar //If hotpluggable displays(i.e, HDMI, WFD) are inactive return error 769361900d9a618d2c4d2276a10ca76919214f6759fJeykumar Sankaran if( (disp != HWC_DISPLAY_PRIMARY) && !ctx->dpyAttr[disp].connected) { 77076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah return -1; 77176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah } 77276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 7732e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah //From HWComposer 7742e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah static const uint32_t DISPLAY_ATTRIBUTES[] = { 7752e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_VSYNC_PERIOD, 7762e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_WIDTH, 7772e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_HEIGHT, 7782e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_X, 7792e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_DPI_Y, 7802e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah HWC_DISPLAY_NO_ATTRIBUTE, 7812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah }; 7822e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7833d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu const size_t NUM_DISPLAY_ATTRIBUTES = (sizeof(DISPLAY_ATTRIBUTES) / 7842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah sizeof(DISPLAY_ATTRIBUTES)[0]); 7852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 7862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for (size_t i = 0; i < NUM_DISPLAY_ATTRIBUTES - 1; i++) { 7872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah switch (attributes[i]) { 7882e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_VSYNC_PERIOD: 7892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].vsync_period; 7902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7912e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_WIDTH: 7922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].xres; 79376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, width = %d",__FUNCTION__, disp, 79476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].xres); 7952e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 7962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_HEIGHT: 7972e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah values[i] = ctx->dpyAttr[disp].yres; 79876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGD("%s disp = %d, height = %d",__FUNCTION__, disp, 79976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ctx->dpyAttr[disp].yres); 8002e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 8012e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_X: 80279e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].xdpi*1000.0); 8032e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 8042e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah case HWC_DISPLAY_DPI_Y: 80579e14117f5e66a080b9f2a783ce3b215c72c8653Naseer Ahmed values[i] = (int32_t) (ctx->dpyAttr[disp].ydpi*1000.0); 8062e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah break; 8072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah default: 8082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah ALOGE("Unknown display attribute %d", 8092e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah attributes[i]); 8102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return -EINVAL; 8112e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 8122e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah } 8132e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah return 0; 8142e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah} 8152e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah 81693138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmedvoid hwc_dump(struct hwc_composer_device_1* dev, char *buff, int buff_len) 81793138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed{ 81893138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 8191a050829890735bc5a936ad65bf9cad80295306bSaurabh Shah Locker::Autolock _l(ctx->mDrawLock); 820a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah android::String8 aBuf(""); 821a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, "Qualcomm HWC state:\n"); 822a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " MDPVersion=%d\n", ctx->mMDP.version); 823a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, " DisplayPanel=%c\n", ctx->mMDP.panel); 8240df43c5a5da262ea6716f7614019fc710562028bAmara Venkata Mastan Manoj Kumar for(int dpy = 0; dpy < HWC_NUM_DISPLAY_TYPES; dpy++) { 825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDPComp[dpy]) 826f4a5614d0908640d9a46d55c25b6ab224f3fae81Jeykumar Sankaran ctx->mMDPComp[dpy]->dump(aBuf, ctx); 827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 828a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah char ovDump[2048] = {'\0'}; 829a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah ctx->mOverlay->getDump(ovDump, 2048); 830a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah dumpsys_log(aBuf, ovDump); 831327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ovDump[0] = '\0'; 8324762db4eb027284225be9d10f08d87252612064cSaurabh Shah ctx->mRotMgr->getDump(ovDump, 1024); 833327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah dumpsys_log(aBuf, ovDump); 834d292850924144d1e3ff1a1ba0ff0c31a54857c9aSaurabh Shah ovDump[0] = '\0'; 835ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah if(Writeback::getDump(ovDump, 1024)) { 836ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah dumpsys_log(aBuf, ovDump); 837ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah ovDump[0] = '\0'; 838ed86bfc13ab26a6d48eabf2dcc241b76241fa591Saurabh Shah } 839a22f5873a9974b00f352370e077db9788ad67699Saurabh Shah strlcpy(buff, aBuf.string(), buff_len); 84093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 84193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 842304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shahint hwc_getActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/) { 843304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah //Supports only the default config (0th index) for now 844304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah return 0; 845304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah} 846304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah 847304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shahint hwc_setActiveConfig(struct hwc_composer_device_1* /*dev*/, int /*disp*/, 848304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah int index) { 849304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah //Supports only the default config (0th index) for now 850304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah return (index == 0) ? index : -EINVAL; 851304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah} 852304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah 853befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_close(struct hw_device_t *dev) 854befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 855befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if(!dev) { 8561589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed ALOGE("%s: NULL device pointer", __FUNCTION__); 857befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return -1; 858befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 859befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed closeContext((hwc_context_t*)dev); 860befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed free(dev); 861befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 862befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return 0; 863befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 864befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 865befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedstatic int hwc_device_open(const struct hw_module_t* module, const char* name, 866befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hw_device_t** device) 867befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed{ 868befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int status = -EINVAL; 869befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed 870befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed if (!strcmp(name, HWC_HARDWARE_COMPOSER)) { 871befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed struct hwc_context_t *dev; 872befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dev = (hwc_context_t*)malloc(sizeof(*dev)); 873c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan if(dev == NULL) 874c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan return status; 875befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed memset(dev, 0, sizeof(*dev)); 8761589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8771589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Initialize hwc context 878befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed initContext(dev); 8791589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed 8801589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed //Setup HWC methods 8812e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.tag = HARDWARE_DEVICE_TAG; 882304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah dev->device.common.version = HWC_DEVICE_API_VERSION_1_4; 8832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.module = const_cast<hw_module_t*>(module); 8842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.common.close = hwc_device_close; 8852e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.prepare = hwc_prepare; 8862e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.set = hwc_set; 8872e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.eventControl = hwc_eventControl; 888304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah dev->device.setPowerMode = hwc_setPowerMode; 8892e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.query = hwc_query; 8902e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.registerProcs = hwc_registerProcs; 89193138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed dev->device.dump = hwc_dump; 8922e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayConfigs = hwc_getDisplayConfigs; 8932e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah dev->device.getDisplayAttributes = hwc_getDisplayAttributes; 894304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah dev->device.getActiveConfig = hwc_getActiveConfig; 895304c6eaab1fe546d37591ba4c84a9cb58368c29bSaurabh Shah dev->device.setActiveConfig = hwc_setActiveConfig; 8962e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah *device = &dev->device.common; 897befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed status = 0; 898befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed } 899befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed return status; 900befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed} 901