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