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