hwc_fbupdate.cpp revision 6d948cb412c5dfca8389a1c5515c923480e3573d
10c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed/*
20c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project
356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, 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>
2372cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <fb_priv.h>
24d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include "hwc_fbupdate.h"
250c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
260c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmednamespace qhwc {
270c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
28d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmednamespace ovutils = overlay::utils;
290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
306457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahIFBUpdate* IFBUpdate::getObject(const int& width, const int& dpy) {
316457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(width > MAX_DISPLAY_DIM) {
326457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        return new FBUpdateHighRes(dpy);
336457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return new FBUpdateLowRes(dpy);
356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void IFBUpdate::reset() {
386457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mModeOn = false;
396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
406457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
416457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//================= Low res====================================
426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahFBUpdateLowRes::FBUpdateLowRes(const int& dpy): IFBUpdate(dpy) {}
43d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void FBUpdateLowRes::reset() {
456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    IFBUpdate::reset();
466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDest = ovutils::OV_INVALID;
4756f610dd235b577725198e9341caae92379fdf23Saurabh Shah}
480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahbool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_layer_1_t *fblayer) {
5096c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    if(!ctx->mMDP.hasOverlay) {
516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
523e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                __FUNCTION__);
53f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed       return false;
54f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed    }
556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mModeOn = configure(ctx, fblayer);
566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return mModeOn;
580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
590c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
600c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// Configure
616457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahbool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer)
620c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{
63d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    bool ret = false;
64d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if (LIKELY(ctx->mOverlay)) {
65d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        overlay::Overlay& ov = *(ctx->mOverlay);
66c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
67ae823e773536ee9b6cf97c575463f1a9902370d9Saurabh Shah        if (!hnd) {
68ae823e773536ee9b6cf97c575463f1a9902370d9Saurabh Shah            ALOGE("%s:NULL private handle for layer!", __FUNCTION__);
69ae823e773536ee9b6cf97c575463f1a9902370d9Saurabh Shah            return false;
70ae823e773536ee9b6cf97c575463f1a9902370d9Saurabh Shah        }
71c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
72d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
73d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        //Request an RGB pipe
746457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
75d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        if(dest == ovutils::OV_INVALID) { //None available
76d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed            return false;
77d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        }
78d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDest = dest;
80c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
81c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE;
820c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
83c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::PipeArgs parg(mdpFlags,
84c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                info,
85c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                ovutils::ZORDER_0,
86d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed                ovutils::IS_FG_SET,
87d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan                ovutils::ROT_FLAGS_NONE);
88d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ov.setSource(parg, dest);
89c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
90c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        hwc_rect_t sourceCrop = layer->sourceCrop;
91c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        // x,y,w,h
92c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                sourceCrop.right - sourceCrop.left,
943e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                sourceCrop.bottom - sourceCrop.top);
95c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setCrop(dcrop, dest);
963e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
97c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        int transform = layer->transform;
98c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::eTransform orient =
99c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                static_cast<ovutils::eTransform>(transform);
100c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setTransform(orient, dest);
1010c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
102c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        hwc_rect_t displayFrame = layer->displayFrame;
103c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Dim dpos(displayFrame.left,
1043e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                displayFrame.top,
1053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                displayFrame.right - displayFrame.left,
1063e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah                displayFrame.bottom - displayFrame.top);
107c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setPosition(dpos, dest);
1083e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
109d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ret = true;
110c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        if (!ov.commit(dest)) {
111c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ALOGE("%s: commit fails", __FUNCTION__);
112d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed            ret = false;
1130c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed        }
1140c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
115d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    return ret;
1160c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
1170c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1186457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahbool FBUpdateLowRes::draw(hwc_context_t *ctx, hwc_layer_1_t *layer)
1190c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{
1206457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!mModeOn) {
1210c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed        return true;
1220c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
1230c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    bool ret = true;
124d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    overlay::Overlay& ov = *(ctx->mOverlay);
1256457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest dest = mDest;
126c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
127d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
1286d948cb412c5dfca8389a1c5515c923480e3573dAmara Venkata Mastan Manoj Kumar        ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__);
129d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ret = false;
1300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
1310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    return ret;
1320c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
1330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//================= High res====================================
1356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahFBUpdateHighRes::FBUpdateHighRes(const int& dpy): IFBUpdate(dpy) {}
1366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void FBUpdateHighRes::reset() {
1386457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    IFBUpdate::reset();
1396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDestLeft = ovutils::OV_INVALID;
1406457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDestRight = ovutils::OV_INVALID;
1416457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
1426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahbool FBUpdateHighRes::prepare(hwc_context_t *ctx, hwc_layer_1_t *fblayer) {
1446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!ctx->mMDP.hasOverlay) {
1456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
1466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                __FUNCTION__);
1476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah       return false;
1486457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
1496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
1506457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mModeOn = configure(ctx, fblayer);
1516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return mModeOn;
1526457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
1536457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1546457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah// Configure
1556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahbool FBUpdateHighRes::configure(hwc_context_t *ctx, hwc_layer_1_t *layer)
1566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah{
1576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool ret = false;
1586457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (LIKELY(ctx->mOverlay)) {
1596457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        overlay::Overlay& ov = *(ctx->mOverlay);
1606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        private_handle_t *hnd = (private_handle_t *)layer->handle;
1616457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!hnd) {
1626457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s:NULL private handle for layer!", __FUNCTION__);
1636457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
1646457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
1656457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size);
1666457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1676457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //Request left RGB pipe
1686457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
1696457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(destL == ovutils::OV_INVALID) { //None available
1706457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
1716457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
1726457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //Request right RGB pipe
1736457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy);
1746457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(destR == ovutils::OV_INVALID) { //None available
1756457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
1766457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
1776457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1786457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDestLeft = destL;
1796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDestRight = destR;
1806457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1816457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_FLAGS_NONE;
1826457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1836457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::PipeArgs pargL(mdpFlagsL,
1846457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                info,
1856457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                ovutils::ZORDER_0,
1866457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                ovutils::IS_FG_SET,
187d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan                ovutils::ROT_FLAGS_NONE);
1886457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setSource(pargL, destL);
1896457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1906457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eMdpFlags mdpFlagsR = mdpFlagsL;
1916457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER);
1926457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::PipeArgs pargR(mdpFlagsR,
1936457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                info,
1946457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                ovutils::ZORDER_0,
1956457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                ovutils::IS_FG_SET,
196d82ce1da8ebdba46e6d0119fac1aa8d4b9b033b7Ramkumar Radhakrishnan                ovutils::ROT_FLAGS_NONE);
1976457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setSource(pargR, destR);
1986457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1996457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        hwc_rect_t sourceCrop = layer->sourceCrop;
2006457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Dim dcropL(sourceCrop.left, sourceCrop.top,
2016457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                (sourceCrop.right - sourceCrop.left) / 2,
2026457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                sourceCrop.bottom - sourceCrop.top);
2036457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Dim dcropR(
2046457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                sourceCrop.left + (sourceCrop.right - sourceCrop.left) / 2,
2056457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                sourceCrop.top,
2066457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                (sourceCrop.right - sourceCrop.left) / 2,
2076457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                sourceCrop.bottom - sourceCrop.top);
2086457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setCrop(dcropL, destL);
2096457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setCrop(dcropR, destR);
2106457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2116457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        int transform = layer->transform;
2126457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eTransform orient =
2136457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                static_cast<ovutils::eTransform>(transform);
2146457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setTransform(orient, destL);
2156457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setTransform(orient, destR);
2166457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2176457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        hwc_rect_t displayFrame = layer->displayFrame;
2186457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //For FB left, top will always be 0
2196457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        //That should also be the case if using 2 mixers for single display
2206457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Dim dpos(displayFrame.left,
2216457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                displayFrame.top,
2226457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                (displayFrame.right - displayFrame.left) / 2,
2236457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                displayFrame.bottom - displayFrame.top);
2246457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setPosition(dpos, destL);
2256457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setPosition(dpos, destR);
2266457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2276457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = true;
2286457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!ov.commit(destL)) {
2296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s: commit fails for left", __FUNCTION__);
2306457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ret = false;
2316457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
2326457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!ov.commit(destR)) {
2336457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s: commit fails for right", __FUNCTION__);
2346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ret = false;
2356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
2366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return ret;
2386457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
2396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2406457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahbool FBUpdateHighRes::draw(hwc_context_t *ctx, hwc_layer_1_t *layer)
2416457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah{
2426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!mModeOn) {
2436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        return true;
2446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool ret = true;
2466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay);
2476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest destL = mDestLeft;
2486457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest destR = mDestRight;
2496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    private_handle_t *hnd = (private_handle_t *)layer->handle;
2506457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destL)) {
2516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGE("%s: queue failed for left of dpy = %d",
2526457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                __FUNCTION__, mDpy);
2536457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = false;
2546457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destR)) {
2566457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGE("%s: queue failed for right of dpy = %d",
2576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                __FUNCTION__, mDpy);
2586457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = false;
2596457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
2606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return ret;
2616457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
2626457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed//---------------------------------------------------------------------
2640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; //namespace qhwc
265