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