hwc_mdpcomp.cpp revision a0e87cbc523323604e8fb7cb5526f410a1ed26df
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; 369af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(sIdleFallBack) { 370af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__); 371af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 372586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 373586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah 374af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 376f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 377f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 378f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 380f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 381f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 382af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 383f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 384f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 385f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 386f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 390f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 391af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 392af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 393af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 396c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 397ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 398ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 399ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 400ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah return false; 401ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah } 402ce145663a82a3fc845b10d48b73252053fe712ffSaurabh Shah 403c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 404c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 408c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 409f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 41041269096daf2363b16dcd89627dd674529a26601Saurabh Shah if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) { 411c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 412c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 413c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 414c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 41541269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx,layer)) { 41641269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 41741269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 418c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 419c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 420c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 422af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 423af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if (partialMDPComp(ctx, list)) { 427af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 429af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 431af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 433af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 434af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 441af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah batchLayers(); //sets up fbZ also 465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_display_contents_1_t* list){ 486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 48941269096daf2363b16dcd89627dd674529a26601Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 491af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 492af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 493af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 494af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 495af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 49641269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!mdpCount) 49741269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 49841269096daf2363b16dcd89627dd674529a26601Saurabh Shah 499af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 500af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 501af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 502af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 503af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 504af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 505af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 506af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 507af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 508af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 509af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 510af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 511af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 512c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 513c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 514c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 518a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(isSkipLayer(layer) && mDpy == HWC_DISPLAY_PRIMARY) { 519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__); 520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 521c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 522c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 523f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 524f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 527f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 52841269096daf2363b16dcd89627dd674529a26601Saurabh Shah if(!isValidDimension(ctx, layer)) { 52941269096daf2363b16dcd89627dd674529a26601Saurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 53041269096daf2363b16dcd89627dd674529a26601Saurabh Shah __FUNCTION__); 53141269096daf2363b16dcd89627dd674529a26601Saurabh Shah return false; 532c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 53341269096daf2363b16dcd89627dd674529a26601Saurabh Shah 534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 535c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 536c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 538f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 546af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 547af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 549af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 550af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 551af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 552af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return; 553af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 565af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 580af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 581af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 58611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 598af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 601c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 602af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 604af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 605af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 608c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 611c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 612c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAvailable = ov.availablePipes(mDpy); 614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve DMA for rotator 61611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE) 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= numDMAPipes; 618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve pipe(s)for FB 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount) 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= pipesForFB(); 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return numAvailable; 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 627c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 629a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!nYuvCount && mDpy) { 630a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan //Reset "No animation on external display" related parameters. 631a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.left = ctx->mPrevCropVideo.top = 632a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevCropVideo.right = ctx->mPrevCropVideo.bottom = 0; 633a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.left = ctx->mPrevDestVideo.top = 634a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevDestVideo.right = ctx->mPrevDestVideo.bottom = 0; 635a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan ctx->mPrevTransformVideo = 0; 636a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan return; 637a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 647c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 648f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 649f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 651f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 652c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 654af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 655af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 656af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 661af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 662f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 664af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 667af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 669af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 673f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 674f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 679f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 680af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(fbBatch == false) { 683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 684af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 686f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 689af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 692af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 697af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 698af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 699af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 700af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 701af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 702af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 703af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 704af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 705af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 706af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 707af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 708af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 710af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 711af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 712af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 713af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 714af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 719f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //reset old data 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 722f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Hard conditions, if not met, cannot do MDP comp 724f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFrameDoable(ctx)) { 725f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 727af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 728af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 730f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 731f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 732f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 733f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Check whether layers marked for MDP Composition is actually doable. 734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(isFullFrameDoable(ctx, list)){ 735ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.map(); 736ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah //Acquire and Program MDP pipes 737ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah if(!programMDP(ctx, list)) { 738ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.reset(numLayers); 739ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCachedFrame.cacheAll(list); 740ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah } else { //Success 741ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah //Any change in composition types needs an FB refresh 742ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.needsRedraw = false; 743ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah if(mCurrentFrame.fbCount && 744ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 745ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 746ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 747ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (!mCurrentFrame.mdpCount) || 748ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 749ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah isSkipPresent(ctx, mDpy) || 750ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah (mDpy > HWC_DISPLAY_PRIMARY))) { 751ab1a610e5f7858d4ade5795bf075295d33664999Saurabh Shah mCurrentFrame.needsRedraw = true; 752af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 753af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 754af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(isOnlyVideoDoable(ctx, list)) { 755f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //All layers marked for MDP comp cannot be bypassed. 756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Try to compose atleast YUV layers through MDP comp and let 757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //all the RGB layers compose in FB 758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Destination over 759af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 760af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mCurrentFrame.fbCount) 761af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount; 762af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 763af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.map(); 764af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!programYUV(ctx, list)) { 765af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 766af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 768af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else { 769af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 770af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 771f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 772f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 773f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //UpdateLayerFlags 774f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran setMDPCompLayerFlags(ctx, list); 775af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 776f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 777f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 778af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 779f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 780f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 782c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 783c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.fbZ; 785c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 786c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 787c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 788c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 789c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 790c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 791c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 792c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 793f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 794327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 795f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 796327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 797327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 798327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 799327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 800327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 801f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 802f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 803f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 804f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 805f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 806c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 807c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 808c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.mdpCount; 811c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 81216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 813c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 81420242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 81520242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++) { 816c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 81820242a75d65c410071434d639266311376a5b7f6Saurabh Shah 819c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 820c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 822f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 823c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 824327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 825c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 826f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 827f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 82820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 82920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 83020242a75d65c410071434d639266311376a5b7f6Saurabh Shah } else if(!qhwc::needsScaling(layer) 83111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 83211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 833f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 834f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 835f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 836f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 837c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 83820242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe type = %d", 83920242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 840c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 841c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 842c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 843c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 844c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 845c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 846c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 847c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 849c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 850c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 85133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 85233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 854c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 855c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 856c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 857c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 859f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 860c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 8610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 862c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 865f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 866f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 867c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 868f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 869f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 870c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 871327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 872327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 873327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 874327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 875c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 8760ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 877f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 878f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 879c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 882c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 883c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 8840ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 885c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 886c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 887327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 888327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 889327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 891327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 892f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 893f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 895327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 896327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 897f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 898327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 899327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 900c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 901327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 902327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 903327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 904327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 905327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 907327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 908c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 909c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 911c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 912c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 913c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 914c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 915c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 916c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 917c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 918f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 920f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 923f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 924f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 925f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 926f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 927f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 928f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(dst.right <= hw_w/2) { 929f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 930f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded += 2; 932f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 933f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 934c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 935c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 936c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 937c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 938c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info, 940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ePipeType type) { 941f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 944f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = ovutils::OV_INVALID; 946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 947f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID) 948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if (dst.right <= hw_w/2) { 950f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = ovutils::OV_INVALID; 951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 953f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID || 958f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex == ovutils::OV_INVALID) 959f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 962c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 963c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 964c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 96520242a75d65c410071434d639266311376a5b7f6Saurabh Shah hwc_display_contents_1_t* list) { 96620242a75d65c410071434d639266311376a5b7f6Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++) { 96720242a75d65c410071434d639266311376a5b7f6Saurabh Shah 96820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 969c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 9705a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 9715a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 972f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[index]; 973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 9743393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 975c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 976c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 97820242a75d65c410071434d639266311376a5b7f6Saurabh Shah if(isYuvBuffer(hnd)) { 97920242a75d65c410071434d639266311376a5b7f6Saurabh Shah type = MDPCOMP_OV_VG; 98020242a75d65c410071434d639266311376a5b7f6Saurabh Shah } else if(!qhwc::needsScaling(layer) 98111154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 98220242a75d65c410071434d639266311376a5b7f6Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 98420242a75d65c410071434d639266311376a5b7f6Saurabh Shah } 985c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 986c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 98720242a75d65c410071434d639266311376a5b7f6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to get pipe for type = %d", 98820242a75d65c410071434d639266311376a5b7f6Saurabh Shah __FUNCTION__, (int) type); 98916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 99016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 991c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 992c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 993c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 996c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 997c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 998f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 999327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 1000f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 1001327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1002327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1003327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1004327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1005327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1006f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1007f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1008f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1009f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1010f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1011f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1012c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1013c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1014c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1015c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1016f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 101716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 101816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1019c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1020c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1021c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1022c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 102316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1024c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1025c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 102616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 1027f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 102816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 102916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 103016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1031f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1032c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1033f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1035c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1036f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1037f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1038660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1039327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1040327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1041327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1042327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1043327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1044c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 104516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1047c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1048c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1049f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1051c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 1052f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1053f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1054327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1055c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1056c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1057f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1058327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1059327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1060327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1061327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1062327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1063327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1064327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1065327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1066c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1067c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1068c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1069c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1070327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1072327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1075c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1076c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1077c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1078c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1079c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1080c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1081327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1082f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1083327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1084327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1085327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1086c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1087c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1088327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 108916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1090c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1091327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 109216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1093c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1094c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1095c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1096