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>
23a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shah#include <overlay.h>
24d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed#include "hwc_fbupdate.h"
25ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah#include "mdp_version.h"
26ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shah
27ab90e9d61fe4dbfd577638a3c0cad65d044a2bf0Saurabh Shahusing namespace qdutils;
28a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shahusing namespace overlay;
290c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
300c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmednamespace qhwc {
310c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
32d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmednamespace ovutils = overlay::utils;
330c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
34828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh ShahIFBUpdate* IFBUpdate::getObject(const int& width, const int& rightSplit,
35828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        const int& dpy) {
36828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah    if(width > MAX_DISPLAY_DIM || rightSplit) {
376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        return new FBUpdateHighRes(dpy);
386457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
396457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return new FBUpdateLowRes(dpy);
406457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
416457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
426457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void IFBUpdate::reset() {
436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mModeOn = false;
446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//================= Low res====================================
476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahFBUpdateLowRes::FBUpdateLowRes(const int& dpy): IFBUpdate(dpy) {}
48d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
496457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void FBUpdateLowRes::reset() {
506457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    IFBUpdate::reset();
516457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDest = ovutils::OV_INVALID;
5256f610dd235b577725198e9341caae92379fdf23Saurabh Shah}
530c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
5485530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
5585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                             int fbZorder) {
5696c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed    if(!ctx->mMDP.hasOverlay) {
576457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
5885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 __FUNCTION__);
5985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
60f8ec162999478a3f96dd945831f7c2913a4d3cffNaseer Ahmed    }
6185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mModeOn = configure(ctx, list, fbZorder);
626457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return mModeOn;
630c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed// Configure
6685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_display_contents_1 *list,
6785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                               int fbZorder) {
68d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    bool ret = false;
696195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
70d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if (LIKELY(ctx->mOverlay)) {
71d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        overlay::Overlay& ov = *(ctx->mOverlay);
7230f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        hwc_rect_t displayFrame = layer->displayFrame;
7330f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        int alignedWidth = 0;
7430f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        int alignedHeight = 0;
7530f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah
7630f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        getBufferSizeAndDimensions(displayFrame.right - displayFrame.left,
7730f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                displayFrame.bottom - displayFrame.top,
7830f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                HAL_PIXEL_FORMAT_RGBA_8888,
7930f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                alignedWidth,
8030f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                alignedHeight);
8130f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah
8230f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        ovutils::Whf info(alignedWidth,
8330f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                alignedHeight,
8430f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888));
85d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
8604af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        //Request a pipe
8704af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        ovutils::eMdpPipeType type = ovutils::OV_MDP_PIPE_ANY;
8804af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        if(qdutils::MDPVersion::getInstance().is8x26() && mDpy) {
8904af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah            //For 8x26 external always use DMA pipe
9004af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah            type = ovutils::OV_MDP_PIPE_DMA;
9104af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        }
92a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shah        ovutils::eDest dest = ov.nextPipe(type, mDpy, Overlay::MIXER_DEFAULT);
93d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        if(dest == ovutils::OV_INVALID) { //None available
945d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            ALOGE("%s: No pipes available to configure framebuffer",
955d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__);
96d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed            return false;
97d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        }
98d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed
996457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDest = dest;
100c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
10185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT;
1020edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N
10385530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder);
1040c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
10518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //XXX: FB layer plane alpha is currently sent as zero from
10618bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //surfaceflinger
107c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::PipeArgs parg(mdpFlags,
108c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah                info,
10985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                zOrder,
11085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ovutils::IS_FG_OFF,
11118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::ROT_FLAGS_NONE,
11218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::DEFAULT_PLANE_ALPHA,
11318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
114d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ov.setSource(parg, dest);
115c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah
1166195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        hwc_rect_t sourceCrop;
1176195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed        getNonWormholeRegion(list, sourceCrop);
118c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        // x,y,w,h
119c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top,
12085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           sourceCrop.right - sourceCrop.left,
12185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           sourceCrop.bottom - sourceCrop.top);
122c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setCrop(dcrop, dest);
1233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
124c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        int transform = layer->transform;
125c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::eTransform orient =
12685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            static_cast<ovutils::eTransform>(transform);
127c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setTransform(orient, dest);
1280c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
12904af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        if(!qdutils::MDPVersion::getInstance().is8x26()) {
13004af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah            getNonWormholeRegion(list, sourceCrop);
13104af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        }
13204af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah
13330f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        displayFrame = sourceCrop;
134c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ovutils::Dim dpos(displayFrame.left,
13585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          displayFrame.top,
13685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          displayFrame.right - displayFrame.left,
13785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                          displayFrame.bottom - displayFrame.top);
13804af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah
13904af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah        if(mDpy && !qdutils::MDPVersion::getInstance().is8x26())
14004af919f7d16572b16a91d8b681afe42386fb4e1Saurabh Shah            // Calculate the actionsafe dimensions for External(dpy = 1 or 2)
1414012258b6b344adccf19973602c4d092e2403053Arun Kumar K.R            getActionSafePosition(ctx, mDpy, dpos.x, dpos.y, dpos.w, dpos.h);
142c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        ov.setPosition(dpos, dest);
1433e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah
144d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ret = true;
145c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah        if (!ov.commit(dest)) {
146c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah            ALOGE("%s: commit fails", __FUNCTION__);
147d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed            ret = false;
1480c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed        }
1490c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
150d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    return ret;
1510c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
1520c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1536195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedbool FBUpdateLowRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
1540c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed{
1556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!mModeOn) {
1560c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed        return true;
1570c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
1580c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    bool ret = true;
159d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    overlay::Overlay& ov = *(ctx->mOverlay);
1606457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest dest = mDest;
161d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed    if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) {
1626d948cb412c5dfca8389a1c5515c923480e3573dAmara Venkata Mastan Manoj Kumar        ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__);
163d551ebe2cb65d9da47d3e25f6004b8870afec8b4Naseer Ahmed        ret = false;
1640c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    }
1650c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed    return ret;
1660c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}
1670c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed
1686457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah//================= High res====================================
1696457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh ShahFBUpdateHighRes::FBUpdateHighRes(const int& dpy): IFBUpdate(dpy) {}
1706457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1716457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shahinline void FBUpdateHighRes::reset() {
1726457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    IFBUpdate::reset();
1736457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDestLeft = ovutils::OV_INVALID;
1746457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    mDestRight = ovutils::OV_INVALID;
1756457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
1766457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
17785530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shahbool FBUpdateHighRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list,
17885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                              int fbZorder) {
1796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!ctx->mMDP.hasOverlay) {
1806457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays",
18185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                 __FUNCTION__);
18285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        return false;
1836457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
1846457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn);
18585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah    mModeOn = configure(ctx, list, fbZorder);
1866457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return mModeOn;
1876457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
1886457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
1896457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah// Configure
1906195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedbool FBUpdateHighRes::configure(hwc_context_t *ctx,
191828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        hwc_display_contents_1 *list, int fbZorder) {
1926457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool ret = false;
1936195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmed    hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1];
1946457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (LIKELY(ctx->mOverlay)) {
1956457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        overlay::Overlay& ov = *(ctx->mOverlay);
19630f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        hwc_rect_t displayFrame = layer->displayFrame;
19730f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        int alignedWidth = 0;
19830f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        int alignedHeight = 0;
19930f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah
20030f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        getBufferSizeAndDimensions(displayFrame.right - displayFrame.left,
20130f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                displayFrame.bottom - displayFrame.top,
20230f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                HAL_PIXEL_FORMAT_RGBA_8888,
20330f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                alignedWidth,
20430f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                alignedHeight);
20530f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah
20630f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah        ovutils::Whf info(alignedWidth,
20730f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                alignedHeight,
20830f8aae831920b8bbdca1fbb199ac88973bf9af4Saurabh Shah                ovutils::getMdpFormat(HAL_PIXEL_FORMAT_RGBA_8888));
2096457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2104a6d3c5e8515236621b80e2cc2ecb8d049d1d25bSaurabh Shah        //Request left pipe
211a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shah        ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy,
212a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shah                Overlay::MIXER_LEFT);
2136457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(destL == ovutils::OV_INVALID) { //None available
2145d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            ALOGE("%s: No pipes available to configure framebuffer",
2155d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__);
2166457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
2176457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
2184a6d3c5e8515236621b80e2cc2ecb8d049d1d25bSaurabh Shah        //Request right pipe
219a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shah        ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy,
220a8c3d11acf21811ee74589d08dbcc037cd763526Saurabh Shah                Overlay::MIXER_RIGHT);
2216457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if(destR == ovutils::OV_INVALID) { //None available
2225d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah            ALOGE("%s: No pipes available to configure framebuffer",
2235d6ba59e2cc10cac241153bd5b1088f2330ef8e6Saurabh Shah                __FUNCTION__);
2246457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            return false;
2256457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
2266457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2276457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDestLeft = destL;
2286457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        mDestRight = destR;
2296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
23085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_BLEND_FG_PREMULT;
2310edd0eba442e8b6db2fc2758ecd48e888d251d02Sravan Kumar D.V.N
23285530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah        ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder);
2336457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
23418bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //XXX: FB layer plane alpha is currently sent as zero from
23518bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed        //surfaceflinger
2366457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::PipeArgs pargL(mdpFlagsL,
2376457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                info,
23885530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                zOrder,
23985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ovutils::IS_FG_OFF,
24018bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::ROT_FLAGS_NONE,
24118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::DEFAULT_PLANE_ALPHA,
24218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
2436457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setSource(pargL, destL);
2446457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2456457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eMdpFlags mdpFlagsR = mdpFlagsL;
2466457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER);
2476457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::PipeArgs pargR(mdpFlagsR,
2486457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah                info,
24985530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                zOrder,
25085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                ovutils::IS_FG_OFF,
25118bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::ROT_FLAGS_NONE,
25218bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                ovutils::DEFAULT_PLANE_ALPHA,
25318bdb52a00d4762d423b060e3142fd958664303eNaseer Ahmed                (ovutils::eBlending) getBlending(layer->blending));
2546457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setSource(pargR, destR);
2556457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
25683f9f73c45da200a06244749e4f21a632ecc01baJesse Hall        hwc_rect_t sourceCrop = integerizeSourceCrop(layer->sourceCropf);
257ccb4eac13ac00f24dfeeb190553164ab5d5d7d84Saurabh Shah
258828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        const float xres = ctx->dpyAttr[mDpy].xres;
259517e8b0015001fed3ea1d7bbeeda421de7fdeb2eSaurabh Shah        const int lSplit = getLeftSplit(ctx, mDpy);
260828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        const float lSplitRatio = lSplit / xres;
261828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        const float lCropWidth =
262828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                (sourceCrop.right - sourceCrop.left) * lSplitRatio;
263828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah
264828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        ovutils::Dim dcropL(
265828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                sourceCrop.left,
266828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                sourceCrop.top,
267828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                lCropWidth,
268828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                sourceCrop.bottom - sourceCrop.top);
269828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah
2706457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::Dim dcropR(
271828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                sourceCrop.left + lCropWidth,
272828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                sourceCrop.top,
273828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                (sourceCrop.right - sourceCrop.left) - lCropWidth,
274828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                sourceCrop.bottom - sourceCrop.top);
275828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah
2766457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setCrop(dcropL, destL);
2776457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setCrop(dcropR, destR);
2786457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
2796457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        int transform = layer->transform;
2806457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ovutils::eTransform orient =
28185530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah            static_cast<ovutils::eTransform>(transform);
2826457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setTransform(orient, destL);
2836457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ov.setTransform(orient, destR);
2846457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
285828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        const int lWidth = (lSplit - displayFrame.left);
286828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        const int rWidth = (displayFrame.right - lSplit);
287577a816cdc141037351fe135e47b0d7a956850a3Saurabh Shah        const int height = displayFrame.bottom - displayFrame.top;
288577a816cdc141037351fe135e47b0d7a956850a3Saurabh Shah
289828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah        ovutils::Dim dposL(displayFrame.left,
29085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           displayFrame.top,
291828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                           lWidth,
292577a816cdc141037351fe135e47b0d7a956850a3Saurabh Shah                           height);
2936c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ov.setPosition(dposL, destL);
294577a816cdc141037351fe135e47b0d7a956850a3Saurabh Shah
2956c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ovutils::Dim dposR(0,
29685530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah                           displayFrame.top,
297828e828437e9d6dd027819c2bbea21f0c13597d5Saurabh Shah                           rWidth,
298577a816cdc141037351fe135e47b0d7a956850a3Saurabh Shah                           height);
2996c7e556faaa7ce7b0a99c6110bfacda9369e65bbSaurabh Shah        ov.setPosition(dposR, destR);
3006457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
3016457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = true;
3026457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!ov.commit(destL)) {
3036457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s: commit fails for left", __FUNCTION__);
3046457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ret = false;
3056457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
3066457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        if (!ov.commit(destR)) {
3076457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ALOGE("%s: commit fails for right", __FUNCTION__);
3086457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah            ret = false;
3096457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        }
3106457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
3116457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return ret;
3126457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
3136457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
3146195b7af4c83ba34d713d8e2dd5b075a8896f61eNaseer Ahmedbool FBUpdateHighRes::draw(hwc_context_t *ctx, private_handle_t *hnd)
3156457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah{
3166457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if(!mModeOn) {
3176457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        return true;
3186457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
3196457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    bool ret = true;
3206457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    overlay::Overlay& ov = *(ctx->mOverlay);
3216457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest destL = mDestLeft;
3226457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    ovutils::eDest destR = mDestRight;
3236457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destL)) {
3246457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGE("%s: queue failed for left of dpy = %d",
32585530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah              __FUNCTION__, mDpy);
3266457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = false;
3276457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
3286457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    if (!ov.queueBuffer(hnd->fd, hnd->offset, destR)) {
3296457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ALOGE("%s: queue failed for right of dpy = %d",
33085530ac7d0a1a8961320ca9c7de6adafcff3be08Saurabh Shah              __FUNCTION__, mDpy);
3316457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah        ret = false;
3326457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    }
3336457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah    return ret;
3346457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah}
3356457316fc7ae8ea29d763edce3fc1ffc78dd7387Saurabh Shah
3360c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed//---------------------------------------------------------------------
3370c8b7b5c841a7fad5df11b7e02d7cd792cfcc734Naseer Ahmed}; //namespace qhwc
338