DisplayAnalyzer.cpp revision 853b12aa319e4557a300923590538282c88314be
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>
3765efc253a628175c7afa95c431b746ea20052794Andy Qiu
3865efc253a628175c7afa95c431b746ea20052794Andy Qiu
3965efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android {
4065efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel {
4165efc253a628175c7afa95c431b746ea20052794Andy Qiu
4265efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer()
4365efc253a628175c7afa95c431b746ea20052794Andy Qiu    : mInitialized(false),
445490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu      mEnableVideoExtendedMode(true),
45770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie      mVideoExtendedMode(false),
46d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu      mForceCloneMode(false),
47d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu      mBlankDevice(false),
48eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mVideoPlaying(false),
49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mVideoPreparing(false),
50b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie      mVideoStateChanged(false),
51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mOverlayAllowed(true),
52b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie      mVideoInstances(0),
53b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie      mVideoInstanceId(-1),
54eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedNumDisplays(0),
55eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedDisplays(0),
56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mPendingEvents(),
574ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu      mEventMutex(),
584ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu      mEventHandledCondition()
5965efc253a628175c7afa95c431b746ea20052794Andy Qiu{
6065efc253a628175c7afa95c431b746ea20052794Andy Qiu}
6165efc253a628175c7afa95c431b746ea20052794Andy Qiu
6265efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer()
6365efc253a628175c7afa95c431b746ea20052794Andy Qiu{
6465efc253a628175c7afa95c431b746ea20052794Andy Qiu}
6565efc253a628175c7afa95c431b746ea20052794Andy Qiu
6665efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize()
6765efc253a628175c7afa95c431b746ea20052794Andy Qiu{
685490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    // by default video extended mode is enabled
695490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    char prop[PROPERTY_VALUE_MAX];
705490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (property_get("hwc.video.extmode.enable", prop, "1") > 0) {
715490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu        mEnableVideoExtendedMode = atoi(prop) ? true : false;
725490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    }
73d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    mVideoExtendedMode = false;
74d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    mForceCloneMode = false;
75d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    mBlankDevice = false;
76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mVideoPlaying = false;
77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mVideoPreparing = false;
78b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    mVideoStateChanged = false;
79eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mOverlayAllowed = true;
80eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = 0;
81eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = 0;
82eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
8365efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = true;
84b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
8565efc253a628175c7afa95c431b746ea20052794Andy Qiu    return true;
8665efc253a628175c7afa95c431b746ea20052794Andy Qiu}
8765efc253a628175c7afa95c431b746ea20052794Andy Qiu
88e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize()
8965efc253a628175c7afa95c431b746ea20052794Andy Qiu{
90eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
9165efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = false;
9265efc253a628175c7afa95c431b746ea20052794Andy Qiu}
9365efc253a628175c7afa95c431b746ea20052794Andy Qiu
94770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents(
95770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        size_t numDisplays, hwc_display_contents_1_t** displays)
96770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // cache and use them only in this context during analysis
98eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = numDisplays;
99eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = displays;
100eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
101eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    handlePendingEvents();
102eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
103eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (mBlankDevice) {
104eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        blankSecondaryDevice();
105eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
106eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
107b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    if (mVideoStateChanged) {
108b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        handleModeSwitch();
109b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        mVideoStateChanged = false;
110b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
111b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
1125490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (mEnableVideoExtendedMode) {
1135490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu        detectVideoExtendedMode();
1145490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu        if (mVideoExtendedMode) {
1155490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu            detectTrickMode(mCachedDisplays[IDisplayDevice::DEVICE_PRIMARY]);
1165490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu        }
117770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
118770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie}
119770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
120770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::detectTrickMode(hwc_display_contents_1_t *list)
121770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
122770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    if (list == NULL)
123770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        return;
124770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
125770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    bool detected = false;
126770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    for (size_t i = 0; i < list->numHwLayers; i++) {
127770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        hwc_layer_1_t *layer = &list->hwLayers[i];
128770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        if (layer && (layer->flags & HWC_TRICK_MODE)) {
129770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie            detected = true;
130bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie            // reset the type
131bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie            layer->compositionType = HWC_FRAMEBUFFER;
132770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie            break;
133770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        }
134770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
135770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
136770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    if (detected != mForceCloneMode) {
137770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        list->flags |= HWC_GEOMETRY_CHANGED;
138770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        mForceCloneMode = detected;
139770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
140770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie}
141770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
142eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::detectVideoExtendedMode()
14365efc253a628175c7afa95c431b746ea20052794Andy Qiu{
144b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    if (!mVideoPlaying || mVideoInstances != 1) {
145eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        mVideoExtendedMode = false;
146eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        mForceCloneMode = false;
147eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
148eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
149eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
15065efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool geometryChanged = false;
15165efc253a628175c7afa95c431b746ea20052794Andy Qiu    int activeDisplays = 0;
152d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
15365efc253a628175c7afa95c431b746ea20052794Andy Qiu    hwc_display_contents_1_t *content = NULL;
154eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
155eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
15665efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content == NULL) {
15765efc253a628175c7afa95c431b746ea20052794Andy Qiu            continue;
15865efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
15965efc253a628175c7afa95c431b746ea20052794Andy Qiu        activeDisplays++;
16065efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content->flags & HWC_GEOMETRY_CHANGED) {
16165efc253a628175c7afa95c431b746ea20052794Andy Qiu            geometryChanged = true;
16265efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
16365efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
16465efc253a628175c7afa95c431b746ea20052794Andy Qiu
16565efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (activeDisplays <= 1) {
16665efc253a628175c7afa95c431b746ea20052794Andy Qiu        mVideoExtendedMode = false;
16765efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
16865efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
16965efc253a628175c7afa95c431b746ea20052794Andy Qiu
17065efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (geometryChanged == false) {
17165efc253a628175c7afa95c431b746ea20052794Andy Qiu        // use previous analysis result
17265efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
17365efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
17465efc253a628175c7afa95c431b746ea20052794Andy Qiu
17565efc253a628175c7afa95c431b746ea20052794Andy Qiu    // reset status of video extended mode
17665efc253a628175c7afa95c431b746ea20052794Andy Qiu    mVideoExtendedMode = false;
17765efc253a628175c7afa95c431b746ea20052794Andy Qiu
17865efc253a628175c7afa95c431b746ea20052794Andy Qiu    // check if there is video layer in the primary device
179eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    content = mCachedDisplays[0];
18065efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (content == NULL) {
18165efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
18265efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
18365efc253a628175c7afa95c431b746ea20052794Andy Qiu
184d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    uint32_t videoHandle = 0;
18565efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool videoLayerExist = false;
18665efc253a628175c7afa95c431b746ea20052794Andy Qiu    // exclude the frame buffer target layer
18765efc253a628175c7afa95c431b746ea20052794Andy Qiu    for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
18865efc253a628175c7afa95c431b746ea20052794Andy Qiu        videoLayerExist = isVideoLayer(content->hwLayers[j]);
189bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie        if (videoLayerExist) {
19065efc253a628175c7afa95c431b746ea20052794Andy Qiu            videoHandle = (uint32_t)content->hwLayers[j].handle;
19165efc253a628175c7afa95c431b746ea20052794Andy Qiu            break;
19265efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
19365efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
19465efc253a628175c7afa95c431b746ea20052794Andy Qiu
19565efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (videoLayerExist == false) {
19665efc253a628175c7afa95c431b746ea20052794Andy Qiu        // no video layer is found in the primary layer
19765efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
19865efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
19965efc253a628175c7afa95c431b746ea20052794Andy Qiu
20065efc253a628175c7afa95c431b746ea20052794Andy Qiu    // check whether video layer exists in external device or virtual device
20165efc253a628175c7afa95c431b746ea20052794Andy Qiu    // TODO: video may exist in virtual device but no in external device or vice versa
20265efc253a628175c7afa95c431b746ea20052794Andy Qiu    // TODO: multiple video layers are not addressed here
203eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 1; i < (int)mCachedNumDisplays; i++) {
204eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
20565efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content == NULL) {
20665efc253a628175c7afa95c431b746ea20052794Andy Qiu            continue;
20765efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
20865efc253a628175c7afa95c431b746ea20052794Andy Qiu
20965efc253a628175c7afa95c431b746ea20052794Andy Qiu        // exclude the frame buffer target layer
21065efc253a628175c7afa95c431b746ea20052794Andy Qiu        for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
21165efc253a628175c7afa95c431b746ea20052794Andy Qiu            if ((uint32_t)content->hwLayers[j].handle == videoHandle) {
21265efc253a628175c7afa95c431b746ea20052794Andy Qiu                ITRACE("video layer exists in device %d", i);
2130131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu                mVideoExtendedMode = isVideoFullScreen(i, content->hwLayers[j]);
21465efc253a628175c7afa95c431b746ea20052794Andy Qiu                return;
21565efc253a628175c7afa95c431b746ea20052794Andy Qiu            }
21665efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
21765efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
21865efc253a628175c7afa95c431b746ea20052794Andy Qiu}
21965efc253a628175c7afa95c431b746ea20052794Andy Qiu
22065efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::checkVideoExtendedMode()
22165efc253a628175c7afa95c431b746ea20052794Andy Qiu{
222770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    return mVideoExtendedMode && !mForceCloneMode;
22365efc253a628175c7afa95c431b746ea20052794Andy Qiu}
22465efc253a628175c7afa95c431b746ea20052794Andy Qiu
2255490411cb9330d4e92d59878da3693c33a948ad6Andy Qiubool DisplayAnalyzer::isVideoExtendedModeEnabled()
2265490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{
2275490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1
2285490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    // enable it for run-time debugging purpose.
2295490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    char prop[PROPERTY_VALUE_MAX];
2305490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (property_get("hwc.video.extmode.enable", prop, "1") > 0) {
2315490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu        mEnableVideoExtendedMode = atoi(prop) ? true : false;
2325490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    }
2335490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    ITRACE("video extended mode enabled: %d", mEnableVideoExtendedMode);
2345490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif
2355490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu
2365490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    return mEnableVideoExtendedMode;
2375490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu}
2385490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu
23965efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer)
24065efc253a628175c7afa95c431b746ea20052794Andy Qiu{
24165efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool ret = false;
24265efc253a628175c7afa95c431b746ea20052794Andy Qiu    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
243eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!layer.handle) {
244eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return false;
245eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
246eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle);
24765efc253a628175c7afa95c431b746ea20052794Andy Qiu     if (!buffer) {
24865efc253a628175c7afa95c431b746ea20052794Andy Qiu         ETRACE("failed to get buffer");
24965efc253a628175c7afa95c431b746ea20052794Andy Qiu     } else {
25065efc253a628175c7afa95c431b746ea20052794Andy Qiu        ret = DisplayQuery::isVideoFormat(buffer->getFormat());
251eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unlockDataBuffer(buffer);
25265efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
25365efc253a628175c7afa95c431b746ea20052794Andy Qiu    return ret;
25465efc253a628175c7afa95c431b746ea20052794Andy Qiu}
25565efc253a628175c7afa95c431b746ea20052794Andy Qiu
2560131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer)
257bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{
2580131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device);
2590131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (!displayDevice) {
260bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie        return false;
261bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    }
2620131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    int width = 0, height = 0;
2630131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (!displayDevice->getDisplaySize(&width, &height)) {
2640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
2650131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    }
2660131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu
2670131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    ITRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d",
2680131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        layer.displayFrame.left, layer.displayFrame.right,
2690131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        layer.displayFrame.top, layer.displayFrame.bottom,
2700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        width, height);
271bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie
272bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    int dstW = layer.displayFrame.right - layer.displayFrame.left;
273bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    int dstH = layer.displayFrame.bottom - layer.displayFrame.top;
2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (dstW < width - 1 &&
2750131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        dstH < height - 1) {
2760131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        ITRACE("video is not full-screen");
2770131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
278bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    }
2790131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    int offset = layer.displayFrame.left + layer.displayFrame.right - width;
2800131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (offset > 1 || offset < -1) {
2810131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        ITRACE("video is not centralized in horizontal direction");
2820131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
2830131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    }
2840131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    offset = layer.displayFrame.top + layer.displayFrame.bottom - height;
2850131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (offset > 1 || offset < -1) {
2860131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        ITRACE("video is not centralized in vertical direction");
2870131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
2880131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    }
2890131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    return true;
290bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie}
291bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie
292eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isVideoPlaying()
293d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{
294eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return mVideoPlaying;
295eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
296eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
297eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed()
298eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
299eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return mOverlayAllowed;
300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
302eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected)
303eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
304eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // TODO: turn on primary display immeidately
305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
306eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!connected) {
307eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        // enable vsync on the primary device immediately
308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource();
309eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    } else {
310eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        // handle hotplug event (vsync switch) asynchronously
311eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        Event e;
312eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        e.type = HOTPLUG_EVENT;
313eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        e.connected = connected;
314eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        postEvent(e);
315eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        Hwcomposer::getInstance().invalidate();
316eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
317eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
318eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
319b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xievoid DisplayAnalyzer::postVideoEvent(int instances, int instanceID, bool preparing, bool playing)
320eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
321eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Event e;
322eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.type = VIDEO_EVENT;
323b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    e.videoEvent.instances = instances;
324b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    e.videoEvent.instanceID = instanceID;
325eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.videoEvent.preparing = preparing;
326eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.videoEvent.playing = playing;
327eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    postEvent(e);
3284ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    if (preparing) {
3294ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Hwcomposer::getInstance().invalidate();
3304ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Mutex::Autolock lock(mEventMutex);
3314ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // ideally overlay should be disabled in the surface flinger thread, if it is not processed
3324ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // in close to one vsync cycle (20ms)  it will be safely disabled in this thread context
3334ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // there is no threading issue
3344ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(20));
3354ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        if (err == -ETIMEDOUT) {
3364ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu            WTRACE("timeout waiting for event handling");
3374ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu            Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes();
3384ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        }
3394ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    }
340eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
341eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
342eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank)
343eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
344eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Event e;
345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.type = BLANK_EVENT;
346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.blank = blank;
347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    postEvent(e);
348d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    Hwcomposer::getInstance().invalidate();
349d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
350d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
351eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e)
352d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{
353eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
354eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.add(e);
355eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
356eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
357eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handlePendingEvents()
358eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
359eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
360eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (mPendingEvents.size() == 0) {
361eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
362eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
363eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
364eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    while (mPendingEvents.size() != 0) {
365eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        Event e = mPendingEvents[0];
366eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        mPendingEvents.removeAt(0);
367eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        switch (e.type) {
368eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        case HOTPLUG_EVENT:
369eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            handleHotplugEvent(e.connected);
370eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            break;
371eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        case BLANK_EVENT:
372eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            handleBlankEvent(e.blank);
373eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            break;
374eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        case VIDEO_EVENT:
375b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie            handleVideoEvent(e.videoEvent.instances,
376b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie                            e.videoEvent.instanceID,
377b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie                            e.videoEvent.preparing,
378b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie                            e.videoEvent.playing);
379eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            break;
380eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
381eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
382eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
383eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
384eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected)
385eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
386eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource();
387eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
388eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
389eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank)
390eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
391eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mBlankDevice = blank;
392eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // force geometry changed in the secondary device to reset layer composition type
393eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (i == IDisplayDevice::DEVICE_PRIMARY) {
395eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            continue;
396eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
397eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (mCachedDisplays[i]) {
398eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED;
399eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
400d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
401eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    blankSecondaryDevice();
402eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
403d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
404b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xievoid DisplayAnalyzer::handleModeSwitch()
405b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{
406b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // check whether external device is connected, reset refresh rate to match video frame rate
407b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // if video is in playing state or reset refresh rate to default preferred one if video is not
408b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // at playing state
409b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    Hwcomposer *hwc = &Hwcomposer::getInstance();
410b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    if (!hwc->getDrm()->isConnected(IDisplayDevice::DEVICE_EXTERNAL))
411b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        return;
412b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
413853b12aa319e4557a300923590538282c88314beAndy Qiu    int hz = 0;
414b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    if (mVideoInstances == 1) {
415b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        MDSVideoSourceInfo info;
416b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo(
417b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie                mVideoInstanceId, &info);
418b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        if (err == 0) {
419b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie            ITRACE("setting refresh rate to %d", info.frameRate);
420853b12aa319e4557a300923590538282c88314beAndy Qiu            hz = info.frameRate;
421b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        }
422b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
423853b12aa319e4557a300923590538282c88314beAndy Qiu    hwc->getVsyncManager()->enableDynamicVsync(false);
424853b12aa319e4557a300923590538282c88314beAndy Qiu    hwc->getDrm()->setRefreshRate(IDisplayDevice::DEVICE_EXTERNAL, hz);
425853b12aa319e4557a300923590538282c88314beAndy Qiu    hwc->getVsyncManager()->enableDynamicVsync(true);
426b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie}
427b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
428b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xievoid DisplayAnalyzer::handleVideoEvent(
429b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    int instances, int instanceID, bool preparing, bool playing)
430eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
431eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (preparing != mVideoPreparing) {
432eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        for (int i = 0; i < (int)mCachedNumDisplays; i++) {
433eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            if (mCachedDisplays[i]) {
434eb726af21649d79ed720bdf329e0849270995c45Andy Qiu                mCachedDisplays[i]->flags = HWC_GEOMETRY_CHANGED;
435eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            }
436eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
437eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        mVideoPreparing = preparing;
438eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        // if video is in preparing stage, overlay use is temporarily not allowed to avoid
439eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        // scrambed RGB overlay if video is protected.
440eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        mOverlayAllowed = !preparing;
441eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
442eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mVideoPlaying = playing;
443b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
444b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    Hwcomposer *hwc = &Hwcomposer::getInstance();
445853b12aa319e4557a300923590538282c88314beAndy Qiu    if ((playing && !preparing) || (!playing && !preparing)) {
446853b12aa319e4557a300923590538282c88314beAndy Qiu        mVideoStateChanged = true;
447b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
448853b12aa319e4557a300923590538282c88314beAndy Qiu    mVideoInstances = instances;
449853b12aa319e4557a300923590538282c88314beAndy Qiu    mVideoInstanceId = instanceID;
450b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
4514ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    if (preparing) {
4524ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes();
4534ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        mEventHandledCondition.signal();
4544ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    }
455eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
456eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
457eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice()
458eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
459d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    hwc_display_contents_1_t *content = NULL;
460d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    hwc_layer_1 *layer = NULL;
461eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
462d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        if (i == IDisplayDevice::DEVICE_PRIMARY) {
463d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            continue;
464d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
465eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
466d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        if (content == NULL) {
467d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            continue;
468d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
469d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
470d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
471d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            layer = &content->hwLayers[j];
472d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            if (!layer) {
473d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                continue;
474d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            }
475d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            if (mBlankDevice) {
476d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->hints |= HWC_HINT_CLEAR_FB;
477d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->flags &= ~HWC_SKIP_LAYER;
478d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->compositionType = HWC_OVERLAY;
479d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            } else {
480d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->hints &= ~HWC_HINT_CLEAR_FB;
481d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->compositionType = HWC_FRAMEBUFFER;
482d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            }
483d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
484d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
485d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
48665efc253a628175c7afa95c431b746ea20052794Andy Qiu
487d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer)
488d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{
489d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    if (mCachedDisplays == NULL) {
490d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        return false;
491d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
492d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    // check if the given layer exists in the primary device
493d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    hwc_display_contents_1_t *content = mCachedDisplays[0];
494d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    if (content == NULL) {
495d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        return false;
496d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
497d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    for (size_t i = 0; i < content->numHwLayers - 1; i++) {
498d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) {
499d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri            VTRACE("Layer exists for Primary device");
500d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri            return false;
501d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        }
502d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
503d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    return true;
504d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri}
505d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri
50665efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel
50765efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android
50865efc253a628175c7afa95c431b746ea20052794Andy Qiu
509