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