hwc_fbupdate.cpp revision 0eb79f8456c2a8bb0f30a2e966f8c9000fe934e9
1ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed/* 2ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project 3f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi * Copyright (C) 2012-2014, The Linux Foundation. All rights reserved. 4ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 5ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Not a Contribution, Apache license notifications and license are 6ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * retained for attribution purposes only. 7ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 8ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 9ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * you may not use this file except in compliance with the License. 10ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * You may obtain a copy of the License at 11ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 12ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 13ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * 14ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Unless required by applicable law or agreed to in writing, software 15ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 16ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * See the License for the specific language governing permissions and 18ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * limitations under the License. 19ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed */ 20ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 21640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah#define DEBUG_FBUPDATE 0 223b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R#include <cutils/properties.h> 231589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h> 241a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah#include <overlay.h> 253b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R#include <overlayRotator.h> 2647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h" 278fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah#include "mdp_version.h" 283b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R#include "external.h" 29fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar#include "virtual.h" 308fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shah 318fe8c938d27e528fcf7fb4a408711b4b6e405f13Saurabh Shahusing namespace qdutils; 321a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shahusing namespace overlay; 333b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rusing overlay::Rotator; 34fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumarusing namespace overlay::utils; 353b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 36ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmednamespace qhwc { 37ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 3847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmednamespace ovutils = overlay::utils; 39ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 40f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh ShahIFBUpdate* IFBUpdate::getObject(hwc_context_t *ctx, const int& dpy) { 41f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(qdutils::MDPVersion::getInstance().isSrcSplit()) { 42c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah return new FBSrcSplit(ctx, dpy); 43640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } else if(isDisplaySplit(ctx, dpy)) { 44c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah return new FBUpdateSplit(ctx, dpy); 45640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 46640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return new FBUpdateNonSplit(ctx, dpy); 47c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah} 48c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan 49c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVMIFBUpdate::IFBUpdate(hwc_context_t *ctx, const int& dpy) : mDpy(dpy) { 50c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM size_t size = 0; 51c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah getBufferAttributes(ctx->dpyAttr[mDpy].xres, 52c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ctx->dpyAttr[mDpy].yres, 53c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah HAL_PIXEL_FORMAT_RGBA_8888, 54c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 0, 55c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM mAlignedFBWidth, 56c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah mAlignedFBHeight, 57c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah mTileEnabled, size); 58c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah} 59640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 603b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rvoid IFBUpdate::reset() { 61640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mModeOn = false; 62640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mRot = NULL; 631029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah} 641029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 651029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shahbool IFBUpdate::prepareAndValidate(hwc_context_t *ctx, 661029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah hwc_display_contents_1 *list, int fbZorder) { 671029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 681029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah mModeOn = prepare(ctx, list, layer->displayFrame, fbZorder) && 69640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd); 70c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah return mModeOn; 71c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah} 7247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 73c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah//================= Low res==================================== 74640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh ShahFBUpdateNonSplit::FBUpdateNonSplit(hwc_context_t *ctx, const int& dpy): 75640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah IFBUpdate(ctx, dpy) {} 76bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah 77ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmedvoid FBUpdateNonSplit::reset() { 78f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah IFBUpdate::reset(); 7981c1cc1465b0758702b30bf7e5428a62dc8e4604Prabhanjan Kandula mDest = ovutils::OV_INVALID; 8097c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan} 8197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan 8297c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnanbool FBUpdateNonSplit::preRotateExtDisplay(hwc_context_t *ctx, 8397c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan hwc_layer_1_t *layer, 8497c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ovutils::Whf &info, 8597c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan hwc_rect_t& sourceCrop, 8697c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ovutils::eMdpFlags& mdpFlags, 8797c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan int& rotFlags) 8897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan{ 8997c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan int extOrient = getExtOrientation(ctx); 9023a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan ovutils::eTransform orient = static_cast<ovutils::eTransform >(extOrient); 9123a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan if(mDpy && (extOrient & HWC_TRANSFORM_ROT_90)) { 9223a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan mRot = ctx->mRotMgr->getNext(); 9323a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan if(mRot == NULL) return false; 9497c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ctx->mLayerRotMap[mDpy]->add(layer, mRot); 9597c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan // Composed FB content will have black bars, if the viewFrame of the 9697c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan // external is different from {0, 0, fbWidth, fbHeight}, so intersect 9797c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan // viewFrame with sourceCrop to avoid those black bars 9897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan sourceCrop = getIntersection(sourceCrop, ctx->mViewFrame[mDpy]); 9997c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan //Configure rotator for pre-rotation 10023a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan if(configRotator(mRot, info, sourceCrop, mdpFlags, orient, 0) < 0) { 10197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ALOGE("%s: configRotator Failed!", __FUNCTION__); 10297c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan mRot = NULL; 10397c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan return false; 10497c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan } 10597c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan info.format = (mRot)->getDstFormat(); 10697c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan updateSource(orient, info, sourceCrop); 10797c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan rotFlags |= ovutils::ROT_PREROTATED; 108f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah } 109f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return true; 110b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed} 111640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 112f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranbool FBUpdateNonSplit::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 113f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t fbUpdatingRect, int fbZorder) { 114080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed if(!ctx->mMDP.hasOverlay) { 115f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 116640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah __FUNCTION__); 117ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return false; 118ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 119ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed mModeOn = configure(ctx, list, fbUpdatingRect, fbZorder); 120f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return mModeOn; 121f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran} 12247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 12304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed// Configure 12447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmedbool FBUpdateNonSplit::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 125eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R hwc_rect_t fbUpdatingRect, int fbZorder) { 126eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R bool ret = false; 127eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 128eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R if (LIKELY(ctx->mOverlay)) { 129eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 130eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R // ext only layer present.. 13147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(extOnlyLayerIndex != -1) { 132c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah layer = &list->hwLayers[extOnlyLayerIndex]; 133c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM layer->compositionType = HWC_OVERLAY; 134c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM } 135c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM overlay::Overlay& ov = *(ctx->mOverlay); 13647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 13756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ovutils::Whf info(mAlignedFBWidth, mAlignedFBHeight, 13856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 13956d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah mTileEnabled)); 14056d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah 14156d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah Overlay::PipeSpecs pipeSpecs; 14256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 1431a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 14447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed pipeSpecs.dpy = mDpy; 145af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_DEFAULT; 146af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah pipeSpecs.fb = true; 14747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 14847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ovutils::eDest dest = ov.getPipe(pipeSpecs); 149640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(dest == ovutils::OV_INVALID) { //None available 15076443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d", 1519f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan __FUNCTION__, mDpy); 1529f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan return false; 1539f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan } 1549f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan mDest = dest; 1559f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan 156f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if((mDpy && ctx->deviceOrientation) && 1573b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R ctx->listStats[mDpy].isDisplayAnimating) { 158f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran fbZorder = 0; 159ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 1608f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah 161eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 16276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ovutils::eIsFg isFg = ovutils::IS_FG_OFF; 1633b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 1643b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 16576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 1663b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R hwc_rect_t displayFrame = layer->displayFrame; 167effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R 16897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan // No FB update optimization on (1) Custom FB resolution, 169ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed // (2) External Mirror mode, (3) External orientation 170a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(!ctx->dpyAttr[mDpy].customFBSize && !ctx->mBufferMirrorMode 171a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan && !ctx->mExtOrientation) { 1723b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R sourceCrop = fbUpdatingRect; 173fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar displayFrame = fbUpdatingRect; 174a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan } 175a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan 176fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar int transform = layer->transform; 177f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi int rotFlags = ovutils::ROT_FLAGS_NONE; 178f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi 179f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi ovutils::eTransform orient = 180f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi static_cast<ovutils::eTransform>(transform); 181f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi // use ext orientation if any 18256d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah int extOrient = getExtOrientation(ctx); 18356d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah 18456d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah // Do not use getNonWormholeRegion() function to calculate the 1853b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R // sourceCrop during animation on external display and 186c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah // Dont do wormhole calculation when extorientation is set on External 18797c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan // Dont do wormhole calculation when extDownscale is enabled on External 188ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R if(ctx->listStats[mDpy].isDisplayAnimating && mDpy) { 189ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R sourceCrop = layer->displayFrame; 1903e76f19cb2c0441315ebe54110f7b452d2932f52Ramkumar Radhakrishnan } else if((!mDpy || 1913b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R (mDpy && !extOrient 19281c1cc1465b0758702b30bf7e5428a62dc8e4604Prabhanjan Kandula && !ctx->dpyAttr[mDpy].mDownScaleMode)) 19381c1cc1465b0758702b30bf7e5428a62dc8e4604Prabhanjan Kandula && (extOnlyLayerIndex == -1)) { 19497c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan if(!qdutils::MDPVersion::getInstance().is8x26() && 19597c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan !ctx->dpyAttr[mDpy].customFBSize) { 196b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah getNonWormholeRegion(list, sourceCrop); 197b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah displayFrame = sourceCrop; 19897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan } 1993b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R } 2003b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R calcExtDisplayPosition(ctx, NULL, mDpy, sourceCrop, displayFrame, 2013b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R transform, orient); 2023b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R //Store the displayFrame, will be used in getDisplayViewFrame 2033b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R ctx->dpyAttr[mDpy].mDstRect = displayFrame; 20412a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed setMdpFlags(layer, mdpFlags, 0, transform); 20512a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed // For External use rotator if there is a rotation value set 20612a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed ret = preRotateExtDisplay(ctx, layer, info, 20712a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed sourceCrop, mdpFlags, rotFlags); 20847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(!ret) { 2093b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R ALOGE("%s: preRotate for external Failed!", __FUNCTION__); 2103b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R return false; 211e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah } 212b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah //For the mdp, since either we are pre-rotating or MDP does flips 21347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed orient = ovutils::OVERLAY_TRANSFORM_0; 214ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed transform = 0; 215ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ovutils::PipeArgs parg(mdpFlags, info, zOrder, isFg, 21647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed static_cast<ovutils::eRotFlags>(rotFlags), 217ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ovutils::DEFAULT_PLANE_ALPHA, 218ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed (ovutils::eBlending) 219f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah getBlending(layer->blending)); 220ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = true; 221640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(configMdp(ctx->mOverlay, parg, orient, sourceCrop, displayFrame, 222ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed NULL, mDest) < 0) { 223ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ALOGE("%s: configMdp failed for dpy %d", __FUNCTION__, mDpy); 224ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed ret = false; 22547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 226640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 2273b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R return ret; 2283b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R} 2293b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 2303b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.Rbool FBUpdateNonSplit::draw(hwc_context_t *ctx, private_handle_t *hnd) 2313b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R{ 2323b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R if(!mModeOn) { 2333b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R return true; 2343b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R } 2353b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R bool ret = true; 2369513fc6f6c9a7eb26a57838c6bbe95ecd29a7ca5Amara Venkata Mastan Manoj Kumar overlay::Overlay& ov = *(ctx->mOverlay); 23747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ovutils::eDest dest = mDest; 238ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed int fd = hnd->fd; 239ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed uint32_t offset = (uint32_t)hnd->offset; 240ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(mRot) { 241ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed if(!mRot->queueBuffer(fd, offset)) 242640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return false; 243c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah fd = mRot->getDstMemId(); 244c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah offset = mRot->getDstOffset(); 245640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 246c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah if (!ov.queueBuffer(fd, offset, dest)) { 247640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__); 248640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ret = false; 249640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 2503b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R return ret; 251640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 252640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 253f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah//================= High res==================================== 254f9572cdbe3541d85522adea584f925671b375300Jeykumar SankaranFBUpdateSplit::FBUpdateSplit(hwc_context_t *ctx, const int& dpy): 255640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah IFBUpdate(ctx, dpy) {} 256640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 257f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaranvoid FBUpdateSplit::reset() { 258f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran IFBUpdate::reset(); 259640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDestLeft = ovutils::OV_INVALID; 260640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDestRight = ovutils::OV_INVALID; 261f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mRot = NULL; 262640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 263640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 264640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahbool FBUpdateSplit::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 265640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah hwc_rect_t fbUpdatingRect, int fbZorder) { 266f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah if(!ctx->mMDP.hasOverlay) { 2672e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 268640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah __FUNCTION__); 26904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed return false; 270640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 271eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn); 272eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R mModeOn = configure(ctx, list, fbUpdatingRect, fbZorder); 273eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R return mModeOn; 274eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R} 275eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R 276eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R// Configure 277640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahbool FBUpdateSplit::configure(hwc_context_t *ctx, 278c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah hwc_display_contents_1 *list, hwc_rect_t fbUpdatingRect, int fbZorder) { 279c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah bool ret = false; 280c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 281c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM if (LIKELY(ctx->mOverlay)) { 282c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM /* External only layer present */ 28365e9330208dae69762bd3fc81587b8552eaaf739Saurabh Shah int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 2841a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah if(extOnlyLayerIndex != -1) { 2851a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah layer = &list->hwLayers[extOnlyLayerIndex]; 286640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah layer->compositionType = HWC_OVERLAY; 287af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah } 288af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ovutils::Whf info(mAlignedFBWidth, mAlignedFBHeight, 289640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 290640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mTileEnabled)); 29165e9330208dae69762bd3fc81587b8552eaaf739Saurabh Shah 2921a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah overlay::Overlay& ov = *(ctx->mOverlay); 2931a36c7e14d1628592e4e1cff96d977b829f8cc31Saurabh Shah ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 294640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 295af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ovutils::eTransform orient = 296af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah static_cast<ovutils::eTransform>(layer->transform); 297640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int hw_w = ctx->dpyAttr[mDpy].xres; 298640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int hw_h = ctx->dpyAttr[mDpy].yres; 299640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah const int lSplit = getLeftSplit(ctx, mDpy); 300640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDestLeft = ovutils::OV_INVALID; 301640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDestRight = ovutils::OV_INVALID; 302640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 303f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t sourceCrop = fbUpdatingRect; 3045c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N hwc_rect_t displayFrame = fbUpdatingRect; 305f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 306640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ret = true; 30712a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed Overlay::PipeSpecs pipeSpecs; 30812a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed pipeSpecs.formatClass = Overlay::FORMAT_RGB; 309640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 310f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipeSpecs.dpy = mDpy; 311f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran pipeSpecs.fb = true; 312f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 31312a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed /* Configure left pipe */ 31412a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed if(displayFrame.left < lSplit) { 31512a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed pipeSpecs.mixer = Overlay::MIXER_LEFT; 31612a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed ovutils::eDest destL = ov.getPipe(pipeSpecs); 317640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(destL == ovutils::OV_INVALID) { //None available 318640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d's left" 319640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah " mixer", __FUNCTION__, mDpy); 320640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return false; 321640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 322f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 323f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mDestLeft = destL; 324f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran 32512a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed //XXX: FB layer plane alpha is currently sent as zero from 32612a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed //surfaceflinger 32712a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed ovutils::PipeArgs pargL(mdpFlags, 32812a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed info, 329640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah zOrder, 330640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ovutils::IS_FG_OFF, 3318f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah ovutils::ROT_FLAGS_NONE, 332eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R ovutils::DEFAULT_PLANE_ALPHA, 3332e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah (ovutils::eBlending) 3342e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah getBlending(layer->blending)); 3359640e380d8f815ef7ca71c1fdf23eb6f7b30db1eSaurabh Shah hwc_rect_t cropL = sourceCrop; 3362e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah hwc_rect_t dstL = displayFrame; 3372e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah hwc_rect_t scissorL = {0, 0, lSplit, hw_h }; 3382e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah qhwc::calculate_crop_rects(cropL, dstL, scissorL, 0); 3392e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah 3402e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if (configMdp(ctx->mOverlay, pargL, orient, cropL, 3412e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah dstL, NULL, destL)< 0) { 3422e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ALOGE("%s: configMdp fails for left FB", __FUNCTION__); 3432e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ret = false; 3442e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah } 3452e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah } 346640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 3472e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah /* Configure right pipe */ 3482e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(displayFrame.right > lSplit) { 3492e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_RIGHT; 3502e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ovutils::eDest destR = ov.getPipe(pipeSpecs); 3512e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah if(destR == ovutils::OV_INVALID) { //None available 352640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d's" 353640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah " right mixer", __FUNCTION__, mDpy); 354640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return false; 355640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 356640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 357f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran mDestRight = destR; 358640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ovutils::eMdpFlags mdpFlagsR = mdpFlags; 359640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER); 360640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 3612e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah //XXX: FB layer plane alpha is currently sent as zero from 3622e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah //surfaceflinger 363c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah ovutils::PipeArgs pargR(mdpFlagsR, 364c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah info, 3652e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah zOrder, 366f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ovutils::IS_FG_OFF, 3672e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah ovutils::ROT_FLAGS_NONE, 368c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah ovutils::DEFAULT_PLANE_ALPHA, 36993f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R (ovutils::eBlending) 370c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah getBlending(layer->blending)); 37193f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R 372f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran hwc_rect_t cropR = sourceCrop; 3732e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah hwc_rect_t dstR = displayFrame; 374c515b0f37640828e8d9c1d9d7fef0d452684fec4Saurabh Shah hwc_rect_t scissorR = {lSplit, 0, hw_w, hw_h }; 37593f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R qhwc::calculate_crop_rects(cropR, dstR, scissorR, 0); 376640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 377640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah dstR.left -= lSplit; 378640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah dstR.right -= lSplit; 379640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 380640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if (configMdp(ctx->mOverlay, pargR, orient, cropR, 381640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah dstR, NULL, destR) < 0) { 382640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGE("%s: configMdp fails for right FB", __FUNCTION__); 383640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ret = false; 384640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 385640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 386b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah } 387b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah return ret; 388b746f91fe3184bf7c3b6475d247d3cc16cc74646Saurabh Shah} 389640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 390640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahbool FBUpdateSplit::draw(hwc_context_t *ctx, private_handle_t *hnd) 391640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah{ 392640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(!mModeOn) { 393f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shah return true; 394640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 395640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah bool ret = true; 396640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah overlay::Overlay& ov = *(ctx->mOverlay); 397640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(mDestLeft != ovutils::OV_INVALID) { 398640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if (!ov.queueBuffer(hnd->fd, (uint32_t)hnd->offset, mDestLeft)) { 399640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGE("%s: queue failed for left of dpy = %d", 400640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah __FUNCTION__, mDpy); 401640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ret = false; 402640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 403640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 404f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran if(mDestRight != ovutils::OV_INVALID) { 405640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if (!ov.queueBuffer(hnd->fd, (uint32_t)hnd->offset, mDestRight)) { 406640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGE("%s: queue failed for right of dpy = %d", 407640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah __FUNCTION__, mDpy); 408640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ret = false; 409f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran } 410640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 411640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return ret; 412640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 413640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 414640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah//=================FBSrcSplit==================================== 415ccf943e44f9e9d615a6019459625148830039f8dNaseer AhmedFBSrcSplit::FBSrcSplit(hwc_context_t *ctx, const int& dpy): 416ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed FBUpdateSplit(ctx, dpy) {} 417 418bool FBSrcSplit::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 419 hwc_rect_t fbUpdatingRect, int fbZorder) { 420 hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 421 int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 422 // ext only layer present.. 423 if(extOnlyLayerIndex != -1) { 424 layer = &list->hwLayers[extOnlyLayerIndex]; 425 layer->compositionType = HWC_OVERLAY; 426 } 427 428 overlay::Overlay& ov = *(ctx->mOverlay); 429 430 ovutils::Whf info(mAlignedFBWidth, 431 mAlignedFBHeight, 432 ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 433 mTileEnabled)); 434 435 ovutils::eMdpFlags mdpFlags = OV_MDP_BLEND_FG_PREMULT; 436 ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 437 438 ovutils::PipeArgs parg(mdpFlags, 439 info, 440 zOrder, 441 ovutils::IS_FG_OFF, 442 ovutils::ROT_FLAGS_NONE, 443 ovutils::DEFAULT_PLANE_ALPHA, 444 (ovutils::eBlending) 445 getBlending(layer->blending)); 446 447 int transform = layer->transform; 448 ovutils::eTransform orient = 449 static_cast<ovutils::eTransform>(transform); 450 451 hwc_rect_t cropL = fbUpdatingRect; 452 hwc_rect_t cropR = fbUpdatingRect; 453 454 //Request left pipe (or 1 by default) 455 Overlay::PipeSpecs pipeSpecs; 456 pipeSpecs.formatClass = Overlay::FORMAT_RGB; 457 pipeSpecs.needsScaling = qhwc::needsScaling(layer); 458 pipeSpecs.dpy = mDpy; 459 pipeSpecs.mixer = Overlay::MIXER_DEFAULT; 460 pipeSpecs.fb = true; 461 ovutils::eDest destL = ov.getPipe(pipeSpecs); 462 if(destL == ovutils::OV_INVALID) { 463 ALOGE("%s: No pipes available to configure fb for dpy %d's left" 464 " mixer", __FUNCTION__, mDpy); 465 return false; 466 } 467 468 ovutils::eDest destR = ovutils::OV_INVALID; 469 470 /* Use 2 pipes IF 471 a) FB's width is > 2048 or 472 b) On primary, driver has indicated with caps to split always. This is 473 based on an empirically derived value of panel height. 474 */ 475 476 bool primarySplitAlways = (mDpy == HWC_DISPLAY_PRIMARY) and 477 qdutils::MDPVersion::getInstance().isSrcSplitAlways(); 478 479 if(((fbUpdatingRect.right - fbUpdatingRect.left) > 480 qdutils::MAX_DISPLAY_DIM) or 481 primarySplitAlways) { 482 destR = ov.getPipe(pipeSpecs); 483 if(destR == ovutils::OV_INVALID) { 484 ALOGE("%s: No pipes available to configure fb for dpy %d's right" 485 " mixer", __FUNCTION__, mDpy); 486 return false; 487 } 488 489 if(ctx->mOverlay->comparePipePriority(destL, destR) == -1) { 490 qhwc::swap(destL, destR); 491 } 492 493 //Split crop equally when using 2 pipes 494 cropL.right = (fbUpdatingRect.right + fbUpdatingRect.left) / 2; 495 cropR.left = cropL.right; 496 } 497 498 mDestLeft = destL; 499 mDestRight = destR; 500 501 if(destL != OV_INVALID) { 502 if(configMdp(ctx->mOverlay, parg, orient, 503 cropL, cropL, NULL /*metadata*/, destL) < 0) { 504 ALOGE("%s: commit failed for left mixer config", __FUNCTION__); 505 return false; 506 } 507 } 508 509 //configure right pipe 510 if(destR != OV_INVALID) { 511 if(configMdp(ctx->mOverlay, parg, orient, 512 cropR, cropR, NULL /*metadata*/, destR) < 0) { 513 ALOGE("%s: commit failed for right mixer config", __FUNCTION__); 514 return false; 515 } 516 } 517 518 return true; 519} 520 521//--------------------------------------------------------------------- 522}; //namespace qhwc 523