1ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson/* 2ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Copyright (C) 2010 The Android Open Source Project 3a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 4ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 5ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Not a Contribution, Apache license notifications and license are 6ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * retained for attribution purposes only. 7ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 8ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 9ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * you may not use this file except in compliance with the License. 10ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * You may obtain a copy of the License at 11ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 12ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * http://www.apache.org/licenses/LICENSE-2.0 13ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * 14ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * Unless required by applicable law or agreed to in writing, software 15ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * distributed under the License is distributed on an "AS IS" BASIS, 16ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * See the License for the specific language governing permissions and 18ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson * limitations under the License. 19ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson */ 20ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 21ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#define DEBUG_FBUPDATE 0 22a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <cutils/properties.h> 23ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <gralloc_priv.h> 24ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include <overlay.h> 25a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include <overlayRotator.h> 26ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "hwc_fbupdate.h" 27ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson#include "mdp_version.h" 28a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "external.h" 29a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson#include "virtual.h" 30ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 31ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace qdutils; 32ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonusing namespace overlay; 33a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonusing overlay::Rotator; 34a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonusing namespace overlay::utils; 35ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 36ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace qhwc { 37ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 38ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilsonnamespace ovutils = overlay::utils; 39ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 40a653efede03423aa840da24634f1ec6f20796f1eSimon WilsonIFBUpdate* IFBUpdate::getObject(hwc_context_t *ctx, const int& dpy) { 41c9e382481ac19b43dcbefee46ff4ee93fbfe8a95Saurabh Shah if(qdutils::MDPVersion::getInstance().isSrcSplit()) { 42c9e382481ac19b43dcbefee46ff4ee93fbfe8a95Saurabh Shah return new FBSrcSplit(ctx, dpy); 43c9e382481ac19b43dcbefee46ff4ee93fbfe8a95Saurabh Shah } else if(isDisplaySplit(ctx, dpy)) { 44a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return new FBUpdateSplit(ctx, dpy); 45ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 46a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return new FBUpdateNonSplit(ctx, dpy); 47a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 48a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 49a653efede03423aa840da24634f1ec6f20796f1eSimon WilsonIFBUpdate::IFBUpdate(hwc_context_t *ctx, const int& dpy) : mDpy(dpy) { 5092e456fd92a6231dbf5d9de5289ed2f84841a804Saurabh Shah unsigned int size = 0; 512c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi uint32_t xres = ctx->dpyAttr[mDpy].xres; 522c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi uint32_t yres = ctx->dpyAttr[mDpy].yres; 532c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi if (ctx->dpyAttr[dpy].customFBSize) { 542c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi //GPU will render and compose at new resolution 552c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi //So need to have FB at new resolution 562c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi xres = ctx->dpyAttr[mDpy].xres_new; 572c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi yres = ctx->dpyAttr[mDpy].yres_new; 582c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi } 592c4de320db5ba9e92cfaa5a7fd67487cec0f26dcDileep Kumar Reddi getBufferAttributes((int)xres, (int)yres, 60a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson HAL_PIXEL_FORMAT_RGBA_8888, 61a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 0, 62a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mAlignedFBWidth, 63a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mAlignedFBHeight, 64a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mTileEnabled, size); 65ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 66ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 67a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid IFBUpdate::reset() { 68ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mModeOn = false; 69a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mRot = NULL; 70a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 71a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 72a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool IFBUpdate::prepareAndValidate(hwc_context_t *ctx, 73a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_display_contents_1 *list, int fbZorder) { 74a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 75a5a4ed325bbfebec8a9e977296a8a11d1a2abdb8Ramkumar Radhakrishnan mModeOn = prepare(ctx, list, layer->displayFrame, fbZorder) && 76a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd); 77a5a4ed325bbfebec8a9e977296a8a11d1a2abdb8Ramkumar Radhakrishnan return mModeOn; 78ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 79ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 80ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//================= Low res==================================== 81a653efede03423aa840da24634f1ec6f20796f1eSimon WilsonFBUpdateNonSplit::FBUpdateNonSplit(hwc_context_t *ctx, const int& dpy): 82a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson IFBUpdate(ctx, dpy) {} 83ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 84a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid FBUpdateNonSplit::reset() { 85ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IFBUpdate::reset(); 86ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mDest = ovutils::OV_INVALID; 87ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 88ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 89a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateNonSplit::preRotateExtDisplay(hwc_context_t *ctx, 90a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer, 91a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::Whf &info, 92a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t& sourceCrop, 93a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eMdpFlags& mdpFlags, 94a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int& rotFlags) 95a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson{ 96a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = getExtOrientation(ctx); 97a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eTransform orient = static_cast<ovutils::eTransform >(extOrient); 98a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(mDpy && (extOrient & HWC_TRANSFORM_ROT_90)) { 99a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mRot = ctx->mRotMgr->getNext(); 100a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(mRot == NULL) return false; 101ebf925e696ac4debee9ed652aea5ba2a21dfa136Saurabh Shah ctx->mLayerRotMap[mDpy]->add(layer, mRot); 102a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Composed FB content will have black bars, if the viewFrame of the 103a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // external is different from {0, 0, fbWidth, fbHeight}, so intersect 104a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // viewFrame with sourceCrop to avoid those black bars 105a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sourceCrop = getIntersection(sourceCrop, ctx->mViewFrame[mDpy]); 106a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Configure rotator for pre-rotation 107a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configRotator(mRot, info, sourceCrop, mdpFlags, orient, 0) < 0) { 108a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: configRotator Failed!", __FUNCTION__); 109a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mRot = NULL; 110a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 111a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 112c5628e5e5d07912ad30849801f18c07ab433a4f5Saurabh Shah updateSource(orient, info, sourceCrop, mRot); 113a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson rotFlags |= ovutils::ROT_PREROTATED; 114a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 115a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return true; 116a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 117a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 118a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateNonSplit::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 119a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t fbUpdatingRect, int fbZorder) { 120ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!ctx->mMDP.hasOverlay) { 121ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 122ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__); 123ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 124ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 125a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mModeOn = configure(ctx, list, fbUpdatingRect, fbZorder); 126ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return mModeOn; 127ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 128ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 129ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Configure 130a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateNonSplit::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 131a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t fbUpdatingRect, int fbZorder) { 132ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool ret = false; 133ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 134ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (LIKELY(ctx->mOverlay)) { 135a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 136a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // ext only layer present.. 137a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOnlyLayerIndex != -1) { 138a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer = &list->hwLayers[extOnlyLayerIndex]; 139a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->compositionType = HWC_OVERLAY; 140a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 141ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Overlay& ov = *(ctx->mOverlay); 142ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 143a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::Whf info(mAlignedFBWidth, mAlignedFBHeight, 144a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 145a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mTileEnabled)); 146ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 147a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah Overlay::PipeSpecs pipeSpecs; 148a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 149a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 150a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.dpy = mDpy; 151a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_DEFAULT; 152a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.fb = true; 153a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah 154a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah ovutils::eDest dest = ov.getPipe(pipeSpecs); 155ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(dest == ovutils::OV_INVALID) { //None available 156a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: No pipes available to configure fb for dpy %d", 157a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson __FUNCTION__, mDpy); 158ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 159ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 160ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mDest = dest; 161ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 162a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if((mDpy && ctx->deviceOrientation) && 163a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->listStats[mDpy].isDisplayAnimating) { 164a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson fbZorder = 0; 165a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 166ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 167a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 168a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eIsFg isFg = ovutils::IS_FG_OFF; 169ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 170ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 171a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 172a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t displayFrame = layer->displayFrame; 173ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 174a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // No FB update optimization on (1) Custom FB resolution, 175a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // (2) External Mirror mode, (3) External orientation 176a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!ctx->dpyAttr[mDpy].customFBSize && !ctx->mBufferMirrorMode 177a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson && !ctx->mExtOrientation) { 178a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sourceCrop = fbUpdatingRect; 179a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame = fbUpdatingRect; 180ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 181ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 182a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int transform = layer->transform; 183a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int rotFlags = ovutils::ROT_FLAGS_NONE; 184ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 185a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eTransform orient = 186a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<ovutils::eTransform>(transform); 187a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // use ext orientation if any 188a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOrient = getExtOrientation(ctx); 189a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 190a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Do not use getNonWormholeRegion() function to calculate the 191a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // sourceCrop during animation on external display and 192a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Dont do wormhole calculation when extorientation is set on External 193a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // Dont do wormhole calculation when extDownscale is enabled on External 194a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(ctx->listStats[mDpy].isDisplayAnimating && mDpy) { 195a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sourceCrop = layer->displayFrame; 196a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } else if((!mDpy || 197a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (mDpy && !extOrient 198a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson && !ctx->dpyAttr[mDpy].mDownScaleMode)) 199a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson && (extOnlyLayerIndex == -1)) { 2004418482cd51e8343e7efd978ccdd17c616d1d78aRaj Kamal if(ctx->mOverlay->isUIScalingOnExternalSupported() && 201a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson !ctx->dpyAttr[mDpy].customFBSize) { 202a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getNonWormholeRegion(list, sourceCrop); 203a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson displayFrame = sourceCrop; 204a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 205a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 206a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson calcExtDisplayPosition(ctx, NULL, mDpy, sourceCrop, displayFrame, 207a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson transform, orient); 208a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //Store the displayFrame, will be used in getDisplayViewFrame 209a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ctx->dpyAttr[mDpy].mDstRect = displayFrame; 2104a7fde21bc0dea152a633521d727dda7d540f262Ramkumar Radhakrishnan setMdpFlags(ctx, layer, mdpFlags, 0, transform); 211a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // For External use rotator if there is a rotation value set 212a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ret = preRotateExtDisplay(ctx, layer, info, 213a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson sourceCrop, mdpFlags, rotFlags); 214a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!ret) { 215a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: preRotate for external Failed!", __FUNCTION__); 216a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 217a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 218a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson //For the mdp, since either we are pre-rotating or MDP does flips 219a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson orient = ovutils::OVERLAY_TRANSFORM_0; 220a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson transform = 0; 221a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::PipeArgs parg(mdpFlags, info, zOrder, isFg, 222a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<ovutils::eRotFlags>(rotFlags), 223a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::DEFAULT_PLANE_ALPHA, 224a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) 225a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getBlending(layer->blending)); 226ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = true; 227a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(configMdp(ctx->mOverlay, parg, orient, sourceCrop, displayFrame, 228a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson NULL, mDest) < 0) { 229a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ALOGE("%s: configMdp failed for dpy %d", __FUNCTION__, mDpy); 230ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = false; 231ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 232ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 233ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 234ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 235ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 236a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateNonSplit::draw(hwc_context_t *ctx, private_handle_t *hnd) 237ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 238ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!mModeOn) { 239ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 240ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 241ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool ret = true; 242ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Overlay& ov = *(ctx->mOverlay); 243ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eDest dest = mDest; 244a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int fd = hnd->fd; 2454217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu uint32_t offset = (uint32_t)hnd->offset; 246a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(mRot) { 247a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(!mRot->queueBuffer(fd, offset)) 248a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson return false; 249a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson fd = mRot->getDstMemId(); 250a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson offset = mRot->getDstOffset(); 251a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 252a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if (!ov.queueBuffer(fd, offset, dest)) { 253ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__); 254ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ret = false; 255ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 256ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 257ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 258ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 259ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//================= High res==================================== 260a653efede03423aa840da24634f1ec6f20796f1eSimon WilsonFBUpdateSplit::FBUpdateSplit(hwc_context_t *ctx, const int& dpy): 261a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson IFBUpdate(ctx, dpy) {} 262ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 263a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonvoid FBUpdateSplit::reset() { 264ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson IFBUpdate::reset(); 265ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mDestLeft = ovutils::OV_INVALID; 266ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson mDestRight = ovutils::OV_INVALID; 267a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mRot = NULL; 268ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 269ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 270a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateSplit::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 271a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t fbUpdatingRect, int fbZorder) { 272ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!ctx->mMDP.hasOverlay) { 273ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 274ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson __FUNCTION__); 275ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return false; 276ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 277a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mModeOn = configure(ctx, list, fbUpdatingRect, fbZorder); 27844d388cf974016f159e1fb6bbb0173c1ca87b9c9Raj Kamal ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn); 279ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return mModeOn; 280ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 281ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 282ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson// Configure 283a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateSplit::configure(hwc_context_t *ctx, 284a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_display_contents_1 *list, hwc_rect_t fbUpdatingRect, int fbZorder) { 285ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool ret = false; 286ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 287ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if (LIKELY(ctx->mOverlay)) { 288847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran /* External only layer present */ 289a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 290a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOnlyLayerIndex != -1) { 291a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer = &list->hwLayers[extOnlyLayerIndex]; 292a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->compositionType = HWC_OVERLAY; 293a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 294847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::Whf info(mAlignedFBWidth, mAlignedFBHeight, 295847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 296847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran mTileEnabled)); 297ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 298847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran overlay::Overlay& ov = *(ctx->mOverlay); 299847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 300ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 301847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::eTransform orient = 302847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran static_cast<ovutils::eTransform>(layer->transform); 303847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran const int hw_w = ctx->dpyAttr[mDpy].xres; 304847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran const int hw_h = ctx->dpyAttr[mDpy].yres; 305847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran const int lSplit = getLeftSplit(ctx, mDpy); 306847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran mDestLeft = ovutils::OV_INVALID; 307847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran mDestRight = ovutils::OV_INVALID; 308ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 309a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t sourceCrop = fbUpdatingRect; 310a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t displayFrame = fbUpdatingRect; 311ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 312847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ret = true; 313a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah Overlay::PipeSpecs pipeSpecs; 314a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 315a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 316a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.dpy = mDpy; 317a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.fb = true; 318a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah 319847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran /* Configure left pipe */ 320847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if(displayFrame.left < lSplit) { 321a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_LEFT; 322a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah ovutils::eDest destL = ov.getPipe(pipeSpecs); 323847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if(destL == ovutils::OV_INVALID) { //None available 324847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ALOGE("%s: No pipes available to configure fb for dpy %d's left" 325847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran " mixer", __FUNCTION__, mDpy); 326847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran return false; 327847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 328ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 329847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran mDestLeft = destL; 330847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran 331847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran //XXX: FB layer plane alpha is currently sent as zero from 332847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran //surfaceflinger 333847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::PipeArgs pargL(mdpFlags, 334847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran info, 335847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran zOrder, 336847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::IS_FG_OFF, 337847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::ROT_FLAGS_NONE, 338847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::DEFAULT_PLANE_ALPHA, 339847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran (ovutils::eBlending) 340847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran getBlending(layer->blending)); 341847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran hwc_rect_t cropL = sourceCrop; 342847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran hwc_rect_t dstL = displayFrame; 343847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran hwc_rect_t scissorL = {0, 0, lSplit, hw_h }; 344847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran qhwc::calculate_crop_rects(cropL, dstL, scissorL, 0); 345847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran 346847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if (configMdp(ctx->mOverlay, pargL, orient, cropL, 347847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran dstL, NULL, destL)< 0) { 348847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ALOGE("%s: configMdp fails for left FB", __FUNCTION__); 349847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ret = false; 350847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 351847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 352ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 353847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran /* Configure right pipe */ 354847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if(displayFrame.right > lSplit) { 355a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_RIGHT; 356a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah ovutils::eDest destR = ov.getPipe(pipeSpecs); 357847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if(destR == ovutils::OV_INVALID) { //None available 358847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ALOGE("%s: No pipes available to configure fb for dpy %d's" 359847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran " right mixer", __FUNCTION__, mDpy); 360847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran return false; 361847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 362ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 363847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran mDestRight = destR; 364847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::eMdpFlags mdpFlagsR = mdpFlags; 365847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER); 366847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran 367847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran //XXX: FB layer plane alpha is currently sent as zero from 368847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran //surfaceflinger 369847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::PipeArgs pargR(mdpFlagsR, 370847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran info, 371847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran zOrder, 372847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::IS_FG_OFF, 373847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::ROT_FLAGS_NONE, 374847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ovutils::DEFAULT_PLANE_ALPHA, 375847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran (ovutils::eBlending) 376847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran getBlending(layer->blending)); 377847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran 378847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran hwc_rect_t cropR = sourceCrop; 379847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran hwc_rect_t dstR = displayFrame; 380847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran hwc_rect_t scissorR = {lSplit, 0, hw_w, hw_h }; 381847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran qhwc::calculate_crop_rects(cropR, dstR, scissorR, 0); 382847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran 383847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran dstR.left -= lSplit; 384847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran dstR.right -= lSplit; 385847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran 386847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if (configMdp(ctx->mOverlay, pargR, orient, cropR, 387847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran dstR, NULL, destR) < 0) { 388847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ALOGE("%s: configMdp fails for right FB", __FUNCTION__); 389847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ret = false; 390847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 391ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 392ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 393ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 394ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 395ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 396a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBUpdateSplit::draw(hwc_context_t *ctx, private_handle_t *hnd) 397ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson{ 398ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson if(!mModeOn) { 399ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return true; 400ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 401ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson bool ret = true; 402ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson overlay::Overlay& ov = *(ctx->mOverlay); 403847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if(mDestLeft != ovutils::OV_INVALID) { 4044217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu if (!ov.queueBuffer(hnd->fd, (uint32_t)hnd->offset, mDestLeft)) { 405847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ALOGE("%s: queue failed for left of dpy = %d", 406847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran __FUNCTION__, mDpy); 407847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ret = false; 408847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 409ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 410847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran if(mDestRight != ovutils::OV_INVALID) { 4114217cbfc47f3b4f8f0436e3953cf169f7f18a506Praveena Pachipulusu if (!ov.queueBuffer(hnd->fd, (uint32_t)hnd->offset, mDestRight)) { 412847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ALOGE("%s: queue failed for right of dpy = %d", 413847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran __FUNCTION__, mDpy); 414847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran ret = false; 415847a264fceba2a223c76f707888f9757e4458105Jeykumar Sankaran } 416ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson } 417ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson return ret; 418ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson} 419ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson 420a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson//=================FBSrcSplit==================================== 421a653efede03423aa840da24634f1ec6f20796f1eSimon WilsonFBSrcSplit::FBSrcSplit(hwc_context_t *ctx, const int& dpy): 422a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson FBUpdateSplit(ctx, dpy) {} 423a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 424a653efede03423aa840da24634f1ec6f20796f1eSimon Wilsonbool FBSrcSplit::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 425a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_rect_t fbUpdatingRect, int fbZorder) { 426a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 427a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 428a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson // ext only layer present.. 429a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson if(extOnlyLayerIndex != -1) { 430a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer = &list->hwLayers[extOnlyLayerIndex]; 431a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson layer->compositionType = HWC_OVERLAY; 432a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 4330bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 434a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson overlay::Overlay& ov = *(ctx->mOverlay); 435a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 436a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::Whf info(mAlignedFBWidth, 437a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mAlignedFBHeight, 438a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 439a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson mTileEnabled)); 440a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 441a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eMdpFlags mdpFlags = OV_MDP_BLEND_FG_PREMULT; 442a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 443a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 444a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::PipeArgs parg(mdpFlags, 445a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson info, 446a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson zOrder, 447a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::IS_FG_OFF, 448a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::ROT_FLAGS_NONE, 449a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::DEFAULT_PLANE_ALPHA, 450a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson (ovutils::eBlending) 451a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson getBlending(layer->blending)); 452a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 453a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson int transform = layer->transform; 454a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson ovutils::eTransform orient = 455a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson static_cast<ovutils::eTransform>(transform); 456a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 4570bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah hwc_rect_t cropL = fbUpdatingRect; 4580bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah hwc_rect_t cropR = fbUpdatingRect; 4590bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 4600bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah //Request left pipe (or 1 by default) 461a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah Overlay::PipeSpecs pipeSpecs; 462a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 463a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 464a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.dpy = mDpy; 465a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_DEFAULT; 466a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah pipeSpecs.fb = true; 467a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah ovutils::eDest destL = ov.getPipe(pipeSpecs); 4680bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(destL == ovutils::OV_INVALID) { 4690bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d's left" 4700bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah " mixer", __FUNCTION__, mDpy); 4710bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah return false; 472a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 4730bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 4740bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah ovutils::eDest destR = ovutils::OV_INVALID; 4750bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 476e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah /* Use 2 pipes IF 477e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah a) FB's width is > 2048 or 478e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah b) On primary, driver has indicated with caps to split always. This is 479e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah based on an empirically derived value of panel height. 480e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah */ 481e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah 482e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah bool primarySplitAlways = (mDpy == HWC_DISPLAY_PRIMARY) and 483e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah qdutils::MDPVersion::getInstance().isSrcSplitAlways(); 484e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah 485e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah if(((fbUpdatingRect.right - fbUpdatingRect.left) > 486e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah qdutils::MAX_DISPLAY_DIM) or 487e095244acd6350d0898d5a9b409dff2748553bfcSaurabh Shah primarySplitAlways) { 488a83d776f160d90db1cb5df28a793f4f06a93f020Saurabh Shah destR = ov.getPipe(pipeSpecs); 4890bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(destR == ovutils::OV_INVALID) { 4900bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d's right" 4910bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah " mixer", __FUNCTION__, mDpy); 4920bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah return false; 4930bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah } 4940bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 4950bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(ctx->mOverlay->comparePipePriority(destL, destR) == -1) { 4960bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah qhwc::swap(destL, destR); 4970bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah } 4980bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 4990bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah //Split crop equally when using 2 pipes 5000bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah cropL.right = (fbUpdatingRect.right + fbUpdatingRect.left) / 2; 5010bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah cropR.left = cropL.right; 5020bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah } 5030bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 5040bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah mDestLeft = destL; 5050bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah mDestRight = destR; 5060bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 5070bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(destL != OV_INVALID) { 5080bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(configMdp(ctx->mOverlay, parg, orient, 5090bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah cropL, cropL, NULL /*metadata*/, destL) < 0) { 5100bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah ALOGE("%s: commit failed for left mixer config", __FUNCTION__); 5110bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah return false; 5120bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah } 513a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 5140bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 5150bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah //configure right pipe 5160bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(destR != OV_INVALID) { 5170bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah if(configMdp(ctx->mOverlay, parg, orient, 5180bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah cropR, cropR, NULL /*metadata*/, destR) < 0) { 5190bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah ALOGE("%s: commit failed for right mixer config", __FUNCTION__); 5200bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah return false; 5210bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah } 522a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson } 5230bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah 5240bc6186c13bed6530aadad53308916869871aa8cSaurabh Shah return true; 525a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson} 526a653efede03423aa840da24634f1ec6f20796f1eSimon Wilson 527ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson//--------------------------------------------------------------------- 528ef53c1c84ec55ed50f607d52b7abfbb86239408eSimon Wilson}; //namespace qhwc 529