DisplayAnalyzer.cpp revision 2f6c0128167508e86c3daf83e7b60f3b5f16f7ac
165efc253a628175c7afa95c431b746ea20052794Andy Qiu/* 265efc253a628175c7afa95c431b746ea20052794Andy Qiu * Copyright © 2012 Intel Corporation 365efc253a628175c7afa95c431b746ea20052794Andy Qiu * All rights reserved. 465efc253a628175c7afa95c431b746ea20052794Andy Qiu * 565efc253a628175c7afa95c431b746ea20052794Andy Qiu * Permission is hereby granted, free of charge, to any person obtaining a 665efc253a628175c7afa95c431b746ea20052794Andy Qiu * copy of this software and associated documentation files (the "Software"), 765efc253a628175c7afa95c431b746ea20052794Andy Qiu * to deal in the Software without restriction, including without limitation 865efc253a628175c7afa95c431b746ea20052794Andy Qiu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 965efc253a628175c7afa95c431b746ea20052794Andy Qiu * and/or sell copies of the Software, and to permit persons to whom the 1065efc253a628175c7afa95c431b746ea20052794Andy Qiu * Software is furnished to do so, subject to the following conditions: 1165efc253a628175c7afa95c431b746ea20052794Andy Qiu * 1265efc253a628175c7afa95c431b746ea20052794Andy Qiu * The above copyright notice and this permission notice (including the next 1365efc253a628175c7afa95c431b746ea20052794Andy Qiu * paragraph) shall be included in all copies or substantial portions of the 1465efc253a628175c7afa95c431b746ea20052794Andy Qiu * Software. 1565efc253a628175c7afa95c431b746ea20052794Andy Qiu * 1665efc253a628175c7afa95c431b746ea20052794Andy Qiu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1765efc253a628175c7afa95c431b746ea20052794Andy Qiu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1865efc253a628175c7afa95c431b746ea20052794Andy Qiu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1965efc253a628175c7afa95c431b746ea20052794Andy Qiu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2065efc253a628175c7afa95c431b746ea20052794Andy Qiu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2165efc253a628175c7afa95c431b746ea20052794Andy Qiu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2265efc253a628175c7afa95c431b746ea20052794Andy Qiu * IN THE SOFTWARE. 2365efc253a628175c7afa95c431b746ea20052794Andy Qiu * 2465efc253a628175c7afa95c431b746ea20052794Andy Qiu * Authors: 2565efc253a628175c7afa95c431b746ea20052794Andy Qiu * Jackie Li <yaodong.li@intel.com> 2665efc253a628175c7afa95c431b746ea20052794Andy Qiu * 2765efc253a628175c7afa95c431b746ea20052794Andy Qiu */ 2865efc253a628175c7afa95c431b746ea20052794Andy Qiu 2965efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <HwcTrace.h> 3065efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <IDisplayDevice.h> 3165efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <DisplayQuery.h> 3265efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <BufferManager.h> 3365efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <DisplayPlaneManager.h> 3465efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <Hwcomposer.h> 3565efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <DisplayAnalyzer.h> 365490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#include <cutils/properties.h> 37ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi#include <GraphicBuffer.h> 382413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin#include <ExternalDevice.h> 3965efc253a628175c7afa95c431b746ea20052794Andy Qiu 4065efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android { 4165efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel { 4265efc253a628175c7afa95c431b746ea20052794Andy Qiu 4365efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer() 4465efc253a628175c7afa95c431b746ea20052794Andy Qiu : mInitialized(false), 45177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEnabled(true), 46177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible(false), 47177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeActive(false), 48d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mBlankDevice(false), 49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed(true), 50177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mActiveInputState(true), 51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays(0), 52eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays(0), 53eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents(), 544ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventMutex(), 554ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventHandledCondition() 5665efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 5765efc253a628175c7afa95c431b746ea20052794Andy Qiu} 5865efc253a628175c7afa95c431b746ea20052794Andy Qiu 5965efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer() 6065efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 6165efc253a628175c7afa95c431b746ea20052794Andy Qiu} 6265efc253a628175c7afa95c431b746ea20052794Andy Qiu 6365efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize() 6465efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 655490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // by default video extended mode is enabled 665490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 675490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 68177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEnabled = atoi(prop) ? true : false; 695490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 70177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible = false; 71177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeActive = false; 72d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mBlankDevice = false; 73eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed = true; 74177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mActiveInputState = true; 75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays = 0; 76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays = 0; 77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.clear(); 78b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 7965efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = true; 80b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 8165efc253a628175c7afa95c431b746ea20052794Andy Qiu return true; 8265efc253a628175c7afa95c431b746ea20052794Andy Qiu} 8365efc253a628175c7afa95c431b746ea20052794Andy Qiu 84e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize() 8565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 86eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.clear(); 87b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 8865efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = false; 8965efc253a628175c7afa95c431b746ea20052794Andy Qiu} 9065efc253a628175c7afa95c431b746ea20052794Andy Qiu 91770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents( 92770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie size_t numDisplays, hwc_display_contents_1_t** displays) 93770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 94eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // cache and use them only in this context during analysis 95eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays = numDisplays; 96eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays = displays; 97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 98eb726af21649d79ed720bdf329e0849270995c45Andy Qiu handlePendingEvents(); 99eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 100177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mVideoExtModeEnabled) { 101177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu handleVideoExtMode(); 102770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 103b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 104b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mBlankDevice) { 105b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // this will make sure device is blanked after geometry changes. 106b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // blank event is only processed once 107b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe blankSecondaryDevice(); 108b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 109770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 110770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 111177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleVideoExtMode() 112770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 113177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu bool eligible = mVideoExtModeEligible; 114177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu checkVideoExtMode(); 115177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (eligible == mVideoExtModeEligible) { 116177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mVideoExtModeActive) { 117177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // need to mark all layers 118177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(0, HWC_OVERLAY, false); 119770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 120177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 121770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 122770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 123177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mVideoExtModeEligible) { 124177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mActiveInputState) { 125177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu VTRACE("input is active"); 126177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } else { 127177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu enterVideoExtMode(); 128177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 129177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } else { 130177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu exitVideoExtMode(); 131770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 132770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 133770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 134177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::checkVideoExtMode() 13565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 136b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mVideoStateMap.size() != 1) { 137177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible = false; 138eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 139eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 140eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 14165efc253a628175c7afa95c431b746ea20052794Andy Qiu bool geometryChanged = false; 14265efc253a628175c7afa95c431b746ea20052794Andy Qiu int activeDisplays = 0; 143d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 14465efc253a628175c7afa95c431b746ea20052794Andy Qiu hwc_display_contents_1_t *content = NULL; 145eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 146eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 14765efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 14865efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 14965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15065efc253a628175c7afa95c431b746ea20052794Andy Qiu activeDisplays++; 15165efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content->flags & HWC_GEOMETRY_CHANGED) { 15265efc253a628175c7afa95c431b746ea20052794Andy Qiu geometryChanged = true; 15365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15565efc253a628175c7afa95c431b746ea20052794Andy Qiu 15665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (activeDisplays <= 1) { 157177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible = false; 15865efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 15965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16065efc253a628175c7afa95c431b746ea20052794Andy Qiu 161177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // video state update event may come later than geometry change event. 162177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // in that case, video extended mode is not detected properly. 163177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu#if 0 16465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (geometryChanged == false) { 16565efc253a628175c7afa95c431b746ea20052794Andy Qiu // use previous analysis result 16665efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 16765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 168177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu#endif 169177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // reset eligibility of video extended mode 170177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible = false; 17165efc253a628175c7afa95c431b746ea20052794Andy Qiu 17265efc253a628175c7afa95c431b746ea20052794Andy Qiu // check if there is video layer in the primary device 173eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[0]; 17465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 17565efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 17665efc253a628175c7afa95c431b746ea20052794Andy Qiu } 17765efc253a628175c7afa95c431b746ea20052794Andy Qiu 178d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu uint32_t videoHandle = 0; 17965efc253a628175c7afa95c431b746ea20052794Andy Qiu bool videoLayerExist = false; 180319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu bool videoFullScreenOnPrimary = false; 1812f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang bool isVideoLayerSkipped = false; 1824a3844e0ffd267aae9ffbe5a3266c8e3c0dc7070Zhu,Tianyang 18365efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 18465efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 18565efc253a628175c7afa95c431b746ea20052794Andy Qiu videoLayerExist = isVideoLayer(content->hwLayers[j]); 186bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie if (videoLayerExist) { 1874a3844e0ffd267aae9ffbe5a3266c8e3c0dc7070Zhu,Tianyang if ((content->hwLayers[j].flags & HWC_SKIP_LAYER)) { 1882f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang isVideoLayerSkipped = true; 1894a3844e0ffd267aae9ffbe5a3266c8e3c0dc7070Zhu,Tianyang } 19065efc253a628175c7afa95c431b746ea20052794Andy Qiu videoHandle = (uint32_t)content->hwLayers[j].handle; 191319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu videoFullScreenOnPrimary = isVideoFullScreen(0, content->hwLayers[j]); 19265efc253a628175c7afa95c431b746ea20052794Andy Qiu break; 19365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19565efc253a628175c7afa95c431b746ea20052794Andy Qiu 19665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == false) { 19765efc253a628175c7afa95c431b746ea20052794Andy Qiu // no video layer is found in the primary layer 19865efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 19965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 20065efc253a628175c7afa95c431b746ea20052794Andy Qiu 20165efc253a628175c7afa95c431b746ea20052794Andy Qiu // check whether video layer exists in external device or virtual device 20265efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: video may exist in virtual device but no in external device or vice versa 20365efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: multiple video layers are not addressed here 204eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 1; i < (int)mCachedNumDisplays; i++) { 205eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 20665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 20765efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 20865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 20965efc253a628175c7afa95c431b746ea20052794Andy Qiu 21065efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 21165efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 21265efc253a628175c7afa95c431b746ea20052794Andy Qiu if ((uint32_t)content->hwLayers[j].handle == videoHandle) { 2132f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang isVideoLayerSkipped |= (content->hwLayers[j].flags & HWC_SKIP_LAYER); 2149332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video layer exists in device %d", i); 2152f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang if (isVideoLayerSkipped || videoFullScreenOnPrimary){ 2162f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang VTRACE("Video ext mode eligible, %d, %d", 2172f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang isVideoLayerSkipped, videoFullScreenOnPrimary); 218319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu mVideoExtModeEligible = true; 219319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu } else { 220319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu mVideoExtModeEligible = isVideoFullScreen(i, content->hwLayers[j]); 221319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu } 22265efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 22365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 22465efc253a628175c7afa95c431b746ea20052794Andy Qiu } 22565efc253a628175c7afa95c431b746ea20052794Andy Qiu } 22665efc253a628175c7afa95c431b746ea20052794Andy Qiu} 22765efc253a628175c7afa95c431b746ea20052794Andy Qiu 228177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeActive() 22965efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 230177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return mVideoExtModeActive; 23165efc253a628175c7afa95c431b746ea20052794Andy Qiu} 23265efc253a628175c7afa95c431b746ea20052794Andy Qiu 233177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeEnabled() 2345490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{ 2355490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1 2365490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // enable it for run-time debugging purpose. 2375490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 2385490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 239177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEnabled = atoi(prop) ? true : false; 2405490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 241177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("video extended mode enabled: %d", mVideoExtModeEnabled); 2425490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif 2435490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 244177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return mVideoExtModeEnabled; 2455490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu} 2465490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 24765efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer) 24865efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 24965efc253a628175c7afa95c431b746ea20052794Andy Qiu bool ret = false; 25065efc253a628175c7afa95c431b746ea20052794Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 251eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!layer.handle) { 252eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return false; 253eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 254eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 25565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (!buffer) { 25665efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("failed to get buffer"); 25765efc253a628175c7afa95c431b746ea20052794Andy Qiu } else { 25865efc253a628175c7afa95c431b746ea20052794Andy Qiu ret = DisplayQuery::isVideoFormat(buffer->getFormat()); 259eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bm->unlockDataBuffer(buffer); 26065efc253a628175c7afa95c431b746ea20052794Andy Qiu } 26165efc253a628175c7afa95c431b746ea20052794Andy Qiu return ret; 26265efc253a628175c7afa95c431b746ea20052794Andy Qiu} 26365efc253a628175c7afa95c431b746ea20052794Andy Qiu 2640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer) 265bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{ 2660131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device); 2670131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice) { 268bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie return false; 269bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu int width = 0, height = 0; 2710131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice->getDisplaySize(&width, &height)) { 2720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2730131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2759332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d", 2760131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.left, layer.displayFrame.right, 2770131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.top, layer.displayFrame.bottom, 2780131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu width, height); 279bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 280319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu // full-screen defintion: 281319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu // width of target display frame == width of target device, with 1 pixel of tolerance, or 282319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu // Height of target display frame == height of target device, with 1 pixel of tolerance, or 283319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu // width * height of display frame > 90% of width * height of display device, or 284319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu // any of above condition is met on either primary display or secondary display 285bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstW = layer.displayFrame.right - layer.displayFrame.left; 286bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstH = layer.displayFrame.bottom - layer.displayFrame.top; 28701b4571b91a4ef92f2a00bd98b2797f10538e431lychenx 2882f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang if (abs(dstW - width) <= 1 && 2892f6c0128167508e86c3daf83e7b60f3b5f16f7acZhu,Tianyang abs(dstH - height) <= 1 && 290319e5478ad0ed4a50df6190a7d529e020051eb50Andy Qiu dstW * dstH * 10 < width * height * 9) { 2919332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video is not full-screen"); 2920131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 293bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2940131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 295bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie} 296bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 297eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed() 298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mOverlayAllowed; 300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 30235fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhiint DisplayAnalyzer::getVideoInstances() 30335fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi{ 304b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return (int)mVideoStateMap.size(); 30535fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi} 30635fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi 307eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected) 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!connected) { 310eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // enable vsync on the primary device immediately 311177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getVsyncManager()->enableDynamicVsync(true); 312eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 313177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 314177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // handle hotplug event (vsync switch) asynchronously 315177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 316177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = HOTPLUG_EVENT; 317177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.bValue = connected; 318177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 319177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().invalidate(); 320eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 321eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 322b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::postVideoEvent(int instanceID, int state) 323eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 324eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 325eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = VIDEO_EVENT; 326b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.instanceID = instanceID; 327b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.videoEvent.state = state; 328eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 329b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 330b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if ((state == VIDEO_PLAYBACK_STARTING) || 331b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) { 3324ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().invalidate(); 3334ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Mutex::Autolock lock(mEventMutex); 3344ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // ideally overlay should be disabled in the surface flinger thread, if it is not processed 335b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // in close to one vsync cycle (50ms) it will be safely disabled in this thread context 3364ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // there is no threading issue 337b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(50)); 3384ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (err == -ETIMEDOUT) { 3394ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu WTRACE("timeout waiting for event handling"); 3404ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes(); 3414ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 3424ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 343eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 344eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 345eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank) 346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 348eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = BLANK_EVENT; 349b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.bValue = blank; 350eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 351d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu Hwcomposer::getInstance().invalidate(); 352d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 353d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 354177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::postInputEvent(bool active) 355177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 356177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 357177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = INPUT_EVENT; 358177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.bValue = active; 359177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 360177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().invalidate(); 361177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 362177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 363466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huvoid DisplayAnalyzer::postIdleEntryEvent(void) 364466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{ 365466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu Event e; 366466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu e.type = IDLE_ENTRY_EVENT; 367466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu e.nValue = 0; 368466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu postEvent(e); 369466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu} 370466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 371eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e) 372d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{ 373eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 374eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.add(e); 375eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 376eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 377b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::getEvent(Event& e) 378eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 379eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 380eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mPendingEvents.size() == 0) { 381b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 382b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 383b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e = mPendingEvents[0]; 384b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mPendingEvents.removeAt(0); 385b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return true; 386b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe} 387b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 388b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handlePendingEvents() 389b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{ 390b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // handle one event per analysis to avoid blocking surface flinger 391b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // some event may take lengthy time to process 392b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Event e; 393b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!getEvent(e)) { 394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 395eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 396eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 397b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe switch (e.type) { 398b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case HOTPLUG_EVENT: 399b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleHotplugEvent(e.bValue); 400b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 401b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case BLANK_EVENT: 402b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleBlankEvent(e.bValue); 403b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 404b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case VIDEO_EVENT: 405b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleVideoEvent(e.videoEvent.instanceID, e.videoEvent.state); 406b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 407b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case TIMING_EVENT: 408b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleTimingEvent(); 409b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 410177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu case INPUT_EVENT: 411177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu handleInputEvent(e.bValue); 412177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu break; 413177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu case DPMS_EVENT: 414177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu handleDpmsEvent(e.nValue); 415177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu break; 416466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu case IDLE_ENTRY_EVENT: 417466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu handleIdleEntryEvent(e.nValue); 418466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu break; 419466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu case IDLE_EXIT_EVENT: 420466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu handleIdleExitEvent(); 421466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu break; 422eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 423eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 424eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 425eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected) 426eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 427466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (connected) { 428466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu Hwcomposer::getInstance().getPowerManager()->disableIdleControl(); 429aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang } else { 430aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang if (mVideoStateMap.size() == 0) { 431aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang Hwcomposer::getInstance().getPowerManager()->enableIdleControl(); 432aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang } else if (mVideoStateMap.size() == 1) { 433aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang // Reset input state if HDMI is plug out to 434aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang // avoid entering extended mode immediately after HDMI is plug in 435aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang mActiveInputState = true; 436aa24c338f8cee39de0bc570e224349257bdd7cc3Zhu,Tianyang } 437466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 438eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 439eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 440eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank) 441eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 442eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBlankDevice = blank; 443eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // force geometry changed in the secondary device to reset layer composition type 444eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 445eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 446eb726af21649d79ed720bdf329e0849270995c45Andy Qiu continue; 447eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 448eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCachedDisplays[i]) { 449eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED; 450eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 451d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 452eb726af21649d79ed720bdf329e0849270995c45Andy Qiu blankSecondaryDevice(); 453eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 454d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 455b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleTimingEvent() 456b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{ 457b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // check whether external device is connected, reset refresh rate to match video frame rate 458b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // if video is in playing state or reset refresh rate to default preferred one if video is not 459b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // at playing state 460b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie Hwcomposer *hwc = &Hwcomposer::getInstance(); 461b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe ExternalDevice *dev = NULL; 462b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe dev = (ExternalDevice *)hwc->getDisplayDevice(IDisplayDevice::DEVICE_EXTERNAL); 463b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!dev) { 464b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie return; 465b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 466b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 467b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!dev->isConnected()) { 468b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return; 469b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 470b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 471f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie if (hwc->getMultiDisplayObserver()->isExternalDeviceTimingFixed()) { 472b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe VTRACE("Timing of external device is fixed."); 473f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie return; 474f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie } 475f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie 476853b12aa319e4557a300923590538282c88314beAndy Qiu int hz = 0; 477b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mVideoStateMap.size() == 1) { 47884e17af0350016243463b4fe7a82e76524e01651Lin Xie VideoSourceInfo info; 479b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe int instanceID = mVideoStateMap.keyAt(0); 480b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo( 481b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe instanceID, &info); 48284e17af0350016243463b4fe7a82e76524e01651Lin Xie if (err == NO_ERROR) { 483853b12aa319e4557a300923590538282c88314beAndy Qiu hz = info.frameRate; 484b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 485b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 4862413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin 487b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe dev->setRefreshRate(hz); 488b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie} 489b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 490b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleVideoEvent(int instanceID, int state) 491eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 492b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.removeItem(instanceID); 493b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state != VIDEO_PLAYBACK_STOPPED) { 494b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.add(instanceID, state); 495b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 496b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 497b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Hwcomposer *hwc = &Hwcomposer::getInstance(); 498b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 499b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // sanity check 500b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (hwc->getMultiDisplayObserver()->getVideoSessionNumber() != 501b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (int)mVideoStateMap.size()) { 502b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe WTRACE("session number does not match!!"); 503b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 504b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state != VIDEO_PLAYBACK_STOPPED) { 505b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.add(instanceID, state); 506b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 507b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 508b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 509f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu // check if composition type needs to be reset 510f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu bool reset = false; 511b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if ((state == VIDEO_PLAYBACK_STARTING) || 512b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) { 513b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // if video is in starting or stopping stage, overlay use is temporarily not allowed to 514b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // avoid scrambed RGB overlay if video is protected. 515b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mOverlayAllowed = false; 516f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu reset = true; 517b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 518b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // disable overlay plane and acknolwdge the waiting thread 519b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe hwc->getPlaneManager()->disableOverlayPlanes(); 520b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mEventHandledCondition.signal(); 521b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } else { 522f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu reset = !mOverlayAllowed; 523b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mOverlayAllowed = true; 524b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 525b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 526f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu if (reset) { 527f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu hwc_display_contents_1_t *content = NULL; 528f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 529177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(i, HWC_FRAMEBUFFER, true); 530f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu } 531f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu } 532f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu 533c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang if (mVideoStateMap.size() == 0) { 534c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang // reset active input state after video playback stops. 535c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang // MDS should update input state in 5 seconds after video playback starts 536c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang mActiveInputState = true; 537c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang } 538466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 539466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (mVideoStateMap.size() > 0) { 540466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu hwc->getPowerManager()->disableIdleControl(); 541466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } else if (!hwc->getDrm()->isConnected(IDisplayDevice::DEVICE_EXTERNAL)) { 542466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu hwc->getPowerManager()->enableIdleControl(); 543466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 544466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 545ddc8e627fdde22f2b37a0e24c7ca8dcd1206df97Zhu,Tianyang // Setting timing immediately, 546ddc8e627fdde22f2b37a0e24c7ca8dcd1206df97Zhu,Tianyang // Don't posthone to next circle 547ddc8e627fdde22f2b37a0e24c7ca8dcd1206df97Zhu,Tianyang handleTimingEvent(); 548eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 549eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 550eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice() 551eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 552d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_display_contents_1_t *content = NULL; 553d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_layer_1 *layer = NULL; 554eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 555d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 556d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 557d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 558eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 559d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (content == NULL) { 560d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 561d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 562d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 563d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 564d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer = &content->hwLayers[j]; 565d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (!layer) { 566d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 567d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 568d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (mBlankDevice) { 569d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints |= HWC_HINT_CLEAR_FB; 570d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->flags &= ~HWC_SKIP_LAYER; 571d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_OVERLAY; 572d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } else { 573d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints &= ~HWC_HINT_CLEAR_FB; 574d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_FRAMEBUFFER; 575d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 576d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 577d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 578d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 57965efc253a628175c7afa95c431b746ea20052794Andy Qiu 580177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleInputEvent(bool active) 581177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 582c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang if (active == mActiveInputState) { 583c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang WTRACE("same input state: %d", active); 584c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang } 585177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mActiveInputState = active; 586177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (!mVideoExtModeEligible) { 587177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("not eligible for video extended mode"); 588177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 589177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 590177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 591177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (active) { 592177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu exitVideoExtMode(); 593177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } else { 594177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu enterVideoExtMode(); 595177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 596177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 597177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 598177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleDpmsEvent(int delayCount) 599177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 600177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mActiveInputState || !mVideoExtModeEligible) { 601177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("aborting display power off in video extended mode"); 602177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 603177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 604177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 605177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (delayCount < DELAY_BEFORE_DPMS_OFF) { 606177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 607177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = DPMS_EVENT; 608177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.nValue = delayCount + 1; 609177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 6105a3b1ac20ca8e3594554e624efcc4b4d88dec392Lei Zhang Hwcomposer::getInstance().invalidate(); 611177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 612177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 613177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 614177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (Hwcomposer::getInstance().getVsyncManager()->getVsyncSource() == 615177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_PRIMARY) { 6166c061a816e1bb454afc8d294231bc235a771d646Nie Jun Hwcomposer::getInstance().getDrm()->setDpmsMode( 6176c061a816e1bb454afc8d294231bc235a771d646Nie Jun IDisplayDevice::DEVICE_PRIMARY, 6186c061a816e1bb454afc8d294231bc235a771d646Nie Jun IDisplayDevice::DEVICE_DISPLAY_STANDBY); 6196c061a816e1bb454afc8d294231bc235a771d646Nie Jun ETRACE("primary display is source of vsync, we only dim backlight"); 620177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 621177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 622177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 623c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu // panel can't be powered off as touch panel shares the power supply with LCD. 624c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu DTRACE("primary display coupled with touch on Saltbay, only dim backlight"); 6256c061a816e1bb454afc8d294231bc235a771d646Nie Jun Hwcomposer::getInstance().getDrm()->setDpmsMode( 6266c061a816e1bb454afc8d294231bc235a771d646Nie Jun IDisplayDevice::DEVICE_PRIMARY, 6276c061a816e1bb454afc8d294231bc235a771d646Nie Jun IDisplayDevice::DEVICE_DISPLAY_STANDBY); 628c0529447ae16f023dfab2978ea2b245f368e893bAndy Qiu //IDisplayDevice::DEVICE_DISPLAY_OFF); 6296c061a816e1bb454afc8d294231bc235a771d646Nie Jun return; 630177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 631177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 632466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 633466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huvoid DisplayAnalyzer::handleIdleEntryEvent(int count) 634466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{ 635466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu DTRACE("handling idle entry event, count %d", count); 636466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (hasProtectedLayer()) { 637466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu ITRACE("Ignoring idle entry as protected layer exists."); 638466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu setCompositionType(0, HWC_FRAMEBUFFER, true); 639466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu return; 640466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 641466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 642466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu // stop idle entry if external device is connected 643466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (mCachedDisplays && mCachedDisplays[IDisplayDevice::DEVICE_EXTERNAL]) { 644466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu ITRACE("Ignoring idle entry as external device is connected."); 645466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu setCompositionType(0, HWC_FRAMEBUFFER, true); 646466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu return; 647466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 648466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 649466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu // stop idle entry if video playback is active 650466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu // TODO: remove this check for Annidale 651466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (mVideoStateMap.size() > 0) { 652466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu ITRACE("Ignoring idle entry as video session is active."); 653466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu setCompositionType(0, HWC_FRAMEBUFFER, true); 654466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu return; 655466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 656466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 657466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu setCompositionType(0, HWC_FORCE_FRAMEBUFFER, true); 658466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 659466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu IPowerManager *pm = Hwcomposer::getInstance().getPowerManager(); 660466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (count == 0) { 661466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu // ready to enter idel mode 662466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu pm->setIdleReady(); 663466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 664466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 665466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu if (count >= DELAY_BEFORE_IDLE_ENTRY) { 666466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu pm->enterIdleState(); 667466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu // next prepare/set will exit idle state. 668466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu Event e; 669466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu e.type = IDLE_EXIT_EVENT; 670466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu postEvent(e); 671466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } else { 672466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu // invalidate surface flinger again 673466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu Event e; 674466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu e.type = IDLE_ENTRY_EVENT; 675466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu e.nValue = count + 1; 676466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu postEvent(e); 677466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu Hwcomposer::getInstance().invalidate(); 678466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu } 679466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu} 680466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 681466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Huvoid DisplayAnalyzer::handleIdleExitEvent() 682466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu{ 683466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu DTRACE("handling idle exit event"); 684466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 685466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu IPowerManager *pm = Hwcomposer::getInstance().getPowerManager(); 686466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu pm->exitIdleState(); 687466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu setCompositionType(0, HWC_FRAMEBUFFER, true); 688466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu} 689466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu 690177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::enterVideoExtMode() 691177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 692177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mVideoExtModeActive) { 693177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu WTRACE("already in video extended mode."); 694177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 695177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 696177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 697177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("entering video extended mode..."); 698177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeActive = true; 699177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 700177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 701177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(0, HWC_OVERLAY, true); 702177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 703177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // Do not power off primary display immediately as flip is asynchronous 704177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 705177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = DPMS_EVENT; 706177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.nValue = 0; 707177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 7085a3b1ac20ca8e3594554e624efcc4b4d88dec392Lei Zhang Hwcomposer::getInstance().invalidate(); 709177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 710177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 711177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::exitVideoExtMode() 712177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 713177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (!mVideoExtModeActive) { 714177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu WTRACE("Not in video extended mode"); 715177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 716177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 717177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 718c8ed4d7c744a7f59864fa5a7db8ae3d0c05a119fZhu,Tianyang ITRACE("exiting video extended mode..."); 719177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 720177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeActive = false; 721177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 722177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getDrm()->setDpmsMode( 723177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_PRIMARY, 724177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_DISPLAY_ON); 725177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 726177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 727177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 728177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(0, HWC_FRAMEBUFFER, true); 729177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 730177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 731d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer) 732d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{ 733177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (layer.handle == NULL) { 734177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return false; 735177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 736d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (mCachedDisplays == NULL) { 737d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 738d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 739d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri // check if the given layer exists in the primary device 740d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri hwc_display_contents_1_t *content = mCachedDisplays[0]; 741d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (content == NULL) { 742d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 743d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 744d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri for (size_t i = 0; i < content->numHwLayers - 1; i++) { 745d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) { 746d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri VTRACE("Layer exists for Primary device"); 747d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 748d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 749d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 750d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return true; 751d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri} 752d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 753b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::hasProtectedLayer() 754b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{ 755b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe DataBuffer * buffer = NULL; 756b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe hwc_display_contents_1_t *content = NULL; 757b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 758b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 759b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (bm == NULL){ 760b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 761b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 762b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 763b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mCachedDisplays == NULL) { 764b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 765b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 766b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // check if the given layer exists in the primary device 767b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe for (int index = 0; index < (int)mCachedNumDisplays; index++) { 768b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe content = mCachedDisplays[index]; 769b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (content == NULL) { 770b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe continue; 771b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 772b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 773b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe for (size_t i = 0; i < content->numHwLayers - 1; i++) { 774b16cf47b6865c4ba53e336558671d11b0325e78bLin Xie if (isProtectedLayer(content->hwLayers[i])) 775b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return true; 776b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 777b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 778b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 779b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 780b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe} 781b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 782ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhibool DisplayAnalyzer::isProtectedLayer(hwc_layer_1_t &layer) 783ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi{ 784ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi if (!layer.handle) { 785177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return false; 786ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } 787177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu bool ret = false; 788177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 789ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 790ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi if (!buffer) { 791ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi ETRACE("failed to get buffer"); 792ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } else { 793ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi ret = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer); 794ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi bm->unlockDataBuffer(buffer); 795ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } 796ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi return ret; 797ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi} 798ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi 799177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(hwc_display_contents_1_t *display, int type) 800177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 801177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu for (size_t i = 0; i < display->numHwLayers - 1; i++) { 802177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu hwc_layer_1_t *layer = &display->hwLayers[i]; 803177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (layer) layer->compositionType = type; 804177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 805177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 806177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 807177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(int device, int type, bool reset) 808177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 809177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu hwc_display_contents_1_t *content = mCachedDisplays[device]; 810177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (content == NULL) { 811177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ETRACE("Invalid device %d", device); 812177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 813177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 814177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 815177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // don't need to set geometry changed if layers are just needed to be marked 816177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (reset) { 817177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu content->flags |= HWC_GEOMETRY_CHANGED; 818177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 819177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 820177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(content, type); 821177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 822177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 8231747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyangint DisplayAnalyzer::getFirstVideoInstanceSessionID() { 8241747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang if (mVideoStateMap.size() >= 1) { 8251747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang return mVideoStateMap.keyAt(0); 8261747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang } 8271747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang return -1; 8281747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang} 8291747c24dc5251a0a062ef5f8a6791c30a715e820Zhu,Tianyang 83065efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel 83165efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android 83265efc253a628175c7afa95c431b746ea20052794Andy Qiu 833