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
4700eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah    /*  Use 2 pipes IF
4710eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah        a) FB's width is > 2048 or
4720eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah        b) On primary, driver has indicated with caps to split always. This is
4730eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah           based on an empirically derived value of panel height.
4740eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah    */
4750eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah
4760eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah    bool primarySplitAlways = (mDpy == HWC_DISPLAY_PRIMARY) and
4770eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah            qdutils::MDPVersion::getInstance().isSrcSplitAlways();
47892b8018e9fcbe8f51f595db0906ff22eed13a251Jesse Hall    int lSplit = getLeftSplit(ctx, mDpy);
4790eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah
4800eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah    if(((fbUpdatingRect.right - fbUpdatingRect.left) >
4810eb79f8456c2a8bb0f30a2e966f8c9000fe934e9Saurabh Shah            qdutils::MAX_DISPLAY_DIM) or
48292b8018e9fcbe8f51f595db0906ff22eed13a251Jesse Hall            ((fbUpdatingRect.right - fbUpdatingRect.left) > lSplit and
48392b8018e9fcbe8f51f595db0906ff22eed13a251Jesse Hall                primarySplitAlways)) {
484314840035b55115a39d526cde009c678ccdacf40Saurabh Shah        destR = ov.getPipe(pipeSpecs);
485348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        if(destR == ovutils::OV_INVALID) {
486348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            ALOGE("%s: No pipes available to configure fb for dpy %d's right"
487348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah                    " mixer", __FUNCTION__, mDpy);
488348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            return false;
489348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        }
490348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
491348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        if(ctx->mOverlay->comparePipePriority(destL, destR) == -1) {
492348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            qhwc::swap(destL, destR);
493348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        }
494348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
495348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        //Split crop equally when using 2 pipes
496348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        cropL.right = (fbUpdatingRect.right + fbUpdatingRect.left) / 2;
497348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        cropR.left = cropL.right;
498348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    }
499348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
500348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    mDestLeft = destL;
501348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    mDestRight = destR;
502348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
503348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    if(destL != OV_INVALID) {
504348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        if(configMdp(ctx->mOverlay, parg, orient,
505348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah                    cropL, cropL, NULL /*metadata*/, destL) < 0) {
506348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            ALOGE("%s: commit failed for left mixer config", __FUNCTION__);
507348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            return false;
508348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        }
5097dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah    }
510348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
511348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    //configure right pipe
512348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    if(destR != OV_INVALID) {
513348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        if(configMdp(ctx->mOverlay, parg, orient,
514348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah                    cropR, cropR, NULL /*metadata*/, destR) < 0) {
515348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            ALOGE("%s: commit failed for right mixer config", __FUNCTION__);
516348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah            return false;
517348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah        }
5187dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah    }
519348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah
520348ca172f707a14925ba1652e9bcb3d4c2a695f4Saurabh Shah    return true;
5217dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah}
5227dc3e31e2a6de0ee146ad9146c12453ad5ce8fa7Saurabh Shah
523ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed//---------------------------------------------------------------------
524ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}; //namespace qhwc
525