1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/*
2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2010 The Android Open Source Project
3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Not a Contribution, Apache license notifications and license are
6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * retained for attribution purposes only.
7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License");
9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License.
10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at
11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *      http://www.apache.org/licenses/LICENSE-2.0
13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby *
14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software
15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS,
16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and
18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License.
19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */
20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define DEBUG_FBUPDATE 0
22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <gralloc_priv.h>
23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "hwc_fbupdate.h"
24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
25b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace qhwc {
26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
27b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace ovutils = overlay::utils;
28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
29b166940edca6e312463461438e2aa66e9852c26aBenoit GobyIFBUpdate* IFBUpdate::getObject(const int& width, const int& dpy) {
30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(width > MAX_DISPLAY_DIM) {
31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return new FBUpdateHighRes(dpy);
32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return new FBUpdateLowRes(dpy);
34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
36b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void IFBUpdate::reset() {
37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mModeOn = false;
38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//================= Low res====================================
41b166940edca6e312463461438e2aa66e9852c26aBenoit GobyFBUpdateLowRes::FBUpdateLowRes(const int& dpy): IFBUpdate(dpy) {}
42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
43b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void FBUpdateLowRes::reset() {
44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    IFBUpdate::reset();
45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mDest = ovutils::OV_INVALID;
46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
48b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                             int fbZorder) {
50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!ctx->mMDP.hasOverlay) {
51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                 __FUNCTION__);
53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mModeOn = configure(ctx, list, fbZorder);
56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return mModeOn;
57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Configure
60b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                               int fbZorder) {
62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool ret = false;
63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (LIKELY(ctx->mOverlay)) {
65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        overlay::Overlay& ov = *(ctx->mOverlay);
66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        private_handle_t *hnd = (private_handle_t *)layer->handle;
67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Whf info(getWidth(hnd), getHeight(hnd),
68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                          ovutils::getMdpFormat(hnd->format), hnd->size);
69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //Request an RGB pipe
71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy);
72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(dest == ovutils::OV_INVALID) { //None available
73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: No pipes available to configure framebuffer",
74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                __FUNCTION__);
75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mDest = dest;
79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT;
81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder);
83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //XXX: FB layer plane alpha is currently sent as zero from
85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //surfaceflinger
86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::PipeArgs parg(mdpFlags,
87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                info,
88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                zOrder,
89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::IS_FG_OFF,
90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::ROT_FLAGS_NONE,
91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::DEFAULT_PLANE_ALPHA,
92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                (ovutils::eBlending) getBlending(layer->blending));
93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setSource(parg, dest);
94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        hwc_rect_t sourceCrop;
96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        getNonWormholeRegion(list, sourceCrop);
97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // x,y,w,h
98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           sourceCrop.right - sourceCrop.left,
100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           sourceCrop.bottom - sourceCrop.top);
101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setCrop(dcrop, dest);
102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        int transform = layer->transform;
104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eTransform orient =
105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            static_cast<ovutils::eTransform>(transform);
106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setTransform(orient, dest);
107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        hwc_rect_t displayFrame = sourceCrop;
109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Dim dpos(displayFrame.left,
110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                          displayFrame.top,
111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                          displayFrame.right - displayFrame.left,
112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                          displayFrame.bottom - displayFrame.top);
113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(mDpy)
115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            getActionSafePosition(ctx, mDpy, dpos.x, dpos.y, dpos.w, dpos.h);
116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setPosition(dpos, dest);
117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
118b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ret = true;
119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (!ov.commit(dest)) {
120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: commit fails", __FUNCTION__);
121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ret = false;
122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return ret;
125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
126b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
127b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateLowRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!mModeOn) {
130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return true;
131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool ret = true;
133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    overlay::Overlay& ov = *(ctx->mOverlay);
134b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::eDest dest = mDest;
135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__);
137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ret = false;
138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return ret;
140b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
142b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//================= High res====================================
143b166940edca6e312463461438e2aa66e9852c26aBenoit GobyFBUpdateHighRes::FBUpdateHighRes(const int& dpy): IFBUpdate(dpy) {}
144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
145b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void FBUpdateHighRes::reset() {
146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    IFBUpdate::reset();
147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mDestLeft = ovutils::OV_INVALID;
148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mDestRight = ovutils::OV_INVALID;
149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
151b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateHighRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                              int fbZorder) {
153b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!ctx->mMDP.hasOverlay) {
154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                 __FUNCTION__);
156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return false;
157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    mModeOn = configure(ctx, list, fbZorder);
160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return mModeOn;
161b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Configure
164b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateHighRes::configure(hwc_context_t *ctx,
165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                                hwc_display_contents_1 *list, int fbZorder) {
166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool ret = false;
167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (LIKELY(ctx->mOverlay)) {
169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        overlay::Overlay& ov = *(ctx->mOverlay);
170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        private_handle_t *hnd = (private_handle_t *)layer->handle;
171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Whf info(getWidth(hnd), getHeight(hnd),
172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                          ovutils::getMdpFormat(hnd->format), hnd->size);
173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //Request left RGB pipe
175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(destL == ovutils::OV_INVALID) { //None available
177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: No pipes available to configure framebuffer",
178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                __FUNCTION__);
179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //Request right RGB pipe
182b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if(destR == ovutils::OV_INVALID) { //None available
184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: No pipes available to configure framebuffer",
185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                __FUNCTION__);
186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            return false;
187b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mDestLeft = destL;
190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        mDestRight = destR;
191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_BLEND_FG_PREMULT;
193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder);
195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //XXX: FB layer plane alpha is currently sent as zero from
197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //surfaceflinger
198b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::PipeArgs pargL(mdpFlagsL,
199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                info,
200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                zOrder,
201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::IS_FG_OFF,
202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::ROT_FLAGS_NONE,
203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::DEFAULT_PLANE_ALPHA,
204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                (ovutils::eBlending) getBlending(layer->blending));
205b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setSource(pargL, destL);
206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eMdpFlags mdpFlagsR = mdpFlagsL;
208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER);
209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::PipeArgs pargR(mdpFlagsR,
210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                info,
211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                zOrder,
212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::IS_FG_OFF,
213b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::ROT_FLAGS_NONE,
214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                ovutils::DEFAULT_PLANE_ALPHA,
215b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                (ovutils::eBlending) getBlending(layer->blending));
216b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setSource(pargR, destR);
217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        hwc_rect_t sourceCrop;
219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        getNonWormholeRegion(list, sourceCrop);
220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Dim dcropL(sourceCrop.left, sourceCrop.top,
221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                            (sourceCrop.right - sourceCrop.left) / 2,
222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                            sourceCrop.bottom - sourceCrop.top);
223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Dim dcropR(
224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            sourceCrop.left + (sourceCrop.right - sourceCrop.left) / 2,
225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            sourceCrop.top,
226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            (sourceCrop.right - sourceCrop.left) / 2,
227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            sourceCrop.bottom - sourceCrop.top);
228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setCrop(dcropL, destL);
229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setCrop(dcropR, destR);
230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        int transform = layer->transform;
232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::eTransform orient =
233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            static_cast<ovutils::eTransform>(transform);
234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setTransform(orient, destL);
235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setTransform(orient, destR);
236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        hwc_rect_t displayFrame = sourceCrop;
238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //For FB left, top will always be 0
239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        //That should also be the case if using 2 mixers for single display
240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Dim dposL(displayFrame.left,
241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           displayFrame.top,
242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           (displayFrame.right - displayFrame.left) / 2,
243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           displayFrame.bottom - displayFrame.top);
244b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setPosition(dposL, destL);
245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ovutils::Dim dposR(0,
246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           displayFrame.top,
247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           (displayFrame.right - displayFrame.left) / 2,
248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby                           displayFrame.bottom - displayFrame.top);
249b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ov.setPosition(dposR, destR);
250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ret = true;
252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (!ov.commit(destL)) {
253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: commit fails for left", __FUNCTION__);
254b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ret = false;
255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        if (!ov.commit(destR)) {
257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ALOGE("%s: commit fails for right", __FUNCTION__);
258b166940edca6e312463461438e2aa66e9852c26aBenoit Goby            ret = false;
259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        }
260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return ret;
262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
264b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateHighRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
265b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{
266b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if(!mModeOn) {
267b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        return true;
268b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
269b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    bool ret = true;
270b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    overlay::Overlay& ov = *(ctx->mOverlay);
271b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::eDest destL = mDestLeft;
272b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    ovutils::eDest destR = mDestRight;
273b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!ov.queueBuffer(hnd->fd, hnd->offset, destL)) {
274b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("%s: queue failed for left of dpy = %d",
275b166940edca6e312463461438e2aa66e9852c26aBenoit Goby              __FUNCTION__, mDpy);
276b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ret = false;
277b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
278b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    if (!ov.queueBuffer(hnd->fd, hnd->offset, destR)) {
279b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ALOGE("%s: queue failed for right of dpy = %d",
280b166940edca6e312463461438e2aa66e9852c26aBenoit Goby              __FUNCTION__, mDpy);
281b166940edca6e312463461438e2aa66e9852c26aBenoit Goby        ret = false;
282b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    }
283b166940edca6e312463461438e2aa66e9852c26aBenoit Goby    return ret;
284b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}
285b166940edca6e312463461438e2aa66e9852c26aBenoit Goby
286b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//---------------------------------------------------------------------
287b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}; //namespace qhwc
288