DisplayAnalyzer.cpp revision 853b12aa319e4557a300923590538282c88314be
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> 3765efc253a628175c7afa95c431b746ea20052794Andy Qiu 3865efc253a628175c7afa95c431b746ea20052794Andy Qiu 3965efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android { 4065efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel { 4165efc253a628175c7afa95c431b746ea20052794Andy Qiu 4265efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer() 4365efc253a628175c7afa95c431b746ea20052794Andy Qiu : mInitialized(false), 445490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu mEnableVideoExtendedMode(true), 45770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mVideoExtendedMode(false), 46d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mForceCloneMode(false), 47d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mBlankDevice(false), 48eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoPlaying(false), 49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoPreparing(false), 50b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie mVideoStateChanged(false), 51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed(true), 52b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie mVideoInstances(0), 53b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie mVideoInstanceId(-1), 54eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays(0), 55eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays(0), 56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents(), 574ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventMutex(), 584ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventHandledCondition() 5965efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 6065efc253a628175c7afa95c431b746ea20052794Andy Qiu} 6165efc253a628175c7afa95c431b746ea20052794Andy Qiu 6265efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer() 6365efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 6465efc253a628175c7afa95c431b746ea20052794Andy Qiu} 6565efc253a628175c7afa95c431b746ea20052794Andy Qiu 6665efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize() 6765efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 685490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // by default video extended mode is enabled 695490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 705490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 715490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu mEnableVideoExtendedMode = atoi(prop) ? true : false; 725490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 73d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mVideoExtendedMode = false; 74d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mForceCloneMode = false; 75d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu mBlankDevice = false; 76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoPlaying = false; 77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoPreparing = false; 78b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie mVideoStateChanged = false; 79eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed = true; 80eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays = 0; 81eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays = 0; 82eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.clear(); 8365efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = true; 84b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 8565efc253a628175c7afa95c431b746ea20052794Andy Qiu return true; 8665efc253a628175c7afa95c431b746ea20052794Andy Qiu} 8765efc253a628175c7afa95c431b746ea20052794Andy Qiu 88e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize() 8965efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 90eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.clear(); 9165efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = false; 9265efc253a628175c7afa95c431b746ea20052794Andy Qiu} 9365efc253a628175c7afa95c431b746ea20052794Andy Qiu 94770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents( 95770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie size_t numDisplays, hwc_display_contents_1_t** displays) 96770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // cache and use them only in this context during analysis 98eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedNumDisplays = numDisplays; 99eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays = displays; 100eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 101eb726af21649d79ed720bdf329e0849270995c45Andy Qiu handlePendingEvents(); 102eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 103eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mBlankDevice) { 104eb726af21649d79ed720bdf329e0849270995c45Andy Qiu blankSecondaryDevice(); 105eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 106eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 107b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie if (mVideoStateChanged) { 108b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie handleModeSwitch(); 109b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie mVideoStateChanged = false; 110b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 111b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 1125490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (mEnableVideoExtendedMode) { 1135490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu detectVideoExtendedMode(); 1145490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (mVideoExtendedMode) { 1155490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu detectTrickMode(mCachedDisplays[IDisplayDevice::DEVICE_PRIMARY]); 1165490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 117770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 118770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 119770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 120770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::detectTrickMode(hwc_display_contents_1_t *list) 121770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 122770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (list == NULL) 123770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie return; 124770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 125770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie bool detected = false; 126770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie for (size_t i = 0; i < list->numHwLayers; i++) { 127770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie hwc_layer_1_t *layer = &list->hwLayers[i]; 128770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (layer && (layer->flags & HWC_TRICK_MODE)) { 129770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie detected = true; 130bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie // reset the type 131bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie layer->compositionType = HWC_FRAMEBUFFER; 132770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie break; 133770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 134770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 135770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 136770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (detected != mForceCloneMode) { 137770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie list->flags |= HWC_GEOMETRY_CHANGED; 138770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mForceCloneMode = detected; 139770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 140770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 141770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 142eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::detectVideoExtendedMode() 14365efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 144b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie if (!mVideoPlaying || mVideoInstances != 1) { 145eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoExtendedMode = false; 146eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mForceCloneMode = false; 147eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 148eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 149eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 15065efc253a628175c7afa95c431b746ea20052794Andy Qiu bool geometryChanged = false; 15165efc253a628175c7afa95c431b746ea20052794Andy Qiu int activeDisplays = 0; 152d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 15365efc253a628175c7afa95c431b746ea20052794Andy Qiu hwc_display_contents_1_t *content = NULL; 154eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 155eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 15665efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 15765efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 15865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15965efc253a628175c7afa95c431b746ea20052794Andy Qiu activeDisplays++; 16065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content->flags & HWC_GEOMETRY_CHANGED) { 16165efc253a628175c7afa95c431b746ea20052794Andy Qiu geometryChanged = true; 16265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16465efc253a628175c7afa95c431b746ea20052794Andy Qiu 16565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (activeDisplays <= 1) { 16665efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 16765efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 16865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16965efc253a628175c7afa95c431b746ea20052794Andy Qiu 17065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (geometryChanged == false) { 17165efc253a628175c7afa95c431b746ea20052794Andy Qiu // use previous analysis result 17265efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 17365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 17465efc253a628175c7afa95c431b746ea20052794Andy Qiu 17565efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset status of video extended mode 17665efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 17765efc253a628175c7afa95c431b746ea20052794Andy Qiu 17865efc253a628175c7afa95c431b746ea20052794Andy Qiu // check if there is video layer in the primary device 179eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[0]; 18065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 18165efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 18265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 18365efc253a628175c7afa95c431b746ea20052794Andy Qiu 184d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu uint32_t videoHandle = 0; 18565efc253a628175c7afa95c431b746ea20052794Andy Qiu bool videoLayerExist = false; 18665efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 18765efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 18865efc253a628175c7afa95c431b746ea20052794Andy Qiu videoLayerExist = isVideoLayer(content->hwLayers[j]); 189bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie if (videoLayerExist) { 19065efc253a628175c7afa95c431b746ea20052794Andy Qiu videoHandle = (uint32_t)content->hwLayers[j].handle; 19165efc253a628175c7afa95c431b746ea20052794Andy Qiu break; 19265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19465efc253a628175c7afa95c431b746ea20052794Andy Qiu 19565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == false) { 19665efc253a628175c7afa95c431b746ea20052794Andy Qiu // no video layer is found in the primary layer 19765efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 19865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19965efc253a628175c7afa95c431b746ea20052794Andy Qiu 20065efc253a628175c7afa95c431b746ea20052794Andy Qiu // check whether video layer exists in external device or virtual device 20165efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: video may exist in virtual device but no in external device or vice versa 20265efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: multiple video layers are not addressed here 203eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 1; i < (int)mCachedNumDisplays; i++) { 204eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 20565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 20665efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 20765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 20865efc253a628175c7afa95c431b746ea20052794Andy Qiu 20965efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 21065efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 21165efc253a628175c7afa95c431b746ea20052794Andy Qiu if ((uint32_t)content->hwLayers[j].handle == videoHandle) { 21265efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("video layer exists in device %d", i); 2130131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu mVideoExtendedMode = isVideoFullScreen(i, content->hwLayers[j]); 21465efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 21565efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21665efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21865efc253a628175c7afa95c431b746ea20052794Andy Qiu} 21965efc253a628175c7afa95c431b746ea20052794Andy Qiu 22065efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::checkVideoExtendedMode() 22165efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 222770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie return mVideoExtendedMode && !mForceCloneMode; 22365efc253a628175c7afa95c431b746ea20052794Andy Qiu} 22465efc253a628175c7afa95c431b746ea20052794Andy Qiu 2255490411cb9330d4e92d59878da3693c33a948ad6Andy Qiubool DisplayAnalyzer::isVideoExtendedModeEnabled() 2265490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{ 2275490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1 2285490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // enable it for run-time debugging purpose. 2295490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 2305490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 2315490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu mEnableVideoExtendedMode = atoi(prop) ? true : false; 2325490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 2335490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu ITRACE("video extended mode enabled: %d", mEnableVideoExtendedMode); 2345490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif 2355490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 2365490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu return mEnableVideoExtendedMode; 2375490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu} 2385490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 23965efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer) 24065efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 24165efc253a628175c7afa95c431b746ea20052794Andy Qiu bool ret = false; 24265efc253a628175c7afa95c431b746ea20052794Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 243eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!layer.handle) { 244eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return false; 245eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 246eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 24765efc253a628175c7afa95c431b746ea20052794Andy Qiu if (!buffer) { 24865efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("failed to get buffer"); 24965efc253a628175c7afa95c431b746ea20052794Andy Qiu } else { 25065efc253a628175c7afa95c431b746ea20052794Andy Qiu ret = DisplayQuery::isVideoFormat(buffer->getFormat()); 251eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bm->unlockDataBuffer(buffer); 25265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 25365efc253a628175c7afa95c431b746ea20052794Andy Qiu return ret; 25465efc253a628175c7afa95c431b746ea20052794Andy Qiu} 25565efc253a628175c7afa95c431b746ea20052794Andy Qiu 2560131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer) 257bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{ 2580131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device); 2590131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice) { 260bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie return false; 261bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2620131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu int width = 0, height = 0; 2630131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice->getDisplaySize(&width, &height)) { 2640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2650131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2660131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2670131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu ITRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d", 2680131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.left, layer.displayFrame.right, 2690131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.top, layer.displayFrame.bottom, 2700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu width, height); 271bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 272bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstW = layer.displayFrame.right - layer.displayFrame.left; 273bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstH = layer.displayFrame.bottom - layer.displayFrame.top; 2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (dstW < width - 1 && 2750131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu dstH < height - 1) { 2760131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu ITRACE("video is not full-screen"); 2770131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 278bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2790131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu int offset = layer.displayFrame.left + layer.displayFrame.right - width; 2800131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (offset > 1 || offset < -1) { 2810131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu ITRACE("video is not centralized in horizontal direction"); 2820131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2830131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2840131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu offset = layer.displayFrame.top + layer.displayFrame.bottom - height; 2850131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (offset > 1 || offset < -1) { 2860131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu ITRACE("video is not centralized in vertical direction"); 2870131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2880131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2890131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 290bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie} 291bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 292eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isVideoPlaying() 293d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{ 294eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mVideoPlaying; 295eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 296eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 297eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed() 298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mOverlayAllowed; 300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 302eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected) 303eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 304eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // TODO: turn on primary display immeidately 305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 306eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!connected) { 307eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // enable vsync on the primary device immediately 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } else { 310eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // handle hotplug event (vsync switch) asynchronously 311eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 312eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = HOTPLUG_EVENT; 313eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.connected = connected; 314eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 315eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Hwcomposer::getInstance().invalidate(); 316eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 317eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 318eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 319b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xievoid DisplayAnalyzer::postVideoEvent(int instances, int instanceID, bool preparing, bool playing) 320eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 321eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 322eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = VIDEO_EVENT; 323b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.instances = instances; 324b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.instanceID = instanceID; 325eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.videoEvent.preparing = preparing; 326eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.videoEvent.playing = playing; 327eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 3284ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (preparing) { 3294ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().invalidate(); 3304ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Mutex::Autolock lock(mEventMutex); 3314ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // ideally overlay should be disabled in the surface flinger thread, if it is not processed 3324ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // in close to one vsync cycle (20ms) it will be safely disabled in this thread context 3334ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // there is no threading issue 3344ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(20)); 3354ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (err == -ETIMEDOUT) { 3364ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu WTRACE("timeout waiting for event handling"); 3374ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes(); 3384ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 3394ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 340eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 341eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 342eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank) 343eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 344eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = BLANK_EVENT; 346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.blank = blank; 347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 348d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu Hwcomposer::getInstance().invalidate(); 349d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 350d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 351eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e) 352d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{ 353eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 354eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.add(e); 355eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 356eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 357eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handlePendingEvents() 358eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 359eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 360eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mPendingEvents.size() == 0) { 361eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 362eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 363eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 364eb726af21649d79ed720bdf329e0849270995c45Andy Qiu while (mPendingEvents.size() != 0) { 365eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e = mPendingEvents[0]; 366eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.removeAt(0); 367eb726af21649d79ed720bdf329e0849270995c45Andy Qiu switch (e.type) { 368eb726af21649d79ed720bdf329e0849270995c45Andy Qiu case HOTPLUG_EVENT: 369eb726af21649d79ed720bdf329e0849270995c45Andy Qiu handleHotplugEvent(e.connected); 370eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 371eb726af21649d79ed720bdf329e0849270995c45Andy Qiu case BLANK_EVENT: 372eb726af21649d79ed720bdf329e0849270995c45Andy Qiu handleBlankEvent(e.blank); 373eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 374eb726af21649d79ed720bdf329e0849270995c45Andy Qiu case VIDEO_EVENT: 375b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie handleVideoEvent(e.videoEvent.instances, 376b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.instanceID, 377b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.preparing, 378b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.playing); 379eb726af21649d79ed720bdf329e0849270995c45Andy Qiu break; 380eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 381eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 382eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 383eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 384eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected) 385eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 386eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 387eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 388eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 389eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank) 390eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 391eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBlankDevice = blank; 392eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // force geometry changed in the secondary device to reset layer composition type 393eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 395eb726af21649d79ed720bdf329e0849270995c45Andy Qiu continue; 396eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 397eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCachedDisplays[i]) { 398eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED; 399eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 400d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 401eb726af21649d79ed720bdf329e0849270995c45Andy Qiu blankSecondaryDevice(); 402eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 403d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 404b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xievoid DisplayAnalyzer::handleModeSwitch() 405b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{ 406b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // check whether external device is connected, reset refresh rate to match video frame rate 407b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // if video is in playing state or reset refresh rate to default preferred one if video is not 408b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // at playing state 409b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie Hwcomposer *hwc = &Hwcomposer::getInstance(); 410b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie if (!hwc->getDrm()->isConnected(IDisplayDevice::DEVICE_EXTERNAL)) 411b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie return; 412b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 413853b12aa319e4557a300923590538282c88314beAndy Qiu int hz = 0; 414b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie if (mVideoInstances == 1) { 415b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie MDSVideoSourceInfo info; 416b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo( 417b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie mVideoInstanceId, &info); 418b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie if (err == 0) { 419b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie ITRACE("setting refresh rate to %d", info.frameRate); 420853b12aa319e4557a300923590538282c88314beAndy Qiu hz = info.frameRate; 421b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 422b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 423853b12aa319e4557a300923590538282c88314beAndy Qiu hwc->getVsyncManager()->enableDynamicVsync(false); 424853b12aa319e4557a300923590538282c88314beAndy Qiu hwc->getDrm()->setRefreshRate(IDisplayDevice::DEVICE_EXTERNAL, hz); 425853b12aa319e4557a300923590538282c88314beAndy Qiu hwc->getVsyncManager()->enableDynamicVsync(true); 426b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie} 427b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 428b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xievoid DisplayAnalyzer::handleVideoEvent( 429b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie int instances, int instanceID, bool preparing, bool playing) 430eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 431eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (preparing != mVideoPreparing) { 432eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 433eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCachedDisplays[i]) { 434eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays[i]->flags = HWC_GEOMETRY_CHANGED; 435eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 436eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 437eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoPreparing = preparing; 438eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // if video is in preparing stage, overlay use is temporarily not allowed to avoid 439eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // scrambed RGB overlay if video is protected. 440eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mOverlayAllowed = !preparing; 441eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 442eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mVideoPlaying = playing; 443b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 444b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie Hwcomposer *hwc = &Hwcomposer::getInstance(); 445853b12aa319e4557a300923590538282c88314beAndy Qiu if ((playing && !preparing) || (!playing && !preparing)) { 446853b12aa319e4557a300923590538282c88314beAndy Qiu mVideoStateChanged = true; 447b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 448853b12aa319e4557a300923590538282c88314beAndy Qiu mVideoInstances = instances; 449853b12aa319e4557a300923590538282c88314beAndy Qiu mVideoInstanceId = instanceID; 450b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 4514ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (preparing) { 4524ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes(); 4534ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu mEventHandledCondition.signal(); 4544ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 455eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 456eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 457eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice() 458eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 459d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_display_contents_1_t *content = NULL; 460d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_layer_1 *layer = NULL; 461eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 462d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 463d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 464d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 466d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (content == NULL) { 467d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 468d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 469d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 470d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 471d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer = &content->hwLayers[j]; 472d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (!layer) { 473d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 474d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 475d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (mBlankDevice) { 476d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints |= HWC_HINT_CLEAR_FB; 477d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->flags &= ~HWC_SKIP_LAYER; 478d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_OVERLAY; 479d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } else { 480d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints &= ~HWC_HINT_CLEAR_FB; 481d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_FRAMEBUFFER; 482d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 483d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 484d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 485d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 48665efc253a628175c7afa95c431b746ea20052794Andy Qiu 487d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer) 488d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{ 489d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (mCachedDisplays == NULL) { 490d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 491d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 492d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri // check if the given layer exists in the primary device 493d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri hwc_display_contents_1_t *content = mCachedDisplays[0]; 494d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (content == NULL) { 495d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 496d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 497d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri for (size_t i = 0; i < content->numHwLayers - 1; i++) { 498d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) { 499d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri VTRACE("Layer exists for Primary device"); 500d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 501d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 502d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 503d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return true; 504d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri} 505d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 50665efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel 50765efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android 50865efc253a628175c7afa95c431b746ea20052794Andy Qiu 509