DisplayAnalyzer.cpp revision 770346b3b6f55e10c54c8a47d4db8f8907035173
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), 43770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mVideoExtendedMode(false), 44770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mForceCloneMode(false) 4565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 4665efc253a628175c7afa95c431b746ea20052794Andy Qiu} 4765efc253a628175c7afa95c431b746ea20052794Andy Qiu 4865efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer() 4965efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 5065efc253a628175c7afa95c431b746ea20052794Andy Qiu} 5165efc253a628175c7afa95c431b746ea20052794Andy Qiu 5265efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize() 5365efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 5465efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = true; 5565efc253a628175c7afa95c431b746ea20052794Andy Qiu return true; 5665efc253a628175c7afa95c431b746ea20052794Andy Qiu} 5765efc253a628175c7afa95c431b746ea20052794Andy Qiu 5865efc253a628175c7afa95c431b746ea20052794Andy Qiuvoid DisplayAnalyzer::uninitialize() 5965efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 6065efc253a628175c7afa95c431b746ea20052794Andy Qiu mInitialized = false; 6165efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 6265efc253a628175c7afa95c431b746ea20052794Andy Qiu} 6365efc253a628175c7afa95c431b746ea20052794Andy Qiu 64770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents( 65770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie size_t numDisplays, hwc_display_contents_1_t** displays) 66770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 67770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie detectVideoExtendedMode(numDisplays, displays); 68770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (mVideoExtendedMode) { 69770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie detectTrickMode(displays[IDisplayDevice::DEVICE_PRIMARY]); 70770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 71770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 72770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 73770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::detectTrickMode(hwc_display_contents_1_t *list) 74770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{ 75770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (list == NULL) 76770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie return; 77770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 78770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie bool detected = false; 79770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie for (size_t i = 0; i < list->numHwLayers; i++) { 80770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie hwc_layer_1_t *layer = &list->hwLayers[i]; 81770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (layer && (layer->flags & HWC_TRICK_MODE)) { 82770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie detected = true; 83770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie break; 84770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 85770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 86770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 87770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie if (detected != mForceCloneMode) { 88770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie list->flags |= HWC_GEOMETRY_CHANGED; 89770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie mForceCloneMode = detected; 90770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie } 91770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie} 92770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie 93770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::detectVideoExtendedMode( 94770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie size_t numDisplays, hwc_display_contents_1_t** displays) 9565efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 9665efc253a628175c7afa95c431b746ea20052794Andy Qiu bool geometryChanged = false; 9765efc253a628175c7afa95c431b746ea20052794Andy Qiu int activeDisplays = 0; 9865efc253a628175c7afa95c431b746ea20052794Andy Qiu hwc_display_contents_1_t *content = NULL; 9965efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int i = 0; i < (int)numDisplays; i++) { 10065efc253a628175c7afa95c431b746ea20052794Andy Qiu content = displays[i]; 10165efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 10265efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 10365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10465efc253a628175c7afa95c431b746ea20052794Andy Qiu activeDisplays++; 10565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content->flags & HWC_GEOMETRY_CHANGED) { 10665efc253a628175c7afa95c431b746ea20052794Andy Qiu geometryChanged = true; 10765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 10965efc253a628175c7afa95c431b746ea20052794Andy Qiu 11065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (activeDisplays <= 1) { 11165efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 11265efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 11365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 11465efc253a628175c7afa95c431b746ea20052794Andy Qiu 11565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (geometryChanged == false) { 11665efc253a628175c7afa95c431b746ea20052794Andy Qiu // use previous analysis result 11765efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 11865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 11965efc253a628175c7afa95c431b746ea20052794Andy Qiu 12065efc253a628175c7afa95c431b746ea20052794Andy Qiu // reset status of video extended mode 12165efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = false; 12265efc253a628175c7afa95c431b746ea20052794Andy Qiu 12365efc253a628175c7afa95c431b746ea20052794Andy Qiu // check if there is video layer in the primary device 12465efc253a628175c7afa95c431b746ea20052794Andy Qiu content = displays[0]; 12565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 12665efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 12765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 12865efc253a628175c7afa95c431b746ea20052794Andy Qiu 12965efc253a628175c7afa95c431b746ea20052794Andy Qiu uint32_t videoHandle = NULL; 13065efc253a628175c7afa95c431b746ea20052794Andy Qiu bool videoLayerExist = false; 13165efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 13265efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 13365efc253a628175c7afa95c431b746ea20052794Andy Qiu videoLayerExist = isVideoLayer(content->hwLayers[j]); 13465efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == true) { 13565efc253a628175c7afa95c431b746ea20052794Andy Qiu videoHandle = (uint32_t)content->hwLayers[j].handle; 13665efc253a628175c7afa95c431b746ea20052794Andy Qiu break; 13765efc253a628175c7afa95c431b746ea20052794Andy Qiu } 13865efc253a628175c7afa95c431b746ea20052794Andy Qiu } 13965efc253a628175c7afa95c431b746ea20052794Andy Qiu 14065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (videoLayerExist == false) { 14165efc253a628175c7afa95c431b746ea20052794Andy Qiu // no video layer is found in the primary layer 14265efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 14365efc253a628175c7afa95c431b746ea20052794Andy Qiu } 14465efc253a628175c7afa95c431b746ea20052794Andy Qiu 14565efc253a628175c7afa95c431b746ea20052794Andy Qiu // check whether video layer exists in external device or virtual device 14665efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: video may exist in virtual device but no in external device or vice versa 14765efc253a628175c7afa95c431b746ea20052794Andy Qiu // TODO: multiple video layers are not addressed here 14865efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int i = 1; i < (int)numDisplays; i++) { 14965efc253a628175c7afa95c431b746ea20052794Andy Qiu content = displays[i]; 15065efc253a628175c7afa95c431b746ea20052794Andy Qiu if (content == NULL) { 15165efc253a628175c7afa95c431b746ea20052794Andy Qiu continue; 15265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 15365efc253a628175c7afa95c431b746ea20052794Andy Qiu 15465efc253a628175c7afa95c431b746ea20052794Andy Qiu // exclude the frame buffer target layer 15565efc253a628175c7afa95c431b746ea20052794Andy Qiu for (int j = 0; j < (int)content->numHwLayers - 1; j++) { 15665efc253a628175c7afa95c431b746ea20052794Andy Qiu if ((uint32_t)content->hwLayers[j].handle == videoHandle) { 15765efc253a628175c7afa95c431b746ea20052794Andy Qiu ITRACE("video layer exists in device %d", i); 15865efc253a628175c7afa95c431b746ea20052794Andy Qiu mVideoExtendedMode = true; 15965efc253a628175c7afa95c431b746ea20052794Andy Qiu return; 16065efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16165efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16265efc253a628175c7afa95c431b746ea20052794Andy Qiu } 16365efc253a628175c7afa95c431b746ea20052794Andy Qiu} 16465efc253a628175c7afa95c431b746ea20052794Andy Qiu 16565efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::checkVideoExtendedMode() 16665efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 167770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie return mVideoExtendedMode && !mForceCloneMode; 16865efc253a628175c7afa95c431b746ea20052794Andy Qiu} 16965efc253a628175c7afa95c431b746ea20052794Andy Qiu 17065efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer) 17165efc253a628175c7afa95c431b746ea20052794Andy Qiu{ 17265efc253a628175c7afa95c431b746ea20052794Andy Qiu bool ret = false; 17365efc253a628175c7afa95c431b746ea20052794Andy Qiu BufferManager *bm = Hwcomposer::getInstance().getBufferManager(); 17465efc253a628175c7afa95c431b746ea20052794Andy Qiu DataBuffer *buffer = bm->get((uint32_t)layer.handle); 17565efc253a628175c7afa95c431b746ea20052794Andy Qiu if (!buffer) { 17665efc253a628175c7afa95c431b746ea20052794Andy Qiu ETRACE("failed to get buffer"); 17765efc253a628175c7afa95c431b746ea20052794Andy Qiu } else { 17865efc253a628175c7afa95c431b746ea20052794Andy Qiu ret = DisplayQuery::isVideoFormat(buffer->getFormat()); 17965efc253a628175c7afa95c431b746ea20052794Andy Qiu bm->put(*buffer); 18065efc253a628175c7afa95c431b746ea20052794Andy Qiu } 18165efc253a628175c7afa95c431b746ea20052794Andy Qiu return ret; 18265efc253a628175c7afa95c431b746ea20052794Andy Qiu} 18365efc253a628175c7afa95c431b746ea20052794Andy Qiu 18465efc253a628175c7afa95c431b746ea20052794Andy Qiu 18565efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel 18665efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android 18765efc253a628175c7afa95c431b746ea20052794Andy Qiu 188