hwc_fbupdate.cpp revision ac2fedd035f04998f47f2c5a47034a0968e47865
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) { 41ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah if(qdutils::MDPVersion::getInstance().isSrcSplit()) { 42ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah return new FBSrcSplit(ctx, dpy); 43ac2fedd035f04998f47f2c5a47034a0968e47865Saurabh Shah } else if(isDisplaySplit(ctx, dpy)) { 44c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah return new FBUpdateSplit(ctx, dpy); 45640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 46c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah return new FBUpdateNonSplit(ctx, dpy); 47640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 48640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 49c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh ShahIFBUpdate::IFBUpdate(hwc_context_t *ctx, const int& dpy) : mDpy(dpy) { 50c9cbe63708025b7aed15e251b2fb3a914fd842a0Ramkumar Radhakrishnan size_t size = 0; 51c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM getBufferAttributes(ctx->dpyAttr[mDpy].xres, 52c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ctx->dpyAttr[mDpy].yres, 53c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah HAL_PIXEL_FORMAT_RGBA_8888, 54c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM 0, 55c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah mAlignedFBWidth, 56c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM mAlignedFBHeight, 57c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM mTileEnabled, size); 58c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah} 59c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah 60c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shahvoid IFBUpdate::reset() { 61640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mModeOn = false; 623b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R mRot = NULL; 63640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 64640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 651029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shahbool IFBUpdate::prepareAndValidate(hwc_context_t *ctx, 661029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah hwc_display_contents_1 *list, int fbZorder) { 67d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 6850cd3e8b50b76d74cfa17be5b2baf4973e3bc3a4Ramkumar Radhakrishnan mModeOn = prepare(ctx, list, layer->displayFrame, fbZorder) && 691029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah ctx->mOverlay->validateAndSet(mDpy, ctx->dpyAttr[mDpy].fd); 7050cd3e8b50b76d74cfa17be5b2baf4973e3bc3a4Ramkumar Radhakrishnan return mModeOn; 711029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah} 721029ad2b12d5f30e77b2c2f85da891f2d1842424Saurabh Shah 73640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah//================= Low res==================================== 74c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh ShahFBUpdateNonSplit::FBUpdateNonSplit(hwc_context_t *ctx, const int& dpy): 75c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah IFBUpdate(ctx, dpy) {} 7647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 77c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shahvoid FBUpdateNonSplit::reset() { 78640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah IFBUpdate::reset(); 79640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDest = ovutils::OV_INVALID; 80bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah} 81ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 82f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateNonSplit::preRotateExtDisplay(hwc_context_t *ctx, 8381c1cc1465b0758702b30bf7e5428a62dc8e4604Prabhanjan Kandula 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); 9097c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ovutils::eTransform orient = static_cast<ovutils::eTransform >(extOrient); 9197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan if(mDpy && (extOrient & HWC_TRANSFORM_ROT_90)) { 9297c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan mRot = ctx->mRotMgr->getNext(); 9397c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan if(mRot == NULL) return false; 945080cdee5662ba2eab9a058bda428217720dc694Saurabh Shah ctx->mLayerRotMap[mDpy]->add(layer, mRot); 9523a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan // Composed FB content will have black bars, if the viewFrame of the 9623a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan // external is different from {0, 0, fbWidth, fbHeight}, so intersect 9723a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan // viewFrame with sourceCrop to avoid those black bars 9823a7db0dafcbd47e976be1011a08f56361801039Ramkumar Radhakrishnan sourceCrop = getIntersection(sourceCrop, ctx->mViewFrame[mDpy]); 9997c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan //Configure rotator for pre-rotation 10097c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar 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; 10897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan } 10997c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan return true; 11097c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan} 11197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan 112f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateNonSplit::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 113d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t fbUpdatingRect, int fbZorder) { 114b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed if(!ctx->mMDP.hasOverlay) { 115640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 116f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 117f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 118080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed } 119d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran mModeOn = configure(ctx, list, fbUpdatingRect, fbZorder); 120640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return mModeOn; 121ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 122ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 123ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed// Configure 124f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateNonSplit::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 125d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t fbUpdatingRect, int fbZorder) { 12647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed bool ret = false; 12704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 12847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if (LIKELY(ctx->mOverlay)) { 129eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 130eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R // ext only layer present.. 131eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R if(extOnlyLayerIndex != -1) { 132eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R layer = &list->hwLayers[extOnlyLayerIndex]; 133eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R layer->compositionType = HWC_OVERLAY; 134eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R } 13547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed overlay::Overlay& ov = *(ctx->mOverlay); 136c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah 137c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ovutils::Whf info(mAlignedFBWidth, mAlignedFBHeight, 138c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 139c38cdae859e0ee12ad3284a308eaeef9d2708c74Manoj Kumar AVM mTileEnabled)); 14047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed 141314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 142314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 143314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 144314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 145314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_DEFAULT; 146314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = true; 147314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 148314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ovutils::eDest dest = ov.getPipe(pipeSpecs); 14947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed if(dest == ovutils::OV_INVALID) { //None available 150af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d", 151af5f82d1c39754b14e9fc91eedc0d0429020c049Saurabh Shah __FUNCTION__, mDpy); 15247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return false; 15347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed } 154640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDest = dest; 15576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah 1569f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan if((mDpy && ctx->deviceOrientation) && 1579f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan ctx->listStats[mDpy].isDisplayAnimating) { 1589f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan fbZorder = 0; 1599f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan } 1609f69b91e962b59f708dac458f24b11c4c4b94348Ramkumar Radhakrishnan 161f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 1623b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R ovutils::eIsFg isFg = ovutils::IS_FG_OFF; 163f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 164ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 1658f42508dc1e3bf24da360d5fbefd8c6574f82868Saurabh Shah hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf); 166eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R hwc_rect_t displayFrame = layer->displayFrame; 167d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran 168d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran // No FB update optimization on (1) Custom FB resolution, 169d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran // (2) External Mirror mode, (3) External orientation 170d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran if(!ctx->dpyAttr[mDpy].customFBSize && !ctx->mBufferMirrorMode 171d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran && !ctx->mExtOrientation) { 172d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran sourceCrop = fbUpdatingRect; 173d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran displayFrame = fbUpdatingRect; 174d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran } 175d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran 17676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah int transform = layer->transform; 1773b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R int rotFlags = ovutils::ROT_FLAGS_NONE; 1783b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R 17976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah ovutils::eTransform orient = 1803b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R static_cast<ovutils::eTransform>(transform); 181effbd25d502916fcdebadd1d2b83988559434e79Arun Kumar K.R // use ext orientation if any 18297c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan int extOrient = getExtOrientation(ctx); 183ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 184a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // Do not use getNonWormholeRegion() function to calculate the 185a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan // sourceCrop during animation on external display and 1863b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R // Dont do wormhole calculation when extorientation is set on External 187fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar // Dont do wormhole calculation when extDownscale is enabled on External 188a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan if(ctx->listStats[mDpy].isDisplayAnimating && mDpy) { 189a0e87cbc523323604e8fb7cb5526f410a1ed26dfRamkumar Radhakrishnan sourceCrop = layer->displayFrame; 190fea63d61337f1efeb2d1c7a7a4fafe472611704cAmara Venkata Mastan Manoj Kumar } else if((!mDpy || 191f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi (mDpy && !extOrient 192f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi && !ctx->dpyAttr[mDpy].mDownScaleMode)) 193f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi && (extOnlyLayerIndex == -1)) { 194f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi if(!qdutils::MDPVersion::getInstance().is8x26() && 195f2a7cdb337bc7b0767c0fcca735b1c1d95b6c715Dileep Kumar Reddi !ctx->dpyAttr[mDpy].customFBSize) { 19656d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah getNonWormholeRegion(list, sourceCrop); 19756d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah displayFrame = sourceCrop; 19856d570f1d7eb34ab0db968298efb8e75b849c893Saurabh Shah } 1993b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R } 200c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah calcExtDisplayPosition(ctx, NULL, mDpy, sourceCrop, displayFrame, 20197c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan transform, orient); 202ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R //Store the displayFrame, will be used in getDisplayViewFrame 203ac5b9f4e6b7dc80e0f91c1581f0bcb4464a48ef4Arun Kumar K.R ctx->dpyAttr[mDpy].mDstRect = displayFrame; 2043e76f19cb2c0441315ebe54110f7b452d2932f52Ramkumar Radhakrishnan setMdpFlags(layer, mdpFlags, 0, transform); 2053b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R // For External use rotator if there is a rotation value set 20681c1cc1465b0758702b30bf7e5428a62dc8e4604Prabhanjan Kandula ret = preRotateExtDisplay(ctx, layer, info, 20781c1cc1465b0758702b30bf7e5428a62dc8e4604Prabhanjan Kandula sourceCrop, mdpFlags, rotFlags); 20897c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan if(!ret) { 20997c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan ALOGE("%s: preRotate for external Failed!", __FUNCTION__); 21097c10c26c62d57a3fc31197fdd37d1bbfb8d1c2aRamkumar Radhakrishnan return false; 2113b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R } 2123b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R //For the mdp, since either we are pre-rotating or MDP does flips 2133b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R orient = ovutils::OVERLAY_TRANSFORM_0; 2143b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R transform = 0; 2153b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R ovutils::PipeArgs parg(mdpFlags, info, zOrder, isFg, 21612a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed static_cast<ovutils::eRotFlags>(rotFlags), 21712a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed ovutils::DEFAULT_PLANE_ALPHA, 21812a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed (ovutils::eBlending) 21912a7b537b1e043a61b06db3d083c2372c11ef1f2Naseer Ahmed getBlending(layer->blending)); 22047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ret = true; 2213b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R if(configMdp(ctx->mOverlay, parg, orient, sourceCrop, displayFrame, 2223b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R NULL, mDest) < 0) { 223e188278e86ebb2f7f1ed3762855f15062b7f9d03Saurabh Shah ALOGE("%s: configMdp failed for dpy %d", __FUNCTION__, mDpy); 22447377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ret = false; 225ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 226ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 22747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed return ret; 228ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 229ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 230f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateNonSplit::draw(hwc_context_t *ctx, private_handle_t *hnd) 231ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{ 232640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(!mModeOn) { 233ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return true; 234ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 235ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed bool ret = true; 23647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed overlay::Overlay& ov = *(ctx->mOverlay); 237640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ovutils::eDest dest = mDest; 2383b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R int fd = hnd->fd; 2393d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu uint32_t offset = (uint32_t)hnd->offset; 2403b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R if(mRot) { 2413b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R if(!mRot->queueBuffer(fd, offset)) 2423b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R return false; 2433b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R fd = mRot->getDstMemId(); 2443b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R offset = mRot->getDstOffset(); 2453b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R } 2463b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R if (!ov.queueBuffer(fd, offset, dest)) { 2479513fc6f6c9a7eb26a57838c6bbe95ecd29a7ca5Amara Venkata Mastan Manoj Kumar ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__); 24847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed ret = false; 249ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed } 250ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed return ret; 251ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed} 252ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed 253640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah//================= High res==================================== 254c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh ShahFBUpdateSplit::FBUpdateSplit(hwc_context_t *ctx, const int& dpy): 255c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shah IFBUpdate(ctx, dpy) {} 256640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 257c4aeb6a47160792212f22edecdf1ed45e5f575f3Saurabh Shahvoid FBUpdateSplit::reset() { 258640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah IFBUpdate::reset(); 259640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDestLeft = ovutils::OV_INVALID; 260640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah mDestRight = ovutils::OV_INVALID; 2613b9570a337a3115ad05dee3c1aa2ecc6f82f6ab1Arun Kumar K.R mRot = NULL; 262640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 263640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 264f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateSplit::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 265d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t fbUpdatingRect, int fbZorder) { 266640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(!ctx->mMDP.hasOverlay) { 267640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 268f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran __FUNCTION__); 269f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran return false; 270640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 271640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn); 272d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran mModeOn = configure(ctx, list, fbUpdatingRect, fbZorder); 273640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return mModeOn; 274640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 275640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 276640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah// Configure 277f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateSplit::configure(hwc_context_t *ctx, 278d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_display_contents_1 *list, hwc_rect_t fbUpdatingRect, int fbZorder) { 279640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah bool ret = false; 28004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 281640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if (LIKELY(ctx->mOverlay)) { 282a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran /* External only layer present */ 283eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 284eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R if(extOnlyLayerIndex != -1) { 285eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R layer = &list->hwLayers[extOnlyLayerIndex]; 286eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R layer->compositionType = HWC_OVERLAY; 287eb43d2b7b681164a58e3f86bd0b0d88eea6a3591Arun Kumar K.R } 288a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::Whf info(mAlignedFBWidth, mAlignedFBHeight, 289a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 290a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran mTileEnabled)); 2915c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N 292a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran overlay::Overlay& ov = *(ctx->mOverlay); 293a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 294f9572cdbe3541d85522adea584f925671b375300Jeykumar Sankaran ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 295a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::eTransform orient = 296a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran static_cast<ovutils::eTransform>(layer->transform); 297a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran const int hw_w = ctx->dpyAttr[mDpy].xres; 298a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran const int hw_h = ctx->dpyAttr[mDpy].yres; 299a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran const int lSplit = getLeftSplit(ctx, mDpy); 300a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran mDestLeft = ovutils::OV_INVALID; 301a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran mDestRight = ovutils::OV_INVALID; 302640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 303d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t sourceCrop = fbUpdatingRect; 304d5d41f238fd48170a0755bde427088c92ca0920cJeykumar Sankaran hwc_rect_t displayFrame = fbUpdatingRect; 3052e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah 306a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ret = true; 307314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 308314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 309314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 310314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 311314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = true; 312314840035b55115a39d526cde009c678ccdacf40Saurabh Shah 313a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran /* Configure left pipe */ 314a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if(displayFrame.left < lSplit) { 315314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_LEFT; 316314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ovutils::eDest destL = ov.getPipe(pipeSpecs); 317a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if(destL == ovutils::OV_INVALID) { //None available 318a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ALOGE("%s: No pipes available to configure fb for dpy %d's left" 319a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran " mixer", __FUNCTION__, mDpy); 320a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran return false; 321a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 3222e474227e216ee37ab84a3c9a22ea1f650626231Saurabh Shah 323a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran mDestLeft = destL; 324a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran 325a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran //XXX: FB layer plane alpha is currently sent as zero from 326a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran //surfaceflinger 327a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::PipeArgs pargL(mdpFlags, 328a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran info, 329a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran zOrder, 330a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::IS_FG_OFF, 331a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::ROT_FLAGS_NONE, 332a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::DEFAULT_PLANE_ALPHA, 333a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran (ovutils::eBlending) 334a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran getBlending(layer->blending)); 335a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran hwc_rect_t cropL = sourceCrop; 336a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran hwc_rect_t dstL = displayFrame; 337a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran hwc_rect_t scissorL = {0, 0, lSplit, hw_h }; 338a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran qhwc::calculate_crop_rects(cropL, dstL, scissorL, 0); 339a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran 340a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if (configMdp(ctx->mOverlay, pargL, orient, cropL, 341a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran dstL, NULL, destL)< 0) { 342a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ALOGE("%s: configMdp fails for left FB", __FUNCTION__); 343a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ret = false; 344a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 345a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 346640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 347a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran /* Configure right pipe */ 348a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if(displayFrame.right > lSplit) { 349314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_RIGHT; 350314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ovutils::eDest destR = ov.getPipe(pipeSpecs); 351a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if(destR == ovutils::OV_INVALID) { //None available 352a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ALOGE("%s: No pipes available to configure fb for dpy %d's" 353a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran " right mixer", __FUNCTION__, mDpy); 354a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran return false; 355a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 356640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 357a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran mDestRight = destR; 358a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::eMdpFlags mdpFlagsR = mdpFlags; 359a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER); 360a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran 361a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran //XXX: FB layer plane alpha is currently sent as zero from 362a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran //surfaceflinger 363a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::PipeArgs pargR(mdpFlagsR, 364a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran info, 365a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran zOrder, 366a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::IS_FG_OFF, 367a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::ROT_FLAGS_NONE, 368a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ovutils::DEFAULT_PLANE_ALPHA, 369a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran (ovutils::eBlending) 370a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran getBlending(layer->blending)); 371a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran 372a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran hwc_rect_t cropR = sourceCrop; 373a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran hwc_rect_t dstR = displayFrame; 374a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran hwc_rect_t scissorR = {lSplit, 0, hw_w, hw_h }; 375a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran qhwc::calculate_crop_rects(cropR, dstR, scissorR, 0); 376a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran 377a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran dstR.left -= lSplit; 378a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran dstR.right -= lSplit; 379a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran 380a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if (configMdp(ctx->mOverlay, pargR, orient, cropR, 381a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran dstR, NULL, destR) < 0) { 382a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ALOGE("%s: configMdp fails for right FB", __FUNCTION__); 383a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ret = false; 384a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 385640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 386640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 387640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return ret; 388640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 389640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 390f8c680dacf0a357ea1f56542fb329bbc9749b6b5Saurabh Shahbool FBUpdateSplit::draw(hwc_context_t *ctx, private_handle_t *hnd) 391640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah{ 392640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah if(!mModeOn) { 393640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return true; 394640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 395640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah bool ret = true; 396640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah overlay::Overlay& ov = *(ctx->mOverlay); 397a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if(mDestLeft != ovutils::OV_INVALID) { 3983d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu if (!ov.queueBuffer(hnd->fd, (uint32_t)hnd->offset, mDestLeft)) { 399a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ALOGE("%s: queue failed for left of dpy = %d", 400a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran __FUNCTION__, mDpy); 401a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ret = false; 402a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 403640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 404a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran if(mDestRight != ovutils::OV_INVALID) { 4053d3705af561ebe7182b23fdc81e0b755d22b11ebPraveena Pachipulusu if (!ov.queueBuffer(hnd->fd, (uint32_t)hnd->offset, mDestRight)) { 406a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ALOGE("%s: queue failed for right of dpy = %d", 407a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran __FUNCTION__, mDpy); 408a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran ret = false; 409a1f884eced72ca52131f38df5181a158248a24b9Jeykumar Sankaran } 410640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah } 411640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah return ret; 412640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah} 413640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah 4147dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah//=================FBSrcSplit==================================== 4157dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh ShahFBSrcSplit::FBSrcSplit(hwc_context_t *ctx, const int& dpy): 4167dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah FBUpdateSplit(ctx, dpy) {} 4177dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 4187dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shahbool FBSrcSplit::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 4197dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_rect_t fbUpdatingRect, int fbZorder) { 4207dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 4217dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah int extOnlyLayerIndex = ctx->listStats[mDpy].extOnlyLayerIndex; 4227dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah // ext only layer present.. 4237dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah if(extOnlyLayerIndex != -1) { 4247dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah layer = &list->hwLayers[extOnlyLayerIndex]; 4257dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah layer->compositionType = HWC_OVERLAY; 4267dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 427348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 4287dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah overlay::Overlay& ov = *(ctx->mOverlay); 4297dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 4307dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::Whf info(mAlignedFBWidth, 4317dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah mAlignedFBHeight, 4327dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888, 4337dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah mTileEnabled)); 4347dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 4357dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::eMdpFlags mdpFlags = OV_MDP_BLEND_FG_PREMULT; 4367dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 4377dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 4387dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::PipeArgs parg(mdpFlags, 4397dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah info, 4407dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah zOrder, 4417dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::IS_FG_OFF, 4427dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::ROT_FLAGS_NONE, 4437dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::DEFAULT_PLANE_ALPHA, 4447dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah (ovutils::eBlending) 4457dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah getBlending(layer->blending)); 4467dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 4477dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah int transform = layer->transform; 4487dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah ovutils::eTransform orient = 4497dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah static_cast<ovutils::eTransform>(transform); 4507dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 451348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah hwc_rect_t cropL = fbUpdatingRect; 452348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah hwc_rect_t cropR = fbUpdatingRect; 453348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 454348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah //Request left pipe (or 1 by default) 455314840035b55115a39d526cde009c678ccdacf40Saurabh Shah Overlay::PipeSpecs pipeSpecs; 456314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.formatClass = Overlay::FORMAT_RGB; 457314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.needsScaling = qhwc::needsScaling(layer); 458314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.dpy = mDpy; 459314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.mixer = Overlay::MIXER_DEFAULT; 460314840035b55115a39d526cde009c678ccdacf40Saurabh Shah pipeSpecs.fb = true; 461314840035b55115a39d526cde009c678ccdacf40Saurabh Shah ovutils::eDest destL = ov.getPipe(pipeSpecs); 462348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(destL == ovutils::OV_INVALID) { 463348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d's left" 464348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah " mixer", __FUNCTION__, mDpy); 465348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return false; 4667dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 467348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 468348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah ovutils::eDest destR = ovutils::OV_INVALID; 469348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 470348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah //Request right pipe (2 pipes needed only if dim > 2048) 471348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if((fbUpdatingRect.right - fbUpdatingRect.left) > 472348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah qdutils::MAX_DISPLAY_DIM) { 473314840035b55115a39d526cde009c678ccdacf40Saurabh Shah destR = ov.getPipe(pipeSpecs); 474348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(destR == ovutils::OV_INVALID) { 475348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah ALOGE("%s: No pipes available to configure fb for dpy %d's right" 476348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah " mixer", __FUNCTION__, mDpy); 477348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return false; 478348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah } 479348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 480348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(ctx->mOverlay->comparePipePriority(destL, destR) == -1) { 481348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah qhwc::swap(destL, destR); 482348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah } 483348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 484348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah //Split crop equally when using 2 pipes 485348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah cropL.right = (fbUpdatingRect.right + fbUpdatingRect.left) / 2; 486348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah cropR.left = cropL.right; 487348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah } 488348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 489348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah mDestLeft = destL; 490348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah mDestRight = destR; 491348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 492348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(destL != OV_INVALID) { 493348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(configMdp(ctx->mOverlay, parg, orient, 494348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah cropL, cropL, NULL /*metadata*/, destL) < 0) { 495348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah ALOGE("%s: commit failed for left mixer config", __FUNCTION__); 496348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return false; 497348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah } 4987dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 499348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 500348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah //configure right pipe 501348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(destR != OV_INVALID) { 502348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah if(configMdp(ctx->mOverlay, parg, orient, 503348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah cropR, cropR, NULL /*metadata*/, destR) < 0) { 504348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah ALOGE("%s: commit failed for right mixer config", __FUNCTION__); 505348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return false; 506348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah } 5077dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah } 508348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah 509348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah return true; 5107dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah} 5117dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah 512ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed//--------------------------------------------------------------------- 513ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}; //namespace qhwc 514