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