1f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed/* 2f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * Copyright (C) 2010 The Android Open Source Project 356f610dd235b577725198e9341caae92379fdf23Saurabh Shah * Copyright (C) 2012, The Linux Foundation. All rights reserved. 4f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * 5f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * Licensed under the Apache License, Version 2.0 (the "License"); 6f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * you may not use this file except in compliance with the License. 7f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * You may obtain a copy of the License at 8f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * 9f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * http://www.apache.org/licenses/LICENSE-2.0 10f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * 11f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * Unless required by applicable law or agreed to in writing, software 12f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * distributed under the License is distributed on an "AS IS" BASIS, 13f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * See the License for the specific language governing permissions and 15f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed * limitations under the License. 16f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed */ 17f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1872cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#define VIDEO_DEBUG 0 1972cf9762f84aab07faab86e35fe830b63ec54d72Naseer Ahmed#include <overlay.h> 20f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#include "hwc_video.h" 213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah#include "hwc_utils.h" 22f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 23f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmednamespace qhwc { 24f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 25f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed#define FINAL_TRANSFORM_MASK 0x000F 26f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 27f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Static Members 28c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahovutils::eOverlayState VideoOverlay::sState[] = {ovutils::OV_CLOSED}; 29c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shahbool VideoOverlay::sIsModeOn[] = {false}; 30f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 31f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed//Cache stats, figure out the state, config overlay 323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool VideoOverlay::prepare(hwc_context_t *ctx, hwc_display_contents_1_t *list, 333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int dpy) { 34c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int yuvIndex = ctx->listStats[dpy].yuvIndex; 36c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah sIsModeOn[dpy] = false; 373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 3896c4c95d48dc075196c601b30a8798a262df9720Naseer Ahmed if(!ctx->mMDP.hasOverlay) { 3931da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed ALOGD_IF(VIDEO_DEBUG,"%s, this hw doesnt support overlay", __FUNCTION__); 4031da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed return false; 4131da0b1f44d5ff8f95be2b440df3cdd8c5c396d4Naseer Ahmed } 42c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 43c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(yuvIndex == -1 || ctx->listStats[dpy].yuvCount != 1) { 442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed return false; 452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 46f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 473e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah //index guaranteed to be not -1 at this point 483e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_layer_1_t *yuvLayer = &list->hwLayers[yuvIndex]; 4968b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed 50cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed private_handle_t *hnd = (private_handle_t *)yuvLayer->handle; 5168b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed if(ctx->mSecureMode) { 5268b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed if (! isSecureBuffer(hnd)) { 5368b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed ALOGD_IF(VIDEO_DEBUG, "%s: Handle non-secure video layer" 5468b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed "during secure playback gracefully", __FUNCTION__); 5568b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed return false; 5668b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed } 57cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed } else { 58cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed if (isSecureBuffer(hnd)) { 59cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed ALOGD_IF(VIDEO_DEBUG, "%s: Handle secure video layer" 60cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed "during non-secure playback gracefully", __FUNCTION__); 61cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed return false; 62cb5f25b58dd1b38a4790debb46b1d5f6024e7d3eNaseer Ahmed } 6368b88cf211873e6f2cef0111c500697cd690266eNaseer Ahmed } 643e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah chooseState(ctx, dpy, yuvLayer); 653e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(configure(ctx, dpy, yuvLayer)) { 663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah markFlags(yuvLayer); 67c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah sIsModeOn[dpy] = true; 683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 69f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 70c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah return sIsModeOn[dpy]; 71f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed} 72f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid VideoOverlay::chooseState(hwc_context_t *ctx, int dpy, 743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_layer_1_t *yuvLayer) { 75f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ALOGD_IF(VIDEO_DEBUG, "%s: old state = %s", __FUNCTION__, 76c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ovutils::getStateString(sState[dpy])); 77f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah private_handle_t *hnd = NULL; 793e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(yuvLayer) { 803e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hnd = (private_handle_t *)yuvLayer->handle; 813e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 82f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ovutils::eOverlayState newState = ovutils::OV_CLOSED; 833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(dpy) { 843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(ctx->listStats[dpy].yuvCount == 1) { 86c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah newState = ovutils::OV_2D_VIDEO_ON_PANEL; 873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(isSkipLayer(yuvLayer) && !isSecureBuffer(hnd)) { 88c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah newState = ovutils::OV_CLOSED; 893e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 903e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 913e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 93c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah newState = ctx->mOverlay[HWC_DISPLAY_EXTERNAL]->getState(); //If we are here, external is active 94c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(ctx->listStats[dpy].yuvCount == 1) { 953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(!isSkipLayer(yuvLayer) || isSecureBuffer(hnd)) { 96c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah newState = ovutils::OV_UI_VIDEO_TV; 973e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 98c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 1003e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 1013e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 102f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } 1033e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah 104c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah sState[dpy] = newState; 105f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ALOGD_IF(VIDEO_DEBUG, "%s: new chosen state = %s", __FUNCTION__, 106c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ovutils::getStateString(sState[dpy])); 107f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed} 108f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1093e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahvoid VideoOverlay::markFlags(hwc_layer_1_t *yuvLayer) { 1103e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if(yuvLayer) { 1113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah yuvLayer->compositionType = HWC_OVERLAY; 1123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah yuvLayer->hints |= HWC_HINT_CLEAR_FB; 113f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } 114f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed} 115f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1162cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed/* Helpers */ 1175b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedbool configPrimVid(hwc_context_t *ctx, hwc_layer_1_t *layer) { 118c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah overlay::Overlay& ov = *(ctx->mOverlay[HWC_DISPLAY_PRIMARY]); 1192cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 1202cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size); 121f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1222cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE; 1233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if (isSecureBuffer(hnd)) { 1242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::setMdpFlags(mdpFlags, 1252cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 1262cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 127f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 12891a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah if(layer->blending == HWC_BLENDING_PREMULT) { 12991a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah ovutils::setMdpFlags(mdpFlags, 13091a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah ovutils::OV_MDP_BLEND_FG_PREMULT); 13191a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah } 13291a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah 1332cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::eIsFg isFgFlag = ovutils::IS_FG_OFF; 134150806ae0ed82d1d26fa144a6950031570b06bfbSaurabh Shah if (ctx->listStats[HWC_DISPLAY_PRIMARY].numAppLayers == 1) { 1352cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed isFgFlag = ovutils::IS_FG_SET; 1362cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 137f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::PipeArgs parg(mdpFlags, 1392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed info, 1402cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::ZORDER_0, 1412cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed isFgFlag, 1422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::ROT_FLAG_DISABLED); 1432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::PipeArgs pargs[ovutils::MAX_PIPES] = { parg, parg, parg }; 1442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setSource(pargs, ovutils::OV_PIPE0); 1452cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 14627c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah int transform = layer->transform & FINAL_TRANSFORM_MASK; 14727c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah ovutils::eTransform orient = 14827c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah static_cast<ovutils::eTransform>(transform); 14927c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah 1502cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 1512cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed hwc_rect_t displayFrame = layer->displayFrame; 1522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 1532cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed //Calculate the rect for primary based on whether the supplied position 1542cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed //is within or outside bounds. 155541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah const int fbWidth = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].xres; 156541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah const int fbHeight = ctx->dpyAttr[HWC_DISPLAY_PRIMARY].yres; 157f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed if( displayFrame.left < 0 || 159f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed displayFrame.top < 0 || 160f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed displayFrame.right > fbWidth || 161f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed displayFrame.bottom > fbHeight) { 16227c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah calculate_crop_rects(sourceCrop, displayFrame, fbWidth, fbHeight, 16327c1d65113aaac5c577523132b5b990552284ba9Saurabh Shah transform); 1642cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 165f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1661023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah // source crop x,y,w,h 1671023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top, 1681023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah sourceCrop.right - sourceCrop.left, 1691023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah sourceCrop.bottom - sourceCrop.top); 1702cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed //Only for Primary 1712cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setCrop(dcrop, ovutils::OV_PIPE0); 172f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1732cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setTransform(orient, ovutils::OV_PIPE0); 174f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1751023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah // position x,y,w,h 1761023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah ovutils::Dim dpos(displayFrame.left, 1771023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah displayFrame.top, 1781023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah displayFrame.right - displayFrame.left, 1791023ce2fdd0c7d82b70d075757503a9ff3eee2a6Saurabh Shah displayFrame.bottom - displayFrame.top); 1802cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setPosition(dpos, ovutils::OV_PIPE0); 181f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1822cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed if (!ov.commit(ovutils::OV_PIPE0)) { 1832cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ALOGE("%s: commit fails", __FUNCTION__); 1842cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed return false; 1852cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 1862cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed return true; 1872cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed} 188f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 1895b6708ac87dc9681b3dd142b82702a8b995c6e22Naseer Ahmedbool configExtVid(hwc_context_t *ctx, hwc_layer_1_t *layer) { 190c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah overlay::Overlay& ov = *(ctx->mOverlay[HWC_DISPLAY_EXTERNAL]); 1912cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed private_handle_t *hnd = (private_handle_t *)layer->handle; 1922cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::Whf info(hnd->width, hnd->height, hnd->format, hnd->size); 1932cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 1942cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::eMdpFlags mdpFlags = ovutils::OV_MDP_FLAGS_NONE; 1953e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if (isSecureBuffer(hnd)) { 1962cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::setMdpFlags(mdpFlags, 1972cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::OV_MDP_SECURE_OVERLAY_SESSION); 198f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } 1992cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 20091a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah if(layer->blending == HWC_BLENDING_PREMULT) { 20191a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah ovutils::setMdpFlags(mdpFlags, 20291a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah ovutils::OV_MDP_BLEND_FG_PREMULT); 20391a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah } 20491a6a994e8d799ea2d4c4cbe6ff2e9be76105988Saurabh Shah 2052cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::eIsFg isFgFlag = ovutils::IS_FG_OFF; 206150806ae0ed82d1d26fa144a6950031570b06bfbSaurabh Shah if (ctx->listStats[HWC_DISPLAY_EXTERNAL].numAppLayers == 1) { 2072cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed isFgFlag = ovutils::IS_FG_SET; 2082cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 2092cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 2102cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::PipeArgs parg(mdpFlags, 2112cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed info, 212c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ovutils::ZORDER_1, 2132cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed isFgFlag, 214c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ovutils::ROT_FLAG_DISABLED); 2152cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::PipeArgs pargs[ovutils::MAX_PIPES] = { parg, parg, parg }; 2162cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setSource(pargs, ovutils::OV_PIPE1); 2172cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 218541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah int transform = layer->transform; 219541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah ovutils::eTransform orient = 220541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah static_cast<ovutils::eTransform>(transform); 221541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah 2222cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed hwc_rect_t sourceCrop = layer->sourceCrop; 223541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah hwc_rect_t displayFrame = layer->displayFrame; 224541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah 225541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah //Calculate the rect for primary based on whether the supplied position 226541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah //is within or outside bounds. 227541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah const int fbWidth = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].xres; 228541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah const int fbHeight = ctx->dpyAttr[HWC_DISPLAY_EXTERNAL].yres; 229541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah 230541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah if( displayFrame.left < 0 || 231541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah displayFrame.top < 0 || 232541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah displayFrame.right > fbWidth || 233541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah displayFrame.bottom > fbHeight) { 234541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah calculate_crop_rects(sourceCrop, displayFrame, fbWidth, fbHeight, 235541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah transform); 236541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah } 237541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah 2382cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed // x,y,w,h 2392cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ovutils::Dim dcrop(sourceCrop.left, sourceCrop.top, 2402cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed sourceCrop.right - sourceCrop.left, 2412cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed sourceCrop.bottom - sourceCrop.top); 2422cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed //Only for External 2432cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setCrop(dcrop, ovutils::OV_PIPE1); 2442cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 245c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ov.setTransform(orient, ovutils::OV_PIPE1); 2462cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 247541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah ovutils::Dim dpos(displayFrame.left, 248541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah displayFrame.top, 249541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah (displayFrame.right - displayFrame.left), 250541b59d15504bb6e5b9fbeb031aa2287a1abed2aSaurabh Shah (displayFrame.bottom - displayFrame.top)); 2512cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 2522cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed //Only for External 2532cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ov.setPosition(dpos, ovutils::OV_PIPE1); 2542cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 2552cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed if (!ov.commit(ovutils::OV_PIPE1)) { 2562cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed ALOGE("%s: commit fails", __FUNCTION__); 2572cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed return false; 2582cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 2592cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed return true; 2602cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed} 2612cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed 2623e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool VideoOverlay::configure(hwc_context_t *ctx, int dpy, 2633e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah hwc_layer_1_t *yuvLayer) { 2642cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed bool ret = true; 265c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah overlay::Overlay& ov = *(ctx->mOverlay[dpy]); 2663e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(dpy) { 2673e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 2683e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah // Set overlay state 269c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ov.setState(sState[dpy]); 270c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah switch(sState[dpy]) { 2713e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case ovutils::OV_2D_VIDEO_ON_PANEL: 2723e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret &= configPrimVid(ctx, yuvLayer); 2733e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2743e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 2753e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return false; 2763e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2773e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2783e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 279c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah ov.setState(sState[dpy]); 280c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah switch(sState[dpy]) { 281c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah case ovutils::OV_UI_VIDEO_TV: 2823e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = configExtVid(ctx, yuvLayer); 2833e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2843e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 2853e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah return false; 2863e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 2873e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 2882cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 2892cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed return ret; 290f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed} 291f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 2923e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shahbool VideoOverlay::draw(hwc_context_t *ctx, hwc_display_contents_1_t *list, 2933e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int dpy) 294f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed{ 295c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(!sIsModeOn[dpy]) { 296c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah return true; 297c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah } 298c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah 2993e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah int yuvIndex = ctx->listStats[dpy].yuvIndex; 300c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah if(yuvIndex == -1) { 301f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed return true; 302f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } 303f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 3044c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed private_handle_t *hnd = (private_handle_t *) 3053e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah list->hwLayers[yuvIndex].handle; 3064c588a200c537224d4eb5f63fb0a88f791511ff2Naseer Ahmed 307f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed bool ret = true; 308c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah overlay::Overlay& ov = *(ctx->mOverlay[dpy]); 309f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed ovutils::eOverlayState state = ov.getState(); 310f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 3113e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(dpy) { 3123e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_PRIMARY: 3133e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch (state) { 3143e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case ovutils::OV_2D_VIDEO_ON_PANEL: 3153e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah // Play primary 3163e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if (!ov.queueBuffer(hnd->fd, hnd->offset, ovutils::OV_PIPE0)) { 3173e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ALOGE("%s: queueBuffer failed for primary", __FUNCTION__); 3183e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = false; 3193e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3203e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 3213e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 3223e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = false; 3233e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 3242cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed } 3252cc53dd510a5e1ffaaac8493b1ff65a908df6c13Naseer Ahmed break; 3263e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah case HWC_DISPLAY_EXTERNAL: 3273e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah switch(state) { 328c4d034f4b8d12953632907d30c0b78856d829579Saurabh Shah case ovutils::OV_UI_VIDEO_TV: 3293e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah // Play external 3303e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah if (!ov.queueBuffer(hnd->fd, hnd->offset, ovutils::OV_PIPE1)) { 3313e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ALOGE("%s: queueBuffer failed for external", __FUNCTION__); 3323e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = false; 3333e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah } 3343e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 3353e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah default: 3363e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah ret = false; 3373e858ebde3f2b4e762af8f7f2808d45ba59b890dSaurabh Shah break; 338f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } 339f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed break; 340f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed } 341f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed return ret; 342f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed} 343f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed 344f48aef64b218d42bd2ede62dcb03a3d7831ebbf9Naseer Ahmed}; //namespace qhwc 345