DisplayAnalyzer.cpp revision 177b44e0661a92d06f8f37c51e59af86423f7a95
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 16965efc253a628175c7afa95c431b746ea20052794Andy Qiu 170177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // reset eligibility of video extended mode 171177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible = false; 17265efc253a628175c7afa95c431b746ea20052794Andy Qiu 17365efc253a628175c7afa95c431b746ea20052794Andy Qiu // check if there is video layer in the primary device 174eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[0]; 17565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 17665efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 17765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 17865efc253a628175c7afa95c431b746ea20052794Andy Qiu 179d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu uint32_t videoHandle = 0; 18065efc253a628175c7afa95c431b746ea20052794Andy Qiu bool videoLayerExist = false; 18165efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 18265efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 18365efc253a628175c7afa95c431b746ea20052794Andy Qiu videoLayerExist = isVideoLayer(content->hwLayers[j]); 184bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie if (videoLayerExist) { 18565efc253a628175c7afa95c431b746ea20052794Andy Qiu videoHandle = (uint32_t)content->hwLayers[j].handle; 18665efc253a628175c7afa95c431b746ea20052794Andy Qiu break; 18765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 18865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 18965efc253a628175c7afa95c431b746ea20052794Andy Qiu 19065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == false) { 19165efc253a628175c7afa95c431b746ea20052794Andy Qiu // no video layer is found in the primary layer 19265efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 19365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 19465efc253a628175c7afa95c431b746ea20052794Andy Qiu 19565efc253a628175c7afa95c431b746ea20052794Andy Qiu // check whether video layer exists in external device or virtual device 19665efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: video may exist in virtual device but no in external device or vice versa 19765efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: multiple video layers are not addressed here 198eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 1; i < (int)mCachedNumDisplays; i++) { 199eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 20065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 20165efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 20265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 20365efc253a628175c7afa95c431b746ea20052794Andy Qiu 20465efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 20565efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 20665efc253a628175c7afa95c431b746ea20052794Andy Qiu if ((uint32_t)content->hwLayers[j].handle == videoHandle) { 2079332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video layer exists in device %d", i); 208177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEligible = isVideoFullScreen(i, content->hwLayers[j]); 20965efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 21065efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21165efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 21365efc253a628175c7afa95c431b746ea20052794Andy Qiu} 21465efc253a628175c7afa95c431b746ea20052794Andy Qiu 215177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeActive() 21665efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 217177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return mVideoExtModeActive; 21865efc253a628175c7afa95c431b746ea20052794Andy Qiu} 21965efc253a628175c7afa95c431b746ea20052794Andy Qiu 220177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeEnabled() 2215490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{ 2225490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1 2235490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu // enable it for run-time debugging purpose. 2245490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu char prop[PROPERTY_VALUE_MAX]; 2255490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu if (property_get("hwc.video.extmode.enable", prop, "1") > 0) { 226177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeEnabled = atoi(prop) ? true : false; 2275490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu } 228177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("video extended mode enabled: %d", mVideoExtModeEnabled); 2295490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif 2305490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 231177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return mVideoExtModeEnabled; 2325490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu} 2335490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu 23465efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer) 23565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 23665efc253a628175c7afa95c431b746ea20052794Andy Qiu bool ret = false; 23765efc253a628175c7afa95c431b746ea20052794Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 238eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!layer.handle) { 239eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return false; 240eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 241eb726af21649d79ed720bdf329e0849270995c45Andy Qiu DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 24265efc253a628175c7afa95c431b746ea20052794Andy Qiu if (!buffer) { 24365efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("failed to get buffer"); 24465efc253a628175c7afa95c431b746ea20052794Andy Qiu } else { 24565efc253a628175c7afa95c431b746ea20052794Andy Qiu ret = DisplayQuery::isVideoFormat(buffer->getFormat()); 246eb726af21649d79ed720bdf329e0849270995c45Andy Qiu bm->unlockDataBuffer(buffer); 24765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 24865efc253a628175c7afa95c431b746ea20052794Andy Qiu return ret; 24965efc253a628175c7afa95c431b746ea20052794Andy Qiu} 25065efc253a628175c7afa95c431b746ea20052794Andy Qiu 2510131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer) 252bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{ 2530131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device); 2540131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice) { 255bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie return false; 256bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2570131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu int width = 0, height = 0; 2580131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (!displayDevice->getDisplaySize(&width, &height)) { 2590131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 2600131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu } 2610131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu 2629332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d", 2630131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.left, layer.displayFrame.right, 2640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu layer.displayFrame.top, layer.displayFrame.bottom, 2650131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu width, height); 266bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 267bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstW = layer.displayFrame.right - layer.displayFrame.left; 268bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie int dstH = layer.displayFrame.bottom - layer.displayFrame.top; 2690131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu if (dstW < width - 1 && 2700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu dstH < height - 1) { 2719332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu VTRACE("video is not full-screen"); 2720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return false; 273bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie } 2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu return true; 275bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie} 276bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie 277eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed() 278eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 279eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return mOverlayAllowed; 280eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 281eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 28235fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhiint DisplayAnalyzer::getVideoInstances() 28335fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi{ 284b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return (int)mVideoStateMap.size(); 28535fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi} 28635fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi 287eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected) 288eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 289eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (!connected) { 290eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // enable vsync on the primary device immediately 291177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getVsyncManager()->enableDynamicVsync(true); 292eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 293177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 294177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // handle hotplug event (vsync switch) asynchronously 295177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 296177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = HOTPLUG_EVENT; 297177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.bValue = connected; 298177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 299177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().invalidate(); 300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 302b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::postVideoEvent(int instanceID, int state) 303eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 304eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = VIDEO_EVENT; 306b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie e.videoEvent.instanceID = instanceID; 307b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.videoEvent.state = state; 308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 309b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 310b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if ((state == VIDEO_PLAYBACK_STARTING) || 311b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) { 3124ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().invalidate(); 3134ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Mutex::Autolock lock(mEventMutex); 3144ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // ideally overlay should be disabled in the surface flinger thread, if it is not processed 315b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // in close to one vsync cycle (50ms) it will be safely disabled in this thread context 3164ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu // there is no threading issue 317b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(50)); 3184ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu if (err == -ETIMEDOUT) { 3194ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu WTRACE("timeout waiting for event handling"); 3204ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes(); 3214ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 3224ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 323eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 324eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 325eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank) 326eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 327eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Event e; 328eb726af21649d79ed720bdf329e0849270995c45Andy Qiu e.type = BLANK_EVENT; 329b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.bValue = blank; 330eb726af21649d79ed720bdf329e0849270995c45Andy Qiu postEvent(e); 331d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu Hwcomposer::getInstance().invalidate(); 332d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 333d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 334177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::postInputEvent(bool active) 335177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 336177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 337177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = INPUT_EVENT; 338177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.bValue = active; 339177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 340177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().invalidate(); 341177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 342177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 343eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e) 344d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{ 345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mPendingEvents.add(e); 347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 348eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 349b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::getEvent(Event& e) 350eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 351eb726af21649d79ed720bdf329e0849270995c45Andy Qiu Mutex::Autolock lock(mEventMutex); 352eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mPendingEvents.size() == 0) { 353b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 354b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 355b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e = mPendingEvents[0]; 356b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mPendingEvents.removeAt(0); 357b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return true; 358b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe} 359b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 360b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handlePendingEvents() 361b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{ 362b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // handle one event per analysis to avoid blocking surface flinger 363b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // some event may take lengthy time to process 364b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Event e; 365b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!getEvent(e)) { 366eb726af21649d79ed720bdf329e0849270995c45Andy Qiu return; 367eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 368eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 369b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe switch (e.type) { 370b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case HOTPLUG_EVENT: 371b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleHotplugEvent(e.bValue); 372b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 373b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case BLANK_EVENT: 374b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleBlankEvent(e.bValue); 375b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 376b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case VIDEO_EVENT: 377b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleVideoEvent(e.videoEvent.instanceID, e.videoEvent.state); 378b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 379b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe case TIMING_EVENT: 380b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe handleTimingEvent(); 381b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe break; 382177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu case INPUT_EVENT: 383177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu handleInputEvent(e.bValue); 384177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu break; 385177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu case DPMS_EVENT: 386177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu handleDpmsEvent(e.nValue); 387177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu break; 388eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 389eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 390eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 391eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected) 392eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 393eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 395eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank) 396eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 397eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mBlankDevice = blank; 398eb726af21649d79ed720bdf329e0849270995c45Andy Qiu // force geometry changed in the secondary device to reset layer composition type 399eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 400eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 401eb726af21649d79ed720bdf329e0849270995c45Andy Qiu continue; 402eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 403eb726af21649d79ed720bdf329e0849270995c45Andy Qiu if (mCachedDisplays[i]) { 404eb726af21649d79ed720bdf329e0849270995c45Andy Qiu mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED; 405eb726af21649d79ed720bdf329e0849270995c45Andy Qiu } 406d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 407eb726af21649d79ed720bdf329e0849270995c45Andy Qiu blankSecondaryDevice(); 408eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 409d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 410b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleTimingEvent() 411b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{ 412b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // check whether external device is connected, reset refresh rate to match video frame rate 413b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // if video is in playing state or reset refresh rate to default preferred one if video is not 414b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie // at playing state 415b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie Hwcomposer *hwc = &Hwcomposer::getInstance(); 416b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe ExternalDevice *dev = NULL; 417b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe dev = (ExternalDevice *)hwc->getDisplayDevice(IDisplayDevice::DEVICE_EXTERNAL); 418b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!dev) { 419b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie return; 420b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 421b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 422b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (!dev->isConnected()) { 423b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return; 424b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 425b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 426f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie if (hwc->getMultiDisplayObserver()->isExternalDeviceTimingFixed()) { 427b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe VTRACE("Timing of external device is fixed."); 428f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie return; 429f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie } 430f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie 431853b12aa319e4557a300923590538282c88314beAndy Qiu int hz = 0; 432b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mVideoStateMap.size() == 1) { 43384e17af0350016243463b4fe7a82e76524e01651Lin Xie VideoSourceInfo info; 434b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe int instanceID = mVideoStateMap.keyAt(0); 435b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo( 436b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe instanceID, &info); 43784e17af0350016243463b4fe7a82e76524e01651Lin Xie if (err == NO_ERROR) { 438853b12aa319e4557a300923590538282c88314beAndy Qiu hz = info.frameRate; 439b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 440b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 4412413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin 442b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe dev->setRefreshRate(hz); 443b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie} 444b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 445b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleVideoEvent(int instanceID, int state) 446eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 447b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.removeItem(instanceID); 448b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state != VIDEO_PLAYBACK_STOPPED) { 449b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.add(instanceID, state); 450b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 451b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 452b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Hwcomposer *hwc = &Hwcomposer::getInstance(); 453b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 454b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // sanity check 455b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (hwc->getMultiDisplayObserver()->getVideoSessionNumber() != 456b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (int)mVideoStateMap.size()) { 457b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe WTRACE("session number does not match!!"); 458b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.clear(); 459b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state != VIDEO_PLAYBACK_STOPPED) { 460b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mVideoStateMap.add(instanceID, state); 461b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 462b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 463b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 464f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu // check if composition type needs to be reset 465f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu bool reset = false; 466b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if ((state == VIDEO_PLAYBACK_STARTING) || 467b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) { 468b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // if video is in starting or stopping stage, overlay use is temporarily not allowed to 469b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // avoid scrambed RGB overlay if video is protected. 470b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mOverlayAllowed = false; 471f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu reset = true; 472b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 473b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // disable overlay plane and acknolwdge the waiting thread 474b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe hwc->getPlaneManager()->disableOverlayPlanes(); 475b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mEventHandledCondition.signal(); 476b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } else { 477f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu reset = !mOverlayAllowed; 478b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe mOverlayAllowed = true; 479b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie } 480b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie 481f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu if (reset) { 482f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu hwc_display_contents_1_t *content = NULL; 483f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 484177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(i, HWC_FRAMEBUFFER, true); 485f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu } 486f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu } 487f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu 488b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // delay changing timing as it is a lengthy operation 489b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (state == VIDEO_PLAYBACK_STARTED || 490b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe state == VIDEO_PLAYBACK_STOPPED) { 491b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe Event e; 492b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe e.type = TIMING_EVENT; 493b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe postEvent(e); 4944ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu } 495eb726af21649d79ed720bdf329e0849270995c45Andy Qiu} 496eb726af21649d79ed720bdf329e0849270995c45Andy Qiu 497eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice() 498eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{ 499d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_display_contents_1_t *content = NULL; 500d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu hwc_layer_1 *layer = NULL; 501eb726af21649d79ed720bdf329e0849270995c45Andy Qiu for (int i = 0; i < (int)mCachedNumDisplays; i++) { 502d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (i == IDisplayDevice::DEVICE_PRIMARY) { 503d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 504d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 505eb726af21649d79ed720bdf329e0849270995c45Andy Qiu content = mCachedDisplays[i]; 506d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (content == NULL) { 507d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 508d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 509d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu 510d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 511d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer = &content->hwLayers[j]; 512d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (!layer) { 513d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu continue; 514d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 515d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu if (mBlankDevice) { 516d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints |= HWC_HINT_CLEAR_FB; 517d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->flags &= ~HWC_SKIP_LAYER; 518d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_OVERLAY; 519d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } else { 520d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->hints &= ~HWC_HINT_CLEAR_FB; 521d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu layer->compositionType = HWC_FRAMEBUFFER; 522d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 523d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 524d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu } 525d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu} 52665efc253a628175c7afa95c431b746ea20052794Andy Qiu 527177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleInputEvent(bool active) 528177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 529177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mActiveInputState = active; 530177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (!mVideoExtModeEligible) { 531177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("not eligible for video extended mode"); 532177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 533177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 534177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 535177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (active) { 536177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu exitVideoExtMode(); 537177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } else { 538177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu enterVideoExtMode(); 539177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 540177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 541177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 542177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleDpmsEvent(int delayCount) 543177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 544177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mActiveInputState || !mVideoExtModeEligible) { 545177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("aborting display power off in video extended mode"); 546177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 547177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 548177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 549177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (delayCount < DELAY_BEFORE_DPMS_OFF) { 550177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 551177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = DPMS_EVENT; 552177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.nValue = delayCount + 1; 553177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 554177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 555177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 556177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 557177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (Hwcomposer::getInstance().getVsyncManager()->getVsyncSource() == 558177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_PRIMARY) { 559177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ETRACE("primary display is source of vsync, it can't be powered off"); 560177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 561177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 562177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 563177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("powering off primary display..."); 564177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getDrm()->setDpmsMode( 565177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_PRIMARY, 566177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_DISPLAY_OFF); 567177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 568177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 569177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::enterVideoExtMode() 570177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 571177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (mVideoExtModeActive) { 572177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu WTRACE("already in video extended mode."); 573177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 574177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 575177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 576177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("entering video extended mode..."); 577177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeActive = true; 578177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 579177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 580177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(0, HWC_OVERLAY, true); 581177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 582177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // Do not power off primary display immediately as flip is asynchronous 583177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Event e; 584177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.type = DPMS_EVENT; 585177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu e.nValue = 0; 586177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu postEvent(e); 587177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 588177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 589177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::exitVideoExtMode() 590177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 591177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (!mVideoExtModeActive) { 592177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu WTRACE("Not in video extended mode"); 593177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 594177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 595177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 596177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ITRACE("exitting video extended mode..."); 597177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 598177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu mVideoExtModeActive = false; 599177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 600177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getDrm()->setDpmsMode( 601177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_PRIMARY, 602177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu IDisplayDevice::DEVICE_DISPLAY_ON); 603177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 604177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource(); 605177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 606177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(0, HWC_FRAMEBUFFER, true); 607177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 608177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 609d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer) 610d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{ 611177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (layer.handle == NULL) { 612177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return false; 613177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 614d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (mCachedDisplays == NULL) { 615d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 616d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 617d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri // check if the given layer exists in the primary device 618d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri hwc_display_contents_1_t *content = mCachedDisplays[0]; 619d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if (content == NULL) { 620d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 621d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 622d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri for (size_t i = 0; i < content->numHwLayers - 1; i++) { 623d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) { 624d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri VTRACE("Layer exists for Primary device"); 625d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return false; 626d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 627d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri } 628d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri return true; 629d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri} 630d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri 631b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::hasProtectedLayer() 632b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{ 633b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe DataBuffer * buffer = NULL; 634b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe hwc_display_contents_1_t *content = NULL; 635b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 636b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 637b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (bm == NULL){ 638b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 639b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 640b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 641b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (mCachedDisplays == NULL) { 642b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 643b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 644b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe // check if the given layer exists in the primary device 645b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe for (int index = 0; index < (int)mCachedNumDisplays; index++) { 646b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe content = mCachedDisplays[index]; 647b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe if (content == NULL) { 648b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe continue; 649b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 650b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 651b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe for (size_t i = 0; i < content->numHwLayers - 1; i++) { 652b16cf47b6865c4ba53e336558671d11b0325e78bLin Xie if (isProtectedLayer(content->hwLayers[i])) 653b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return true; 654b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 655b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe } 656b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 657b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe return false; 658b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe} 659b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe 660ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhibool DisplayAnalyzer::isProtectedLayer(hwc_layer_1_t &layer) 661ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi{ 662ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi if (!layer.handle) { 663177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return false; 664ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } 665177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu bool ret = false; 666177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 667ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle); 668ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi if (!buffer) { 669ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi ETRACE("failed to get buffer"); 670ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } else { 671ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi ret = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer); 672ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi bm->unlockDataBuffer(buffer); 673ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi } 674ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi return ret; 675ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi} 676ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi 677177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(hwc_display_contents_1_t *display, int type) 678177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 679177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu for (size_t i = 0; i < display->numHwLayers - 1; i++) { 680177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu hwc_layer_1_t *layer = &display->hwLayers[i]; 681177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (layer) layer->compositionType = type; 682177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 683177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 684177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 685177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(int device, int type, bool reset) 686177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{ 687177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu hwc_display_contents_1_t *content = mCachedDisplays[device]; 688177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (content == NULL) { 689177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu ETRACE("Invalid device %d", device); 690177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu return; 691177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 692177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 693177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu // don't need to set geometry changed if layers are just needed to be marked 694177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu if (reset) { 695177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu content->flags |= HWC_GEOMETRY_CHANGED; 696177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu } 697177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 698177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu setCompositionType(content, type); 699177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu} 700177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu 70165efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel 70265efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android 70365efc253a628175c7afa95c431b746ea20052794Andy Qiu 704