hwc_mdpcomp.cpp revision 1b9b395878eee6052ce3c382c4a3067b5adb13c4
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 19c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h" 2016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h> 21bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 22591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h" 238b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h" 24327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah#include <overlayRotator.h> 25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shahusing namespace overlay; 278fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 28327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils; 2916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 30c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 31327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 32327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 33c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 34c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 3816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 39f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 41f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) { 42c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(width <= MAX_DISPLAY_DIM) { 43f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompLowRes(dpy); 44c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 45f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompHighRes(dpy); 46c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 47c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 49f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 50f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 51c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 53f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\""); 55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount:%2d \n", mCachedFrame.layerCount, 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount, mCachedFrame.cacheCount); 58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount:%2d \n", mCurrentFrame.layerCount, 60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 76f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 77c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!setupBasePipe(ctx)) { 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 94c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 96f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 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; 225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran needsRedraw = false; 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) { 2670ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 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 2780ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t sourceCrop = layer->sourceCrop; 2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t displayFrame = layer->displayFrame; 2800ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2810ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t crop = sourceCrop; 2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 2830ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 2840ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2850ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t dst = displayFrame; 2860ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 2870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 2880ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2890ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 290f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 292f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran crop_w = crop.right - crop.left; 293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran crop_h = crop.bottom - crop.top; 2940ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 296f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 297f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 298f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 2991b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * There also is a HW limilation in MDP, minimum block size is 2x2 3001b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N * Fallback to GPU if height is less than 2. 3011b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N */ 302f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 3030ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 3040ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 3050ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 3060ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 3070ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 308c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) { 309c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 310c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 311c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 312c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 313f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 314f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy); 315f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 317f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 319f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 320f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 321f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 323f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 326f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 327f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 328f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy); 331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 334c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 335c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 336c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 337c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 340af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = true; 341f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 344af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 345af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->mExtDispConfiguring) { 346c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 348af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 349af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->listStats[mDpy].needsAlphaScale 350f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran && ctx->mMDP.version < qdutils::MDSS_V5) { 351f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 352af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 353af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(ctx->isPaddingRound) { 354586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ctx->isPaddingRound = false; 355586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah ALOGD_IF(isDebug(), "%s: padding round",__FUNCTION__); 356af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 357af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(sIdleFallBack) { 358af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah sIdleFallBack = false; 359af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__); 360af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = false; 361586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah } 362586aedccc2eaa76923bc22a3325fc2e4eff415e2Saurabh Shah 363af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 365f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 366f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 367f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 368f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 369f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 370f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 371af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 373f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 374f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 375f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 377c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 378c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 379f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 380af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 381af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, 382af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy)); 383c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 384c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 385c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 391c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 392f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 393f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran if(layer->transform & HWC_TRANSFORM_ROT_90 && !isYuvBuffer(hnd)) { 394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 395c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 396c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 397c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 3981b9b395878eee6052ce3c382c4a3067b5adb13c4Sravan Kumar D.V.N if(!isYuvBuffer(hnd) && !isValidDimension(ctx,layer)) { 399c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",__FUNCTION__); 400c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 401c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 403af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 404af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 405af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool ret = false; 406af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(fullMDPComp(ctx, list)) { 407af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 408af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if (partialMDPComp(ctx, list)) { 409af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ret = true; 410af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 411af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return ret; 412af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 413af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 414af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 415af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 416af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 417af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount = 0; 418af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 419af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 420af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 421af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 422af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 423af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 424af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 425af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 426af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 427af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 428af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 429af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 430af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 431af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 432af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 433af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 434af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 435af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 436af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 437af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 438af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 439af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 440af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah{ 441af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 442af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Setup mCurrentFrame 443af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 444af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateLayerCache(ctx, list); 445af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 446af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah batchLayers(); //sets up fbZ also 447af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 448af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 449af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 450af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 451af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 452af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 453af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 454af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 455af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 456af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 457af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 458af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 459af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 460af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 461af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 462af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 463af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 464af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 465af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 466af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 467af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_display_contents_1_t* list){ 468af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 469af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numAppLayers); 470af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah updateYUV(ctx, list); 471af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount; 472af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 473af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 474af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 475af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 476af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 477af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 478af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 479af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 480af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 481af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 482af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 483af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 484af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int availPipes = getAvailablePipes(ctx); 485af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(numPipesNeeded > availPipes) { 486af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 487af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 488af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 489af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 490af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 491c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 492c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 493c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 494f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 495f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 496f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 497f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipLayer(layer)) { 498f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__); 499f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 500c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 501c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 502f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 503f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 504f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 505f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 506f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 5078fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if(!qdutils::MDPVersion::getInstance().supportsDecimation()) { 5088fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah const uint32_t downscale = 5098fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah qdutils::MDPVersion::getInstance().getMaxMDPDownscale(); 510f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t crop = layer->sourceCrop; 511f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 512f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int cWidth = crop.right - crop.left; 513f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int cHeight = crop.bottom - crop.top; 514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int dWidth = dst.right - dst.left; 515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int dHeight = dst.bottom - dst.top; 516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 517b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar if(layer->transform & HAL_TRANSFORM_ROT_90) { 518b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar swap(cWidth, cHeight); 519b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar } 520b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar 5218fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah if(cWidth > MAX_DISPLAY_DIM || (cWidth/dWidth) > downscale || 5228fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah (cHeight/dHeight) > downscale) 523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 524c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 525c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 526c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 527c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 530f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 534f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 537af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.fbCount) { 538af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 540af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 541af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.mdpCount) { 542af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = 0; 543af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return; 544af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 551f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 552f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 553f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 556af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 571af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 572af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 57711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 589af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 592c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 593af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 595af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 596af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 599c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 602c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 603c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAvailable = ov.availablePipes(mDpy); 605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve DMA for rotator 60711154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(Overlay::getDMAMode() == Overlay::DMA_BLOCK_MODE) 608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= numDMAPipes; 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve pipe(s)for FB 611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount) 612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= pipesForFB(); 613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return numAvailable; 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 618c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 629c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 634c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 636af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 637af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 638af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbCount; 639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 643af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 646af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 648f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 649af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah bool fbBatch = false; 650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 651af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah index++) { 652f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 653f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 654f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 656f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 658f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 660f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 662af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 664af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(fbBatch == false) { 665af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mdpNextZOrder++; 666af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah fbBatch = true; 667af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 670af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 671af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah} 672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 673af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 674af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!allocLayerPipes(ctx, list)) { 675af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 676af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 677af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 678af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 679af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIdx = 0; 680af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 681af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 682af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 683af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 684af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah MdpPipeInfo* cur_pipe = 685af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 686af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah cur_pipe->zOrder = mdpIdx++; 687af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 688af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(configure(ctx, layer, 689af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 690af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 691af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah layer %d",__FUNCTION__, index); 692af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return false; 693af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 694af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 695af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 696af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah return true; 697f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 699f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 700f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 701f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //reset old data 702af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 703af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 705af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Hard conditions, if not met, cannot do MDP comp 706f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFrameDoable(ctx)) { 707f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 709af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 710af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 711af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 715f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Check whether layers marked for MDP Composition is actually doable. 716af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(isFullFrameDoable(ctx, list)){ 717af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mCurrentFrame.mdpCount) { 718af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.map(); 719af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Acquire and Program MDP pipes 720af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!programMDP(ctx, list)) { 721af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 722af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 723af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 724af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 725af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else if(isOnlyVideoDoable(ctx, list)) { 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //All layers marked for MDP comp cannot be bypassed. 727f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Try to compose atleast YUV layers through MDP comp and let 728f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //all the RGB layers compose in FB 729af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah //Destination over 730af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = -1; 731af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(mCurrentFrame.fbCount) 732af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount; 733af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah 734af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.map(); 735af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah if(!programYUV(ctx, list)) { 736af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 737af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 738f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 739af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } else { 740af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCurrentFrame.reset(numLayers); 741af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.cacheAll(list); 742f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 743f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 744f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Any change in composition types needs an FB refresh*/ 745f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount && 746af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 747af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 748af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 749af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah (!mCurrentFrame.mdpCount) || 750af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 751af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah isSkipPresent(ctx, mDpy) || 752af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah (mDpy > HWC_DISPLAY_PRIMARY))) { 753f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.needsRedraw = true; 754c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 755c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //UpdateLayerFlags 757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran setMDPCompLayerFlags(ctx, list); 758af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 759f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 760f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 761af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 762f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 763f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 764f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 765c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 766c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.fbZ; 768c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 769c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 770c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 771c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 772c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 773c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 774c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 775c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 776f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 777327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 778f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 779327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 780327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 781327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 782327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 783327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 784f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 787f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 788f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 789c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 790c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 791c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 792f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 793f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.mdpCount; 794c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 79516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 796c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 797f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 798f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isYuvPresent(ctx, mDpy)) { 799f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 800c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 801f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < nYuvCount ; index ++) { 802f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 803c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 804f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) 805f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran continue; 806413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar 807c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 808f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex]; 810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 812c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 813327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 814c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 816c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG); 817c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 818c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos", 819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 820c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 821c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 822c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 82316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 82416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) { 826f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 827c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 828c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 8290114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed 830c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(isYuvBuffer(hnd)) 831c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran continue; 832c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 835f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 836c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 837327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 838c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 839c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 840f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 841f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 84211154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(!qhwc::needsScaling(layer) 84311154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 84411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 845f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 846f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 847f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 848f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 849c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 850c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 851c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 852c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 853c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 854c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 856c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 858c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 859f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 860c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 861c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 86233650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 86333650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 864c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 866c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 867c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 868c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 870f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 8720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 873c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 875c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 876f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 877f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 878c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 879f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 880f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 881c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 882327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 883327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 884327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 885327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 886c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 8870ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 888f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 889f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 891f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 8950ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 897c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 898327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 899327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 900327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 901c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 902327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 903f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 904f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 905c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 906327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 907327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 908f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 909327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 910327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 911c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 912327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 913327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 915327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 917327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 918327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 919c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 920c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 921c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 922c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 925c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 926c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 927c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 928c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 929f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 930c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 932f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 933f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 934f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 935f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 936f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 937f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 939f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(dst.right <= hw_w/2) { 940f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 941f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded += 2; 943f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 944f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 945c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 946c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 947c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 948c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 949c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 950f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info, 951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ePipeType type) { 952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 953f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 954f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 955f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 956f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = ovutils::OV_INVALID; 957f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 958f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID) 959f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if (dst.right <= hw_w/2) { 961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = ovutils::OV_INVALID; 962f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 963f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 965f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 966f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID || 969f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex == ovutils::OV_INVALID) 970f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 971f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 972f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 973c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 974c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 975c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 976f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 97716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 978f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int layer_count = ctx->listStats[mDpy].numAppLayers; 979c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 980f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isYuvPresent(ctx, mDpy)) { 981f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 9825a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran 9835a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran for(int index = 0; index < nYuvCount; index ++) { 984f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 9855a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 986f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex]; 987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 9883393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 989c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) { 991c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos", 992f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //TODO: windback pipebook data on fail 9945a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran return false; 9955a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran } 9965a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran pipe_info.zOrder = nYuvIndex; 997c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 998c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 999c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 100016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 10015a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 10025a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 10035a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran 10045a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran if(isYuvBuffer(hnd)) 100516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed continue; 1006c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1007f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[index]; 1008c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 10093393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 1010c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 1011c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1012c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 1013c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 101411154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah if(!qhwc::needsScaling(layer) 101511154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && Overlay::getDMAMode() != Overlay::DMA_BLOCK_MODE 101611154eed0599cd2e03bd0706341e14e05265b907Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) 1017c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 1018c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1019c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 102016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 1021c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //TODO: windback pipebook data on fail 102216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 102316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 102416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = index; 1025c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1026c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 1027c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1028c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 1029c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 1030c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 1031c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 1032f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 1033327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 1034f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 1035327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 1036327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 1037327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 1038327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 1039327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 1040f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1041f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 1042f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 1043f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1044f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 1045f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 1046c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1047c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1048c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 1049c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1050f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 105116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 105216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1053c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 1054c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1055c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 1056c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 105716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 1058c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1059c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 106016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 1061f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 106216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 106316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 106416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 1065f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 1066c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1067f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 1068f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 1069c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 1070f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 1071f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1072660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 1073327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 1074327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 1075327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 1076327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1077327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1078c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 107916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 1080c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 1081c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1082c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1083f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 1084f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1085c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 1086f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 1087f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 1088327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1089c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 1090c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 1091f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 1092327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 1093327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 1094327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 1095327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 1096327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 1097327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 1098327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 1099327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 1100c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 1101c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 1102c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 1103c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 1104327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 1106327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 1107327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 1108327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1109c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1110c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 1111c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1112c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 1113c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 1114c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 1115327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 1116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 1117327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 1118327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1119327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1122327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 112316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1125327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 112616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1130