10c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/*
20c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
36ff21c1cb103978d544227d64577ce230696a3d7Saurabh Shah * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved.
40c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
50c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Not a Contribution, Apache license notifications and license are
60c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * retained for attribution purposes only.
70c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
80c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License");
90c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * you may not use this file except in compliance with the License.
100c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * You may obtain a copy of the License at
110c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
120c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *      http://www.apache.org/licenses/LICENSE-2.0
130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed *
140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Unless required by applicable law or agreed to in writing, software
150c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS,
160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * See the License for the specific language governing permissions and
180c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * limitations under the License.
190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed */
200c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
216457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah#define DEBUG_FBUPDATE 0
2272cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <gralloc_priv.h>
23d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include "hwc_fbupdate.h"
240c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmednamespace qhwc {
260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
27d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmednamespace ovutils = overlay::utils;
280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahIFBUpdate* IFBUpdate::getObject(const int& width, const int& dpy) {
306457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(width > MAX_DISPLAY_DIM) {
316457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        return new FBUpdateHighRes(dpy);
326457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
336457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return new FBUpdateLowRes(dpy);
346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void IFBUpdate::reset() {
376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mModeOn = false;
386457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
406457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//================= Low res====================================
416457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahFBUpdateLowRes::FBUpdateLowRes(const int& dpy): IFBUpdate(dpy) {}
42d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void FBUpdateLowRes::reset() {
446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    IFBUpdate::reset();
456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDest = ovutils::OV_INVALID;
4656f610dd235b577725198e9341caae92379fdf23Saurabh Shah}
470c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
4885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
4985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                             int fbZorder) {
5096c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    if(!ctx->mMDP.hasOverlay) {
516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
5285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 __FUNCTION__);
5385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
54f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed    }
5585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mModeOn = configure(ctx, list, fbZorder);
566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return mModeOn;
570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// Configure
6085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
6185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                               int fbZorder) {
62d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    bool ret = false;
636195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
64d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if (LIKELY(ctx->mOverlay)) {
65d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        overlay::Overlay& ov = *(ctx->mOverlay);
66c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
6732cafd22d940da88d6173248e9790c9424b2a65bNaseer Ahmed        ovutils::Whf info(getWidth(hnd), getHeight(hnd),
6885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          ovutils::getMdpFormat(hnd->format), hnd->size);
69d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
70d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        //Request an RGB pipe
7185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy);
72d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        if(dest == ovutils::OV_INVALID) { //None available
735d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            ALOGE("%s: No pipes available to configure framebuffer",
745d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__);
75d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed            return false;
76d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        }
77d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
786457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDest = dest;
79c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
8085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT;
810edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N
8285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder);
830c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
8418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //XXX: FB layer plane alpha is currently sent as zero from
8518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //surfaceflinger
86c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::PipeArgs parg(mdpFlags,
87c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                info,
8885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                zOrder,
8985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ovutils::IS_FG_OFF,
9018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::ROT_FLAGS_NONE,
9118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::DEFAULT_PLANE_ALPHA,
9218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
93d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ov.setSource(parg, dest);
94c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
956195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        hwc_rect_t sourceCrop;
966195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        getNonWormholeRegion(list, sourceCrop);
97c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        // x,y,w,h
98c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
9985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           sourceCrop.right - sourceCrop.left,
10085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           sourceCrop.bottom - sourceCrop.top);
101c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setCrop(dcrop, dest);
1023e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
103c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        int transform = layer->transform;
104c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::eTransform orient =
10585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            static_cast<ovutils::eTransform>(transform);
106c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setTransform(orient, dest);
1070c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1086195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        hwc_rect_t displayFrame = sourceCrop;
109c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Dim dpos(displayFrame.left,
11085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          displayFrame.top,
11185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          displayFrame.right - displayFrame.left,
11285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          displayFrame.bottom - displayFrame.top);
1134012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R        // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
1144012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R        if(mDpy)
1154012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R            getActionSafePosition(ctx, mDpy, dpos.x, dpos.y, dpos.w, dpos.h);
116c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setPosition(dpos, dest);
1173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
118d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ret = true;
119c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        if (!ov.commit(dest)) {
120c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ALOGE("%s: commit fails", __FUNCTION__);
121d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed            ret = false;
1220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed        }
1230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
124d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    return ret;
1250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
1260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1276195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedbool FBUpdateLowRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
1280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{
1296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!mModeOn) {
1300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed        return true;
1310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
1320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    bool ret = true;
133d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    overlay::Overlay& ov = *(ctx->mOverlay);
1346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest dest = mDest;
135d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
1366d948cb412c5dfca8389a1c5515c923480e3573dAmara Venkata Mastan Manoj Kumar        ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__);
137d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ret = false;
1380c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
1390c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    return ret;
1400c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
1410c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//================= High res====================================
1436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahFBUpdateHighRes::FBUpdateHighRes(const int& dpy): IFBUpdate(dpy) {}
1446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void FBUpdateHighRes::reset() {
1466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    IFBUpdate::reset();
1476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDestLeft = ovutils::OV_INVALID;
1486457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDestRight = ovutils::OV_INVALID;
1496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
1506457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
15185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool FBUpdateHighRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
15285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                              int fbZorder) {
1536457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!ctx->mMDP.hasOverlay) {
1546457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
15585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 __FUNCTION__);
15685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
1576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
1586457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
15985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mModeOn = configure(ctx, list, fbZorder);
1606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return mModeOn;
1616457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
1626457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1636457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah// Configure
1646195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedbool FBUpdateHighRes::configure(hwc_context_t *ctx,
16585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                                hwc_display_contents_1 *list, int fbZorder) {
1666457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool ret = false;
1676195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
1686457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (LIKELY(ctx->mOverlay)) {
1696457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        overlay::Overlay& ov = *(ctx->mOverlay);
1706457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
17132cafd22d940da88d6173248e9790c9424b2a65bNaseer Ahmed        ovutils::Whf info(getWidth(hnd), getHeight(hnd),
17285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          ovutils::getMdpFormat(hnd->format), hnd->size);
1736457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1746457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //Request left RGB pipe
1756457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
1766457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(destL == ovutils::OV_INVALID) { //None available
1775d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            ALOGE("%s: No pipes available to configure framebuffer",
1785d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__);
1796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
1806457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
1816457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //Request right RGB pipe
1826457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
1836457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(destR == ovutils::OV_INVALID) { //None available
1845d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            ALOGE("%s: No pipes available to configure framebuffer",
1855d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__);
1866457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
1876457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
1886457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1896457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDestLeft = destL;
1906457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDestRight = destR;
1916457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
19285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_BLEND_FG_PREMULT;
1930edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N
19485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder);
1956457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
19618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //XXX: FB layer plane alpha is currently sent as zero from
19718bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //surfaceflinger
1986457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::PipeArgs pargL(mdpFlagsL,
1996457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                info,
20085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                zOrder,
20185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ovutils::IS_FG_OFF,
20218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::ROT_FLAGS_NONE,
20318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::DEFAULT_PLANE_ALPHA,
20418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
2056457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setSource(pargL, destL);
2066457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2076457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eMdpFlags mdpFlagsR = mdpFlagsL;
2086457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER);
2096457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::PipeArgs pargR(mdpFlagsR,
2106457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                info,
21185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                zOrder,
21285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ovutils::IS_FG_OFF,
21318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::ROT_FLAGS_NONE,
21418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::DEFAULT_PLANE_ALPHA,
21518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
2166457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setSource(pargR, destR);
2176457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2186195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        hwc_rect_t sourceCrop;
2196195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        getNonWormholeRegion(list, sourceCrop);
2206457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Dim dcropL(sourceCrop.left, sourceCrop.top,
22185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                            (sourceCrop.right - sourceCrop.left) / 2,
22285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                            sourceCrop.bottom - sourceCrop.top);
2236457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Dim dcropR(
22485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            sourceCrop.left + (sourceCrop.right - sourceCrop.left) / 2,
22585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            sourceCrop.top,
22685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            (sourceCrop.right - sourceCrop.left) / 2,
22785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            sourceCrop.bottom - sourceCrop.top);
2286457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setCrop(dcropL, destL);
2296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setCrop(dcropR, destR);
2306457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2316457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        int transform = layer->transform;
2326457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eTransform orient =
23385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            static_cast<ovutils::eTransform>(transform);
2346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setTransform(orient, destL);
2356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setTransform(orient, destR);
2366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2376195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        hwc_rect_t displayFrame = sourceCrop;
2386457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //For FB left, top will always be 0
2396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //That should also be the case if using 2 mixers for single display
2406c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ovutils::Dim dposL(displayFrame.left,
24185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           displayFrame.top,
24285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           (displayFrame.right - displayFrame.left) / 2,
24385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           displayFrame.bottom - displayFrame.top);
2446c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ov.setPosition(dposL, destL);
2456c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ovutils::Dim dposR(0,
24685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           displayFrame.top,
24785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           (displayFrame.right - displayFrame.left) / 2,
24885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           displayFrame.bottom - displayFrame.top);
2496c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ov.setPosition(dposR, destR);
2506457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = true;
2526457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!ov.commit(destL)) {
2536457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s: commit fails for left", __FUNCTION__);
2546457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ret = false;
2556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
2566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!ov.commit(destR)) {
2576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s: commit fails for right", __FUNCTION__);
2586457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ret = false;
2596457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
2606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2616457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return ret;
2626457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
2636457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2646195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedbool FBUpdateHighRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
2656457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah{
2666457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!mModeOn) {
2676457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        return true;
2686457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2696457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool ret = true;
2706457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay);
2716457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest destL = mDestLeft;
2726457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest destR = mDestRight;
2736457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destL)) {
2746457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGE("%s: queue failed for left of dpy = %d",
27585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah              __FUNCTION__, mDpy);
2766457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = false;
2776457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2786457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destR)) {
2796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGE("%s: queue failed for right of dpy = %d",
28085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah              __FUNCTION__, mDpy);
2816457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = false;
2826457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2836457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return ret;
2846457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
2856457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2860c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed//---------------------------------------------------------------------
2870c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; //namespace qhwc
288