hwc_mdpcomp.cpp revision 8b2d50f3c665329517352269a687bdf562b2cc6d
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 2bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved. 3c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Not a Contribution, Apache license notifications and license are retained 4c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * for attribution purposes only. 5c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 6c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 7c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * you may not use this file except in compliance with the License. 8c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * You may obtain a copy of the License at 9c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 10c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 11c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 12c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 13c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 14c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * See the License for the specific language governing permissions and 16c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * limitations under the License. 17c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 18c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 19c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_mdpcomp.h" 2016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed#include <sys/ioctl.h> 21bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah#include "external.h" 22591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan#include "qdMetaData.h" 238b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan#include "mdp_version.h" 24c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmednamespace qhwc { 26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 28c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 29c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//==============MDPComp======================================================== 30c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 33c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 3416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 36c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh ShahMDPComp* MDPComp::getObject(const int& width) { 37c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //For now. Later check for width > 2048 38c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return new MDPCompLowRes(); 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 41c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::dump(android::String8& buf) 42c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah{ 43c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dumpsys_log(buf, " MDP Composition: "); 44c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dumpsys_log(buf, "MDPCompState=%d\n", mState); 45c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //XXX: Log more info 46c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 47c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 48c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::init(hwc_context_t *ctx) { 49c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 50c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!ctx) { 51c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 52c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 53c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 54c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 55c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!setupBasePipe(ctx)) { 56c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 57c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 58c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 59c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 60c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah char property[PROPERTY_VALUE_MAX]; 61c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 62c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = false; 63c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 64c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 65c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 66c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sEnabled = true; 67c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 68c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 69c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = false; 70c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 71c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 72c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah sDebugLogs = true; 73c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 74c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 75c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah unsigned long idle_timeout = DEFAULT_IDLE_TIME; 76c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 77c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(atoi(property) != 0) 78c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idle_timeout = atoi(property); 79c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 80c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 81c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //create Idle Invalidator 82c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator = IdleInvalidator::getInstance(); 83c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 84c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(idleInvalidator == NULL) { 85c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__); 86c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else { 87c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah idleInvalidator->init(timeout_handler, ctx, idle_timeout); 88c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 89c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 90c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 91c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 92c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 93c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 94c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 95c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 96c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 97c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 98c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 99c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 100359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 101c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 102c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 103c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 106359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 109c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 110c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_display_contents_1_t* list) { 111c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 112c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah LayerProp *layerProp = ctx->layerProp[dpy]; 113c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 114c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah for(int index = 0; index < ctx->listStats[dpy].numAppLayers; index++ ) { 115c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_layer_1_t* layer = &(list->hwLayers[index]); 116c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah layerProp[index].mFlags |= HWC_MDPCOMP; 117c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah layer->compositionType = HWC_OVERLAY; 118c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah layer->hints |= HWC_HINT_CLEAR_FB; 119b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed } 120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 122c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::unsetMDPCompLayerFlags(hwc_context_t* ctx, 123c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_display_contents_1_t* list) { 124c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 125c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah LayerProp *layerProp = ctx->layerProp[dpy]; 126c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 127c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah for (int index = 0 ; 128c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah index < ctx->listStats[dpy].numAppLayers; index++) { 129c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(layerProp[index].mFlags & HWC_MDPCOMP) { 130c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah layerProp[index].mFlags &= ~HWC_MDPCOMP; 131c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 132c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 133c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(list->hwLayers[index].compositionType == HWC_OVERLAY) { 134c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah list->hwLayers[index].compositionType = HWC_FRAMEBUFFER; 135c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 136c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 13816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 139c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah/* 140c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Sets up BORDERFILL as default base pipe and detaches RGB0. 141c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah * Framebuffer is always updated using PLAY ioctl. 142c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah */ 143c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 144c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 145c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_stride = ctx->dpyAttr[dpy].stride; 146c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_width = ctx->dpyAttr[dpy].xres; 147c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_height = ctx->dpyAttr[dpy].yres; 148c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int fb_fd = ctx->dpyAttr[dpy].fd; 149c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 150c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_overlay ovInfo; 151c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah msmfb_overlay_data ovData; 152c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovInfo, 0, sizeof(mdp_overlay)); 153c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah memset(&ovData, 0, sizeof(msmfb_overlay_data)); 154c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 155c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.format = MDP_RGB_BORDERFILL; 156c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.width = fb_width; 157c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src.height = fb_height; 158c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.w = fb_width; 159c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.src_rect.h = fb_height; 160c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.w = fb_width; 161c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.dst_rect.h = fb_height; 162c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovInfo.id = MSMFB_NEW_REQUEST; 163c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 164c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 165c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 166c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah strerror(errno)); 167c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 168c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 169c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 170c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovData.id = ovInfo.id; 171c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 172c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 173c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah strerror(errno)); 174c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 175c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 176c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 177c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 178c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 179c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPComp::printInfo(hwc_layer_1_t* layer) { 180c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_rect_t sourceCrop = layer->sourceCrop; 181c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_rect_t displayFrame = layer->displayFrame; 182c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 183c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int s_l = sourceCrop.left; 184c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int s_t = sourceCrop.top; 185c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int s_r = sourceCrop.right; 186c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int s_b = sourceCrop.bottom; 187c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 188c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int d_l = displayFrame.left; 189c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int d_t = displayFrame.top; 190c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int d_r = displayFrame.right; 191c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int d_b = displayFrame.bottom; 192c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 193c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGD_IF(isDebug(), "src:[%d,%d,%d,%d] (%d x %d) \ 194c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dst:[%d,%d,%d,%d] (%d x %d)", 195c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah s_l, s_t, s_r, s_b, (s_r - s_l), (s_b - s_t), 196c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah d_l, d_t, d_r, d_b, (d_r - d_l), (d_b - d_t)); 197c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 198c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 199c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah//=============MDPCompLowRes=================================================== 200c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPCompLowRes::reset(hwc_context_t *ctx, 201c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_display_contents_1_t* list ) { 202c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //Reset flags and states 203c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah unsetMDPCompLayerFlags(ctx, list); 204c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mCurrentFrame.count = 0; 205c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(mCurrentFrame.pipeLayer) { 206c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah free(mCurrentFrame.pipeLayer); 207c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mCurrentFrame.pipeLayer = NULL; 208c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 209c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah} 210c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 211c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahvoid MDPCompLowRes::setVidInfo(hwc_layer_1_t *layer, 212c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::eMdpFlags &mdpFlags) { 21316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 214591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan MetaData_t *metadata = (MetaData_t *)hnd->base_metadata; 21516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 21616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isSecureBuffer(hnd)) { 21716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 21816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 21916fdbfa1b3314c14b63f91ead7044bcd4ad28a3eRamkumar Radhakrishnan if(metadata && (metadata->operation & PP_PARAM_INTERLACED) && 22016fdbfa1b3314c14b63f91ead7044bcd4ad28a3eRamkumar Radhakrishnan metadata->interlaced) { 221591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_DEINTERLACE); 222591f83eb35f33cf108720d9bb30cb56933e1e724Ramkumar Radhakrishnan } 22316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 22416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 225c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 226c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 228c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer, 229c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah MdpPipeInfo& mdp_info) { 230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int nPipeIndex = mdp_info.index; 231c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 232c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah private_handle_t *hnd = (private_handle_t *)layer->handle; 233c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 234c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 235c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!hnd) { 236c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: layer handle is NULL", __FUNCTION__); 237c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return -1; 238c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 239c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 240c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int hw_w = ctx->dpyAttr[dpy].xres; 241c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int hw_h = ctx->dpyAttr[dpy].yres; 242c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 243c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_rect_t sourceCrop = layer->sourceCrop; 244c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_rect_t displayFrame = layer->displayFrame; 245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 246c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int src_w = sourceCrop.right - sourceCrop.left; 247c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int src_h = sourceCrop.bottom - sourceCrop.top; 248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 249c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_rect_t crop = sourceCrop; 250c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int crop_w = crop.right - crop.left; 251c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int crop_h = crop.bottom - crop.top; 252c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 253c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_rect_t dst = displayFrame; 254c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int dst_w = dst.right - dst.left; 255c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int dst_h = dst.bottom - dst.top; 256c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 257c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(dst.left < 0 || dst.top < 0 || 258c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dst.right > hw_w || dst.bottom > hw_h) { 259c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGD_IF(isDebug(),"%s: Destination has negative coordinates", 260c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah __FUNCTION__); 261c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah qhwc::calculate_crop_rects(crop, dst, hw_w, hw_h, 0); 262c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 263c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //Update calulated width and height 264c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah crop_w = crop.right - crop.left; 265c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah crop_h = crop.bottom - crop.top; 266c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 267c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dst_w = dst.right - dst.left; 268c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dst_h = dst.bottom - dst.top; 269c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 270c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 271c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if( (dst_w > hw_w)|| (dst_h > hw_h)) { 272c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGD_IF(isDebug(),"%s: Dest rect exceeds FB", __FUNCTION__); 273c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah printInfo(layer); 274c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dst_w = hw_w; 275c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dst_h = hw_h; 276c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 277c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 278c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // Determine pipe to set based on pipe index 279c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::eDest dest = (ovutils::eDest)mdp_info.index; 280c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 281c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::eZorder zOrder = ovutils::ZORDER_0; 282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 283c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(mdp_info.zOrder == 0 ) { 284c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah zOrder = ovutils::ZORDER_0; 285c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else if(mdp_info.zOrder == 1 ) { 286c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah zOrder = ovutils::ZORDER_1; 287c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else if(mdp_info.zOrder == 2 ) { 288c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah zOrder = ovutils::ZORDER_2; 289c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else if(mdp_info.zOrder == 3) { 290c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah zOrder = ovutils::ZORDER_3; 291c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 292c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 293c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // Order order order 294c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // setSource - just setting source 295c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // setParameter - changes src w/h/f accordingly 296c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // setCrop - ROI - src_rect 297c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // setPosition - dst_rect 298c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // commit - commit changes to mdp driver 299c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah // queueBuffer - not here, happens when draw is called 300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 301c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size); 302c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 303c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE; 304c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 305c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(isYuvBuffer(hnd)) 306c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah setVidInfo(layer, mdpFlags); 30716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 308c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::setMdpFlags(mdpFlags,ovutils::OV_MDP_BACKEND_COMPOSITION); 30916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 310c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(layer->blending == HWC_BLENDING_PREMULT) { 311c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::setMdpFlags(mdpFlags, 312c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::OV_MDP_BLEND_FG_PREMULT); 313c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 31416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 315c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::eTransform orient = overlay::utils::OVERLAY_TRANSFORM_0 ; 316b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah 317c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!(layer->transform & HWC_TRANSFORM_ROT_90)) { 318c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(layer->transform & HWC_TRANSFORM_FLIP_H) { 319c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H); 320b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah } 321b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah 322c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(layer->transform & HWC_TRANSFORM_FLIP_V) { 323c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_V); 32416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 325c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else { 326c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah orient = static_cast<ovutils::eTransform>(layer->transform); 327c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 328d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah 3298b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan ovutils::eRotFlags rotFlags = ovutils::ROT_FLAGS_NONE; 3308b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan if(isYuvBuffer(hnd) && (ctx->mMDP.version >= qdutils::MDP_V4_2 && 3318b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan ctx->mMDP.version < qdutils::MDSS_V5)) { 3328b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan rotFlags = ovutils::ROT_DOWNSCALE_ENABLED; 3338b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan } 3348b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan 335c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::PipeArgs parg(mdpFlags, 336c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah info, 337c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah zOrder, 338c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::IS_FG_OFF, 3398b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan rotFlags); 340c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 341c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ov.setSource(parg, dest); 34216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 343c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ov.setTransform(orient, dest); 344c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 345c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::Dim dcrop(crop.left, crop.top, crop_w, crop_h); 346c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ov.setCrop(dcrop, dest); 347c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 348c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ovutils::Dim dim(dst.left, dst.top, dst_w, dst_h); 349c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ov.setPosition(dim, dest); 350c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 351c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGD_IF(isDebug(),"%s: MDP set: crop[%d,%d,%d,%d] dst[%d,%d,%d,%d] \ 352c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah nPipe: %d zorder: %d",__FUNCTION__, dcrop.x, 353c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah dcrop.y,dcrop.w, dcrop.h, dim.x, dim.y, dim.w, dim.h, 354c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_info.index, mdp_info.zOrder); 355c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 356c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if (!ov.commit(dest)) { 357c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: commit failed", __FUNCTION__); 358c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return -1; 359c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 360c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 361c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 362c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 363c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 364c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * MDPComp not possible when 365c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 1. We have more than sMaxLayers 366c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 2. External display connected 367c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 3. Composition is triggered by 368c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Idle timer expiry 369c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 4. Rotation is needed 370c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 5. Overlay in use 371c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 372c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 373c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::isDoable(hwc_context_t *ctx, 374c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_display_contents_1_t* list) { 375c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Number of layers 376c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 377c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int numAppLayers = ctx->listStats[dpy].numAppLayers; 37816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 379c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah overlay::Overlay& ov = *ctx->mOverlay; 380c500638565ae6b65a7007c5d1ad73f1ec5c7e53cJeykumar Sankaran int availablePipes = ov.availablePipes(dpy); 381c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah 382c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(numAppLayers < 1 || numAppLayers > (uint32_t)availablePipes) { 383c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: Unsupported number of layers",__FUNCTION__); 384c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 385c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 386c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 387413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar if(ctx->mExtDispConfiguring) { 388413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar ALOGD_IF( isDebug(),"%s: External Display connection is pending", 389413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar __FUNCTION__); 390413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar return false; 391413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar } 392413701aeb9879f1b9ae4401def52199c6950191eAmara Venkata Mastan Manoj Kumar 39316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isSecuring(ctx)) { 39416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 39516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 39616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 39716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 3980114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed if(ctx->mSecureMode) 3990114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed return false; 4000114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed 40116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed //Check for skip layers 402c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(isSkipPresent(ctx, dpy)) { 40316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Skip layers are present",__FUNCTION__); 4046d41cb36a5f965bb6e5d6e0a6391f97ded56d39dSaurabh Shah return false; 405c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 406c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 407c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(ctx->listStats[dpy].needsAlphaScale) { 40833650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed ALOGD_IF(isDebug(), "%s: frame needs alpha downscaling",__FUNCTION__); 40933650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed return false; 41033650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed } 41133650f2bc6096f20fb3974f5d1f98cb60ed6bdf4Naseer Ahmed 412c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //FB composition on idle timeout 413c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(sIdleFallBack) { 41416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sIdleFallBack = false; 415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__); 416c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 417c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 418c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 419d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah //MDP composition is not efficient if layer needs rotator. 4202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for(int i = 0; i < numAppLayers; ++i) { 421d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah // As MDP h/w supports flip operation, use MDP comp only for 422d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah // 180 transforms. Fail for any transform involving 90 (90, 270). 42316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[i]; 42416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 42516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) { 42616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 42716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 428c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 429c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 431c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 432c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 433c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahint MDPCompLowRes::getMdpPipe(hwc_context_t *ctx, ePipeType type) { 434c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 43516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 43616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int mdp_pipe = -1; 437c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 43816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed switch(type) { 439c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah case MDPCOMP_OV_ANY: 440c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah case MDPCOMP_OV_RGB: 441c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, dpy); 442c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(mdp_pipe != ovutils::OV_INVALID) { 443c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return mdp_pipe; 444c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 445c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 446c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(type == MDPCOMP_OV_RGB) { 447c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //Requested only for RGB pipe 448c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return -1; 449c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 450c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah case MDPCOMP_OV_VG: 451c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_VG, dpy); 452c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(mdp_pipe != ovutils::OV_INVALID) { 453c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return mdp_pipe; 454c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 455c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return -1; 456c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah default: 457c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: Invalid pipe type",__FUNCTION__); 45816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return -1; 45916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed }; 460c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 461c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 462c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::allocLayerPipes(hwc_context_t *ctx, 4632e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t* list, 46416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed FrameInfo& currentFrame) { 465c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 46616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 467c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int layer_count = ctx->listStats[dpy].numAppLayers; 468c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 46916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.count = layer_count; 47016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.pipeLayer = (PipeLayerPair*) 471c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah malloc(sizeof(PipeLayerPair) * currentFrame.count); 472c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 473c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(isYuvPresent(ctx, dpy)) { 474c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int nYuvIndex = ctx->listStats[dpy].yuvIndex; 47516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 47616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed PipeLayerPair& info = currentFrame.pipeLayer[nYuvIndex]; 47716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& pipe_info = info.pipeIndex; 47816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG); 47916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(pipe_info.index < 0) { 48016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos", 481c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah __FUNCTION__); 48216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 483c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 48416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = nYuvIndex; 485c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 486c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 48716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 488c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(index == ctx->listStats[dpy].yuvIndex ) 48916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed continue; 490c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 49116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[index]; 49216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed PipeLayerPair& info = currentFrame.pipeLayer[index]; 49316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& pipe_info = info.pipeIndex; 49416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_ANY); 49516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(pipe_info.index < 0) { 49616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 49716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 49816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 49916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = index; 500c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 501c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 502c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 503c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 504c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::setup(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 505c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 506c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int nPipeIndex, vsync_wait, isFG; 507c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int numHwLayers = ctx->listStats[dpy].numAppLayers; 508c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 509c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah FrameInfo ¤tFrame = mCurrentFrame; 51016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.count = 0; 511c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 51216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(currentFrame.pipeLayer) { 51316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed free(currentFrame.pipeLayer); 51416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.pipeLayer = NULL; 515b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed } 516b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed 517c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 518c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGE("%s: invalid context", __FUNCTION__); 519c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return -1; 520c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 521c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 52216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!allocLayerPipes(ctx, list, currentFrame)) { 52316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed //clean current frame data 52416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.count = 0; 525c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 52616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(currentFrame.pipeLayer) { 52716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed free(currentFrame.pipeLayer); 52816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.pipeLayer = NULL; 52916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 530c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 53116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Falling back to FB", __FUNCTION__); 53216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 53316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 534c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 53516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for (int index = 0 ; index < currentFrame.count; index++) { 53616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[index]; 53716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& cur_pipe = currentFrame.pipeLayer[index].pipeIndex; 538c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 539c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(configure(ctx, layer, cur_pipe) != 0 ) { 540c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah ALOGD_IF(isDebug(), "%s: MDPComp failed to configure overlay for \ 541c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah layer %d with pipe index:%d",__FUNCTION__, 542c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah index, cur_pipe.index); 543c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return false; 5441409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed } 545c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 546c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return true; 547c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 548c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 549c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 550c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 55116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!isEnabled() || !isUsed()) { 55216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 55316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 554c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 557c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 55816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 559c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 560c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 56116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 56216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(idleInvalidator) 56316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 56416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 565c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah const int dpy = HWC_DISPLAY_PRIMARY; 56616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 567c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah LayerProp *layerProp = ctx->layerProp[dpy]; 568c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 569c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah int numHwLayers = ctx->listStats[dpy].numAppLayers; 5702e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for(int i = 0; i < numHwLayers; i++ ) 571c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 572660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 57416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 575c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 576c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 577c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 57816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& pipe_info = 579c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mCurrentFrame.pipeLayer[i].pipeIndex; 580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int index = pipe_info.index; 581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 582c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(index < 0) { 583c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, index); 58416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 585c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 586c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 58716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::eDest dest = (ovutils::eDest)index; 588c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 589c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (ctx ) { 590c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 591c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!hnd) { 592c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s handle null", __FUNCTION__); 59316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 594c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 595c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 596c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 597c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah using pipe: %d", __FUNCTION__, layer, 598c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hnd, index ); 599c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 600c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) { 601c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 60216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 603c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 604c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 60516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 60616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 607c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 60816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 610c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 611c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shahbool MDPCompLowRes::prepare(hwc_context_t *ctx, 612c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah hwc_display_contents_1_t* list) { 613c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!isEnabled()) { 61416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 615c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 616c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 617c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 61816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 619c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed bool isMDPCompUsed = true; 62016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed bool doable = isDoable(ctx, list); 621c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 622c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(doable) { 623c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(setup(ctx, list)) { 62416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed setMDPCompLayerFlags(ctx, list); 625c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 626c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp Failed",__FUNCTION__); 627c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isMDPCompUsed = false; 628c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 629c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } else { 630c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF( isDebug(),"%s: MDP Comp not possible[%d]",__FUNCTION__, 631c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah doable); 632c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isMDPCompUsed = false; 633c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 634c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 635c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah //Reset states 636c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah if(!isMDPCompUsed) { 637c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Reset current frame 638c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah reset(ctx, list); 639c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah } 64093138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 641c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah mState = isMDPCompUsed ? MDPCOMP_ON : MDPCOMP_OFF; 642c18b3a0ef41fe474fe37e2e1833ef1bb11c85b11Saurabh Shah return isMDPCompUsed; 64393138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed} 64493138887ec8fb0f232340c4fb852e3dbcb3542e4Naseer Ahmed 645c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 646c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 647