hwc_mdpcomp.cpp revision b68089410e6856f272c70cc9dbe652e336c82006
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" 25327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 288fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 29327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils; 3016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 33327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 34c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 35c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 3916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 40f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 42f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) { 43c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(width <= MAX_DISPLAY_DIM) { 44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompLowRes(dpy); 45c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 46f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompHighRes(dpy); 47c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 50f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 51f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 53c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\""); 56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount:%2d \n", mCachedFrame.layerCount, 58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount, mCachedFrame.cacheCount); 59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount:%2d \n", mCurrentFrame.layerCount, 61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 77f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 91f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 92f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 946387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou if(!setupBasePipe(ctx)) { 956387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 966387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou return false; 976387d878d0412c6f677d4eff28485d26f79b6facXiaoming Zhou } 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = false; 101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 105c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 10711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, "-1") > 0) { 10811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah int val = atoi(property); 10911154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(val >= 0) 11011154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah sMaxPipesPerMixer = min(val, MAX_PIPES_PER_MIXER); 111f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 112f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah unsigned long idle_timeout = DEFAULT_IDLE_TIME; 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idle_timeout = atoi(property); 117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //create Idle Invalidator 120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator = IdleInvalidator::getInstance(); 121c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(idleInvalidator == NULL) { 123f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__); 124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else { 125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator->init(timeout_handler, ctx, idle_timeout); 126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 138359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 144359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 146c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 147c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 148f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 153f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[index] = NULL; 158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 159f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.needsRedraw) 160f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 161c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 162c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 16416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 165c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/* 166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0. 167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl. 168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */ 169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_stride = ctx->dpyAttr[dpy].stride; 172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_width = ctx->dpyAttr[dpy].xres; 173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_height = ctx->dpyAttr[dpy].yres; 174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_fd = ctx->dpyAttr[dpy].fd; 175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_overlay ovInfo; 177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah msmfb_overlay_data ovData; 178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovInfo, 0, sizeof(mdp_overlay)); 179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovData, 0, sizeof(msmfb_overlay_data)); 180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.format = MDP_RGB_BORDERFILL; 182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.width = fb_width; 183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.height = fb_height; 184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.w = fb_width; 185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.h = fb_height; 186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.w = fb_width; 187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.h = fb_height; 188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.id = MSMFB_NEW_REQUEST; 189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 192f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovData.id = ovInfo.id; 197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 199f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 204f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 205af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah reset(0); 206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 208af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 209af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0 ; i < MAX_PIPES_PER_MIXER && numLayers; i++ ) { 210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 215c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 216c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 218f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 219f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 220af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 222af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = numLayers; 223af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbCount = numLayers; 224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 225ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah needsRedraw = true; 226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 229af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::FrameInfo::map() { 230af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah // populate layer and MDP maps 231af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 232af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 233af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isFBComposed[idx]) { 234af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 235af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerToMDP[idx] = mdpIdx++; 236af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 237af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 238af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 239af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 240f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 241f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 242f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 243f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 244f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 245af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 246f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 247f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount = 0; 248f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 249af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = -1; 250af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 251af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 252af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 253af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 254af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 255af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hnd[i] = list->hwLayers[i].handle; 256af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 257af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 258af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 259af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 260af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpCount = curFrame.mdpCount; 261af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cacheCount = curFrame.fbCount; 262af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layerCount = curFrame.layerCount; 263af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbZ = curFrame.fbZ; 264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 265c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 2661b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.Nbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 26741269096daf2363b16dcd89627dd674529a26601Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 2680ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 2690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2700ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 2710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 2720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2730ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2740ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 27841269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t crop = layer->sourceCrop; 27941269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t dst = layer->displayFrame; 28041269096daf2363b16dcd89627dd674529a26601Saurabh Shah 28141269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 28241269096daf2363b16dcd89627dd674529a26601Saurabh Shah hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 28341269096daf2363b16dcd89627dd674529a26601Saurabh Shah qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 28441269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 29041269096daf2363b16dcd89627dd674529a26601Saurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 29141269096daf2363b16dcd89627dd674529a26601Saurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 2920ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 294f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 2961b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 2971b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 2981b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 299f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3000ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3010ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 30241269096daf2363b16dcd89627dd674529a26601Saurabh Shah const uint32_t downscale = 30341269096daf2363b16dcd89627dd674529a26601Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 30441269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(ctx->mMDP.version >= qdutils::MDSS_V5) { 30541269096daf2363b16dcd89627dd674529a26601Saurabh Shah /* Workaround for downscales larger than 4x. 30641269096daf2363b16dcd89627dd674529a26601Saurabh Shah * Will be removed once decimator block is enabled for MDSS 30741269096daf2363b16dcd89627dd674529a26601Saurabh Shah */ 30841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 30941269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(crop_w > MAX_DISPLAY_DIM || w_dscale > downscale || 31041269096daf2363b16dcd89627dd674529a26601Saurabh Shah h_dscale > downscale) 31141269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 31241269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { 31341269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > 64 || h_dscale > 64) 31441269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 31541269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 31641269096daf2363b16dcd89627dd674529a26601Saurabh Shah } else { //A-family 31741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(w_dscale > downscale || h_dscale > downscale) 31841269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 31941269096daf2363b16dcd89627dd674529a26601Saurabh Shah } 32041269096daf2363b16dcd89627dd674529a26601Saurabh Shah 3210ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3220ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3230ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) { 325c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 326c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 327c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 328c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy); 331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 340c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 341f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy); 347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 352c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 353c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 355f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 356af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 357f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 360af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 361af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->mExtDispConfiguring) { 362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 364af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 365af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 366586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 367586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 368af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 369586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 370af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 371f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 378af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 38033b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(sIdleFallBack) { 38133b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 38233b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah return false; 38333b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah } 38433b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 387f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 391f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 393af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 394af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 396c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 397c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 398ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 399ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 400ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 401ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah return false; 402ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah } 403ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah 404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 408c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 409c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 410f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 41141269096daf2363b16dcd89627dd674529a26601Saurabh Shah if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) { 412c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 413c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 414c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 415c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 41641269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx,layer)) { 41741269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 41841269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 419c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 420c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 421c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 422af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 423af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 427af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if (partialMDPComp(ctx, list)) { 428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 429af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 431af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 433af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 434af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 441af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah batchLayers(); //sets up fbZ also 466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_display_contents_1_t* list){ 487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 49041269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 494af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 496af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 49741269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 49841269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 49941269096daf2363b16dcd89627dd674529a26601Saurabh Shah 500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 511af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 512af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 513c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 514c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 515c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 518e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah bool extAnimBlockFeature = mDpy && ctx->listStats[mDpy].isDisplayAnimating; 519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 520e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah if(isSkipLayer(layer) && !extAnimBlockFeature) { 521e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGD_IF(isDebug(), "%s: Video marked SKIP dpy %d", __FUNCTION__, mDpy); 522f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 524c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 527f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 53041269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 53141269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 53241269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 53341269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 53541269096daf2363b16dcd89627dd674529a26601Saurabh Shah 536c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 537c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 538c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 548af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 554af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return; 555af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 567af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 582af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 583af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 58811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 600af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 603c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 606af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 607af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 610c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 613c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 614c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAvailable = ov.availablePipes(mDpy); 616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve DMA for rotator 61811154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE) 619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= numDMAPipes; 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve pipe(s)for FB 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount) 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= pipesForFB(); 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return numAvailable; 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 629c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 631a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 632a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 633a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 634a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 635a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 636a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 637a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 638a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 639a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 648f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 651f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 654c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 657af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 658af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 663af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 666af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 669af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 671af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 684af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(fbBatch == false) { 685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 686af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 687af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 690af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 697af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 698af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 699af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 702af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 703af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 705af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 706af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 708af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 710af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 711af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 712af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 713af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 714af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 715af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 720f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 722b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan 723b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 724b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan //do not cache the information for next draw cycle. 725b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan if(numLayers > MAX_NUM_APP_LAYERS) { 726b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ", 727b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan __FUNCTION__); 728b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan return 0; 729b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan } 730b68089410e6856f272c70cc9dbe652e336c82006Ramkumar Radhakrishnan //reset old data 731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 732f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Hard conditions, if not met, cannot do MDP comp 734f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFrameDoable(ctx)) { 735f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 736f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 738af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 740f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Check whether layers marked for MDP Composition is actually doable. 744af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(isFullFrameDoable(ctx, list)){ 745ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.map(); 746ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah //Acquire and Program MDP pipes 747ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah if(!programMDP(ctx, list)) { 748ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.reset(numLayers); 749ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCachedFrame.cacheAll(list); 750ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah } else { //Success 751ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah //Any change in composition types needs an FB refresh 752ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.needsRedraw = false; 753ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah if(mCurrentFrame.fbCount && 754ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 755ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 756ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 757ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (!mCurrentFrame.mdpCount) || 758ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 759ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah isSkipPresent(ctx, mDpy) || 760ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (mDpy > HWC_DISPLAY_PRIMARY))) { 761ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.needsRedraw = true; 762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 763af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(isOnlyVideoDoable(ctx, list)) { 765f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //All layers marked for MDP comp cannot be bypassed. 766f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Try to compose atleast YUV layers through MDP comp and let 767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //all the RGB layers compose in FB 768af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Destination over 769af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 770af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mCurrentFrame.fbCount) 771af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount; 772af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 773af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.map(); 774af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!programYUV(ctx, list)) { 775af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 776af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 777f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 778af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else { 779af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 780af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 783f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //UpdateLayerFlags 784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran setMDPCompLayerFlags(ctx, list); 785af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 787f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 788af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 789f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 790f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 791f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 792c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 793c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 794f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.fbZ; 795c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 796c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 797c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 798c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 799c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 800c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 801c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 802c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 803f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 804327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 805f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 806327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 807327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 808327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 809327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 810327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 816c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 817c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 818c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.mdpCount; 821c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 82216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 823c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 82420242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 82520242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 826c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 827f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 82820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 829c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 830c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 831f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 833c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 834327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 835c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 836f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 837f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 83820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 83920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 8401ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 84111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 84211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 843f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 844f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 845f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 846f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 847c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 84820242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 84920242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 850c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 851c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 852c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 854c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 855c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 858f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 859c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 860c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 86133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 86233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 863c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 865c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 866c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 867c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 868c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 86933b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 870c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 8710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 872c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 873f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 874c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 875f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 876f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 877c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 878f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 879f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 880c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 881327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 882327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 883327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 884327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 885c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 8860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 887f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 888f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 890f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 891c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 8940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 897327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 898327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 899327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 900c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 901327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 902f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 903f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 904c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 907f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 908327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 909327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 911327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 912327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 913327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 915327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 917327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 918c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 920c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 921c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 922c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 925c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 926c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 927c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 928f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 929c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 930f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 932f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 933f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 934f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 935f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 936f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(dst.right <= hw_w/2) { 939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 941f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded += 2; 942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 944c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 945c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 946c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 947c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 948c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info, 950f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ePipeType type) { 951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 953f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = ovutils::OV_INVALID; 956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID) 958f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 959f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if (dst.right <= hw_w/2) { 960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = ovutils::OV_INVALID; 961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 962f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 963f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 965f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 966f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID || 968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex == ovutils::OV_INVALID) 969f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 971f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 972c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 974c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 97520242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 97620242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 97720242a75d65c410071434d639266311376a5b7f6Saurabh Shah 97820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 979c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 9805a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 9815a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 982f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[index]; 983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 9843393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 985c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 986c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 98820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 98920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 9901ca0f09fec9ca2d43c5f88348fb16306b6d02411Saurabh Shah } else if(!qhwc::needsScaling(ctx, layer, mDpy) 99111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 99220242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 99420242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 99720242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 99820242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 99916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 100016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 1001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1002c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1003c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1004c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1005c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1006c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1007c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1008f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1009327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 1010f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 1011327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1012327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1013327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1014327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1015327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1017f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1018f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1019f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1020f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1021f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1022c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1023c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1024c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1025c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1026f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 102716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 102816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1029c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1030c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1031c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1032c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 103316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1034c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1035c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 103616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 103733b155572be4b98d60a51d534247a4fb6f5ffad1Saurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 103816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 103916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 104016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1042c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1045c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1046f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1047f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1048660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1049327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1050327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1051327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1052327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1053327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1054c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 105516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1056c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1057c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1058c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1059f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1060f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1061c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 1062f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1063f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1065c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1066c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1068327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1069327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1070327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1071327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1072327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1075327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1076c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1077c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1078c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1080327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1081f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1082327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1083327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1084327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1085c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1086c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1087c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1088c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1089c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1090c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1091327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1092f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1093327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1094327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1096c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1097c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1098327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 109916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1100c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1101327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 110216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1103c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1106