17c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed/* 26371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 37c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Not a Contribution, Apache license notifications and license are retained 47c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * for attribution purposes only. 57c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * 67c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 77c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * you may not use this file except in compliance with the License. 87c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * You may obtain a copy of the License at 97c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * 107c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 117c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * 127c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 137c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 147c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 157c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * See the License for the specific language governing permissions and 167c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * limitations under the License. 177c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed */ 187c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 19c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah#include <math.h> 207c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed#include "hwc_mdpcomp.h" 2165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed#include <sys/ioctl.h> 2256f610dd235b577725198e9341caae92379fdf23Saurabh Shah#include "external.h" 23c0945d8a389f71cdf8432947a6911838d1219c4bRamkumar Radhakrishnan#include "qdMetaData.h" 24d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan#include "mdp_version.h" 2536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah#include <overlayRotator.h> 267c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 2736963690317abceae79621f14ba41ff62b3ff489Saurabh Shahusing overlay::Rotator; 2836963690317abceae79621f14ba41ff62b3ff489Saurabh Shahusing namespace overlay::utils; 2965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmednamespace ovutils = overlay::utils; 307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 3136963690317abceae79621f14ba41ff62b3ff489Saurabh Shahnamespace qhwc { 3236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 33bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah//==============MDPComp======================================================== 34bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 357c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 367c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedbool MDPComp::sIdleFallBack = false; 377c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedbool MDPComp::sDebugLogs = false; 3865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmedbool MDPComp::sEnabled = false; 3985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahint MDPComp::sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 407c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 4185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp* MDPComp::getObject(const int& width, int dpy) { 426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(width <= MAX_DISPLAY_DIM) { 4385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return new MDPCompLowRes(dpy); 446371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } else { 4585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return new MDPCompHighRes(dpy); 466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 477c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 4865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 4985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp::MDPComp(int dpy):mDpy(dpy){}; 5085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 51bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahvoid MDPComp::dump(android::String8& buf) 52bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah{ 5385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf,"HWC Map for Dpy: %s \n", 5485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mDpy ? "\"EXTERNAL\"" : "\"PRIMARY\""); 5585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf,"PREV_FRAME: layerCount:%2d mdpCount:%2d \ 5685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah cacheCount:%2d \n", mCachedFrame.layerCount, 5785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCachedFrame.mdpCount, mCachedFrame.cacheCount); 5885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf,"CURR_FRAME: layerCount:%2d mdpCount:%2d \ 5985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah fbCount:%2d \n", mCurrentFrame.layerCount, 6085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.mdpCount, mCurrentFrame.fbCount); 6185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf,"needsFBRedraw:%3s pipesUsed:%2d MaxPipesPerMixer: %d \n", 6285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (mCurrentFrame.needsRedraw? "YES" : "NO"), 6385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.mdpCount, sMaxPipesPerMixer); 6485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf," --------------------------------------------- \n"); 6585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf," listIdx | cached? | mdpIndex | comptype | Z \n"); 6685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf," --------------------------------------------- \n"); 6785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int index = 0; index < mCurrentFrame.layerCount; index++ ) 6885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf," %7d | %7s | %8d | %9s | %2d \n", 6985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah index, 7085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (mCurrentFrame.isFBComposed[index] ? "YES" : "NO"), 7185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.layerToMDP[index], 7285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (mCurrentFrame.isFBComposed[index] ? 7385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (mCurrentFrame.needsRedraw ? "GLES" : "CACHE") : "MDP"), 7485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (mCurrentFrame.isFBComposed[index] ? mCurrentFrame.fbZ : 7585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.mdpToLayer[mCurrentFrame.layerToMDP[index]].pipeInfo->zOrder)); 7685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dumpsys_log(buf,"\n"); 77bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah} 78bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 79bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 80bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 81bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if(!ctx) { 82bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 83bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah return false; 84bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 85bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 86bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah char property[PROPERTY_VALUE_MAX]; 87bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 88bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah sEnabled = false; 89bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 9085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 9185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 92bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah sEnabled = true; 93bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 94bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 95bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah sDebugLogs = false; 96bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 97bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah if(atoi(property) != 0) 98bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah sDebugLogs = true; 99bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 100bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 10185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah sMaxPipesPerMixer = MAX_PIPES_PER_MIXER; 10285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(property_get("debug.mdpcomp.maxpermixer", property, NULL) > 0) { 10385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(atoi(property) != 0) 10485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah sMaxPipesPerMixer = true; 10585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 10685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 107ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed if(ctx->mMDP.panel != MIPI_CMD_PANEL) { 108ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed // Idle invalidation is not necessary on command mode panels 109ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed long idle_timeout = DEFAULT_IDLE_TIME; 110ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 111ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed if(atoi(property) != 0) 112ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed idle_timeout = atoi(property); 113ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed } 114ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed 115ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed //create Idle Invalidator only when not disabled through property 116ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed if(idle_timeout != -1) 117ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 118ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed 119ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed if(idleInvalidator == NULL) { 120ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", 121ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed __FUNCTION__); 122ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed } else { 123ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 124ed69bc8090c0a784a65d91d5ef2c013f7c93f873Naseer Ahmed } 125bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 126bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah return true; 127bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah} 1287c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 1297c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 1307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 1317c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 1327c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed if(!ctx) { 1337c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 1347c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed return; 1357c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 1367c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 1373be78d9816da84e48a40232165189f9deb16808fJesse Hall if(!ctx->proc) { 1387c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 1397c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed return; 1407c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 1417c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed sIdleFallBack = true; 1427c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed /* Trigger SF to redraw the current frame */ 1433be78d9816da84e48a40232165189f9deb16808fJesse Hall ctx->proc->invalidate(ctx->proc); 1447c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 1457c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 146bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 14785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list) { 14885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah LayerProp *layerProp = ctx->layerProp[mDpy]; 149bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 15085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int index = 0; index < ctx->listStats[mDpy].numAppLayers; index++) { 151bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 15285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 15385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah layerProp[index].mFlags |= HWC_MDPCOMP; 15485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah layer->compositionType = HWC_OVERLAY; 15585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah layer->hints |= HWC_HINT_CLEAR_FB; 15685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCachedFrame.hnd[index] = NULL; 15785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else { 15885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!mCurrentFrame.needsRedraw) 15985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah layer->compositionType = HWC_OVERLAY; 16085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 16152ca6d2747ec9b46f7fff666f3b35ec1d3f1ce13Naseer Ahmed } 1627c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 1637c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 16485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah/* 16585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0. 16685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * Framebuffer is always updated using PLAY ioctl. 16785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah */ 16885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 169bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 17085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int fb_width = ctx->dpyAttr[dpy].xres; 17185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int fb_height = ctx->dpyAttr[dpy].yres; 17285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int fb_fd = ctx->dpyAttr[dpy].fd; 17385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 17485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdp_overlay ovInfo; 17585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah msmfb_overlay_data ovData; 17685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah memset(&ovInfo, 0, sizeof(mdp_overlay)); 17785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah memset(&ovData, 0, sizeof(msmfb_overlay_data)); 17885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 17985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.src.format = MDP_RGB_BORDERFILL; 18085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.src.width = fb_width; 18185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.src.height = fb_height; 18285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.src_rect.w = fb_width; 18385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.src_rect.h = fb_height; 18485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.dst_rect.w = fb_width; 18585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.dst_rect.h = fb_height; 18685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovInfo.id = MSMFB_NEW_REQUEST; 18785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 18885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 18985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 19085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah strerror(errno)); 19185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 19285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 193bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 19485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ovData.id = ovInfo.id; 19585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 19685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 19785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah strerror(errno)); 19885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 199bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 20085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return true; 2017c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 20265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 20385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp::FrameInfo::FrameInfo() { 20480c2b7d36c8a088e7672aed237966986bf99fa29Jesse Hall memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 2055d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah reset(0); 20685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 20785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 2085d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::FrameInfo::reset(const int& numLayers) { 20980c2b7d36c8a088e7672aed237966986bf99fa29Jesse Hall for(int i = 0 ; i < MAX_PIPES_PER_MIXER; i++ ) { 21085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mdpToLayer[i].pipeInfo) { 21185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah delete mdpToLayer[i].pipeInfo; 21285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdpToLayer[i].pipeInfo = NULL; 21385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //We dont own the rotator 21485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdpToLayer[i].rot = NULL; 2156371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 216bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 21785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 21885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah memset(&mdpToLayer, 0, sizeof(mdpToLayer)); 21985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah memset(&layerToMDP, -1, sizeof(layerToMDP)); 2205d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah memset(&isFBComposed, 1, sizeof(isFBComposed)); 22185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 2225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah layerCount = numLayers; 2235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah fbCount = numLayers; 22485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdpCount = 0; 2250b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah needsRedraw = true; 22685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah fbZ = 0; 22785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 22885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 2295d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::FrameInfo::map() { 2305d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah // populate layer and MDP maps 2315d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int mdpIdx = 0; 2325d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah for(int idx = 0; idx < layerCount; idx++) { 2335d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!isFBComposed[idx]) { 2345d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mdpToLayer[mdpIdx].listIndex = idx; 2355d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah layerToMDP[idx] = mdpIdx++; 2365d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 2375d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 2385d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 2395d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 24085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh ShahMDPComp::LayerCache::LayerCache() { 24185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah reset(); 24285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 24385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 24485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::LayerCache::reset() { 2455d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah memset(&hnd, 0, sizeof(hnd)); 24685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdpCount = 0; 24785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah cacheCount = 0; 24885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah layerCount = 0; 2495d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah fbZ = -1; 2505d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 2515d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 2525d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::LayerCache::cacheAll(hwc_display_contents_1_t* list) { 2535d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah const int numAppLayers = list->numHwLayers - 1; 2545d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 2555d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah hnd[i] = list->hwLayers[i].handle; 2565d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 2575d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 2585d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 2595d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahvoid MDPComp::LayerCache::updateCounts(const FrameInfo& curFrame) { 2605d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mdpCount = curFrame.mdpCount; 2615d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah cacheCount = curFrame.fbCount; 2625d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah layerCount = curFrame.layerCount; 2635d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah fbZ = curFrame.fbZ; 264bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah} 265bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 266ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchevbool MDPComp::isValidDimension(hwc_context_t *ctx, hwc_layer_1_t *layer) { 267ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev private_handle_t *hnd = (private_handle_t *)layer->handle; 268ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 269ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev if(!hnd) { 270ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev ALOGE("%s: layer handle is NULL", __FUNCTION__); 271ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev return false; 272ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev } 273ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 27485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int hw_w = ctx->dpyAttr[mDpy].xres; 27585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int hw_h = ctx->dpyAttr[mDpy].yres; 276ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 277c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah hwc_rect_t crop = layer->sourceCrop; 278c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah hwc_rect_t dst = layer->displayFrame; 279c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah 280c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(dst.left < 0 || dst.top < 0 || dst.right > hw_w || dst.bottom > hw_h) { 281c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah hwc_rect_t scissor = {0, 0, hw_w, hw_h }; 282c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah qhwc::calculate_crop_rects(crop, dst, scissor, layer->transform); 283c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah } 284ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 285ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev int crop_w = crop.right - crop.left; 286ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev int crop_h = crop.bottom - crop.top; 287ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev int dst_w = dst.right - dst.left; 288ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev int dst_h = dst.bottom - dst.top; 289c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah float w_dscale = ceilf((float)crop_w / (float)dst_w); 290c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah float h_dscale = ceilf((float)crop_h / (float)dst_h); 291ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 292c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah //Workaround for MDP HW limitation in DSI command mode panels where 293c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah //FPS will not go beyond 30 if buffers on RGB pipes are of width < 5 294ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 29585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if((crop_w < 5)||(crop_h < 5)) 296ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev return false; 297ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 298c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(ctx->mMDP.version >= qdutils::MDSS_V5) { 299c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah /* Workaround for downscales larger than 4x. 300c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah * Will be removed once decimator block is enabled for MDSS 301c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah */ 302c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(w_dscale > 4.0f || h_dscale > 4.0f) 303c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah return false; 304c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah } else { 305c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(w_dscale > 8.0f || h_dscale > 8.0f) 306c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah // MDP 4 supports 1/8 downscale 307c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah return false; 308c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah } 309ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 310ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev return true; 311ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev} 312ba6e8a536e083008d0d3506e25c8ce47f66b3e2cIliyan Malchev 3136371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranovutils::eDest MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type) { 3146371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 3156371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ovutils::eDest mdp_pipe = ovutils::OV_INVALID; 3166371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 3176371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran switch(type) { 31885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah case MDPCOMP_OV_DMA: 31985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_DMA, mDpy); 32085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mdp_pipe != ovutils::OV_INVALID) { 32185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ctx->mDMAInUse = true; 32285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return mdp_pipe; 32385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 32485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah case MDPCOMP_OV_ANY: 32585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah case MDPCOMP_OV_RGB: 32685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 32785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mdp_pipe != ovutils::OV_INVALID) { 32885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return mdp_pipe; 32985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 3306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 33185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(type == MDPCOMP_OV_RGB) { 33285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //Requested only for RGB pipe 33385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah break; 33485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 33585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah case MDPCOMP_OV_VG: 33685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return ov.nextPipe(ovutils::OV_MDP_PIPE_VG, mDpy); 33785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah default: 33885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGE("%s: Invalid pipe type",__FUNCTION__); 33985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return ovutils::OV_INVALID; 3406371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran }; 3416371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return ovutils::OV_INVALID; 3426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 3436371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 34485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::isFrameDoable(hwc_context_t *ctx) { 3455d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah bool ret = true; 34645660529af1f4063a00e84aa2361649e6a9a878cArun Kumar K.R const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 3476371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 34885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!isEnabled()) { 34985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 3505d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ret = false; 3515d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } else if(ctx->mExtDispConfiguring) { 3526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGD_IF( isDebug(),"%s: External Display connection is pending", 35385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah __FUNCTION__); 3545d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ret = false; 3554693292411622c9be2d23b9904c88907be629625Naseer Ahmed } else if(ctx->mVideoTransFlag) { 3564693292411622c9be2d23b9904c88907be629625Naseer Ahmed ALOGD_IF(isDebug(), "%s: MDP Comp. video transition padding round", 3574693292411622c9be2d23b9904c88907be629625Naseer Ahmed __FUNCTION__); 3586371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 3595d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return ret; 36085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 36185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 36285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah/* Checks for conditions where all the layers marked for MDP comp cannot be 36385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * bypassed. On such conditions we try to bypass atleast YUV layers */ 36485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::isFullFrameDoable(hwc_context_t *ctx, 36585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list){ 36685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 3675d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah const int numAppLayers = ctx->listStats[mDpy].numAppLayers; 36885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 3694e9a6fcae996778da1343e41693788f27af450faSaurabh Shah if(sIdleFallBack) { 3704e9a6fcae996778da1343e41693788f27af450faSaurabh Shah ALOGD_IF(isDebug(), "%s: Idle fallback dpy %d",__FUNCTION__, mDpy); 3714e9a6fcae996778da1343e41693788f27af450faSaurabh Shah return false; 3724e9a6fcae996778da1343e41693788f27af450faSaurabh Shah } 3734e9a6fcae996778da1343e41693788f27af450faSaurabh Shah 37485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mDpy > HWC_DISPLAY_PRIMARY){ 37585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(), "%s: Cannot support External display(s)", 37685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah __FUNCTION__); 37785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 37885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 37985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 38085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(isSkipPresent(ctx, mDpy)) { 3815d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(),"%s: SKIP present: %d", 3825d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah __FUNCTION__, 3835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah isSkipPresent(ctx, mDpy)); 3846371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return false; 3856371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 3866371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 38785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(ctx->listStats[mDpy].planeAlpha 388ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed && ctx->mMDP.version >= qdutils::MDSS_V5) { 389ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed ALOGD_IF(isDebug(), "%s: plane alpha not implemented on MDSS", 390ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed __FUNCTION__); 391ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed return false; 392ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed } 393ac1391615c3d70676a31aae57e51e47db2ee57d8Naseer Ahmed 394215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah if(ctx->listStats[mDpy].needsAlphaScale 395215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah && ctx->mMDP.version < qdutils::MDSS_V5) { 396215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 397215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah return false; 398215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah } 399215129c8b0407f7ef02a7a2bdd00754714f4921cSaurabh Shah 4006371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran //MDP composition is not efficient if layer needs rotator. 4016371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran for(int i = 0; i < numAppLayers; ++i) { 4026371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran // As MDP h/w supports flip operation, use MDP comp only for 4036371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran // 180 transforms. Fail for any transform involving 90 (90, 270). 4046371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[i]; 4056371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 406b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar if(isYuvBuffer(hnd) ) { 407b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar if(isSecuring(ctx, layer)) { 408b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 409b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar return false; 410b8986cf8f2f7702e1d281bf67fd31f6be09eb287Amara Venkata Mastan Manoj Kumar } 411c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah } else if(layer->transform & HWC_TRANSFORM_ROT_90) { 412c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 413c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah return false; 414c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah } 415c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah 416c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(!isValidDimension(ctx,layer)) { 417c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 418c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah __FUNCTION__); 419c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah return false; 4206371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 4216371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 4225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah //If all above hard conditions are met we can do full or partial MDP comp. 4245d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah bool ret = false; 4255d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(fullMDPComp(ctx, list)) { 4265d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ret = true; 4275d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } else if (partialMDPComp(ctx, list)) { 4285d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ret = true; 4295d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 4305d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return ret; 4315d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 4325d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4335d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::fullMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 4345d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah //Setup mCurrentFrame 4355d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount; 4365d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbCount = 0; 4375d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbZ = -1; 4385d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah memset(&mCurrentFrame.isFBComposed, 0, sizeof(mCurrentFrame.isFBComposed)); 4395d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4405d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 4415d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(mdpCount > sMaxPipesPerMixer) { 4425d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 4435d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 4445d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 4455d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4465d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 4475d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int availPipes = getAvailablePipes(ctx); 4485d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4495d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(numPipesNeeded > availPipes) { 4505d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 4515d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 4525d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 4535d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 4545d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4555d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return true; 4565d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 4575d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4585d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::partialMDPComp(hwc_context_t *ctx, hwc_display_contents_1_t* list) 4595d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah{ 4605d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 4615d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah //Setup mCurrentFrame 4625d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.reset(numAppLayers); 4635d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah updateLayerCache(ctx, list); 4645d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah updateYUV(ctx, list); 4655d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah batchLayers(); //sets up fbZ also 4665d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4675d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int mdpCount = mCurrentFrame.mdpCount; 4685d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - 1)) { // -1 since FB is used 4695d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 4705d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 4715d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 4725d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4735d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 4745d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int availPipes = getAvailablePipes(ctx); 4755d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4765d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(numPipesNeeded > availPipes) { 4775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 4785d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 4795d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 4805d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 4815d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4825d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return true; 4835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 4845d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4855d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::isOnlyVideoDoable(hwc_context_t *ctx, 4865d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah hwc_display_contents_1_t* list){ 4875d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 4885d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.reset(numAppLayers); 4895d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah updateYUV(ctx, list); 490c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah int mdpCount = mCurrentFrame.mdpCount; 4915d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int fbNeeded = int(mCurrentFrame.fbCount != 0); 4925d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 4935d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!isYuvPresent(ctx, mDpy)) { 4945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 4955d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 4965d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 497c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(!mdpCount) 498c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah return false; 499c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah 5005d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(mdpCount > (sMaxPipesPerMixer - fbNeeded)) { 5015d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Exceeds MAX_PIPES_PER_MIXER",__FUNCTION__); 5025d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 5035d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 5045d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 5055d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int numPipesNeeded = pipesNeeded(ctx, list); 5065d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int availPipes = getAvailablePipes(ctx); 5075d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(numPipesNeeded > availPipes) { 5085d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Insufficient MDP pipes, needed %d, avail %d", 5095d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah __FUNCTION__, numPipesNeeded, availPipes); 5105d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 5115d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 5125d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 51361b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed int nYuvCount = ctx->listStats[mDpy].yuvCount; 51461b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed for(int index = 0; index < nYuvCount ; index ++) { 51561b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 51661b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 51761b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed if(layer->planeAlpha < 0xFF) { 51861b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed ALOGD_IF(isDebug(), "%s: Cannot handle YUV layer with plane alpha\ 51961b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed when sandwiched", 52061b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed __FUNCTION__); 52161b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed return false; 52261b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed } 52361b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed } 52461b0def48758b5ab2555c9eeec3c8f9ce326fff3Naseer Ahmed 5256371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return true; 5266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 5276371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 52885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah/* Checks for conditions where YUV layers cannot be bypassed */ 52985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool MDPComp::isYUVDoable(hwc_context_t* ctx, hwc_layer_1_t* layer) { 53085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 53185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(isSkipLayer(layer)) { 53285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGE("%s: Unable to bypass skipped YUV", __FUNCTION__); 53385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 5346371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 5356371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 53685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(ctx->mNeedsRotator && ctx->mDMAInUse) { 53785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGE("%s: No DMA for Rotator",__FUNCTION__); 5386371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return false; 5396371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 5406371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 54185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(isSecuring(ctx, layer)) { 54285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 54385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 54485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 54585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 546c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah if(!isValidDimension(ctx, layer)) { 547c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah ALOGD_IF(isDebug(), "%s: Buffer is of invalid width", 548c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah __FUNCTION__); 549c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah return false; 5506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 551c61596b90f6dd4dbbebfb1ffb4ad513f5fba485eSaurabh Shah 5526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return true; 5536371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 5546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 55585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::batchLayers() { 55685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah /* Idea is to keep as many contiguous non-updating(cached) layers in FB and 55785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * send rest of them through MDP. NEVER mark an updating layer for caching. 55885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah * But cached ones can be marked for MDP*/ 55985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 56085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int maxBatchStart = -1; 56185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int maxBatchCount = 0; 56285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 56385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah /* All or Nothing is cached. No batching needed */ 5645d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!mCurrentFrame.fbCount) { 5655d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbZ = -1; 5665d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return; 5675d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 5685d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!mCurrentFrame.mdpCount) { 5695d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbZ = 0; 57085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return; 5715d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 57285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 57385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah /* Search for max number of contiguous (cached) layers */ 57485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int i = 0; 57585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah while (i < mCurrentFrame.layerCount) { 57685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int count = 0; 57785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah while(mCurrentFrame.isFBComposed[i] && i < mCurrentFrame.layerCount) { 57885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah count++; i++; 57985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 58085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(count > maxBatchCount) { 58185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah maxBatchCount = count; 58285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah maxBatchStart = i - count; 5835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbZ = maxBatchStart; 58485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 58585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(i < mCurrentFrame.layerCount) i++; 58685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 58785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 58885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah /* reset rest of the layers for MDP comp */ 58985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; i++) { 59085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(i != maxBatchStart){ 59185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 59285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else { 59385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah i += maxBatchCount; 59485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 59585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 59685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 59785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.fbCount = maxBatchCount; 5985d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 5995d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbCount; 60085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 60185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 60285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.fbCount); 60385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 6045d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 60585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::updateLayerCache(hwc_context_t* ctx, 60685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list) { 60785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 60885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int numAppLayers = ctx->listStats[mDpy].numAppLayers; 60985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int numCacheableLayers = 0; 61085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 61185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int i = 0; i < numAppLayers; i++) { 61285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if (mCachedFrame.hnd[i] == list->hwLayers[i].handle) { 61385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah numCacheableLayers++; 61485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.isFBComposed[i] = true; 61585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else { 6165d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.isFBComposed[i] = false; 61785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCachedFrame.hnd[i] = list->hwLayers[i].handle; 61885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 6196371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 6205d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 62185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.fbCount = numCacheableLayers; 6225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 6235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbCount; 62485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, numCacheableLayers); 62585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 6266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 62785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahint MDPComp::getAvailablePipes(hwc_context_t* ctx) { 62885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int numDMAPipes = qdutils::MDPVersion::getInstance().getDMAPipes(); 6296371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 6306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 63185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int numAvailable = ov.availablePipes(mDpy); 63285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 63385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //Reserve DMA for rotator 63485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(ctx->mNeedsRotator) 63585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah numAvailable -= numDMAPipes; 63685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 63785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //Reserve pipe(s)for FB 63885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mCurrentFrame.fbCount) 63985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah numAvailable -= pipesForFB(); 64085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 64185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return numAvailable; 64285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 64385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 64485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahvoid MDPComp::updateYUV(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 64585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 64685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int nYuvCount = ctx->listStats[mDpy].yuvCount; 64785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int index = 0;index < nYuvCount; index++){ 64885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 64985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 65085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 65185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!isYUVDoable(ctx, layer)) { 65285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!mCurrentFrame.isFBComposed[nYuvIndex]) { 65385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = true; 65485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.fbCount++; 65585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 6566371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } else { 65785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mCurrentFrame.isFBComposed[nYuvIndex]) { 65885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.isFBComposed[nYuvIndex] = false; 65985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.fbCount--; 66085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 6616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 6626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 6635d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 6645d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.mdpCount = mCurrentFrame.layerCount - 6655d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbCount; 66685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(),"%s: cached count: %d",__FUNCTION__, 66785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah mCurrentFrame.fbCount); 66885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 66985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 6705d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::programMDP(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 67185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ctx->mDMAInUse = false; 67285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!allocLayerPipes(ctx, list)) { 67385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 6745d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 67585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 67685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 6775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah bool fbBatch = false; 67885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for (int index = 0, mdpNextZOrder = 0; index < mCurrentFrame.layerCount; 6795d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah index++) { 68085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 68185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 68285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 68385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 68485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah MdpPipeInfo* cur_pipe = mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 68585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah cur_pipe->zOrder = mdpNextZOrder++; 68685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 68785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(configure(ctx, layer, mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 68885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 68985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah layer %d",__FUNCTION__, index); 6905d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 69185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 6925d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } else if(fbBatch == false) { 6935d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mdpNextZOrder++; 6945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah fbBatch = true; 6955d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 69685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 69785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 6985d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return true; 6995d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah} 70085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 7015d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shahbool MDPComp::programYUV(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 7025d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!allocLayerPipes(ctx, list)) { 7035d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Unable to allocate MDP pipes", __FUNCTION__); 7045d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 7055d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 7065d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah //If we are in this block, it means we have yuv + rgb layers both 7075d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int mdpIdx = 0; 7085d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah for (int index = 0; index < mCurrentFrame.layerCount; index++) { 7095d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!mCurrentFrame.isFBComposed[index]) { 7105d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[index]; 7115d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 7125d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah MdpPipeInfo* cur_pipe = 7135d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 7145d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah cur_pipe->zOrder = mdpIdx++; 7155d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 7165d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(configure(ctx, layer, 7175d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.mdpToLayer[mdpIndex]) != 0 ){ 7185d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD_IF(isDebug(), "%s: Failed to configure overlay for \ 7195d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah layer %d",__FUNCTION__, index); 7205d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return false; 7215d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 7225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 7235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 7245d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah return true; 72585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah} 72685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 72785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahint MDPComp::prepare(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 72885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 7295d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah const int numLayers = ctx->listStats[mDpy].numAppLayers; 7300787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R 7310787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R //reset old data 7325d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.reset(numLayers); 73385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 7340787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R //number of app layers exceeds MAX_NUM_APP_LAYERS fall back to GPU 7350787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R //do not cache the information for next draw cycle. 7360787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R if(numLayers > MAX_NUM_APP_LAYERS) { 7370787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R ALOGD_IF(isDebug(), "%s: Number of App layers exceeded the limit ", 7380787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R __FUNCTION__); 7390787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R return 0; 7400787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R } 7410787bc222a016e944f01492c2dd04bd03c1da6afArun Kumar K.R 7425d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah //Hard conditions, if not met, cannot do MDP comp 74385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!isFrameDoable(ctx)) { 74485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF( isDebug(),"%s: MDP Comp not possible for this frame", 74585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah __FUNCTION__); 7465d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.reset(numLayers); 7475d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCachedFrame.cacheAll(list); 7485d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 74985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return 0; 75085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 75185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 75285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //Check whether layers marked for MDP Composition is actually doable. 7535d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(isFullFrameDoable(ctx, list)){ 7540b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah mCurrentFrame.map(); 7550b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah //Acquire and Program MDP pipes 7560b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah if(!programMDP(ctx, list)) { 7570b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah mCurrentFrame.reset(numLayers); 7580b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah mCachedFrame.cacheAll(list); 7590b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah } else { //Success 7600b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah //Any change in composition types needs an FB refresh 7610b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah mCurrentFrame.needsRedraw = false; 7620b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah if(mCurrentFrame.fbCount && 7630b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah ((mCurrentFrame.mdpCount != mCachedFrame.mdpCount) || 7640b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah (mCurrentFrame.fbCount != mCachedFrame.cacheCount) || 7650b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah (mCurrentFrame.fbZ != mCachedFrame.fbZ) || 7660b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah (!mCurrentFrame.mdpCount) || 7670b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah (list->flags & HWC_GEOMETRY_CHANGED) || 7680b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah isSkipPresent(ctx, mDpy) || 7690b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah (mDpy > HWC_DISPLAY_PRIMARY))) { 7700b6581440f8ee137a59af383a3d5207c58df215dSaurabh Shah mCurrentFrame.needsRedraw = true; 7715d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 7725d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } 7735d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } else if(isOnlyVideoDoable(ctx, list)) { 77485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //All layers marked for MDP comp cannot be bypassed. 77585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //Try to compose atleast YUV layers through MDP comp and let 77685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //all the RGB layers compose in FB 7775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah //Destination over 7785d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbZ = -1; 7795d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(mCurrentFrame.fbCount) 7805d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.fbZ = ctx->listStats[mDpy].yuvCount; 7815d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah 7825d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.map(); 7835d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah if(!programYUV(ctx, list)) { 7845d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.reset(numLayers); 7855d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCachedFrame.cacheAll(list); 78685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 7875d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah } else { 7885d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCurrentFrame.reset(numLayers); 7895d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCachedFrame.cacheAll(list); 79085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 79185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 79285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah //UpdateLayerFlags 79385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah setMDPCompLayerFlags(ctx, list); 7945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah mCachedFrame.updateCounts(mCurrentFrame); 7956371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 79685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(isDebug()) { 7975d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah ALOGD("GEOMETRY change: %d", (list->flags & HWC_GEOMETRY_CHANGED)); 79885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah android::String8 sDump(""); 79985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah dump(sDump); 80085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGE("%s",sDump.string()); 8016371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 8026371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 80385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return mCurrentFrame.fbZ; 8046371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 8056371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 8066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran//=============MDPCompLowRes=================================================== 8076371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 8087c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed/* 8097c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed * Configures pipe(s) for MDP composition 8107c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed */ 811bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 81285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah PipeLayerPair& PipeLayerPair) { 81336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah MdpPipeInfoLowRes& mdp_info = 81485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah *(static_cast<MdpPipeInfoLowRes*>(PipeLayerPair.pipeInfo)); 81536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eMdpFlags mdpFlags = OV_MDP_BACKEND_COMPOSITION; 81636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 81736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eIsFg isFg = IS_FG_OFF; 81836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eDest dest = mdp_info.index; 81936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 82085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipe: %d", 82185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah __FUNCTION__, layer, zOrder, dest); 82285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 82385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return configureLowRes(ctx, layer, mDpy, mdpFlags, zOrder, isFg, dest, 82485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah &PipeLayerPair.rot); 8257c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 8267c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 8276371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranint MDPCompLowRes::pipesNeeded(hwc_context_t *ctx, 82885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list) { 82985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return mCurrentFrame.mdpCount; 8306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 83165bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 8326371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 83385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list) { 83485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(isYuvPresent(ctx, mDpy)) { 83585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int nYuvCount = ctx->listStats[mDpy].yuvCount; 836bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah 83785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int index = 0; index < nYuvCount ; index ++) { 83885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 8397c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 84085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mCurrentFrame.isFBComposed[nYuvIndex]) 84185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah continue; 842f3db354f47d3d6b7f42374ea7b4e3b8e06df8592Amara Venkata Mastan Manoj Kumar 84385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[nYuvIndex]; 84485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 84585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 8466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 84736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah info.rot = NULL; 8486371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 84985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 8506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG); 8516371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 8526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos", 85385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah __FUNCTION__); 8546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return false; 8556371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 8566371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 85765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 85865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 85985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int index = 0 ; index < mCurrentFrame.layerCount; index++ ) { 86085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mCurrentFrame.isFBComposed[index]) continue; 8616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 8626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 86352a135bafb05fabbe5d3281dcc4c9aad98103cbcNaseer Ahmed 8646371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(isYuvBuffer(hnd)) 8656371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran continue; 8666371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 86785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[index]; 86885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 86985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 8706371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran info.pipeInfo = new MdpPipeInfoLowRes; 87136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah info.rot = NULL; 8726371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran MdpPipeInfoLowRes& pipe_info = *(MdpPipeInfoLowRes*)info.pipeInfo; 8736371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 874f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 875f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran 876f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator 87785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) { 878f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran type = MDPCOMP_OV_DMA; 879f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran } 880f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran 881f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran pipe_info.index = getMdpPipe(ctx, type); 8826371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(pipe_info.index == ovutils::OV_INVALID) { 8836371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 8846371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return false; 8856371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 8867c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 8876371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return true; 8886371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 8897c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 8906371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 8916371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 89285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!isEnabled()) { 8936371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 8946371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return true; 89553bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed } 89653bdba54f2eb33c5e8133d75d149f5ede92baa33Naseer Ahmed 8976371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(!ctx || !list) { 8986371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGE("%s: invalid contxt or list",__FUNCTION__); 8997c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed return false; 9007c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 9017c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 9026371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran /* reset Invalidator */ 9034e9a6fcae996778da1343e41693788f27af450faSaurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 9046371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran idleInvalidator->markForSleep(); 9054ed83de9e5eba8193a50dab50155014b7d3c7f04Jeykumar Sankaran 9066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran overlay::Overlay& ov = *ctx->mOverlay; 90785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah LayerProp *layerProp = ctx->layerProp[mDpy]; 9086371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 90985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int numHwLayers = ctx->listStats[mDpy].numAppLayers; 91085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 9116371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran { 91285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mCurrentFrame.isFBComposed[i]) continue; 91385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 9146371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[i]; 91536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 91636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(!hnd) { 91736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s handle null", __FUNCTION__); 91836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah return false; 9197c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 9204ed83de9e5eba8193a50dab50155014b7d3c7f04Jeykumar Sankaran 92185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[i]; 92285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 9236371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran MdpPipeInfoLowRes& pipe_info = 92485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah *(MdpPipeInfoLowRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 9256371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ovutils::eDest dest = pipe_info.index; 9266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(dest == ovutils::OV_INVALID) { 9276371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, dest); 9284ed83de9e5eba8193a50dab50155014b7d3c7f04Jeykumar Sankaran return false; 9296371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 9306371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 93136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 93236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah continue; 93336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah } 9346371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 93536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 93685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah using pipe: %d", __FUNCTION__, layer, 93785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hnd, dest ); 9386371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 93936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah int fd = hnd->fd; 94036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah uint32_t offset = hnd->offset; 94185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 94236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(rot) { 94336963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(!rot->queueBuffer(fd, offset)) 9446371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return false; 94536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah fd = rot->getDstMemId(); 94636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah offset = rot->getDstOffset(); 94736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah } 94836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 94936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 95036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 95136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah return false; 9526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 9536371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 9546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran layerProp[i].mFlags &= ~HWC_MDPCOMP; 9557c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 9567c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed return true; 9577c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 9587c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 9596371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran//=============MDPCompHighRes=================================================== 9606371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 9616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranint MDPCompHighRes::pipesNeeded(hwc_context_t *ctx, 96285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list) { 9636371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran int pipesNeeded = 0; 96485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int hw_w = ctx->dpyAttr[mDpy].xres; 96585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 96685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int i = 0; i < mCurrentFrame.layerCount; ++i) { 96785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!mCurrentFrame.isFBComposed[i]) { 96885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_layer_1_t* layer = &list->hwLayers[i]; 96985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_rect_t dst = layer->displayFrame; 97085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(dst.left > hw_w/2) { 97185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipesNeeded++; 97285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else if(dst.right <= hw_w/2) { 97385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipesNeeded++; 97485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else { 97585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipesNeeded += 2; 97685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 97785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 9786371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 9796371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran return pipesNeeded; 9807c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 9817c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 9826371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompHighRes::acquireMDPPipes(hwc_context_t *ctx, hwc_layer_1_t* layer, 98385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah MdpPipeInfoHighRes& pipe_info, 98485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ePipeType type) { 98585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int hw_w = ctx->dpyAttr[mDpy].xres; 98685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 98785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_rect_t dst = layer->displayFrame; 98885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(dst.left > hw_w/2) { 98985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.lIndex = ovutils::OV_INVALID; 99085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type); 99185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID) 99285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 99385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else if (dst.right <= hw_w/2) { 99485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.rIndex = ovutils::OV_INVALID; 99585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type); 99685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(pipe_info.lIndex == ovutils::OV_INVALID) 99785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 99885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } else { 99985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.rIndex = getMdpPipe(ctx, type); 100085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.lIndex = getMdpPipe(ctx, type); 100185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(pipe_info.rIndex == ovutils::OV_INVALID || 100285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah pipe_info.lIndex == ovutils::OV_INVALID) 100385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return false; 100485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah } 100585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return true; 10066371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran} 10076371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 10086371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompHighRes::allocLayerPipes(hwc_context_t *ctx, 100985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah hwc_display_contents_1_t* list) { 101065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 101185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int layer_count = ctx->listStats[mDpy].numAppLayers; 10127c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 101385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(isYuvPresent(ctx, mDpy)) { 101485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int nYuvCount = ctx->listStats[mDpy].yuvCount; 101543d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran 101643d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran for(int index = 0; index < nYuvCount; index ++) { 101785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int nYuvIndex = ctx->listStats[mDpy].yuvIndices[index]; 101843d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 101985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah PipeLayerPair& info = mCurrentFrame.mdpToLayer[nYuvIndex]; 10206371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 10217fd7ee4a0e438f613fc072089c1c02fcf115bb24Saurabh Shah info.rot = NULL; 10226371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 10236371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info,MDPCOMP_OV_VG)) { 10246371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ALOGD_IF(isDebug(),"%s: Unable to get pipe for videos", 102585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah __FUNCTION__); 10266371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran //TODO: windback pipebook data on fail 102743d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran return false; 102843d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran } 102943d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran pipe_info.zOrder = nYuvIndex; 10307c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 10317c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 10327c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 103365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 103443d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran hwc_layer_1_t* layer = &list->hwLayers[index]; 103543d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran private_handle_t *hnd = (private_handle_t *)layer->handle; 103643d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran 103743d839785a39d93219bad17693c96698ffe10065Jeykumar Sankaran if(isYuvBuffer(hnd)) 103865bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed continue; 10397c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 104095c2601aab7f27505e8b086fdd1f1dce31091e5dArun Kumar K.R int mdpIndex = mCurrentFrame.layerToMDP[index]; 104195c2601aab7f27505e8b086fdd1f1dce31091e5dArun Kumar K.R PipeLayerPair& info = mCurrentFrame.mdpToLayer[mdpIndex]; 10426371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran info.pipeInfo = new MdpPipeInfoHighRes; 10437fd7ee4a0e438f613fc072089c1c02fcf115bb24Saurabh Shah info.rot = NULL; 10446371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info = *(MdpPipeInfoHighRes*)info.pipeInfo; 10456371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 10466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ePipeType type = MDPCOMP_OV_ANY; 10476371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 1048f723a18011e80facc7a3028ecb005a125f3c481bJeykumar Sankaran if(!qhwc::needsScaling(layer) && !ctx->mNeedsRotator 104985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah && ctx->mMDP.version >= qdutils::MDSS_V5) 10506371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran type = MDPCOMP_OV_DMA; 10516371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 10526371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(!acquireMDPPipes(ctx, layer, pipe_info, type)) { 105365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 10546371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran //TODO: windback pipebook data on fail 105565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed return false; 105665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed } 105765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed pipe_info.zOrder = index; 10587c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 10597c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed return true; 10607c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 10616371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran/* 10626371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran * Configures pipe(s) for MDP composition 10636371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran */ 10646371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranint MDPCompHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 106585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah PipeLayerPair& PipeLayerPair) { 106636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah MdpPipeInfoHighRes& mdp_info = 106785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah *(static_cast<MdpPipeInfoHighRes*>(PipeLayerPair.pipeInfo)); 106836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eZorder zOrder = static_cast<eZorder>(mdp_info.zOrder); 106936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eIsFg isFg = IS_FG_OFF; 107036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eMdpFlags mdpFlagsL = OV_MDP_BACKEND_COMPOSITION; 107136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eDest lDest = mdp_info.lIndex; 107236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah eDest rDest = mdp_info.rIndex; 107385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 107485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah ALOGD_IF(isDebug(),"%s: configuring: layer: %p z_order: %d dest_pipeL: %d" 107585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah "dest_pipeR: %d",__FUNCTION__, layer, zOrder, lDest, rDest); 107685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 107785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah return configureHighRes(ctx, layer, mDpy, mdpFlagsL, zOrder, isFg, lDest, 107885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah rDest, &PipeLayerPair.rot); 10797c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 10807c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 10816371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaranbool MDPCompHighRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 10827c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 108385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(!isEnabled()) { 108465bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 108565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed return true; 1086bfa005e8c51529d99b9c360a444d351ebe0885f7Saurabh Shah } 10877c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 10887c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed if(!ctx || !list) { 10897c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 109065bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed return false; 10917c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 10927c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 109365bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed /* reset Invalidator */ 10944e9a6fcae996778da1343e41693788f27af450faSaurabh Shah if(idleInvalidator && !sIdleFallBack && mCurrentFrame.mdpCount) 109565bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed idleInvalidator->markForSleep(); 109665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed 109765bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 109885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah LayerProp *layerProp = ctx->layerProp[mDpy]; 10997c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 110085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int numHwLayers = ctx->listStats[mDpy].numAppLayers; 110185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah for(int i = 0; i < numHwLayers && mCurrentFrame.mdpCount; i++ ) 11027c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed { 110385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah if(mCurrentFrame.isFBComposed[i]) continue; 110485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 11055b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 110636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 110736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(!hnd) { 110836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s handle null", __FUNCTION__); 110936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah return false; 111036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah } 11117c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 111265bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 11137c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed continue; 11147c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 11157c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 111685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah int mdpIndex = mCurrentFrame.layerToMDP[i]; 111785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 11186371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran MdpPipeInfoHighRes& pipe_info = 111985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah *(MdpPipeInfoHighRes*)mCurrentFrame.mdpToLayer[mdpIndex].pipeInfo; 112085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah Rotator *rot = mCurrentFrame.mdpToLayer[mdpIndex].rot; 112136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 11226371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ovutils::eDest indexL = pipe_info.lIndex; 11236371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ovutils::eDest indexR = pipe_info.rIndex; 112485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah 112536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah int fd = hnd->fd; 112636963690317abceae79621f14ba41ff62b3ff489Saurabh Shah int offset = hnd->offset; 112736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 112836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if(rot) { 112936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah rot->queueBuffer(fd, offset); 113036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah fd = rot->getDstMemId(); 113136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah offset = rot->getDstOffset(); 113236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah } 11336371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran 11346371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran //************* play left mixer ********** 11356371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(indexL != ovutils::OV_INVALID) { 11366371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ovutils::eDest destL = (ovutils::eDest)indexL; 113736963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 113885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah using pipe: %d", __FUNCTION__, layer, hnd, indexL ); 113936963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ov.queueBuffer(fd, offset, destL)) { 114036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: queueBuffer failed for left mixer", __FUNCTION__); 114136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah return false; 11427c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 11436371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran } 11447c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 11456371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran //************* play right mixer ********** 11466371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran if(indexR != ovutils::OV_INVALID) { 11476371fcefbcaf155e7402b3a7343d800470631d04Jeykumar Sankaran ovutils::eDest destR = (ovutils::eDest)indexR; 114836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 114985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah using pipe: %d", __FUNCTION__, layer, hnd, indexR ); 115036963690317abceae79621f14ba41ff62b3ff489Saurabh Shah if (!ov.queueBuffer(fd, offset, destR)) { 115136963690317abceae79621f14ba41ff62b3ff489Saurabh Shah ALOGE("%s: queueBuffer failed for right mixer", __FUNCTION__); 115236963690317abceae79621f14ba41ff62b3ff489Saurabh Shah return false; 11537c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 11547c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 115536963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 115665bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 11577c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed } 115836963690317abceae79621f14ba41ff62b3ff489Saurabh Shah 115965bb464dab7f1b35ffd4dda11a3d16885bbadf2dNaseer Ahmed return true; 11607c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed} 11617c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed}; //namespace 11627c958d445fe88a82eedbd1b887cd1e474a7526b1Naseer Ahmed 1163