1b166940edca6e312463461438e2aa66e9852c26aBenoit Goby/* 2b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2010 The Android Open Source Project 3b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Copyright (C) 2012-2013, The Linux Foundation. All rights reserved. 4b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 5b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Not a Contribution, Apache license notifications and license are 6b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * retained for attribution purposes only. 7b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 8b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Licensed under the Apache License, Version 2.0 (the "License"); 9b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * you may not use this file except in compliance with the License. 10b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * You may obtain a copy of the License at 11b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 12b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * http://www.apache.org/licenses/LICENSE-2.0 13b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * 14b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * Unless required by applicable law or agreed to in writing, software 15b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * distributed under the License is distributed on an "AS IS" BASIS, 16b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 17b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * See the License for the specific language governing permissions and 18b166940edca6e312463461438e2aa66e9852c26aBenoit Goby * limitations under the License. 19b166940edca6e312463461438e2aa66e9852c26aBenoit Goby */ 20b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 21b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#define DEBUG_FBUPDATE 0 22b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include <gralloc_priv.h> 23b166940edca6e312463461438e2aa66e9852c26aBenoit Goby#include "hwc_fbupdate.h" 24b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 25b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace qhwc { 26b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 27b166940edca6e312463461438e2aa66e9852c26aBenoit Gobynamespace ovutils = overlay::utils; 28b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 29b166940edca6e312463461438e2aa66e9852c26aBenoit GobyIFBUpdate* IFBUpdate::getObject(const int& width, const int& dpy) { 30b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(width > MAX_DISPLAY_DIM) { 31b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return new FBUpdateHighRes(dpy); 32b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 33b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return new FBUpdateLowRes(dpy); 34b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 35b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 36b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void IFBUpdate::reset() { 37b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mModeOn = false; 38b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 39b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 40b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//================= Low res==================================== 41b166940edca6e312463461438e2aa66e9852c26aBenoit GobyFBUpdateLowRes::FBUpdateLowRes(const int& dpy): IFBUpdate(dpy) {} 42b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 43b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void FBUpdateLowRes::reset() { 44b166940edca6e312463461438e2aa66e9852c26aBenoit Goby IFBUpdate::reset(); 45b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDest = ovutils::OV_INVALID; 46b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 47b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 48b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateLowRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 49b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int fbZorder) { 50b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!ctx->mMDP.hasOverlay) { 51b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 52b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__); 53b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 54b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 55b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mModeOn = configure(ctx, list, fbZorder); 56b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return mModeOn; 57b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 58b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 59b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Configure 60b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateLowRes::configure(hwc_context_t *ctx, hwc_display_contents_1 *list, 61b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int fbZorder) { 62b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool ret = false; 63b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 64b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (LIKELY(ctx->mOverlay)) { 65b166940edca6e312463461438e2aa66e9852c26aBenoit Goby overlay::Overlay& ov = *(ctx->mOverlay); 66b166940edca6e312463461438e2aa66e9852c26aBenoit Goby private_handle_t *hnd = (private_handle_t *)layer->handle; 67b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Whf info(getWidth(hnd), getHeight(hnd), 68b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::getMdpFormat(hnd->format), hnd->size); 69b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 70b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Request an RGB pipe 71b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eDest dest = ov.nextPipe(ovutils::OV_MDP_PIPE_ANY, mDpy); 72b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(dest == ovutils::OV_INVALID) { //None available 73b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: No pipes available to configure framebuffer", 74b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__); 75b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 76b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 77b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 78b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDest = dest; 79b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 80b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_BLEND_FG_PREMULT; 81b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 82b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 83b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 84b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //XXX: FB layer plane alpha is currently sent as zero from 85b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //surfaceflinger 86b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::PipeArgs parg(mdpFlags, 87b166940edca6e312463461438e2aa66e9852c26aBenoit Goby info, 88b166940edca6e312463461438e2aa66e9852c26aBenoit Goby zOrder, 89b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::IS_FG_OFF, 90b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::ROT_FLAGS_NONE, 91b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::DEFAULT_PLANE_ALPHA, 92b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (ovutils::eBlending) getBlending(layer->blending)); 93b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setSource(parg, dest); 94b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 95b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_rect_t sourceCrop; 96b166940edca6e312463461438e2aa66e9852c26aBenoit Goby getNonWormholeRegion(list, sourceCrop); 97b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // x,y,w,h 98b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top, 99b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sourceCrop.right - sourceCrop.left, 100b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sourceCrop.bottom - sourceCrop.top); 101b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setCrop(dcrop, dest); 102b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 103b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int transform = layer->transform; 104b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eTransform orient = 105b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static_cast<ovutils::eTransform>(transform); 106b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setTransform(orient, dest); 107b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 108b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_rect_t displayFrame = sourceCrop; 109b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Dim dpos(displayFrame.left, 110b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.top, 111b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.right - displayFrame.left, 112b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.bottom - displayFrame.top); 113b166940edca6e312463461438e2aa66e9852c26aBenoit Goby // Calculate the actionsafe dimensions for External(dpy = 1 or 2) 114b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(mDpy) 115b166940edca6e312463461438e2aa66e9852c26aBenoit Goby getActionSafePosition(ctx, mDpy, dpos.x, dpos.y, dpos.w, dpos.h); 116b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setPosition(dpos, dest); 117b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 118b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = true; 119b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!ov.commit(dest)) { 120b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: commit fails", __FUNCTION__); 121b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = false; 122b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 123b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 124b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return ret; 125b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 126b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 127b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateLowRes::draw(hwc_context_t *ctx, private_handle_t *hnd) 128b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{ 129b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!mModeOn) { 130b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 131b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 132b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool ret = true; 133b166940edca6e312463461438e2aa66e9852c26aBenoit Goby overlay::Overlay& ov = *(ctx->mOverlay); 134b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eDest dest = mDest; 135b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!ov.queueBuffer(hnd->fd, hnd->offset, dest)) { 136b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: queueBuffer failed for FBUpdate", __FUNCTION__); 137b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = false; 138b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 139b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return ret; 140b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 141b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 142b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//================= High res==================================== 143b166940edca6e312463461438e2aa66e9852c26aBenoit GobyFBUpdateHighRes::FBUpdateHighRes(const int& dpy): IFBUpdate(dpy) {} 144b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 145b166940edca6e312463461438e2aa66e9852c26aBenoit Gobyinline void FBUpdateHighRes::reset() { 146b166940edca6e312463461438e2aa66e9852c26aBenoit Goby IFBUpdate::reset(); 147b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDestLeft = ovutils::OV_INVALID; 148b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDestRight = ovutils::OV_INVALID; 149b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 150b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 151b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateHighRes::prepare(hwc_context_t *ctx, hwc_display_contents_1 *list, 152b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int fbZorder) { 153b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!ctx->mMDP.hasOverlay) { 154b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(DEBUG_FBUPDATE, "%s, this hw doesnt support overlays", 155b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__); 156b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 157b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 158b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGD_IF(DEBUG_FBUPDATE, "%s, mModeOn = %d", __FUNCTION__, mModeOn); 159b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mModeOn = configure(ctx, list, fbZorder); 160b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return mModeOn; 161b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 162b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 163b166940edca6e312463461438e2aa66e9852c26aBenoit Goby// Configure 164b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateHighRes::configure(hwc_context_t *ctx, 165b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_display_contents_1 *list, int fbZorder) { 166b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool ret = false; 167b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_layer_1_t *layer = &list->hwLayers[list->numHwLayers - 1]; 168b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (LIKELY(ctx->mOverlay)) { 169b166940edca6e312463461438e2aa66e9852c26aBenoit Goby overlay::Overlay& ov = *(ctx->mOverlay); 170b166940edca6e312463461438e2aa66e9852c26aBenoit Goby private_handle_t *hnd = (private_handle_t *)layer->handle; 171b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Whf info(getWidth(hnd), getHeight(hnd), 172b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::getMdpFormat(hnd->format), hnd->size); 173b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 174b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Request left RGB pipe 175b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eDest destL = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 176b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(destL == ovutils::OV_INVALID) { //None available 177b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: No pipes available to configure framebuffer", 178b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__); 179b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 180b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 181b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //Request right RGB pipe 182b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eDest destR = ov.nextPipe(ovutils::OV_MDP_PIPE_RGB, mDpy); 183b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(destR == ovutils::OV_INVALID) { //None available 184b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: No pipes available to configure framebuffer", 185b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__); 186b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return false; 187b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 188b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 189b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDestLeft = destL; 190b166940edca6e312463461438e2aa66e9852c26aBenoit Goby mDestRight = destR; 191b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 192b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eMdpFlags mdpFlagsL = ovutils::OV_MDP_BLEND_FG_PREMULT; 193b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 194b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eZorder zOrder = static_cast<ovutils::eZorder>(fbZorder); 195b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 196b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //XXX: FB layer plane alpha is currently sent as zero from 197b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //surfaceflinger 198b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::PipeArgs pargL(mdpFlagsL, 199b166940edca6e312463461438e2aa66e9852c26aBenoit Goby info, 200b166940edca6e312463461438e2aa66e9852c26aBenoit Goby zOrder, 201b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::IS_FG_OFF, 202b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::ROT_FLAGS_NONE, 203b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::DEFAULT_PLANE_ALPHA, 204b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (ovutils::eBlending) getBlending(layer->blending)); 205b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setSource(pargL, destL); 206b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 207b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eMdpFlags mdpFlagsR = mdpFlagsL; 208b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::setMdpFlags(mdpFlagsR, ovutils::OV_MDSS_MDP_RIGHT_MIXER); 209b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::PipeArgs pargR(mdpFlagsR, 210b166940edca6e312463461438e2aa66e9852c26aBenoit Goby info, 211b166940edca6e312463461438e2aa66e9852c26aBenoit Goby zOrder, 212b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::IS_FG_OFF, 213b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::ROT_FLAGS_NONE, 214b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::DEFAULT_PLANE_ALPHA, 215b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (ovutils::eBlending) getBlending(layer->blending)); 216b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setSource(pargR, destR); 217b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 218b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_rect_t sourceCrop; 219b166940edca6e312463461438e2aa66e9852c26aBenoit Goby getNonWormholeRegion(list, sourceCrop); 220b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Dim dcropL(sourceCrop.left, sourceCrop.top, 221b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (sourceCrop.right - sourceCrop.left) / 2, 222b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sourceCrop.bottom - sourceCrop.top); 223b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Dim dcropR( 224b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sourceCrop.left + (sourceCrop.right - sourceCrop.left) / 2, 225b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sourceCrop.top, 226b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (sourceCrop.right - sourceCrop.left) / 2, 227b166940edca6e312463461438e2aa66e9852c26aBenoit Goby sourceCrop.bottom - sourceCrop.top); 228b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setCrop(dcropL, destL); 229b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setCrop(dcropR, destR); 230b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 231b166940edca6e312463461438e2aa66e9852c26aBenoit Goby int transform = layer->transform; 232b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eTransform orient = 233b166940edca6e312463461438e2aa66e9852c26aBenoit Goby static_cast<ovutils::eTransform>(transform); 234b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setTransform(orient, destL); 235b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setTransform(orient, destR); 236b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 237b166940edca6e312463461438e2aa66e9852c26aBenoit Goby hwc_rect_t displayFrame = sourceCrop; 238b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //For FB left, top will always be 0 239b166940edca6e312463461438e2aa66e9852c26aBenoit Goby //That should also be the case if using 2 mixers for single display 240b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Dim dposL(displayFrame.left, 241b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.top, 242b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (displayFrame.right - displayFrame.left) / 2, 243b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.bottom - displayFrame.top); 244b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setPosition(dposL, destL); 245b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::Dim dposR(0, 246b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.top, 247b166940edca6e312463461438e2aa66e9852c26aBenoit Goby (displayFrame.right - displayFrame.left) / 2, 248b166940edca6e312463461438e2aa66e9852c26aBenoit Goby displayFrame.bottom - displayFrame.top); 249b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ov.setPosition(dposR, destR); 250b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 251b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = true; 252b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!ov.commit(destL)) { 253b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: commit fails for left", __FUNCTION__); 254b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = false; 255b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 256b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!ov.commit(destR)) { 257b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: commit fails for right", __FUNCTION__); 258b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = false; 259b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 260b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 261b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return ret; 262b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 263b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 264b166940edca6e312463461438e2aa66e9852c26aBenoit Gobybool FBUpdateHighRes::draw(hwc_context_t *ctx, private_handle_t *hnd) 265b166940edca6e312463461438e2aa66e9852c26aBenoit Goby{ 266b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if(!mModeOn) { 267b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return true; 268b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 269b166940edca6e312463461438e2aa66e9852c26aBenoit Goby bool ret = true; 270b166940edca6e312463461438e2aa66e9852c26aBenoit Goby overlay::Overlay& ov = *(ctx->mOverlay); 271b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eDest destL = mDestLeft; 272b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ovutils::eDest destR = mDestRight; 273b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!ov.queueBuffer(hnd->fd, hnd->offset, destL)) { 274b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: queue failed for left of dpy = %d", 275b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__, mDpy); 276b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = false; 277b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 278b166940edca6e312463461438e2aa66e9852c26aBenoit Goby if (!ov.queueBuffer(hnd->fd, hnd->offset, destR)) { 279b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ALOGE("%s: queue failed for right of dpy = %d", 280b166940edca6e312463461438e2aa66e9852c26aBenoit Goby __FUNCTION__, mDpy); 281b166940edca6e312463461438e2aa66e9852c26aBenoit Goby ret = false; 282b166940edca6e312463461438e2aa66e9852c26aBenoit Goby } 283b166940edca6e312463461438e2aa66e9852c26aBenoit Goby return ret; 284b166940edca6e312463461438e2aa66e9852c26aBenoit Goby} 285b166940edca6e312463461438e2aa66e9852c26aBenoit Goby 286b166940edca6e312463461438e2aa66e9852c26aBenoit Goby//--------------------------------------------------------------------- 287b166940edca6e312463461438e2aa66e9852c26aBenoit Goby}; //namespace qhwc 288