hwc_mdpcomp.cpp revision 0114e85754fb37f4f0eb042fb682b41fd74aa4b5
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" 22c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 23c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmednamespace qhwc { 24c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmednamespace ovutils = overlay::utils; 26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/****** Class MDPComp ***********/ 27c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 2816791f95b2570b9d48fa360875676e9c8559c0a1Naseer AhmedMDPComp::eState MDPComp::sMDPCompState = MDPCOMP_OFF; 2916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedstruct MDPComp::FrameInfo MDPComp::sCurrentFrame; 30c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 3316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sEnabled = false; 3416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedint MDPComp::sActiveMax = 0; 3516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::sSecuredVid = false; 36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::deinit() { 38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //XXX: Tear down MDP comp state 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 4116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::isSkipPresent (hwc_context_t *ctx) { 4216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return ctx->listStats[HWC_DISPLAY_PRIMARY].skipCount; 4316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}; 4416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 4516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::isYuvPresent (hwc_context_t *ctx) { 4616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return ctx->listStats[HWC_DISPLAY_PRIMARY].yuvCount; 4716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed}; 48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 50c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 51c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 52c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 53c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 56c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 57359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 58c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 59c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 60c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 61c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 62c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 63359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 64c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 65c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 661409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmedvoid MDPComp::reset(hwc_context_t *ctx, hwc_display_contents_1_t* list ) { 671409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed //Reset flags and states 681409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed unsetMDPCompLayerFlags(ctx, list); 69c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sCurrentFrame.count = 0; 7016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(sCurrentFrame.pipeLayer) { 7116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed free(sCurrentFrame.pipeLayer); 7216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sCurrentFrame.pipeLayer = NULL; 73b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed } 74c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 75c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 76660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::print_info(hwc_layer_1_t* layer) 77c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 78c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 79c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 80c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 81c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_l = sourceCrop.left; 82c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_t = sourceCrop.top; 83c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_r = sourceCrop.right; 84c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_b = sourceCrop.bottom; 85c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 86c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_l = displayFrame.left; 87c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_t = displayFrame.top; 88c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_r = displayFrame.right; 89c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_b = displayFrame.bottom; 90c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 91c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "src:[%d,%d,%d,%d] (%d x %d) \ 92c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst:[%d,%d,%d,%d] (%d x %d)", 93c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed s_l, s_t, s_r, s_b, (s_r - s_l), (s_b - s_t), 94c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed d_l, d_t, d_r, d_b, (d_r - d_l), (d_b - d_t)); 95c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 9616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 9716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedvoid MDPComp::setVidInfo(hwc_layer_1_t *layer, ovutils::eMdpFlags &mdpFlags) { 9816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 9916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 10016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isSecureBuffer(hnd)) { 10116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 10216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sSecuredVid = true; 10316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 10416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 10516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 106c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 109660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::prepare(hwc_context_t *ctx, hwc_layer_1_t *layer, 11016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& mdp_info) { 111c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 112c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int nPipeIndex = mdp_info.index; 113c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 114c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (ctx) { 115c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 116c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 117c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 11816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 119c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!hnd) { 121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: layer handle is NULL", __FUNCTION__); 122c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 123c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 12516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int hw_w = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 12616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int hw_h = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 127c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 128c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 129c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 130c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 131c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed const int src_w = sourceCrop.right - sourceCrop.left; 132c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed const int src_h = sourceCrop.bottom - sourceCrop.top; 133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t crop = sourceCrop; 135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int crop_w = crop.right - crop.left; 136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int crop_h = crop.bottom - crop.top; 137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t dst = displayFrame; 139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int dst_w = dst.right - dst.left; 140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int dst_h = dst.bottom - dst.top; 141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(dst.left < 0 || dst.top < 0 || 143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst.right > hw_w || dst.bottom > hw_h) { 144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: Destination has negative coordinates", 145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed __FUNCTION__); 1469a678455a788dc76a43ad93459ae6a792f0fd114Saurabh Shah qhwc::calculate_crop_rects(crop, dst, hw_w, hw_h, 0); 147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 148c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Update calulated width and height 149c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed crop_w = crop.right - crop.left; 150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed crop_h = crop.bottom - crop.top; 151c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 152c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_w = dst.right - dst.left; 153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_h = dst.bottom - dst.top; 154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 155c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 156c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if( (dst_w > hw_w)|| (dst_h > hw_h)) { 157c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: Dest rect exceeds FB", __FUNCTION__); 158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed print_info(layer); 159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_w = hw_w; 160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_h = hw_h; 161c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 163c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // Determine pipe to set based on pipe index 16416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::eDest dest = (ovutils::eDest)mdp_info.index; 165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eZorder zOrder = ovutils::ZORDER_0; 167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 16816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(mdp_info.zOrder == 0 ) { 169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder = ovutils::ZORDER_0; 17016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } else if(mdp_info.zOrder == 1 ) { 171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder = ovutils::ZORDER_1; 17216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } else if(mdp_info.zOrder == 2 ) { 173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder = ovutils::ZORDER_2; 17416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } else if(mdp_info.zOrder == 3) { 17516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed zOrder = ovutils::ZORDER_3; 176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // Order order order 179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setSource - just setting source 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setParameter - changes src w/h/f accordingly 181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setCrop - ROI - src_rect 182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setPosition - dst_rect 183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // commit - commit changes to mdp driver 184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // queueBuffer - not here, happens when draw is called 185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 186c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size); 18716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 18816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE; 18916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 19016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isYuvBuffer(hnd)) 19116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed setVidInfo(layer, mdpFlags); 19216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 193a79e534d42353d8e75b668f5e77b6f6357a08e07Saurabh Shah ovutils::setMdpFlags(mdpFlags,ovutils::OV_MDP_BACKEND_COMPOSITION); 194b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah 195b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah if(layer->blending == HWC_BLENDING_PREMULT) { 196b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah ovutils::setMdpFlags(mdpFlags, 197b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah ovutils::OV_MDP_BLEND_FG_PREMULT); 198b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah } 199b5e3a690995208ad018a083456d6a05628300e92Saurabh Shah 20016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::eTransform orient = overlay::utils::OVERLAY_TRANSFORM_0 ; 201d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah 20216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layer->transform & HWC_TRANSFORM_ROT_90)) { 20316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(layer->transform & HWC_TRANSFORM_FLIP_H) { 20416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_H); 20516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 206d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah 20716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(layer->transform & HWC_TRANSFORM_FLIP_V) { 20816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_FLIP_V); 20916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 21016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } else { 21116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed orient = static_cast<ovutils::eTransform>(layer->transform); 21216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 213d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah 214c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::PipeArgs parg(mdpFlags, 215c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed info, 216c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder, 21716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::IS_FG_OFF, 218c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::ROT_FLAG_DISABLED); 219c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 22016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ov.setSource(parg, dest); 22116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 22216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ov.setTransform(orient, dest); 223c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 224c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::Dim dcrop(crop.left, crop.top, crop_w, crop_h); 22516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ov.setCrop(dcrop, dest); 226c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::Dim dim(dst.left, dst.top, dst_w, dst_h); 22816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ov.setPosition(dim, dest); 229c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP set: crop[%d,%d,%d,%d] dst[%d,%d,%d,%d] \ 23116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed nPipe: %d zorder: %d",__FUNCTION__, dcrop.x, 232c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dcrop.y,dcrop.w, dcrop.h, dim.x, dim.y, dim.w, dim.h, 23316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed mdp_info.index, mdp_info.zOrder); 234c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 235c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.commit(dest)) { 236c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: commit failed", __FUNCTION__); 237c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 238c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 239c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 240c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 241c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 242c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 243c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 244c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * MDPComp not possible when 245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 1. We have more than sMaxLayers 246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 2. External display connected 247c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 3. Composition is triggered by 248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Idle timer expiry 249c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 4. Rotation is needed 250c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 5. Overlay in use 251c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 252c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 25316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::isDoable(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Number of layers 2552e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int numAppLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers; 25616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 25716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(numAppLayers < 1 || numAppLayers > (uint32_t)sActiveMax) { 258c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: Unsupported number of layers",__FUNCTION__); 259c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 260c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 261c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 26216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isSecuring(ctx)) { 26316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: MDP securing is active", __FUNCTION__); 26416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 26516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 26616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 2670114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed if(ctx->mSecureMode) 2680114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed return false; 2690114e85754fb37f4f0eb042fb682b41fd74aa4b5Naseer Ahmed 27016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed //Check for skip layers 27116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isSkipPresent(ctx)) { 27216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Skip layers are present",__FUNCTION__); 2736d41cb36a5f965bb6e5d6e0a6391f97ded56d39dSaurabh Shah return false; 274c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 275c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 276c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //FB composition on idle timeout 277c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(sIdleFallBack) { 27816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sIdleFallBack = false; 279c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__); 280c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 281c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 283d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah //MDP composition is not efficient if layer needs rotator. 2842e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for(int i = 0; i < numAppLayers; ++i) { 285d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah // As MDP h/w supports flip operation, use MDP comp only for 286d7dd5e35374e461d250dd8cc430a47624d6485c7Saurabh Shah // 180 transforms. Fail for any transform involving 90 (90, 270). 28716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[i]; 28816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 28916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if((layer->transform & HWC_TRANSFORM_ROT_90) && !isYuvBuffer(hnd)) { 29016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 29116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 292c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 293c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 294c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 295c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 296c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 29716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedvoid MDPComp::setMDPCompLayerFlags(hwc_context_t *ctx, 29816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t* list) { 29916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed LayerProp *layerProp = ctx->layerProp[HWC_DISPLAY_PRIMARY]; 300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 30116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for(int index = 0 ; index < sCurrentFrame.count; index++ ) { 30216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &(list->hwLayers[index]); 30316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[index].mFlags |= HWC_MDPCOMP; 30416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layer->compositionType = HWC_OVERLAY; 30516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layer->hints |= HWC_HINT_CLEAR_FB; 306c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 307c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 308c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 30916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedint MDPComp::getMdpPipe(hwc_context_t *ctx, ePipeType type){ 31016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 31116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int mdp_pipe = -1; 312c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 31316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed switch(type) { 31416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case MDPCOMP_OV_ANY: 31516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case MDPCOMP_OV_RGB: 31616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, HWC_DISPLAY_PRIMARY); 31716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(mdp_pipe != ovutils::OV_INVALID) { 31816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return mdp_pipe; 319c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 320c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 32116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(type == MDPCOMP_OV_RGB) { 32216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed //Requested only for RGB pipe 32316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return -1; 324c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 32516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed case MDPCOMP_OV_VG: 32616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed mdp_pipe = ov.nextPipe(ovutils::OV_MDP_PIPE_VG, HWC_DISPLAY_PRIMARY); 32716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(mdp_pipe != ovutils::OV_INVALID) { 32816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return mdp_pipe; 329c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 33016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return -1; 33116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed default: 33216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE("%s: Invalid pipe type",__FUNCTION__); 33316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return -1; 33416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed }; 335c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 336c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 33716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::allocLayerPipes(hwc_context_t *ctx, 3382e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah hwc_display_contents_1_t* list, 33916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed FrameInfo& currentFrame) { 34016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 34116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 342c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 3432e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int layer_count = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers; 344c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 34516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.count = layer_count; 346c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 34716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.pipeLayer = (PipeLayerPair*) 34816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed malloc(sizeof(PipeLayerPair) * currentFrame.count); 349c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 35016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(isYuvPresent(ctx)) { 35116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int nYuvIndex = ctx->listStats[HWC_DISPLAY_PRIMARY].yuvIndex; 35216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[nYuvIndex]; 35316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed PipeLayerPair& info = currentFrame.pipeLayer[nYuvIndex]; 35416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& pipe_info = info.pipeIndex; 35516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_VG); 35616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(pipe_info.index < 0) { 35716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for Videos", 35816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed __FUNCTION__); 35916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 360c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 36116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = nYuvIndex; 362c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 363c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 36416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 36516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(index == ctx->listStats[HWC_DISPLAY_PRIMARY].yuvIndex ) 36616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed continue; 367c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 36816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[index]; 36916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed PipeLayerPair& info = currentFrame.pipeLayer[index]; 37016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& pipe_info = info.pipeIndex; 37116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.index = getMdpPipe(ctx, MDPCOMP_OV_ANY); 37216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(pipe_info.index < 0) { 37316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Unable to get pipe for UI", __FUNCTION__); 37416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 37516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 37616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed pipe_info.zOrder = index; 377c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 378c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 379c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 380c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 381660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::setup(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 382c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int nPipeIndex, vsync_wait, isFG; 3832e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int numHwLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers; 384c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 38516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed FrameInfo ¤tFrame = sCurrentFrame; 38616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.count = 0; 387c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 38816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(currentFrame.pipeLayer) { 38916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed free(currentFrame.pipeLayer); 39016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.pipeLayer = NULL; 391b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed } 392b2fa7edbf5150e6bdc25b1d37dfd5e14ad571ae9Naseer Ahmed 393c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 394c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid context", __FUNCTION__); 395c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 396c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 397c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 39816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!allocLayerPipes(ctx, list, currentFrame)) { 39916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed //clean current frame data 40016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.count = 0; 401c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 40216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(currentFrame.pipeLayer) { 40316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed free(currentFrame.pipeLayer); 40416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed currentFrame.pipeLayer = NULL; 40516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 406c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 40716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(), "%s: Falling back to FB", __FUNCTION__); 40816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 40916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 410c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 41116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed for (int index = 0 ; index < currentFrame.count; index++) { 41216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[index]; 41316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& cur_pipe = currentFrame.pipeLayer[index].pipeIndex; 414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if( prepare(ctx, layer, cur_pipe) != 0 ) { 416c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: MDPComp failed to configure overlay for \ 417c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer %d with pipe index:%d",__FUNCTION__, 418c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed index, cur_pipe.index); 419c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 420c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 421c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 422c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 423c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 424c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 42516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedvoid MDPComp::unsetMDPCompLayerFlags(hwc_context_t* ctx, 42616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t* list) 427c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 42816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed LayerProp *layerProp = ctx->layerProp[HWC_DISPLAY_PRIMARY]; 42916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for (int index = 0 ; index < sCurrentFrame.count; index++) { 43116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(layerProp[index].mFlags & HWC_MDPCOMP) { 43216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[index].mFlags &= ~HWC_MDPCOMP; 433c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 4341409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed 43516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(list->hwLayers[index].compositionType == HWC_OVERLAY) { 43616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed list->hwLayers[index].compositionType = HWC_FRAMEBUFFER; 4371409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed } 438c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 439c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 440c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 44116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 442c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 44316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!isEnabled() || !isUsed()) { 44416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp not configured", __FUNCTION__); 44516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 446c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 447c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 448c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 449c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 45016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 451c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 452c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 45316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed /* reset Invalidator */ 45416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(idleInvalidator) 45516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->markForSleep(); 45616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 45716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 45816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed LayerProp *layerProp = ctx->layerProp[HWC_DISPLAY_PRIMARY]; 459c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 4602e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah int numHwLayers = ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers; 4612e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah for(int i = 0; i < numHwLayers; i++ ) 462c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 463660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 464c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 46516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!(layerProp[i].mFlags & HWC_MDPCOMP)) { 466c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 467c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 468c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 46916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed MdpPipeInfo& pipe_info = 47016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sCurrentFrame.pipeLayer[i].pipeIndex; 471c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int index = pipe_info.index; 472c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 473c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(index < 0) { 474c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, index); 47516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 476c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 477c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 47816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovutils::eDest dest = (ovutils::eDest)index; 479c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 480c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (ctx ) { 481c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 482c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!hnd) { 483c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s handle null", __FUNCTION__); 48416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 485c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 486c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 487c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed using pipe: %d", __FUNCTION__, layer, 489c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hnd, index ); 490c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 491c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) { 492c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 49316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 494c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 495c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 49616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 49716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed layerProp[i].mFlags &= ~HWC_MDPCOMP; 498c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 49916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 500c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 501c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 50216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed/* 50316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed * Sets up BORDERFILL as default base pipe and detaches RGB0. 50416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed * Framebuffer is always updated using PLAY ioctl. 50516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed */ 506c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 50716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::setupBasePipe(hwc_context_t *ctx) { 50816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 50916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int fb_stride = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].stride; 51016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int fb_width = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 51116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int fb_height = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 51216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed int fb_fd = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].fd; 51316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 51416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed mdp_overlay ovInfo; 51516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed msmfb_overlay_data ovData; 51616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed memset(&ovInfo, 0, sizeof(mdp_overlay)); 51716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed memset(&ovData, 0, sizeof(msmfb_overlay_data)); 51816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 51916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.src.format = MDP_RGB_BORDERFILL; 52016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.src.width = fb_width; 52116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.src.height = fb_height; 52216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.src_rect.w = fb_width; 52316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.src_rect.h = fb_height; 52416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.dst_rect.w = fb_width; 52516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.dst_rect.h = fb_height; 52616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovInfo.id = MSMFB_NEW_REQUEST; 52716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 52816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if (ioctl(fb_fd, MSMFB_OVERLAY_SET, &ovInfo) < 0) { 52916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE("Failed to call ioctl MSMFB_OVERLAY_SET err=%s", 53016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed strerror(errno)); 531c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 532c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 533c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 53416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ovData.id = ovInfo.id; 53516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if (ioctl(fb_fd, MSMFB_OVERLAY_PLAY, &ovData) < 0) { 53616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE("Failed to call ioctl MSMFB_OVERLAY_PLAY err=%s", 53716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed strerror(errno)); 53816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 53916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 54016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return true; 54116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed} 542c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 54316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::init(hwc_context_t *ctx) { 544c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 54516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!ctx) { 54616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 54716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 548c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 54916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 55016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if(!setupBasePipe(ctx)) { 55116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE("%s: Failed to setup primary base pipe", __FUNCTION__); 55216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed return false; 55316791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed } 55416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed char property[PROPERTY_VALUE_MAX]; 556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 55716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sEnabled = false; 55816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed if((property_get("persist.hwc.mdpcomp.enable", property, NULL) > 0) && 55916791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed (!strncmp(property, "1", PROPERTY_VALUE_MAX ) || 56016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed (!strncasecmp(property,"true", PROPERTY_VALUE_MAX )))) { 56116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sEnabled = true; 562c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 563c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 564c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sDebugLogs = false; 565c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 566c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(atoi(property) != 0) 567c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sDebugLogs = true; 568c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 569c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 570c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed unsigned long idle_timeout = DEFAULT_IDLE_TIME; 571c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 572c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(atoi(property) != 0) 573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed idle_timeout = atoi(property); 574c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 575c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 576c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //create Idle Invalidator 577c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 578c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 579c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(idleInvalidator == NULL) { 580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__); 581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 58216791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed idleInvalidator->init(timeout_handler, ctx, idle_timeout); 583c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 584c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 585c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 586c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 58716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmedbool MDPComp::configure(hwc_context_t *ctx, 58816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed hwc_display_contents_1_t* list) { 589c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 590c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!isEnabled()) { 59116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed ALOGE_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 592c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 593c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 594c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 59516791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed overlay::Overlay& ov = *ctx->mOverlay; 59616791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 59716791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sActiveMax = ov.availablePipes(); 59816791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed 599c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed bool isMDPCompUsed = true; 60016791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed bool doable = isDoable(ctx, list); 601c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 602c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(doable) { 603c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(setup(ctx, list)) { 60416791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed setMDPCompLayerFlags(ctx, list); 605c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 606c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp Failed",__FUNCTION__); 607c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isMDPCompUsed = false; 608c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 610c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF( isDebug(),"%s: MDP Comp not possible[%d]",__FUNCTION__, 611c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed doable); 612c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isMDPCompUsed = false; 613c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 614c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 615c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Reset states 616c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!isMDPCompUsed) { 617c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Reset current frame 618c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed reset(ctx, list); 619c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 620c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 62116791f95b2570b9d48fa360875676e9c8559c0a1Naseer Ahmed sMDPCompState = isMDPCompUsed ? MDPCOMP_ON : MDPCOMP_OFF; 622c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 623c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return isMDPCompUsed; 624c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 625c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 626c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 627