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