hwc_mdpcomp.cpp revision 699929775d0f2612670fe7f07ceda438c7f7d502
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 2c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained 4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only. 5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License. 8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at 9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and 16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License. 17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1941269096daf2363b16dcd89627dd674529a26601Saurabh Shah#include <math.h> 20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h" 2116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h> 22bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 23591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h" 248b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h" 25699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah#include "hwc_fbupdate.h" 26327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 27c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 298fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils; 3116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 33327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 34327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 35c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 36c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 4016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 41e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaranbool MDPComp::sEnableMixedMode = true; 42f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 43c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 442e474227e216ee37ab84a3c9a22ea1f650626231Saurabh ShahMDPComp* MDPComp::getObject(const int& width, const int& rightSplit, 452e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int& dpy) { 462e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(width > MAX_DISPLAY_DIM || rightSplit) { 47f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompHighRes(dpy); 48c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 492e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah return new MDPCompLowRes(dpy); 50c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 5116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 52f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 53f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 54c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 55c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 5652e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula Locker::Autolock _l(mMdpCompLock); 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\""); 59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount:%2d \n", mCachedFrame.layerCount, 61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount, mCachedFrame.cacheCount); 62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount:%2d \n", mCurrentFrame.layerCount, 64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 78f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 79f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 80f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 94f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 976387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou if(!setupBasePipe(ctx)) { 986387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 996387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou return false; 1006387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou } 101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 103e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = true; 104e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if((property_get("debug.mdpcomp.mixedmode.disable", property, NULL) > 0) && 105e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 106e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 107e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran sEnableMixedMode = false; 108e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 109e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 110c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = false; 111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 11711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 11811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 11911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 12011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 121f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 122f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1239336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam long idle_timeout = DEFAULT_IDLE_TIME; 124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idle_timeout = atoi(property); 127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 1299336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam //create Idle Invalidator only when not disabled through property 1309336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam if(idle_timeout != -1) 1319336c633b7b916aa0fdc7cf3272a1946658b23faZohaib Alam idleInvalidator = IdleInvalidator::getInstance(); 132c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 133c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(idleInvalidator == NULL) { 134f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__); 135c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else { 136c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator->init(timeout_handler, ctx, idle_timeout); 137c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 138c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 141699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shahvoid MDPComp::reset(const int& numLayers, hwc_display_contents_1_t* list) { 142699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.reset(numLayers); 143699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.cacheAll(list); 144699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 145699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah} 146699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 148c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 149c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 151c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 152c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 155359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 156c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 157c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 161359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 164c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 165f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 166f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 168f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 170f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 171f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 172f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 173f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 174f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[index] = NULL; 175f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 176f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.needsRedraw) 177f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 18116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/* 183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0. 184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl. 185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */ 186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_stride = ctx->dpyAttr[dpy].stride; 189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_width = ctx->dpyAttr[dpy].xres; 190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_height = ctx->dpyAttr[dpy].yres; 191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_fd = ctx->dpyAttr[dpy].fd; 192c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_overlay ovInfo; 194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah msmfb_overlay_data ovData; 195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovInfo, 0, sizeof(mdp_overlay)); 196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovData, 0, sizeof(msmfb_overlay_data)); 197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.format = MDP_RGB_BORDERFILL; 199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.width = fb_width; 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.height = fb_height; 201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.w = fb_width; 202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.h = fb_height; 203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.w = fb_width; 204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.h = fb_height; 205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.id = MSMFB_NEW_REQUEST; 206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 208c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 209f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 210c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 211c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 212c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 213c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovData.id = ovInfo.id; 214c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 215c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 217c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 218c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 219c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 220c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 221f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 224c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 225af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 226af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 229f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 230f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 232c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 233c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 235f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 240af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 242ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 245f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 246af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 247af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 248af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 257f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 259f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 260f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 261f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 263f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 264f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount = 0; 265f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 266af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = -1; 267af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 268af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 269af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 270af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 271af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 272af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 273af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 274af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 275af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 276af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 277af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpCount = curFrame.mdpCount; 278af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cacheCount = curFrame.fbCount; 279af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 280af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = curFrame.fbZ; 281c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 282c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 2831b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 28441269096daf2363b16dcd89627dd674529a26601Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2900ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2910ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 292f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 2940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 29541269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t crop = layer->sourceCrop; 29641269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 29741269096daf2363b16dcd89627dd674529a26601Saurabh Shah 29841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 29941269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 30041269096daf2363b16dcd89627dd674529a26601Saurabh Shah qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 30141269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 3020ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 3060ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 3090ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 312f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 3131b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3141b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3151b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3170ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3180ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah const uint32_t downscale = 32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 32141269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(ctx->mMDP.version >= qdutils::MDSS_V5) { 32241269096daf2363b16dcd89627dd674529a26601Saurabh Shah /* Workaround for downscales larger than 4x. 32341269096daf2363b16dcd89627dd674529a26601Saurabh Shah * Will be removed once decimator block is enabled for MDSS 32441269096daf2363b16dcd89627dd674529a26601Saurabh Shah */ 32541269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 32641269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 32741269096daf2363b16dcd89627dd674529a26601Saurabh Shah h_dscale > downscale) 32841269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 32941269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { 33041269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > 64 || h_dscale > 64) 33141269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 33241269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 33341269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { //A-family 33441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > downscale || h_dscale > downscale) 33541269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 33641269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 33741269096daf2363b16dcd89627dd674529a26601Saurabh Shah 3380ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3390ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3400ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 341c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) { 342c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 343c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 344c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 345c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy); 348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 351f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 352f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 357c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 360f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 361f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 362f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy); 364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 366f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 367c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 368c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 369c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 370c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 372af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 373e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 374f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 377af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 37856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } else if(qdutils::MDPVersion::getInstance().is8x26() && 37956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mVideoTransFlag && 38056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ctx->mExtDisplay->isExternalConnected()) { 38156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah //1 Padding round to shift pipes across mixers 38256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. video transition padding round", 38356d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah __FUNCTION__); 38456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ret = false; 385af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->mExtDispConfiguring) { 386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 388af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 389af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 390586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 391586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 393586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 394af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 401f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 402af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 403f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 40433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(sIdleFallBack) { 40533b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 40633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 40733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 40833b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 410f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 412c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 413c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 414c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 415f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 416af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 417af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 418af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 419c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 420c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 421c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 422ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 423ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 424ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 425ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah return false; 426ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah } 427ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah 428c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 430c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 433c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 434f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 43541269096daf2363b16dcd89627dd674529a26601Saurabh Shah if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) { 436c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 437c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 438c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 439c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 44041269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx,layer)) { 44141269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 44241269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 443c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 444c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 4452902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula 4462902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula //For 8x26 with panel width>1k, if RGB layer needs HFLIP fail mdp comp 4472902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula // may not need it if Gfx pre-rotation can handle all flips & rotations 4482902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula if(qdutils::MDPVersion::getInstance().is8x26() && 4492902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (ctx->dpyAttr[mDpy].xres > 1024) && 4502902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (layer->transform & HWC_TRANSFORM_FLIP_H) && 4512902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula (!isYuvBuffer(hnd))) 4522902acdce6ec5278db2d207dc467acb122423d6cPrabhanjan Kandula return false; 453c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 459e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } else if(partialMDPComp(ctx, list)) { 460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 493e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 494e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran if(!sEnableMixedMode) { 495e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran //Mixed mode is disabled. No need to even try caching. 496e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran return false; 497e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran } 498e5a8bbcdfedda1658779baa80bc8f067505097caJeykumar Sankaran 499af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah batchLayers(); //sets up fbZ also 504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 511af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 512af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 513af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 514af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 515af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 516af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 517af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 518af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 519af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 520af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 521af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 522af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 523af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 524af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_display_contents_1_t* list){ 525af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 526af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 527af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 52841269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 529af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 530af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 531af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 532af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 533af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 534af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 53541269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 53641269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 53741269096daf2363b16dcd89627dd674529a26601Saurabh Shah 538af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 539af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 540af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 542af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 543af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 544af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 545af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 546af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 547af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 548af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 551c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 552c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 553c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 556e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating; 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 558e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah if(isSkipLayer(layer) && !extAnimBlockFeature) { 559e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 561c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 562c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 56841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 56941269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 57041269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 57141269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 572c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 57341269096daf2363b16dcd89627dd674529a26601Saurabh Shah 574c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 575c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 576c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 586af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 587af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 589af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 590af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 591af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 592af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return; 593af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 620af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 621af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 62611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 636f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 641c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 642af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 644af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 645af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 648c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 651c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 652c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAvailable = ov.availablePipes(mDpy); 654f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve DMA for rotator 65611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE) 657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= numDMAPipes; 658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve pipe(s)for FB 660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount) 661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= pipesForFB(); 662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return numAvailable; 664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 667c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 669a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 670a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 671a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 672a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 673a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 674a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 675a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 676a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 677a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 685f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 687c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 691f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 692c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 693f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 699f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 700f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 702f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 703f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 710f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 711f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 721f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(fbBatch == false) { 723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 724af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 727f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 728af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 740af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 741af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 742af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 743af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 744af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 745af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 746af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 747af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 748af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 749af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 750af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 751af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 752af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 753af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 754af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 755f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 759b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 76089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula { //LOCK SCOPE BEGIN 76189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula Locker::Autolock _l(mMdpCompLock); 76252e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula 76389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //reset old data 764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 76689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 76789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //do not cache the information for next draw cycle. 76889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(numLayers > MAX_NUM_APP_LAYERS) { 76989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCachedFrame.updateCounts(mCurrentFrame); 77089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ", 77189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula __FUNCTION__); 772699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 77389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 77489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 77589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //Hard conditions, if not met, cannot do MDP comp 77689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(!isFrameDoable(ctx)) { 77789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 77889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula __FUNCTION__); 779699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 780699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 781af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 782af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 78389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //Check whether layers marked for MDP Composition is actually doable. 78489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(isFullFrameDoable(ctx, list)){ 78589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCurrentFrame.map(); 786699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah //Configure framebuffer first if applicable 787699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 788699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, 789699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah mCurrentFrame.fbZ)) { 790699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah ALOGE("%s configure framebuffer failed", __func__); 791699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 792699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 793699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 794699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 79589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //Acquire and Program MDP pipes 79689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(!programMDP(ctx, list)) { 797699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 798699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 79989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } else { //Success 80089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //Any change in composition types needs an FB refresh 80189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCurrentFrame.needsRedraw = false; 80289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(mCurrentFrame.fbCount && 80389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 80489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 80589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 80689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula (!mCurrentFrame.mdpCount) || 80789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula (list->flags & HWC_GEOMETRY_CHANGED) || 80889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula isSkipPresent(ctx, mDpy) || 80989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula (mDpy > HWC_DISPLAY_PRIMARY))) { 81089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCurrentFrame.needsRedraw = true; 81189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 81289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 81389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } else if(isOnlyVideoDoable(ctx, list)) { 81489235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //All layers marked for MDP comp cannot be bypassed. 81589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //Try to compose atleast YUV layers through MDP comp and let 81689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //all the RGB layers compose in FB 81789235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //Destination over 81889235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCurrentFrame.fbZ = -1; 81989235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(mCurrentFrame.fbCount) 82089235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCurrentFrame.fbZ = mCurrentFrame.mdpCount; 82189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula 82289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCurrentFrame.map(); 823699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah 824699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah //Configure framebuffer first if applicable 825699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(mCurrentFrame.fbZ >= 0) { 826699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah if(!ctx->mFBUpdate[mDpy]->prepare(ctx, list, mCurrentFrame.fbZ)) { 827699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah ALOGE("%s configure framebuffer failed", __func__); 828699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 829699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 830699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 831699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah } 83289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula if(!programYUV(ctx, list)) { 833699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 834699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 83589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } 83689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } else { 837699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah reset(numLayers, list); 838699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return -1; 839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 84189235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula //UpdateLayerFlags 84289235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula setMDPCompLayerFlags(ctx, list); 84389235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula mCachedFrame.updateCounts(mCurrentFrame); 844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 84589235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula } //LOCK SCOPE END. dump also need this lock. 84689235b6c563e68046aed07d86746d747f48eca67Prabhanjan Kandula // unlock it before calling dump function to avoid deadlock 847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 848af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 852c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 854699929775d0f2612670fe7f07ceda438c7f7d502Saurabh Shah return 0; 855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 859c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 860c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 861c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 862c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 864327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 865f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 866327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 867327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 868327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 869327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 870327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 871f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 872f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 873f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 875f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 876c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 877c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 878c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 879f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.mdpCount; 881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 88216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 883c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 88420242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 88520242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 886c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 887f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 88820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 891f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 892f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 894327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 896f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 897f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 89820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 89920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 9001ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 90111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 90211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 903f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 904f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 905f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 906f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 907c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 90820242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 90920242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 911c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 912c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 913c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 914c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 915c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 916c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 917c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 918f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 920c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 92133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 92233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 923c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 924c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 925c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 927c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 928ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 929ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 930ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 931ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 932ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 93352e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula Locker::Autolock _l(mMdpCompLock); 93452e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula 935c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 93633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 937c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 9380ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 939c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 941c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 944c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 947c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 948327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 949327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 950327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 951327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 952c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 9530ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 956c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 958c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 959c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 960c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 9610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 962c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 963c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 964327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 965327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 966327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 967c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 968327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 969f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 972327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 973327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 974f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 975327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 976327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 978327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 979327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 980327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 981327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 982327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 983ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGE("%s: queueBuffer failed for display:%d ", __FUNCTION__, mDpy); 984327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 985c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 986c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 988c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 989c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 990c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 991c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 992c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 9952e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah hwc_display_contents_1_t* list) { 996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 9972e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 9982e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah //Default even split for all displays with high res 9992e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah int lSplit = xres / 2; 10002e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(mDpy == HWC_DISPLAY_PRIMARY && 10012e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah qdutils::MDPVersion::getInstance().getLeftSplit()) { 10022e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah //Override if split published by driver for primary 10032e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah lSplit = qdutils::MDPVersion::getInstance().getLeftSplit(); 10042e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah } 1005f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1006f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 1007f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 1008f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 1009f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 10102e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(dst.left > lSplit) { 1011f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 10122e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah } else if(dst.right <= lSplit) { 1013f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 1014f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 1015f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded += 2; 1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1017f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1018c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1019c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 1020c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1021c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1022c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 10232e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah MdpPipeInfoHighRes& pipe_info, 10242e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ePipeType type) { 10252e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah const int xres = ctx->dpyAttr[mDpy].xres; 10262e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah //Default even split for all displays with high res 10272e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah int lSplit = xres / 2; 10282e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(mDpy == HWC_DISPLAY_PRIMARY && 10292e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah qdutils::MDPVersion::getInstance().getLeftSplit()) { 10302e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah //Override if split published by driver for primary 10312e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah lSplit = qdutils::MDPVersion::getInstance().getLeftSplit(); 10322e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah } 1033f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 10352e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(dst.left > lSplit) { 1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = ovutils::OV_INVALID; 1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 1038f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID) 1039f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 10402e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah } else if (dst.right <= lSplit) { 1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = ovutils::OV_INVALID; 1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1045f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 1046f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 1047f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 1048f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID || 1049f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex == ovutils::OV_INVALID) 1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 1051f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 1052f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 1053c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 1054c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1055c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 105620242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 105720242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 105820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 105920242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 1060c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 10615a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 10625a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 10631bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 10641bccd080a21bd76d606bef74b3ccac888f01f3d0Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 1065c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 10663393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1067c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1069c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 107020242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 107120242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 10721ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 107311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 107420242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 1075c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 107620242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 1077c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1078c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 107920242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 108020242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 108116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 108216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1083c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1084c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1085c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1086c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1087c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1088c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1089c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 10902e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah PipeLayerPair& PipeLayerPair) { 1091327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 1093327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1094327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1096327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1097327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1098f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1099f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1100f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1101f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1102f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1103f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1106c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 110916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 111016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1112c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1113c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1114c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 111516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1116c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1117c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1118ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula if(ctx->listStats[mDpy].numAppLayers > MAX_NUM_APP_LAYERS) { 1119ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula ALOGD_IF(isDebug(),"%s: Exceeding max layer count", __FUNCTION__); 1120ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula return true; 1121ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula } 1122ac6a693721e84a8a8eebc50df0c1dcfce1e8e864Prabhanjan Kandula 112352e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula Locker::Autolock _l(mMdpCompLock); 112452e9b66d4cbf560e803720c6111fded83bb2a1f4Prabhanjan Kandula 112516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 112633b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 112716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 112816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 112916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1130f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1132f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1133f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1135f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1136f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1137660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1138327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1139327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1140327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1141327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1142327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 114416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1146c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1148f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1150c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 1151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1152f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1153327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1154c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1155c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1157327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1158327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1159327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1160327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1161327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1162327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1163327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1164327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1165c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1166c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1167c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1168c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1169327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1170f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1171327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1172327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1173327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1175c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1177c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1178c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1179c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1180327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1181f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1182327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1183327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1184327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1187327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 118816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1189c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1190327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 119116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1193c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1194c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1195