hwc_mdpcomp.cpp revision 359c544e1ca5ad76be326d9ee809e7bee51f94b4
1c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 2c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Copyright (C) 2012, Code Aurora Forum. 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" 20c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_qbuf.h" 21c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#include "hwc_external.h" 22c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 23c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#define SUPPORT_4LAYER 0 24c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 25c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmednamespace qhwc { 26c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 27c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/****** Class PipeMgr ***********/ 28c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 29c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid inline PipeMgr::reset() { 30c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mVGPipes = MAX_VG; 31c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mVGUsed = 0; 32c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mVGIndex = 0; 33c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBPipes = MAX_RGB; 34c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBUsed = 0; 35c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBIndex = MAX_VG; 36c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mTotalAvail = mVGPipes + mRGBPipes; 37c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed memset(&mStatus, 0x0 , sizeof(int)*mTotalAvail); 38c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 39c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 40c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint PipeMgr::req_for_pipe(int pipe_req) { 41c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 42c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed switch(pipe_req) { 43c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed case PIPE_REQ_VG: //VG 44c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mVGPipes){ 45c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mVGPipes--; 46c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mVGUsed++; 47c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mTotalAvail--; 48c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return PIPE_REQ_VG; 49c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 50c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed case PIPE_REQ_RGB: // RGB 51c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mRGBPipes) { 52c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBPipes--; 53c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBUsed++; 54c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mTotalAvail--; 55c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return PIPE_REQ_RGB; 56c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 57c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return PIPE_NONE; 58c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed case PIPE_REQ_FB: //FB 59c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mRGBPipes) { 60c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBPipes--; 61c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBUsed++; 62c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mTotalAvail--; 63c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mStatus[VAR_INDEX] = PIPE_IN_FB_MODE; 64c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return PIPE_REQ_FB; 65c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 66c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed default: 67c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed break; 68c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed }; 69c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return PIPE_NONE; 70c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 71c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 72c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint PipeMgr::assign_pipe(int pipe_pref) { 73c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed switch(pipe_pref) { 74c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed case PIPE_REQ_VG: //VG 75c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mVGUsed) { 76c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mVGUsed--; 77c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mStatus[mVGIndex] = PIPE_IN_COMP_MODE; 78c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return mVGIndex++; 79c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 80c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed case PIPE_REQ_RGB: //RGB 81c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mRGBUsed) { 82c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mRGBUsed--; 83c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mStatus[mRGBIndex] = PIPE_IN_COMP_MODE; 84c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return mRGBIndex++; 85c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 86c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed default: 87c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: PipeMgr:invalid case in pipe_mgr_assign", 88c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed __FUNCTION__); 89c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 90c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed }; 91c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 92c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 93c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/****** Class MDPComp ***********/ 94c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 95c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedMDPComp::State MDPComp::sMDPCompState = MDPCOMP_OFF; 96c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedstruct MDPComp::frame_info MDPComp::sCurrentFrame; 97c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedPipeMgr MDPComp::sPipeMgr; 98c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer AhmedIdleInvalidator *MDPComp::idleInvalidator = NULL; 99c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sIdleFallBack = false; 100c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::sDebugLogs = false; 101c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint MDPComp::sSkipCount = 0; 102c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint MDPComp::sMaxLayers = 0; 103c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 104c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::deinit() { 105c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //XXX: Tear down MDP comp state 106c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 107c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 108c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 109c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::timeout_handler(void *udata) { 110c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed struct hwc_context_t* ctx = (struct hwc_context_t*)(udata); 111c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 112c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 113c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: received empty data in timer callback", __FUNCTION__); 114c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 115c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 116c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 117359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall if(!ctx->proc) { 118c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: HWC proc not registered", __FUNCTION__); 119c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 120c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 121c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = true; 122c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* Trigger SF to redraw the current frame */ 123359c544e1ca5ad76be326d9ee809e7bee51f94b4Jesse Hall ctx->proc->invalidate(ctx->proc); 124c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 125c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 1261409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmedvoid MDPComp::reset(hwc_context_t *ctx, hwc_display_contents_1_t* list ) { 1271409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed //Reset flags and states 1281409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed unsetMDPCompLayerFlags(ctx, list); 1291409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed if(sMDPCompState == MDPCOMP_ON) { 1301409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed sMDPCompState = MDPCOMP_OFF_PENDING; 1311409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed } 1321409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed 133c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sCurrentFrame.count = 0; 134c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed free(sCurrentFrame.pipe_layer); 135c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sCurrentFrame.pipe_layer = NULL; 136c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 137c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Reset MDP pipes 138c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sPipeMgr.reset(); 139c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sPipeMgr.setStatus(VAR_INDEX, PIPE_IN_FB_MODE); 140c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 141c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER 142c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed configure_var_pipe(ctx); 143c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif 144c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 145c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 146660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::setLayerIndex(hwc_layer_1_t* layer, const int pipe_index) 147c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 148c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->flags &= ~HWC_MDPCOMP_INDEX_MASK; 149c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->flags |= pipe_index << MDPCOMP_INDEX_OFFSET; 150c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 151c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 152660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::getLayerIndex(hwc_layer_1_t* layer) 153c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 154c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int byp_index = -1; 155c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 156c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer->flags & HWC_MDPCOMP) { 157c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed byp_index = ((layer->flags & HWC_MDPCOMP_INDEX_MASK) >> 158c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed MDPCOMP_INDEX_OFFSET); 159c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed byp_index = (byp_index < sMaxLayers ? byp_index : -1 ); 160c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 161c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return byp_index; 162c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 163660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::print_info(hwc_layer_1_t* layer) 164c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 165c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 166c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 167c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 168c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_l = sourceCrop.left; 169c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_t = sourceCrop.top; 170c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_r = sourceCrop.right; 171c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int s_b = sourceCrop.bottom; 172c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 173c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_l = displayFrame.left; 174c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_t = displayFrame.top; 175c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_r = displayFrame.right; 176c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int d_b = displayFrame.bottom; 177c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 178c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "src:[%d,%d,%d,%d] (%d x %d) \ 179c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst:[%d,%d,%d,%d] (%d x %d)", 180c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed s_l, s_t, s_r, s_b, (s_r - s_l), (s_b - s_t), 181c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed d_l, d_t, d_r, d_b, (d_r - d_l), (d_b - d_t)); 182c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 183c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 184c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Configures pipe(s) for MDP composition 185c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 186660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::prepare(hwc_context_t *ctx, hwc_layer_1_t *layer, 187c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mdp_pipe_info& mdp_info) { 188c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 189c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int nPipeIndex = mdp_info.index; 190c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 191c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (ctx) { 192c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 193c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 194c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 195c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed overlay::Overlay& ov = *(ctx->mOverlay); 196c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 197c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!hnd) { 198c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: layer handle is NULL", __FUNCTION__); 199c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 200c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 201c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 202c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 203c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int hw_w = ctx->mFbDev->width; 204c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int hw_h = ctx->mFbDev->height; 205c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 206c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 207c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 208c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 209c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 210c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed const int src_w = sourceCrop.right - sourceCrop.left; 211c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed const int src_h = sourceCrop.bottom - sourceCrop.top; 212c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 213c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t crop = sourceCrop; 214c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int crop_w = crop.right - crop.left; 215c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int crop_h = crop.bottom - crop.top; 216c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 217c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t dst = displayFrame; 218c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int dst_w = dst.right - dst.left; 219c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int dst_h = dst.bottom - dst.top; 220c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 221c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //REDUNDANT ?? 222c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(hnd != NULL && 223c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed (hnd->flags & private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM )) { 224c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: failed due to non-pmem memory",__FUNCTION__); 225c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 226c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 227c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 228c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(dst.left < 0 || dst.top < 0 || 229c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst.right > hw_w || dst.bottom > hw_h) { 230c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: Destination has negative coordinates", 231c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed __FUNCTION__); 232c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 233c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed qhwc::calculate_crop_rects(crop, dst, hw_w, hw_h); 234c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 235c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Update calulated width and height 236c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed crop_w = crop.right - crop.left; 237c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed crop_h = crop.bottom - crop.top; 238c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 239c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_w = dst.right - dst.left; 240c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_h = dst.bottom - dst.top; 241c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 242c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 243c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if( (dst_w > hw_w)|| (dst_h > hw_h)) { 244c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: Dest rect exceeds FB", __FUNCTION__); 245c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed print_info(layer); 246c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_w = hw_w; 247c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dst_h = hw_h; 248c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 249c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 250c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // Determine pipe to set based on pipe index 251c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eDest dest = ovutils::OV_PIPE_ALL; 252c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (nPipeIndex == 0) { 253c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dest = ovutils::OV_PIPE0; 254c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if (nPipeIndex == 1) { 255c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dest = ovutils::OV_PIPE1; 256c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if (nPipeIndex == 2) { 257c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dest = ovutils::OV_PIPE2; 258c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 259c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 260c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eZorder zOrder = ovutils::ZORDER_0; 261c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 262c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mdp_info.z_order == 0 ) { 263c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder = ovutils::ZORDER_0; 264c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if(mdp_info.z_order == 1 ) { 265c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder = ovutils::ZORDER_1; 266c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if(mdp_info.z_order == 2 ) { 267c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder = ovutils::ZORDER_2; 268c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 269c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 270c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // Order order order 271c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setSource - just setting source 272c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setParameter - changes src w/h/f accordingly 273c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setCrop - ROI - src_rect 274c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // setPosition - dst_rect 275c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // commit - commit changes to mdp driver 276c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed // queueBuffer - not here, happens when draw is called 277c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 278c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eTransform orient = 279c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed static_cast<ovutils::eTransform>(layer->transform); 280c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 281c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ov.setTransform(orient, dest); 282c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size); 283c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eMdpFlags mdpFlags = mdp_info.isVG ? ovutils::OV_MDP_PIPE_SHARE 284c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed : ovutils::OV_MDP_FLAGS_NONE; 285c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eIsFg isFG = mdp_info.isFG ? ovutils::IS_FG_SET 286c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed : ovutils::IS_FG_OFF; 287c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::PipeArgs parg(mdpFlags, 288c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed info, 289c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed zOrder, 290c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isFG, 291c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::ROT_FLAG_DISABLED); 292c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 293c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::PipeArgs pargs[MAX_PIPES] = { parg, parg, parg }; 294c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.setSource(pargs, dest)) { 295c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: setSource failed", __FUNCTION__); 296c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 297c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 298c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 299c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::Dim dcrop(crop.left, crop.top, crop_w, crop_h); 300c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.setCrop(dcrop, dest)) { 301c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: setCrop failed", __FUNCTION__); 302c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 303c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 304c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 305c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::Dim dim(dst.left, dst.top, dst_w, dst_h); 306c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.setPosition(dim, dest)) { 307c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: setPosition failed", __FUNCTION__); 308c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 309c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 310c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 311c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP set: crop[%d,%d,%d,%d] dst[%d,%d,%d,%d] \ 312c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed nPipe: %d isFG: %d zorder: %d",__FUNCTION__, dcrop.x, 313c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dcrop.y,dcrop.w, dcrop.h, dim.x, dim.y, dim.w, dim.h, 314c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed nPipeIndex,mdp_info.isFG, mdp_info.z_order); 315c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 316c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.commit(dest)) { 317c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: commit failed", __FUNCTION__); 318c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 319c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 320c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 321c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 322c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 323c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 324c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed/* 325c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * MDPComp not possible when 326c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 1. We have more than sMaxLayers 327c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 2. External display connected 328c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 3. Composition is triggered by 329c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * Idle timer expiry 330c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 4. Rotation is needed 331c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed * 5. Overlay in use 332c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed */ 333c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 334660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::is_doable(hwc_composer_device_1_t *dev, 3351409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed hwc_display_contents_1_t* list) { 336c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 337c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 338c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 339c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: hwc context is NULL", __FUNCTION__); 340c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 341c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 342c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 343c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Number of layers 3441c51df74d381b330b9675429c93a09cbeb512629Naseer Ahmed if(list->numHwLayers < 1 || list->numHwLayers > (uint32_t)sMaxLayers) { 345c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: Unsupported number of layers",__FUNCTION__); 346c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 347c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 348c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 349c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Disable MDPComp when ext display connected 350c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(ctx->mExtDisplay->getExternalDisplay()) { 351c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: External display connected.", __FUNCTION__); 3526d41cb36a5f965bb6e5d6e0a6391f97ded56d39dSaurabh Shah return false; 353c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 354c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 355c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //FB composition on idle timeout 356c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(sIdleFallBack) { 357c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: idle fallback",__FUNCTION__); 358c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 359c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 360c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 361c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //MDP composition is not efficient if rotation is needed. 362c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for(unsigned int i = 0; i < list->numHwLayers; ++i) { 363c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(list->hwLayers[i].transform) { 364c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: orientation involved",__FUNCTION__); 365c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 366c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 367c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 368c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 369c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 370c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 371c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 372660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::setMDPCompLayerFlags(hwc_display_contents_1_t* list) { 373c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 374c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for(int index = 0 ; index < sCurrentFrame.count; index++ ) 375c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 376c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int layer_index = sCurrentFrame.pipe_layer[index].layer_index; 377c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer_index >= 0) { 378660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t* layer = &(list->hwLayers[layer_index]); 379c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 380c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->flags |= HWC_MDPCOMP; 381c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->compositionType = HWC_OVERLAY; 382c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->hints |= HWC_HINT_CLEAR_FB; 383c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 384c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 385c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 386c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 387660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::get_layer_info(hwc_layer_1_t* layer, int& flags) { 388c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 389c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed private_handle_t* hnd = (private_handle_t*)layer->handle; 390c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 391c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer->flags & HWC_SKIP_LAYER) { 392c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed flags |= MDPCOMP_LAYER_SKIP; 393c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if(hnd != NULL && 394c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed (hnd->flags & private_handle_t::PRIV_FLAGS_NONCONTIGUOUS_MEM )) { 395c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed flags |= MDPCOMP_LAYER_UNSUPPORTED_MEM; 396c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 397c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 398c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer->blending != HWC_BLENDING_NONE) 399c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed flags |= MDPCOMP_LAYER_BLEND; 400c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 401c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int dst_w, dst_h; 402c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed getLayerResolution(layer, dst_w, dst_h); 403c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 404c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 405c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed const int src_w = sourceCrop.right - sourceCrop.left; 406c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed const int src_h = sourceCrop.bottom - sourceCrop.top; 407c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(((src_w > dst_w) || (src_h > dst_h))) { 408c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed flags |= MDPCOMP_LAYER_DOWNSCALE; 409c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 410c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 411c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 412660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::mark_layers(hwc_display_contents_1_t* list, layer_mdp_info* layer_info, 413c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed frame_info& current_frame) { 414c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 415c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int layer_count = list->numHwLayers; 416c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 417c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer_count > sMaxLayers) { 418c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!sPipeMgr.req_for_pipe(PIPE_REQ_FB)) { 419c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: binding var pipe to FB failed!!", __FUNCTION__); 420c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 421c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 422c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 423c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 424c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Parse layers from higher z-order 425c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for(int index = layer_count - 1 ; index >= 0; index-- ) { 426660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[index]; 427c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 428c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int layer_prop = 0; 429c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed get_layer_info(layer, layer_prop); 430c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 431c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: prop for layer [%d]: %x", __FUNCTION__, 432c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed index, layer_prop); 433c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 434c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Both in cases of NON-CONTIGUOUS memory or SKIP layer, 435c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //current version of mdp composition falls back completely to FB 436c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //composition. 437c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //TO DO: Support dual mode composition 438c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 439c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer_prop & MDPCOMP_LAYER_UNSUPPORTED_MEM) { 440c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: Non contigous memory",__FUNCTION__); 441c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return MDPCOMP_ABORT; 442c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 443c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 444c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer_prop & MDPCOMP_LAYER_SKIP) { 445c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s:skip layer",__FUNCTION__); 446c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return MDPCOMP_ABORT; 447c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 448c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 449c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Request for MDP pipes 450c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int pipe_pref = PIPE_REQ_VG; 451c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 452c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if((layer_prop & MDPCOMP_LAYER_DOWNSCALE) && 453c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed (layer_prop & MDPCOMP_LAYER_BLEND)) { 454c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_pref = PIPE_REQ_RGB; 455c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 456c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 457c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int allocated_pipe = sPipeMgr.req_for_pipe( pipe_pref); 458c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(allocated_pipe) { 459c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_info[index].can_use_mdp = true; 460c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_info[index].pipe_pref = allocated_pipe; 461c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed current_frame.count++; 462c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed }else { 463c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: pipe marking in mark layer fails for : %d", 464c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed __FUNCTION__, allocated_pipe); 465c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return MDPCOMP_FAILURE; 466c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 467c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 468c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return MDPCOMP_SUCCESS; 469c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 470c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 471c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedvoid MDPComp::reset_layer_mdp_info(layer_mdp_info* layer_info, int count) { 472c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for(int i = 0 ; i < count; i++ ) { 473c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_info[i].can_use_mdp = false; 474c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_info[i].pipe_pref = PIPE_NONE; 475c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 476c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 477c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 478660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::alloc_layer_pipes(hwc_display_contents_1_t* list, 479c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_mdp_info* layer_info, frame_info& current_frame) { 480c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 481c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int layer_count = list->numHwLayers; 482c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int mdp_count = current_frame.count; 483c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int fallback_count = layer_count - mdp_count; 484c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int frame_pipe_count = 0; 485c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 486c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: dual mode: %d total count: %d \ 487c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mdp count: %d fallback count: %d", 488c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed __FUNCTION__, (layer_count != mdp_count), 489c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_count, mdp_count, fallback_count); 490c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 491c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for(int index = 0 ; index < layer_count ; index++ ) { 492660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[index]; 493c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 494c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(layer_info[index].can_use_mdp) { 495c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_layer_pair& info = current_frame.pipe_layer[frame_pipe_count]; 496c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mdp_pipe_info& pipe_info = info.pipe_index; 497c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 498c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_info.index = sPipeMgr.assign_pipe(layer_info[index].pipe_pref); 499c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_info.isVG = (layer_info[index].pipe_pref == PIPE_REQ_VG); 500c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_info.isFG = (frame_pipe_count == 0); 501c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* if VAR pipe is attached to FB, FB will be updated with 502c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed VSYNC WAIT flag, so no need to set VSYNC WAIT for any 503c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed bypass pipes. if not, set VSYNC WAIT to the last updating pipe*/ 504c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_info.vsync_wait = 505c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed (sPipeMgr.getStatus(VAR_INDEX) == PIPE_IN_FB_MODE) ? false: 506c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed (frame_pipe_count == (mdp_count - 1)); 507c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* All the layers composed on FB will have MDP zorder 0, so start 508c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed assigning from 1*/ 509c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed pipe_info.z_order = index - 510c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed (fallback_count ? fallback_count - 1 : fallback_count); 511c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 512c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed info.layer_index = index; 513c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed frame_pipe_count++; 514c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 515c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 516c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 1; 517c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 518c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 519c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed//returns array of layers and their allocated pipes 520660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::parse_and_allocate(hwc_context_t* ctx, hwc_display_contents_1_t* list, 521c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed frame_info& current_frame ) { 522c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 523c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int layer_count = list->numHwLayers; 524c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 525c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* clear pipe status */ 526c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sPipeMgr.reset(); 527c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 528c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer_mdp_info* bp_layer_info = (layer_mdp_info*) 529c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed malloc(sizeof(layer_mdp_info)* layer_count); 530c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 531c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed reset_layer_mdp_info(bp_layer_info, layer_count); 532c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 533c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* iterate through layer list to mark candidate */ 534c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(mark_layers(list, bp_layer_info, current_frame) == MDPCOMP_ABORT) { 535c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed free(bp_layer_info); 536c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed current_frame.count = 0; 537c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE_IF(isDebug(), "%s:mark_layers failed!!", __FUNCTION__); 538c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 539c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 540c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed current_frame.pipe_layer = (pipe_layer_pair*) 541c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed malloc(sizeof(pipe_layer_pair) * current_frame.count); 542c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 543c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* allocate MDP pipes for marked layers */ 544c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed alloc_layer_pipes( list, bp_layer_info, current_frame); 545c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 546c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed free(bp_layer_info); 547c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 548c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 549c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER 550c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedint MDPComp::configure_var_pipe(hwc_context_t* ctx) { 551c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 552c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 553c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid context", __FUNCTION__); 554c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 555c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 556c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 557c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed framebuffer_device_t *fbDev = ctx->fbDev; 558c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!fbDev) { 559c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: fbDev is NULL", __FUNCTION__); 560c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 561c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 562c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 563c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int new_mode = -1, cur_mode; 564c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed fbDev->perform(fbDev,EVENT_GET_VAR_PIPE_MODE, (void*)&cur_mode); 565c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 566c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(sPipeMgr.getStatus(VAR_INDEX) == PIPE_IN_FB_MODE) { 567c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed new_mode = VAR_PIPE_FB_ATTACH; 568c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if(sPipeMgr.getStatus(VAR_INDEX) == PIPE_IN_BYP_MODE) { 569c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed new_mode = VAR_PIPE_FB_DETACH; 570c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed fbDev->perform(fbDev,EVENT_WAIT_POSTBUFFER,NULL); 571c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 572c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 573c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: old_mode: %d new_mode: %d", __FUNCTION__, 574c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed cur_mode, new_mode); 575c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 576c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if((new_mode != cur_mode) && (new_mode >= 0)) { 577c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(fbDev->perform(fbDev,EVENT_SET_VAR_PIPE_MODE,(void*)&new_mode) < 0) { 578c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: Setting var pipe mode failed", __FUNCTION__); 579c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 580c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 581c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 582c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 583c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 584c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif 585c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 586660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::setup(hwc_context_t* ctx, hwc_display_contents_1_t* list) { 587c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int nPipeIndex, vsync_wait, isFG; 588c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int numHwLayers = list->numHwLayers; 589c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 590c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed frame_info ¤t_frame = sCurrentFrame; 591c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed current_frame.count = 0; 592c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 593c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx) { 594c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid context", __FUNCTION__); 595c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 596c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 597c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 598c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed framebuffer_device_t *fbDev = ctx->mFbDev; 599c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!fbDev) { 600c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: fbDev is NULL", __FUNCTION__); 601c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 602c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 603c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 604c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!parse_and_allocate(ctx, list, current_frame)) { 605c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER 606c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int mode = VAR_PIPE_FB_ATTACH; 607c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(fbDev->perform(fbDev,EVENT_SET_VAR_PIPE_MODE,(void*)&mode) < 0 ) { 608c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: setting var pipe mode failed", __FUNCTION__); 609c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 610c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif 611c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: Falling back to FB", __FUNCTION__); 612c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 613c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 614c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER 615c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed configure_var_pipe(ctx); 616c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif 617c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 618c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed overlay::Overlay& ov = *(ctx->mOverlay); 619c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eOverlayState state = ov.getState(); 620c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 621c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (current_frame.count == 1) { 622c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed state = ovutils::OV_BYPASS_1_LAYER; 623c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if (current_frame.count == 2) { 624c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed state = ovutils::OV_BYPASS_2_LAYER; 625c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if (current_frame.count == 3) { 626c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed state = ovutils::OV_BYPASS_3_LAYER; 627c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 628c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 629c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ov.setState(state); 630c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 631c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 632c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for (int index = 0 ; index < current_frame.count; index++) { 633c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int layer_index = current_frame.pipe_layer[index].layer_index; 634660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t* layer = &list->hwLayers[layer_index]; 635c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mdp_pipe_info& cur_pipe = current_frame.pipe_layer[index].pipe_index; 636c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 637c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if( prepare(ctx, layer, cur_pipe) != 0 ) { 638c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: MDPComp failed to configure overlay for \ 639c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer %d with pipe index:%d",__FUNCTION__, 640c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed index, cur_pipe.index); 641c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 642c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 643c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed setLayerIndex(layer, index); 644c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 645c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 646c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 647c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 648c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 649660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedvoid MDPComp::unsetMDPCompLayerFlags(hwc_context_t* ctx, hwc_display_contents_1_t* list) 650c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed{ 651c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!list) 652c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return; 653c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 654c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for (int index = 0 ; index < sCurrentFrame.count; index++) { 655c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int l_index = sCurrentFrame.pipe_layer[index].layer_index; 656c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(list->hwLayers[l_index].flags & HWC_MDPCOMP) { 657c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed list->hwLayers[l_index].flags &= ~HWC_MDPCOMP; 658c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 6591409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed 6601409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed if(list->hwLayers[l_index].compositionType == HWC_OVERLAY) { 6611409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed list->hwLayers[l_index].compositionType = HWC_FRAMEBUFFER; 6621409b3ce70e0f46806c431eff4db4d9881598e05Naseer Ahmed } 663c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 664c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 665c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 666660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedint MDPComp::draw(hwc_context_t *ctx, hwc_display_contents_1_t* list) { 667c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 668c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!isEnabled()) { 669c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled",__FUNCTION__); 670c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 671c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 672c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 673c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!ctx || !list) { 674c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: invalid contxt or list",__FUNCTION__); 675c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 676c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 677c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 678c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed overlay::Overlay& ov = *(ctx->mOverlay); 679c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 680c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed for(unsigned int i = 0; i < list->numHwLayers; i++ ) 681c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed { 682660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[i]; 683c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 684c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!(layer->flags & HWC_MDPCOMP)) { 685c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(), "%s: Layer Not flagged for MDP comp", 686c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed __FUNCTION__); 687c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed continue; 688c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 689c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 690c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int data_index = getLayerIndex(layer); 691c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed mdp_pipe_info& pipe_info = 692c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sCurrentFrame.pipe_layer[data_index].pipe_index; 693c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed int index = pipe_info.index; 694c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 695c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(index < 0) { 696c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: Invalid pipe index (%d)", __FUNCTION__, index); 697c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 698c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 699c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 700c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed /* reset Invalidator */ 701c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(idleInvalidator) 702c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed idleInvalidator->markForSleep(); 703c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 704c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ovutils::eDest dest; 705c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 706c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (index == 0) { 707c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dest = ovutils::OV_PIPE0; 708c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if (index == 1) { 709c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dest = ovutils::OV_PIPE1; 710c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else if (index == 2) { 711c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed dest = ovutils::OV_PIPE2; 712c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 713c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 714c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (ctx ) { 715c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 716c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!hnd) { 717c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s handle null", __FUNCTION__); 718c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 719c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 720c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 721c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //lock buffer before queue 722c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //XXX: Handle lock failure 723c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ctx->qbuf->lockAndAdd(hnd); 724c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 725c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp: Drawing layer: %p hnd: %p \ 726c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed using pipe: %d", __FUNCTION__, layer, 727c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hnd, index ); 728c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 729c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) { 730c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 731c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return -1; 732c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 733c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 734c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->flags &= ~HWC_MDPCOMP; 735c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed layer->flags |= HWC_MDPCOMP_INDEX_MASK; 736c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 737c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return 0; 738c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 739c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 740c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmedbool MDPComp::init(hwc_context_t *dev) { 741c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 742c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!dev) { 743c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: Invalid hwc context!!",__FUNCTION__); 744c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 745c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 746c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 747c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#if SUPPORT_4LAYER 748c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(MAX_MDPCOMP_LAYERS > MAX_STATIC_PIPES) { 749c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed framebuffer_device_t *fbDev = dev->fbDevice; 750c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(fbDev == NULL) { 751c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: FATAL: framebuffer device is NULL", __FUNCTION__); 752c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 753c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 754c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 755c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Receive VAR pipe object from framebuffer 756c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(fbDev->perform(fbDev,EVENT_GET_VAR_PIPE,(void*)&ov) < 0) { 757c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: FATAL: getVariablePipe failed!!", __FUNCTION__); 758c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 759c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 760c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 761c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sPipeMgr.setStatus(VAR_INDEX, PIPE_IN_FB_MODE); 762c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 763c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed#endif 764c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed char property[PROPERTY_VALUE_MAX]; 765c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 766c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sMaxLayers = 0; 767c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(property_get("debug.mdpcomp.maxlayer", property, NULL) > 0) { 768c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(atoi(property) != 0) 769c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sMaxLayers = atoi(property); 770c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 771c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 772c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sDebugLogs = false; 773c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(property_get("debug.mdpcomp.logs", property, NULL) > 0) { 774c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(atoi(property) != 0) 775c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sDebugLogs = true; 776c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 777c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 778c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed unsigned long idle_timeout = DEFAULT_IDLE_TIME; 779c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(property_get("debug.mdpcomp.idletime", property, NULL) > 0) { 780c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(atoi(property) != 0) 781c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed idle_timeout = atoi(property); 782c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 783c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 784c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //create Idle Invalidator 785c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed idleInvalidator = IdleInvalidator::getInstance(); 786c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 787c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(idleInvalidator == NULL) { 788c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGE("%s: failed to instantiate idleInvalidator object", __FUNCTION__); 789c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 790c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed idleInvalidator->init(timeout_handler, dev, idle_timeout); 791c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 792c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return true; 793c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 794c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 795660267c43bb3370ab49f4e95562c027171d8fb83Naseer Ahmedbool MDPComp::configure(hwc_composer_device_1_t *dev, hwc_display_contents_1_t* list) { 796c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 797c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!isEnabled()) { 798c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp. not enabled.", __FUNCTION__); 799c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return false; 800c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 801c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 802c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed hwc_context_t* ctx = (hwc_context_t*)(dev); 803c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 804c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed bool isMDPCompUsed = true; 805c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed bool doable = is_doable(dev, list); 806c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 807c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(doable) { 808c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(setup(ctx, list)) { 809c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed setMDPCompLayerFlags(list); 810c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sMDPCompState = MDPCOMP_ON; 811c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 812c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF(isDebug(),"%s: MDP Comp Failed",__FUNCTION__); 813c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isMDPCompUsed = false; 814c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 815c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } else { 816c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed ALOGD_IF( isDebug(),"%s: MDP Comp not possible[%d]",__FUNCTION__, 817c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed doable); 818c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed isMDPCompUsed = false; 819c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 820c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 821c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Reset states 822c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed if(!isMDPCompUsed) { 823c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed //Reset current frame 824c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed reset(ctx, list); 825c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed } 826c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 827c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed sIdleFallBack = false; 828c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 829c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed return isMDPCompUsed; 830c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed} 831c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed}; //namespace 832c85d6b7428ded41c74a9455f580f3ee8b451bbdeNaseer Ahmed 833