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