DisplayAnalyzer.cpp revision 65efc253a628175c7afa95c431b746ea20052794
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> 3665efc253a628175c7afa95c431b746ea20052794Andy Qiu 3765efc253a628175c7afa95c431b746ea20052794Andy Qiu 3865efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android { 3965efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel { 4065efc253a628175c7afa95c431b746ea20052794Andy Qiu 4165efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer() 4265efc253a628175c7afa95c431b746ea20052794Andy Qiu : mInitialized(false), 4365efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode(false) 4465efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 4565efc253a628175c7afa95c431b746ea20052794Andy Qiu} 4665efc253a628175c7afa95c431b746ea20052794Andy Qiu 4765efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer() 4865efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 4965efc253a628175c7afa95c431b746ea20052794Andy Qiu} 5065efc253a628175c7afa95c431b746ea20052794Andy Qiu 5165efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize() 5265efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 5365efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = true; 5465efc253a628175c7afa95c431b746ea20052794Andy Qiu return true; 5565efc253a628175c7afa95c431b746ea20052794Andy Qiu} 5665efc253a628175c7afa95c431b746ea20052794Andy Qiu 5765efc253a628175c7afa95c431b746ea20052794Andy Qiuvoid DisplayAnalyzer::uninitialize() 5865efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 5965efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = false; 6065efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 6165efc253a628175c7afa95c431b746ea20052794Andy Qiu} 6265efc253a628175c7afa95c431b746ea20052794Andy Qiu 6365efc253a628175c7afa95c431b746ea20052794Andy Qiuvoid DisplayAnalyzer::analyzeContents(size_t numDisplays, hwc_display_contents_1_t** displays) 6465efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 6565efc253a628175c7afa95c431b746ea20052794Andy Qiu bool geometryChanged = false; 6665efc253a628175c7afa95c431b746ea20052794Andy Qiu int activeDisplays = 0; 6765efc253a628175c7afa95c431b746ea20052794Andy Qiu hwc_display_contents_1_t *content = NULL; 6865efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int i = 0; i < (int)numDisplays; i++) { 6965efc253a628175c7afa95c431b746ea20052794Andy Qiu content = displays[i]; 7065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 7165efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 7265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 7365efc253a628175c7afa95c431b746ea20052794Andy Qiu activeDisplays++; 7465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content->flags & HWC_GEOMETRY_CHANGED) { 7565efc253a628175c7afa95c431b746ea20052794Andy Qiu geometryChanged = true; 7665efc253a628175c7afa95c431b746ea20052794Andy Qiu } 7765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 7865efc253a628175c7afa95c431b746ea20052794Andy Qiu 7965efc253a628175c7afa95c431b746ea20052794Andy Qiu if (activeDisplays <= 1) { 8065efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 8165efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 8265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 8365efc253a628175c7afa95c431b746ea20052794Andy Qiu 8465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (geometryChanged == false) { 8565efc253a628175c7afa95c431b746ea20052794Andy Qiu // use previous analysis result 8665efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 8765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 8865efc253a628175c7afa95c431b746ea20052794Andy Qiu 8965efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset status of video extended mode 9065efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 9165efc253a628175c7afa95c431b746ea20052794Andy Qiu 9265efc253a628175c7afa95c431b746ea20052794Andy Qiu // check if there is video layer in the primary device 9365efc253a628175c7afa95c431b746ea20052794Andy Qiu content = displays[0]; 9465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 9565efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 9665efc253a628175c7afa95c431b746ea20052794Andy Qiu } 9765efc253a628175c7afa95c431b746ea20052794Andy Qiu 9865efc253a628175c7afa95c431b746ea20052794Andy Qiu uint32_t videoHandle = NULL; 9965efc253a628175c7afa95c431b746ea20052794Andy Qiu bool videoLayerExist = false; 10065efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 10165efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 10265efc253a628175c7afa95c431b746ea20052794Andy Qiu videoLayerExist = isVideoLayer(content->hwLayers[j]); 10365efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == true) { 10465efc253a628175c7afa95c431b746ea20052794Andy Qiu videoHandle = (uint32_t)content->hwLayers[j].handle; 10565efc253a628175c7afa95c431b746ea20052794Andy Qiu break; 10665efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10865efc253a628175c7afa95c431b746ea20052794Andy Qiu 10965efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == false) { 11065efc253a628175c7afa95c431b746ea20052794Andy Qiu // no video layer is found in the primary layer 11165efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 11265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 11365efc253a628175c7afa95c431b746ea20052794Andy Qiu 11465efc253a628175c7afa95c431b746ea20052794Andy Qiu // check whether video layer exists in external device or virtual device 11565efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: video may exist in virtual device but no in external device or vice versa 11665efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: multiple video layers are not addressed here 11765efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int i = 1; i < (int)numDisplays; i++) { 11865efc253a628175c7afa95c431b746ea20052794Andy Qiu content = displays[i]; 11965efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 12065efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 12165efc253a628175c7afa95c431b746ea20052794Andy Qiu } 12265efc253a628175c7afa95c431b746ea20052794Andy Qiu 12365efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 12465efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 12565efc253a628175c7afa95c431b746ea20052794Andy Qiu if ((uint32_t)content->hwLayers[j].handle == videoHandle) { 12665efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("video layer exists in device %d", i); 12765efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = true; 12865efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 12965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 13065efc253a628175c7afa95c431b746ea20052794Andy Qiu } 13165efc253a628175c7afa95c431b746ea20052794Andy Qiu } 13265efc253a628175c7afa95c431b746ea20052794Andy Qiu} 13365efc253a628175c7afa95c431b746ea20052794Andy Qiu 13465efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::checkVideoExtendedMode() 13565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 13665efc253a628175c7afa95c431b746ea20052794Andy Qiu return mVideoExtendedMode; 13765efc253a628175c7afa95c431b746ea20052794Andy Qiu} 13865efc253a628175c7afa95c431b746ea20052794Andy Qiu 13965efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer) 14065efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 14165efc253a628175c7afa95c431b746ea20052794Andy Qiu bool ret = false; 14265efc253a628175c7afa95c431b746ea20052794Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 14365efc253a628175c7afa95c431b746ea20052794Andy Qiu DataBuffer *buffer = bm->get((uint32_t)layer.handle); 14465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (!buffer) { 14565efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("failed to get buffer"); 14665efc253a628175c7afa95c431b746ea20052794Andy Qiu } else { 14765efc253a628175c7afa95c431b746ea20052794Andy Qiu ret = DisplayQuery::isVideoFormat(buffer->getFormat()); 14865efc253a628175c7afa95c431b746ea20052794Andy Qiu bm->put(*buffer); 14965efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15065efc253a628175c7afa95c431b746ea20052794Andy Qiu return ret; 15165efc253a628175c7afa95c431b746ea20052794Andy Qiu} 15265efc253a628175c7afa95c431b746ea20052794Andy Qiu 15365efc253a628175c7afa95c431b746ea20052794Andy Qiu 15465efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel 15565efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android 15665efc253a628175c7afa95c431b746ea20052794Andy Qiu 157