hwc_mdpcomp.cpp revision b393a0202cdfde0099530add9671277aeb018e89
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 424b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar if(layer->transform & HAL_TRANSFORM_ROT_90) { 425b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar swap(cWidth, cHeight); 426b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar } 427b393a0202cdfde0099530add9671277aeb018e89Amara Venkata Mastan Manoj Kumar 428f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((cWidth/dWidth) > 4 || (cHeight/dHeight) > 4) 429c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 430c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 431c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 432c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 433c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 434f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::batchLayers() { 435f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 436f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * send rest of them through MDP. NEVER mark an updating layer for caching. 437f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran * But cached ones can be marked for MDP*/ 438f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 439f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchStart = -1; 440f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int maxBatchCount = 0; 441f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 442f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* All or Nothing is cached. No batching needed */ 443f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.fbCount || 444f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.fbCount == mCurrentFrame.layerCount)) 445f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 446f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 447f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Search for max number of contiguous (cached) layers */ 448f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int i = 0; 449f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while (i < mCurrentFrame.layerCount) { 450f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int count = 0; 451f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 452f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran count++; i++; 453f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 454f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(count > maxBatchCount) { 455f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchCount = count; 456f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran maxBatchStart = i - count; 457f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 458f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i < mCurrentFrame.layerCount) i++; 459f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 460f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 461f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* reset rest of the layers for MDP comp */ 462f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; i++) { 463f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(i != maxBatchStart){ 464f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = false; 465f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 466f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran i += maxBatchCount; 467f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 468f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 469f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 470f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = maxBatchCount; 471f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 472f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 473f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 474f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 475f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 476f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 477f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 478f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAppLayers = ctx->listStats[mDpy].numAppLayers; 479f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numCacheableLayers = 0; 480f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 481f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((list->flags & HWC_GEOMETRY_CHANGED) || (isSkipPresent(ctx, mDpy))) { 482f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: No Caching: \ 483f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran GEOMETRY change: %d SKIP present: %d", __FUNCTION__, 484f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (list->flags & HWC_GEOMETRY_CHANGED),isSkipPresent(ctx, mDpy)); 485f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.reset(); 486f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return; 487f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 488f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 489f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numAppLayers; i++) { 490f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 491f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numCacheableLayers++; 492f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[i] = true; 493f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 494f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCachedFrame.hnd[i] = list->hwLayers[i].handle; 495f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 496c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 497f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = numCacheableLayers; 498f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 499f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 500c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 501f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 502f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 503c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 504c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 505f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numAvailable = ov.availablePipes(mDpy); 506f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 507f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve DMA for rotator 508f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(ctx->mNeedsRotator) 509f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= numDMAPipes; 510f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 511f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Reserve pipe(s)for FB 512f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount) 513f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran numAvailable -= pipesForFB(); 514f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 515f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return numAvailable; 516f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 517f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 518f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::resetFrameForFB(hwc_context_t* ctx, 519f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 520f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount = mCurrentFrame.layerCount; 521f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran memset(&mCurrentFrame.isFBComposed, 1, 522f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran sizeof(mCurrentFrame.isFBComposed)); 523f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.needsRedraw = true; 524f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 525f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 526f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 527c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 528f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 529f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0;index < nYuvCount; index++){ 530f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 531f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 532f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 533f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isYUVDoable(ctx, layer)) { 534f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 535f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = true; 536f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount++; 537f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 538c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } else { 539f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) { 540f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.isFBComposed[nYuvIndex] = false; 541f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount--; 542f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 543c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 544f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 545f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 546f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount); 547f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 548f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 549f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 550f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int fbZOrder = -1; 551f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ctx->mDMAInUse = false; 552f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 553f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!allocLayerPipes(ctx, list)) { 554f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 555f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran goto fn_exit; 556f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 557f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 558f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 559f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran index++) { 560f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[index]) { 561f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 562f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 563f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 564f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 565f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 566f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran cur_pipe->zOrder = mdpNextZOrder++; 567f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 568f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 569f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 570f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran layer %d",__FUNCTION__, index); 571f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran goto fn_exit; 572f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 573f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(fbZOrder < 0) { 574f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZOrder = mdpNextZOrder++; 575f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran }; 576f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 577f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 578f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return fbZOrder; 579f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 580f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fn_exit: 581f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Complete fallback to FB 582f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran resetFrameForFB(ctx, list); 583f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 584f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 585f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 586f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 587f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 588f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //reset old data 589f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.reset(); 590f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 591f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFrameDoable(ctx)) { 592f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 593f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 594f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return 0; 595f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 596f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 597f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerCount = ctx->listStats[mDpy].numAppLayers; 598f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 599f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Iterate layer list for cached layers 600f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran updateLayerCache(ctx, list); 601f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 602f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Add YUV layers to cached list 603f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran updateYUV(ctx, list); 604f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 605f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Optimze for bypass 606f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran batchLayers(); 607f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 608f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //list is already parsed / batched for optimal mixed mode composition. 609f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Check whether layers marked for MDP Composition is actually doable. 610f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isFullFrameDoable(ctx, list)){ 611f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //All layers marked for MDP comp cannot be bypassed. 612f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Try to compose atleast YUV layers through MDP comp and let 613f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //all the RGB layers compose in FB 614f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran resetFrameForFB(ctx, list); 615f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran updateYUV(ctx, list); 616f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 617f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 618f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 619f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbCount; 620f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 621f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.mdpCount) { 622f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran // populate layer and MDP maps 623f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int idx = 0, mdpIdx = 0; idx < mCurrentFrame.layerCount; idx++) { 624f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[idx]) { 625f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.mdpToLayer[mdpIdx].listIndex = idx; 626f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.layerToMDP[idx] = mdpIdx++; 627f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 628f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 629f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //Acquire and Program MDP pipes 630f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.fbZ = programMDP(ctx, list); 631f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 632f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 633f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran /* Any change in composition types needs an FB refresh*/ 634f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.fbCount && 635f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 636f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 637f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran !mCurrentFrame.mdpCount)) { 638f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mCurrentFrame.needsRedraw = true; 639c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 640c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 641f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran //UpdateLayerFlags 642f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran setMDPCompLayerFlags(ctx, list); 643f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 644f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isDebug()) { 645f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran android::String8 sDump(""); 646f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran dump(sDump); 647f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGE("%s",sDump.string()); 648c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 649c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 650f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.fbZ; 651c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 652c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 653c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompLowRes=================================================== 654c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 655c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 656c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 657c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 658c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 659f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 660327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoLowRes& mdp_info = 661f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 662327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 663327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 664327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 665327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest dest = mdp_info.index; 666327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 667f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 668f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__, layer, zOrder, dest); 669f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 670f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 671f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran &PipeLayerPair.rot); 672c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 673c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 674c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 675f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 676f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return mCurrentFrame.mdpCount; 677c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 67816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 679c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 680f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 681f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isYuvPresent(ctx, mDpy)) { 682f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 683c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 684f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0; index < nYuvCount ; index ++) { 685f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 686c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 687f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[nYuvIndex]) 688f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran continue; 689413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar 690c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 691f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 692f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex]; 693f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 694f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 695c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 696327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 697c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 698f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 699c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG); 700c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 701c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos", 702f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 703c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 704c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 705c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 70616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 70716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 708f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) { 709f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[index]) continue; 710c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 711c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 7120114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed 713c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(isYuvBuffer(hnd)) 714c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran continue; 715c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 716f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[index]; 717f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 718f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 719c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 720327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah info.rot = NULL; 721c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 722c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 723f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 724f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 725f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator 726f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran && ctx->mMDP.version >= qdutils::MDSS_V5) { 727f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran type = MDPCOMP_OV_DMA; 728f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran } 729f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran 730f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 731c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 732c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 733c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 734c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 735c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 736c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 737c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 738c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 739c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 740c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 741f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 742c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 743c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return true; 74433650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 74533650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 746c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!ctx || !list) { 747c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 748c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 749c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 750c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 751c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran /* reset Invalidator */ 752f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 753c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran idleInvalidator->markForSleep(); 7540ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 755c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 756f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 757c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 758f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 759f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 760c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran { 761f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 762f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 763c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 764327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 765327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 766327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 767327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 768c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 7690ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran 770f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 771f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 772c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 773f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 774c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest dest = pipe_info.index; 775c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(dest == ovutils::OV_INVALID) { 776c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 7770ee9643396d2a257034a1c9b6d4eb6f6f7255e2dJeykumar Sankaran return false; 778c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 779c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 780327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 781327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah continue; 782327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 783c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 784327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 785f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, 786f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hnd, dest ); 787c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 788327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 789327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah uint32_t offset = hnd->offset; 790f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 791327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 792327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!rot->queueBuffer(fd, offset)) 793c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return false; 794327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 795327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 796327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 797327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 798327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 799327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 800327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 801c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 802c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 803c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 804c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 805c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 806c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 807c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 808c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran//=============MDPCompHighRes=================================================== 809c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 810c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 811f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 812c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran int pipesNeeded = 0; 813f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 814f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 815f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 816f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!mCurrentFrame.isFBComposed[i]) { 817f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 818f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 819f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 820f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 821f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if(dst.right <= hw_w/2) { 822f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded++; 823f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 824f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipesNeeded += 2; 825f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 826f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 827c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 828c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran return pipesNeeded; 829c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 830c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 831c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 832f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info, 833f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ePipeType type) { 834f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int hw_w = ctx->dpyAttr[mDpy].xres; 835f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 836f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t dst = layer->displayFrame; 837f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(dst.left > hw_w/2) { 838f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = ovutils::OV_INVALID; 839f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 840f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID) 841f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 842f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else if (dst.right <= hw_w/2) { 843f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = ovutils::OV_INVALID; 844f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 845f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.lIndex == ovutils::OV_INVALID) 846f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 847f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } else { 848f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.rIndex = getMdpPipe(ctx, type); 849f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex = getMdpPipe(ctx, type); 850f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(pipe_info.rIndex == ovutils::OV_INVALID || 851f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipe_info.lIndex == ovutils::OV_INVALID) 852f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 853f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 854f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 855c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran} 856c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 857c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 858f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_display_contents_1_t* list) { 85916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 860f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int layer_count = ctx->listStats[mDpy].numAppLayers; 861c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 862f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(isYuvPresent(ctx, mDpy)) { 863f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvCount = ctx->listStats[mDpy].yuvCount; 8645a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran 8655a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran for(int index = 0; index < nYuvCount; index ++) { 866f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 8675a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 868f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex]; 869c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 8703393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 871c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 872c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) { 873c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos", 874f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 875c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //TODO: windback pipebook data on fail 8765a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran return false; 8775a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran } 8785a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran pipe_info.zOrder = nYuvIndex; 879c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 880c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 881c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 88216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 8835a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 8845a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 8855a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran 8865a107b4b7124301baf3b9e58089c7621fb9dfc95Jeykumar Sankaran if(isYuvBuffer(hnd)) 88716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed continue; 888c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 889f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& info = mCurrentFrame.mdpToLayer[index]; 890c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 8913393d793e88663ee9147b04e11289020be3721c9Saurabh Shah info.rot = NULL; 892c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 893c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 894c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 895c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 896f8f3943c612a0e324b9fb01c858bf668d9e5b859Jeykumar Sankaran if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator 897f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran && ctx->mMDP.version >= qdutils::MDSS_V5) 898c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran type = MDPCOMP_OV_DMA; 899c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 900c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 90116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 902c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //TODO: windback pipebook data on fail 90316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 90416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 90516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = index; 906c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 907c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 908c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 909c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran/* 910c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran * Configures pipe(s) for MDP composition 911c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran */ 912c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 913f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran PipeLayerPair& PipeLayerPair) { 914327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah MdpPipeInfoHighRes& mdp_info = 915f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 916327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 917327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eIsFg isFg = IS_FG_OFF; 918327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 919327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest lDest = mdp_info.lIndex; 920327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah eDest rDest = mdp_info.rIndex; 921f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 922f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 923f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 924f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 925f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 926f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran rDest, &PipeLayerPair.rot); 927c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 928c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 929c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 930c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 931f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(!isEnabled()) { 93216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 93316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 934c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 935c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 936c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 937c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 93816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 939c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 940c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 94116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 942f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(idleInvalidator && mCurrentFrame.mdpCount) 94316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 94416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 94516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 946f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran LayerProp *layerProp = ctx->layerProp[mDpy]; 947c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 948f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int numHwLayers = ctx->listStats[mDpy].numAppLayers; 949f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 950c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 951f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mCurrentFrame.isFBComposed[i]) continue; 952f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 953660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 954327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 955327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(!hnd) { 956327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s handle null", __FUNCTION__); 957327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 958327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 959c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 96016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 961c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 962c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 963c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 964f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran int mdpIndex = mCurrentFrame.layerToMDP[i]; 965f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 966c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 967f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 968f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 969327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 970c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 971c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 972f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 973327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int fd = hnd->fd; 974327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah int offset = hnd->offset; 975327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 976327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if(rot) { 977327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah rot->queueBuffer(fd, offset); 978327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah fd = rot->getDstMemId(); 979327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah offset = rot->getDstOffset(); 980327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah } 981c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran 982c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play left mixer ********** 983c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 984c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 985327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 986f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 987327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 988327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 989327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 990c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 991c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran } 992c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 993c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran //************* play right mixer ********** 994c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 995c8d563c4df56d25bf6ac6f38fb6703150458737aJeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 996327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 997f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 998327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 999327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 1000327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah return false; 1001c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1002c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1003327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 100416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 1005c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 1006327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah 100716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 1008c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 1009c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 1010c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1011