hwc_fbupdate.cpp revision 5c937230915bced21130a3e5d129c4f470fd74d3
1ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed/*
2ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed * Copyright (C) 2010 The Android Open Source Project
3bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah * Copyright (C) 2012, 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
221589dee5c27293d278d3e549af8a4bda27e080f8Naseer Ahmed#include <gralloc_priv.h>
2347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed#include "hwc_fbupdate.h"
245c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N#include "hwc_video.h"
25ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
26ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmednamespace qhwc {
27ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
2847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmednamespace ovutils = overlay::utils;
29ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
30640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh ShahIFBUpdate* IFBUpdate::getObject(const int& width, const int& dpy) {
31640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if(width > MAX_DISPLAY_DIM) {
32640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        return new FBUpdateHighRes(dpy);
33640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    }
34640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    return new FBUpdateLowRes(dpy);
35640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah}
36640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
37640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahinline void IFBUpdate::reset() {
38640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    mModeOn = false;
39640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah}
40640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
41640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah//================= Low res====================================
42640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh ShahFBUpdateLowRes::FBUpdateLowRes(const int& dpy): IFBUpdate(dpy) {}
4347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
44640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahinline void FBUpdateLowRes::reset() {
45640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    IFBUpdate::reset();
46640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    mDest = ovutils::OV_INVALID;
47bbee5b1c3475b630caa5061fbf535f87f21743f7Saurabh Shah}
48ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
4904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedbool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list)
5004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
51b3c6e058ce1dbc689f27e7d7acbf1529d37307d8Naseer Ahmed    if(!ctx->mMDP.hasOverlay) {
52640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
532e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                __FUNCTION__);
54080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed       return false;
55080cfcaf2e972513fc09a0207d034ef5dcc975d8Naseer Ahmed    }
5604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    mModeOn = configure(ctx, list);
57640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
58640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    return mModeOn;
59ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
60ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
61ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed// Configure
6204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedbool FBUpdateLowRes::configure(hwc_context_t *ctx,
6304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed                               hwc_display_contents_1 *list)
64ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
6547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    bool ret = false;
6604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
6747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if (LIKELY(ctx->mOverlay)) {
6847377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        overlay::Overlay& ov = *(ctx->mOverlay);
6976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
708cc5d853c3125df5867ce35a10d7a01dd51d48c6Saurabh Shah        if (!hnd) {
718cc5d853c3125df5867ce35a10d7a01dd51d48c6Saurabh Shah            ALOGE("%s:NULL private handle for layer!", __FUNCTION__);
728cc5d853c3125df5867ce35a10d7a01dd51d48c6Saurabh Shah            return false;
738cc5d853c3125df5867ce35a10d7a01dd51d48c6Saurabh Shah        }
74327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ovutils::Whf info(hnd->width, hnd->height,
75327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ovutils::getMdpFormat(hnd->format), hnd->size);
7647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
7747377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        //Request an RGB pipe
78640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
7947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        if(dest == ovutils::OV_INVALID) { //None available
8047377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            return false;
8147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        }
8247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed
83640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        mDest = dest;
8476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
8576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
865c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        // If any of the layers has pre-multiplied alpha, set Pre multiplied
875c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        // Flag as the compositied output is alpha pre-multiplied.
885c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        if(ctx->listStats[mDpy].preMultipliedAlpha == true)
895c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N               ovutils::setMdpFlags(mdpFlags, ovutils::OV_MDP_BLEND_FG_PREMULT);
905c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N
915c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        ovutils::eZorder z_order =
925c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N              ctx->mVidOv[mDpy]->isModeOn()?ovutils::ZORDER_1:ovutils::ZORDER_0;
935c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        ovutils::eIsFg is_fg =
945c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N           ctx->mVidOv[mDpy]->isModeOn()? ovutils::IS_FG_OFF:ovutils::IS_FG_SET;
95ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
9676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ovutils::PipeArgs parg(mdpFlags,
9776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                info,
985c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N                z_order,
995c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N                is_fg,
1008b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan                ovutils::ROT_FLAGS_NONE);
10147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        ov.setSource(parg, dest);
10276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah
10304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        hwc_rect_t sourceCrop;
10404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        getNonWormholeRegion(list, sourceCrop);
10576443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        // x,y,w,h
10676443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
1072e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                sourceCrop.right - sourceCrop.left,
1082e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                sourceCrop.bottom - sourceCrop.top);
10976443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ov.setCrop(dcrop, dest);
1102e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
11176443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        int transform = layer->transform;
11276443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ovutils::eTransform orient =
11376443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah                static_cast<ovutils::eTransform>(transform);
11476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ov.setTransform(orient, dest);
115ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
11604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        hwc_rect_t displayFrame = sourceCrop;
11776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ovutils::Dim dpos(displayFrame.left,
1182e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                displayFrame.top,
1192e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                displayFrame.right - displayFrame.left,
1202e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah                displayFrame.bottom - displayFrame.top);
1210ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
1220ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R        if(mDpy)
1230ae34e340382b0b3b767b844305db19e91257eddArun Kumar K.R            getActionSafePosition(ctx, mDpy, dpos.x, dpos.y, dpos.w, dpos.h);
12476443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        ov.setPosition(dpos, dest);
1252e449280f98f003bb5831c274fc07ab722ac1a94Saurabh Shah
12647377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        ret = true;
12776443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah        if (!ov.commit(dest)) {
12876443245d153635b512539fbc68fdf7a904fdf6fSaurabh Shah            ALOGE("%s: commit fails", __FUNCTION__);
12947377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed            ret = false;
130ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        }
131ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
13247377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    return ret;
133ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
134ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
13504a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedbool FBUpdateLowRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
136ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed{
137640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if(!mModeOn) {
138ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed        return true;
139ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
140ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    bool ret = true;
14147377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    overlay::Overlay& ov = *(ctx->mOverlay);
142640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ovutils::eDest dest = mDest;
14347377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed    if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
1449513fc6f6c9a7eb26a57838c6bbe95ecd29a7ca5Amara Venkata Mastan Manoj Kumar        ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__);
14547377987cc4eef72ee3b0cdced8c3a15038b39ebNaseer Ahmed        ret = false;
146ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    }
147ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed    return ret;
148ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}
149ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed
150640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah//================= High res====================================
151640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh ShahFBUpdateHighRes::FBUpdateHighRes(const int& dpy): IFBUpdate(dpy) {}
152640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
153640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shahinline void FBUpdateHighRes::reset() {
154640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    IFBUpdate::reset();
155640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    mDestLeft = ovutils::OV_INVALID;
156640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    mDestRight = ovutils::OV_INVALID;
157640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah}
158640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
15904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedbool FBUpdateHighRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list)
16004a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed{
161640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if(!ctx->mMDP.hasOverlay) {
162640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
163640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                __FUNCTION__);
164640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah       return false;
165640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    }
166640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
16704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    mModeOn = configure(ctx, list);
168640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    return mModeOn;
169640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah}
170640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
171640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah// Configure
17204a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedbool FBUpdateHighRes::configure(hwc_context_t *ctx,
17304a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed                                hwc_display_contents_1 *list)
174640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah{
175640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    bool ret = false;
17604a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
177640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if (LIKELY(ctx->mOverlay)) {
178640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        overlay::Overlay& ov = *(ctx->mOverlay);
179640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
180640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if (!hnd) {
181640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ALOGE("%s:NULL private handle for layer!", __FUNCTION__);
182640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            return false;
183640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        }
184327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah        ovutils::Whf info(hnd->width, hnd->height,
185327b2ba85538669304a50d0fb6cc2f6aab7aaf3bSaurabh Shah                ovutils::getMdpFormat(hnd->format), hnd->size);
186640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
187640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        //Request left RGB pipe
188640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
189640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(destL == ovutils::OV_INVALID) { //None available
190640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            return false;
191640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        }
192640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        //Request right RGB pipe
193640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
194640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if(destR == ovutils::OV_INVALID) { //None available
195640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            return false;
196640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        }
197640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
198640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        mDestLeft = destL;
199640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        mDestRight = destR;
200640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
201640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_FLAGS_NONE;
2025c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        //If any layer has pre-multiplied alpha, set Pre multiplied
2035c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        //Flag as the compositied output is alpha pre-multiplied.
2045c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        if(ctx->listStats[mDpy].preMultipliedAlpha == true)
2055c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N            ovutils::setMdpFlags(mdpFlagsL, ovutils::OV_MDP_BLEND_FG_PREMULT);
2065c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N
2075c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        ovutils::eZorder z_order =
2085c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N              ctx->mVidOv[mDpy]->isModeOn()?ovutils::ZORDER_1:ovutils::ZORDER_0;
2095c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N        ovutils::eIsFg is_fg =
2105c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N           ctx->mVidOv[mDpy]->isModeOn()? ovutils::IS_FG_OFF:ovutils::IS_FG_SET;
211640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
212640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::PipeArgs pargL(mdpFlagsL,
213640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                info,
2145c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N                z_order,
2155c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N                is_fg,
2168b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan                ovutils::ROT_FLAGS_NONE);
217640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ov.setSource(pargL, destL);
218640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
219640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::eMdpFlags mdpFlagsR = mdpFlagsL;
220640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER);
221640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::PipeArgs pargR(mdpFlagsR,
222640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                info,
2235c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N                z_order,
2245c937230915bced21130a3e5d129c4f470fd74d3Sravan Kumar D.V.N                is_fg,
2258b2d50f3c665329517352269a687bdf562b2cc6dRamkumar Radhakrishnan                ovutils::ROT_FLAGS_NONE);
226640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ov.setSource(pargR, destR);
227640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
22804a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        hwc_rect_t sourceCrop;
22904a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        getNonWormholeRegion(list, sourceCrop);
230640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::Dim dcropL(sourceCrop.left, sourceCrop.top,
231640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                (sourceCrop.right - sourceCrop.left) / 2,
232640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                sourceCrop.bottom - sourceCrop.top);
233640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::Dim dcropR(
234640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                sourceCrop.left + (sourceCrop.right - sourceCrop.left) / 2,
235640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                sourceCrop.top,
236640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                (sourceCrop.right - sourceCrop.left) / 2,
237640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                sourceCrop.bottom - sourceCrop.top);
238640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ov.setCrop(dcropL, destL);
239640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ov.setCrop(dcropR, destR);
240640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
241640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        int transform = layer->transform;
242640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ovutils::eTransform orient =
243640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                static_cast<ovutils::eTransform>(transform);
244640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ov.setTransform(orient, destL);
245640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ov.setTransform(orient, destR);
246640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
24704a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmed        hwc_rect_t displayFrame = sourceCrop;
248640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        //For FB left, top will always be 0
249640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        //That should also be the case if using 2 mixers for single display
25093f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R        ovutils::Dim dposL(displayFrame.left,
25193f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R                displayFrame.top,
25293f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R                (displayFrame.right - displayFrame.left) / 2,
25393f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R                displayFrame.bottom - displayFrame.top);
25493f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R        ov.setPosition(dposL, destL);
25593f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R        ovutils::Dim dposR(0,
256640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                displayFrame.top,
257640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                (displayFrame.right - displayFrame.left) / 2,
258640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                displayFrame.bottom - displayFrame.top);
25993f93515d4b36db7ddb56da15563e3ea6e7ce18cArun Kumar K.R        ov.setPosition(dposR, destR);
260640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
261640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ret = true;
262640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if (!ov.commit(destL)) {
263640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ALOGE("%s: commit fails for left", __FUNCTION__);
264640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ret = false;
265640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        }
266640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        if (!ov.commit(destR)) {
267640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ALOGE("%s: commit fails for right", __FUNCTION__);
268640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah            ret = false;
269640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        }
270640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    }
271640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    return ret;
272640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah}
273640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
27404a2afbd65e9f8bc580a637bf44bfc4e627edce0Naseer Ahmedbool FBUpdateHighRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
275640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah{
276640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if(!mModeOn) {
277640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        return true;
278640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    }
279640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    bool ret = true;
280640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay);
281640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ovutils::eDest destL = mDestLeft;
282640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    ovutils::eDest destR = mDestRight;
283640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destL)) {
284640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ALOGE("%s: queue failed for left of dpy = %d",
285640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                __FUNCTION__, mDpy);
286640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ret = false;
287640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    }
288640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destR)) {
289640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ALOGE("%s: queue failed for right of dpy = %d",
290640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah                __FUNCTION__, mDpy);
291640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah        ret = false;
292640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    }
293640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah    return ret;
294640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah}
295640cb9421639c13248aeb30c3496cdfaec6d894cSaurabh Shah
296ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed//---------------------------------------------------------------------
297ccf943e44f9e9d615a6019459625148830039f8dNaseer Ahmed}; //namespace qhwc
298