hwc_mdpcomp.cpp revision f9572cdbe3541d85522adea584f925671b375300
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 26327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing overlay::Rotator; 27327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahusing namespace overlay::utils; 2816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 30327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shahnamespace qhwc { 31327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 32c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 33c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 3716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 38f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 40f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp* MDPComp::getObject(const int& width, int dpy) { 41c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(width <= MAX_DISPLAY_DIM) { 42f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompLowRes(dpy); 43c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 44f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return new MDPCompHighRes(dpy); 45c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 46c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 48f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::MDPComp(int dpy):mDpy(dpy){}; 49f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 50c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 51c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 52f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"HWC Map for Dpy: %s \n", 53f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\""); 54f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 55f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount:%2d \n", mCachedFrame.layerCount, 56f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount, mCachedFrame.cacheCount); 57f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 58f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount:%2d \n", mCurrentFrame.layerCount, 59f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 60f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 61f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw? "YES" : "NO"), 62f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount, sMaxPipesPerMixer); 63f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 64f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 65f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," --------------------------------------------- \n"); 66f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 67f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 68f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index, 69f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 70f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[index], 71f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? 72f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 73f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 74f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 75f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dumpsys_log(buf,"\n"); 76c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 77c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!setupBasePipe(ctx)) { 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 91c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 92c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 93c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 94f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 95f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 96c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 97c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 98c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 99c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = false; 100c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 101c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 102c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 103c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 104c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 105f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 106f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(property_get("debug.mdpcomp.maxpermixer", property, NULL) > 0) { 107f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(atoi(property) != 0) 108f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sMaxPipesPerMixer = true; 109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 110f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah unsigned long idle_timeout = DEFAULT_IDLE_TIME; 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idle_timeout = atoi(property); 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //create Idle Invalidator 118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator = IdleInvalidator::getInstance(); 119c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 120c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(idleInvalidator == NULL) { 121f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__); 122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else { 123c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator->init(timeout_handler, ctx, idle_timeout); 124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 136359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 142359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 145c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 146f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 147f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 149f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 151f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 152f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerProp[index].mFlags |= HWC_MDPCOMP; 153f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 154f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->hints |= HWC_HINT_CLEAR_FB; 155f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[index] = NULL; 156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 157f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.needsRedraw) 158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer->compositionType = HWC_OVERLAY; 159c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 160c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 161f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.mdpCount = mCurrentFrame.mdpCount; 162f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.cacheCount = mCurrentFrame.fbCount; 163f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.layerCount = ctx->listStats[mDpy].numAppLayers; 164c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 16516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/* 167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0. 168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl. 169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */ 170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_stride = ctx->dpyAttr[dpy].stride; 173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_width = ctx->dpyAttr[dpy].xres; 174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_height = ctx->dpyAttr[dpy].yres; 175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_fd = ctx->dpyAttr[dpy].fd; 176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_overlay ovInfo; 178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah msmfb_overlay_data ovData; 179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovInfo, 0, sizeof(mdp_overlay)); 180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovData, 0, sizeof(msmfb_overlay_data)); 181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.format = MDP_RGB_BORDERFILL; 183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.width = fb_width; 184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.height = fb_height; 185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.w = fb_width; 186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.h = fb_height; 187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.w = fb_width; 188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.h = fb_height; 189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.id = MSMFB_NEW_REQUEST; 190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 192c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 193f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovData.id = ovInfo.id; 198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 200f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran strerror(errno)); 201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 205f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::FrameInfo::FrameInfo() { 206f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 207f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 208f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 209c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 210f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::FrameInfo::reset() { 211f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 212f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0 ; i < MAX_PIPES_PER_MIXER && layerCount; i++ ) { 213f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpToLayer[i].pipeInfo) { 214f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran delete mdpToLayer[i].pipeInfo; 215f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].pipeInfo = NULL; 216f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //We dont own the rotator 217f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpToLayer[i].rot = NULL; 218c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 219c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 220f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 221f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 222f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&layerToMDP, -1, sizeof(layerToMDP)); 223f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&isFBComposed, 0, sizeof(isFBComposed)); 224f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 225f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 226f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 227f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbCount = 0; 228f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran needsRedraw = false; 229f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZ = 0; 230f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 231f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 232f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranMDPComp::LayerCache::LayerCache() { 233f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran reset(); 234f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 235f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 236f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::LayerCache::reset() { 237f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&hnd, 0, sizeof(buffer_handle_t)); 238f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdpCount = 0; 239f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cacheCount = 0; 240f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layerCount = 0; 241c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 242c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 243c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPComp::isWidthValid(hwc_context_t *ctx, hwc_layer_1_t *layer) { 2440ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2450ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 2460ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2470ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(!hnd) { 2480ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran ALOGE("%s: layer handle is NULL", __FUNCTION__); 2490ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2500ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2510ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 252f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 253f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_h = ctx->dpyAttr[mDpy].yres; 2540ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2550ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t sourceCrop = layer->sourceCrop; 2560ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t displayFrame = layer->displayFrame; 2570ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2580ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t crop = sourceCrop; 2590ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_w = crop.right - crop.left; 2600ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int crop_h = crop.bottom - crop.top; 2610ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2620ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran hwc_rect_t dst = displayFrame; 2630ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_w = dst.right - dst.left; 2640ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran int dst_h = dst.bottom - dst.top; 2650ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2660ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 267f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 268f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 269f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran crop_w = crop.right - crop.left; 270f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran crop_h = crop.bottom - crop.top; 2710ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran } 2720ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 273f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for MDP HW limitation in DSI command mode panels where 274f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * FPS will not go beyond 30 if buffers on RGB pipes are of width or height 275f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * less than 5 pixels 276f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * */ 2770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 278f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((crop_w < 5)||(crop_h < 5)) 2790ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 2800ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 2810ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return true; 2820ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran} 2830ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 284c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) { 285c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 286c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 287c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 288c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran switch(type) { 289f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_DMA: 290f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy); 291f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 292f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mDMAInUse = true; 293f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 294f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 295f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_ANY: 296f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_RGB: 297f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 298f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdp_pipe != ovutils::OV_INVALID) { 299f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mdp_pipe; 300f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 301c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 302f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(type == MDPCOMP_OV_RGB) { 303f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Requested only for RGB pipe 304f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran break; 305f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 306f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran case MDPCOMP_OV_VG: 307f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy); 308f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran default: 309f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Invalid pipe type",__FUNCTION__); 310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return ovutils::OV_INVALID; 311c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran }; 312c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return ovutils::OV_INVALID; 313c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 314c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 315f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 316f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 317f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 318f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 319f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 320c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 321c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 322c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 323c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(ctx->mExtDispConfiguring) { 324c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 325f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 326c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 327c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 328c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 329f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->listStats[mDpy].needsAlphaScale 330f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran && ctx->mMDP.version < qdutils::MDSS_V5) { 331f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 332f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 333f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 334f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 335f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 336f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 337f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 338f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where all the layers marked for MDP comp cannot be 339f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * bypassed. On such conditions we try to bypass atleast YUV layers */ 340f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 341f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list){ 342f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 343f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 344f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpCount = mCurrentFrame.layerCount - mCurrentFrame.fbCount; 345f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int fbNeeded = int(mCurrentFrame.fbCount != 0); 346f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 347f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDpy > HWC_DISPLAY_PRIMARY){ 348f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 349f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 350c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 351c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 352c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 353f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mdpCount > (sMaxPipesPerMixer-fbNeeded)) { 354f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 355c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 356f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 357c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 358f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipesNeeded(ctx, list) > getAvailablePipes(ctx)) { 359f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes",__FUNCTION__); 360c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 361c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 362c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 363f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipPresent(ctx, mDpy)) { 364f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Skip layers present",__FUNCTION__); 365c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 366c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 367c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 368c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //FB composition on idle timeout 369c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(sIdleFallBack) { 370c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran sIdleFallBack = false; 371c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__); 372c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 373c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 374c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 375c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 376c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 377c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 378c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 379c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 380c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 381f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 382f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran if(layer->transform & HWC_TRANSFORM_ROT_90 && !isYuvBuffer(hnd)) { 383c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 384c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 385c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 386c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 387c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!isYuvBuffer(hnd) && !isWidthValid(ctx,layer)) { 388c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Buffer is of invalid width",__FUNCTION__); 389c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 390c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 391c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 392c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 393c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 394c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 395f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran/* Checks for conditions where YUV layers cannot be bypassed */ 396f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 397f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 398f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSkipLayer(layer)) { 399f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__); 400f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 401c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 402c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 403f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mNeedsRotator && ctx->mDMAInUse) { 404f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s: No DMA for Rotator",__FUNCTION__); 405c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 406c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 407c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 408f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isSecuring(ctx, layer)) { 409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 410f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 411f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 412f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 413f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Workaround for downscales larger than 4x. Will be removed once decimator 414f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * block is enabled for MDSS*/ 415f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mMDP.version == qdutils::MDSS_V5) { 416f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t crop = layer->sourceCrop; 417f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 418f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 419f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int cWidth = crop.right - crop.left; 420f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int cHeight = crop.bottom - crop.top; 421f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int dWidth = dst.right - dst.left; 422f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int dHeight = dst.bottom - dst.top; 423f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 424f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((cWidth/dWidth) > 4 || (cHeight/dHeight) > 4) 425c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 426c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 427c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 428c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 430f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 431f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 432f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 433f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 434f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 435f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 436f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 437f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 438f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.fbCount || 440f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.fbCount == mCurrentFrame.layerCount)) 441f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 442f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 443f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 445f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 446f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 447f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 448f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 449f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 451f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 452f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 453f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 454f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 455f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 456f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 457f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 458f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 459f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 461f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 462f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 463f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 464f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 465f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 466f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 467f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 468f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 469f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 470f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 472f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 474f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 475f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((list->flags & HWC_GEOMETRY_CHANGED) || (isSkipPresent(ctx, mDpy))) { 478f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: No Caching: \ 479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran GEOMETRY change: %d SKIP present: %d", __FUNCTION__, 480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (list->flags & HWC_GEOMETRY_CHANGED),isSkipPresent(ctx, mDpy)); 481f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.reset(); 482f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 483f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 484f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 485f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 486f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 487f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 488f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 489f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 490f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 491f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 492c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 493f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 494f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 495f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 496c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 497f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 498f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 499c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 500c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 501f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAvailable = ov.availablePipes(mDpy); 502f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 503f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve DMA for rotator 504f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mNeedsRotator) 505f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= numDMAPipes; 506f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 507f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve pipe(s)for FB 508f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount) 509f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= pipesForFB(); 510f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 511f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return numAvailable; 512f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 513f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::resetFrameForFB(hwc_context_t* ctx, 515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = mCurrentFrame.layerCount; 517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mCurrentFrame.isFBComposed, 1, 518f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.needsRedraw = true; 520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 521f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 522f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 523c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 524f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 527f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 530f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 534c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 538f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 539c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 543f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int fbZOrder = -1; 547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mDMAInUse = false; 548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 551f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran goto fn_exit; 552f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 553f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index++) { 556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran goto fn_exit; 568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(fbZOrder < 0) { 570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZOrder = mdpNextZOrder++; 571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran }; 572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return fbZOrder; 575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fn_exit: 577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Complete fallback to FB 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran resetFrameForFB(ctx, list); 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //reset old data 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.reset(); 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFrameDoable(ctx)) { 588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerCount = ctx->listStats[mDpy].numAppLayers; 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Iterate layer list for cached layers 596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran updateLayerCache(ctx, list); 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Add YUV layers to cached list 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran updateYUV(ctx, list); 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Optimze for bypass 602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran batchLayers(); 603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //list is already parsed / batched for optimal mixed mode composition. 605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Check whether layers marked for MDP Composition is actually doable. 606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFullFrameDoable(ctx, list)){ 607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //All layers marked for MDP comp cannot be bypassed. 608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Try to compose atleast YUV layers through MDP comp and let 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //all the RGB layers compose in FB 610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran resetFrameForFB(ctx, list); 611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran updateYUV(ctx, list); 612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount; 616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.mdpCount) { 618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran // populate layer and MDP maps 619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int idx = 0, mdpIdx = 0; idx < mCurrentFrame.layerCount; idx++) { 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[idx]) { 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mdpIdx].listIndex = idx; 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[idx] = mdpIdx++; 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Acquire and Program MDP pipes 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbZ = programMDP(ctx, list); 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Any change in composition types needs an FB refresh*/ 630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount && 631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran !mCurrentFrame.mdpCount)) { 634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.needsRedraw = true; 635c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 636c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //UpdateLayerFlags 638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran setMDPCompLayerFlags(ctx, list); 639f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 640f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 644c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 645c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.fbZ; 647c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 648c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 650c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 651c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 652c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 653c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 654c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 655f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 656327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 657f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 658327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 659327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 660327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 661327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 662327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 663f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 664f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 665f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 666f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 668c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 669c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 670c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 672f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.mdpCount; 673c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 67416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 675c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 677f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isYuvPresent(ctx, mDpy)) { 678f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 679c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < nYuvCount ; index ++) { 681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 682c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 683f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) 684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran continue; 685413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar 686c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex]; 689f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 690f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 691c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 692327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 693c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 695c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG); 696c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 697c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos", 698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 699c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 700c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 701c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 70216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 70316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 704f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) { 705f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 706c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 707c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 7080114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed 709c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(isYuvBuffer(hnd)) 710c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran continue; 711c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 712f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 713f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 714f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 715c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 716327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 717c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 718c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 719f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 720f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 721f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator 722f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran && ctx->mMDP.version >= qdutils::MDSS_V5) { 723f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 724f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 725f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 726f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 727c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 728c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 729c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 730c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 731c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 732c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 733c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 734c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 735c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 736c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 737f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 738c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 739c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 74033650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 74133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 742c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 743c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 744c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 745c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 746c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 747c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 748f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 749c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 7500ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 751c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 752f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 753c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 754f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 755f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 756c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 757f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 758f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 759c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 760327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 761327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 762327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 763327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 764c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 7650ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 766f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 767f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 768c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 769f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 770c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 771c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 772c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 7730ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 774c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 775c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 776327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 777327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 778327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 779c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 780327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 781f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 782f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 783c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 784327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 785327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 787327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 788327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 789c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 790327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 791327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 792327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 793327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 794327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 795327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 796327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 797c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 798c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 799c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 800c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 801c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 802c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 803c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 804c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 805c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 806c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 807f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 808c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 809f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 810f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 812f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(dst.right <= hw_w/2) { 818f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded += 2; 821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 822f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 823c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 824c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 825c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 826c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 827c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 828f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info, 829f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ePipeType type) { 830f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 831f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = ovutils::OV_INVALID; 835f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 836f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID) 837f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 838f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if (dst.right <= hw_w/2) { 839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = ovutils::OV_INVALID; 840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 841f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 842f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 843f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 845f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 846f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID || 847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex == ovutils::OV_INVALID) 848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 851c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 852c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 853c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 854f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 85516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 856f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int layer_count = ctx->listStats[mDpy].numAppLayers; 857c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 858f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isYuvPresent(ctx, mDpy)) { 859f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 8605a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran 8615a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran for(int index = 0; index < nYuvCount; index ++) { 862f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 8635a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 864f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex]; 865c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 8663393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 867c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 868c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) { 869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos", 870f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //TODO: windback pipebook data on fail 8725a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran return false; 8735a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran } 8745a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran pipe_info.zOrder = nYuvIndex; 875c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 876c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 877c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 87816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 8795a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 8805a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 8815a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran 8825a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran if(isYuvBuffer(hnd)) 88316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed continue; 884c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 885f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[index]; 886c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 8873393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 888c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 889c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 891c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 892f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator 893f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran && ctx->mMDP.version >= qdutils::MDSS_V5) 894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 896c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 89716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 898c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //TODO: windback pipebook data on fail 89916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 90016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 90116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = index; 902c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 903c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 904c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 905c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 906c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 907c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 908c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 909f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 910327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 911f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 912327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 913327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 915327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 917f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 918f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 919f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 920f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 923c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 924c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 925c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 926c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 927f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 92816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 92916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 930c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 931c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 932c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 933c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 93416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 935c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 936c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 93716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 938f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 93916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 94016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 94116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 943c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 944f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 945f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 946c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 947f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 949660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 950327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 951327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 952327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 953327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 954327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 955c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 95616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 957c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 958c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 959c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 960f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 961f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 962c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 963f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 965327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 966c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 967c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 969327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 970327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 971327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 972327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 973327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 974327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 975327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 976327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 977c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 978c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 979c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 980c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 981327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 982f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 983327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 984327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 985327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 986c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 987c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 988c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 989c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 990c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 991c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 992327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 993f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 994327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 995327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 996327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 997c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 998c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 999327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 100016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1002327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 100316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1004c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1005c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1006c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1007