DisplayAnalyzer.cpp revision 177b44e0661a92d06f8f37c51e59af86423f7a95
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>
37ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi#include <GraphicBuffer.h>
382413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin#include <ExternalDevice.h>
3965efc253a628175c7afa95c431b746ea20052794Andy Qiu
4065efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android {
4165efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel {
4265efc253a628175c7afa95c431b746ea20052794Andy Qiu
4365efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer()
4465efc253a628175c7afa95c431b746ea20052794Andy Qiu    : mInitialized(false),
45177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mVideoExtModeEnabled(true),
46177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mVideoExtModeEligible(false),
47177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mVideoExtModeActive(false),
48d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu      mBlankDevice(false),
49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mOverlayAllowed(true),
50177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu      mActiveInputState(true),
51eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedNumDisplays(0),
52eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedDisplays(0),
53eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mPendingEvents(),
544ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu      mEventMutex(),
554ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu      mEventHandledCondition()
5665efc253a628175c7afa95c431b746ea20052794Andy Qiu{
5765efc253a628175c7afa95c431b746ea20052794Andy Qiu}
5865efc253a628175c7afa95c431b746ea20052794Andy Qiu
5965efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer()
6065efc253a628175c7afa95c431b746ea20052794Andy Qiu{
6165efc253a628175c7afa95c431b746ea20052794Andy Qiu}
6265efc253a628175c7afa95c431b746ea20052794Andy Qiu
6365efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize()
6465efc253a628175c7afa95c431b746ea20052794Andy Qiu{
655490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    // by default video extended mode is enabled
665490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    char prop[PROPERTY_VALUE_MAX];
675490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (property_get("hwc.video.extmode.enable", prop, "1") > 0) {
68177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEnabled = atoi(prop) ? true : false;
695490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    }
70177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeEligible = false;
71177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeActive = false;
72d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    mBlankDevice = false;
73eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mOverlayAllowed = true;
74177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mActiveInputState = true;
75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = 0;
76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = 0;
77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
78b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mVideoStateMap.clear();
7965efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = true;
80b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
8165efc253a628175c7afa95c431b746ea20052794Andy Qiu    return true;
8265efc253a628175c7afa95c431b746ea20052794Andy Qiu}
8365efc253a628175c7afa95c431b746ea20052794Andy Qiu
84e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize()
8565efc253a628175c7afa95c431b746ea20052794Andy Qiu{
86eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
87b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mVideoStateMap.clear();
8865efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = false;
8965efc253a628175c7afa95c431b746ea20052794Andy Qiu}
9065efc253a628175c7afa95c431b746ea20052794Andy Qiu
91770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents(
92770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        size_t numDisplays, hwc_display_contents_1_t** displays)
93770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
94eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // cache and use them only in this context during analysis
95eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = numDisplays;
96eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = displays;
97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
98eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    handlePendingEvents();
99eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
100177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mVideoExtModeEnabled) {
101177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        handleVideoExtMode();
102770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
103b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
104b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mBlankDevice) {
105b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // this will make sure device is blanked after geometry changes.
106b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // blank event is only processed once
107b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        blankSecondaryDevice();
108b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
109770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie}
110770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
111177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleVideoExtMode()
112770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
113177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    bool eligible = mVideoExtModeEligible;
114177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    checkVideoExtMode();
115177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (eligible == mVideoExtModeEligible) {
116177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (mVideoExtModeActive) {
117177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            // need to mark all layers
118177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            setCompositionType(0, HWC_OVERLAY, false);
119770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        }
120177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
121770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
122770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
123177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mVideoExtModeEligible) {
124177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (mActiveInputState) {
125177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            VTRACE("input is active");
126177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        } else {
127177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            enterVideoExtMode();
128177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        }
129177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    } else {
130177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        exitVideoExtMode();
131770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie    }
132770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie}
133770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie
134177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::checkVideoExtMode()
13565efc253a628175c7afa95c431b746ea20052794Andy Qiu{
136b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mVideoStateMap.size() != 1) {
137177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEligible = false;
138eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
139eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
140eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
14165efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool geometryChanged = false;
14265efc253a628175c7afa95c431b746ea20052794Andy Qiu    int activeDisplays = 0;
143d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
14465efc253a628175c7afa95c431b746ea20052794Andy Qiu    hwc_display_contents_1_t *content = NULL;
145eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
146eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
14765efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content == NULL) {
14865efc253a628175c7afa95c431b746ea20052794Andy Qiu            continue;
14965efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
15065efc253a628175c7afa95c431b746ea20052794Andy Qiu        activeDisplays++;
15165efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content->flags & HWC_GEOMETRY_CHANGED) {
15265efc253a628175c7afa95c431b746ea20052794Andy Qiu            geometryChanged = true;
15365efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
15465efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
15565efc253a628175c7afa95c431b746ea20052794Andy Qiu
15665efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (activeDisplays <= 1) {
157177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEligible = false;
15865efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
15965efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
16065efc253a628175c7afa95c431b746ea20052794Andy Qiu
161177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // video state update event may come later than geometry change event.
162177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // in that case, video extended mode is not detected properly.
163177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu#if 0
16465efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (geometryChanged == false) {
16565efc253a628175c7afa95c431b746ea20052794Andy Qiu        // use previous analysis result
16665efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
16765efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
168177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu#endif
16965efc253a628175c7afa95c431b746ea20052794Andy Qiu
170177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // reset eligibility of video extended mode
171177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeEligible = false;
17265efc253a628175c7afa95c431b746ea20052794Andy Qiu
17365efc253a628175c7afa95c431b746ea20052794Andy Qiu    // check if there is video layer in the primary device
174eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    content = mCachedDisplays[0];
17565efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (content == NULL) {
17665efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
17765efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
17865efc253a628175c7afa95c431b746ea20052794Andy Qiu
179d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    uint32_t videoHandle = 0;
18065efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool videoLayerExist = false;
18165efc253a628175c7afa95c431b746ea20052794Andy Qiu    // exclude the frame buffer target layer
18265efc253a628175c7afa95c431b746ea20052794Andy Qiu    for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
18365efc253a628175c7afa95c431b746ea20052794Andy Qiu        videoLayerExist = isVideoLayer(content->hwLayers[j]);
184bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie        if (videoLayerExist) {
18565efc253a628175c7afa95c431b746ea20052794Andy Qiu            videoHandle = (uint32_t)content->hwLayers[j].handle;
18665efc253a628175c7afa95c431b746ea20052794Andy Qiu            break;
18765efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
18865efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
18965efc253a628175c7afa95c431b746ea20052794Andy Qiu
19065efc253a628175c7afa95c431b746ea20052794Andy Qiu    if (videoLayerExist == false) {
19165efc253a628175c7afa95c431b746ea20052794Andy Qiu        // no video layer is found in the primary layer
19265efc253a628175c7afa95c431b746ea20052794Andy Qiu        return;
19365efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
19465efc253a628175c7afa95c431b746ea20052794Andy Qiu
19565efc253a628175c7afa95c431b746ea20052794Andy Qiu    // check whether video layer exists in external device or virtual device
19665efc253a628175c7afa95c431b746ea20052794Andy Qiu    // TODO: video may exist in virtual device but no in external device or vice versa
19765efc253a628175c7afa95c431b746ea20052794Andy Qiu    // TODO: multiple video layers are not addressed here
198eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 1; i < (int)mCachedNumDisplays; i++) {
199eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
20065efc253a628175c7afa95c431b746ea20052794Andy Qiu        if (content == NULL) {
20165efc253a628175c7afa95c431b746ea20052794Andy Qiu            continue;
20265efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
20365efc253a628175c7afa95c431b746ea20052794Andy Qiu
20465efc253a628175c7afa95c431b746ea20052794Andy Qiu        // exclude the frame buffer target layer
20565efc253a628175c7afa95c431b746ea20052794Andy Qiu        for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
20665efc253a628175c7afa95c431b746ea20052794Andy Qiu            if ((uint32_t)content->hwLayers[j].handle == videoHandle) {
2079332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu                VTRACE("video layer exists in device %d", i);
208177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu                mVideoExtModeEligible = isVideoFullScreen(i, content->hwLayers[j]);
20965efc253a628175c7afa95c431b746ea20052794Andy Qiu                return;
21065efc253a628175c7afa95c431b746ea20052794Andy Qiu            }
21165efc253a628175c7afa95c431b746ea20052794Andy Qiu        }
21265efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
21365efc253a628175c7afa95c431b746ea20052794Andy Qiu}
21465efc253a628175c7afa95c431b746ea20052794Andy Qiu
215177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeActive()
21665efc253a628175c7afa95c431b746ea20052794Andy Qiu{
217177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    return mVideoExtModeActive;
21865efc253a628175c7afa95c431b746ea20052794Andy Qiu}
21965efc253a628175c7afa95c431b746ea20052794Andy Qiu
220177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiubool DisplayAnalyzer::isVideoExtModeEnabled()
2215490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu{
2225490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#if 1
2235490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    // enable it for run-time debugging purpose.
2245490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    char prop[PROPERTY_VALUE_MAX];
2255490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    if (property_get("hwc.video.extmode.enable", prop, "1") > 0) {
226177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        mVideoExtModeEnabled = atoi(prop) ? true : false;
2275490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu    }
228177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    ITRACE("video extended mode enabled: %d", mVideoExtModeEnabled);
2295490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu#endif
2305490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu
231177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    return mVideoExtModeEnabled;
2325490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu}
2335490411cb9330d4e92d59878da3693c33a948ad6Andy Qiu
23465efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::isVideoLayer(hwc_layer_1_t &layer)
23565efc253a628175c7afa95c431b746ea20052794Andy Qiu{
23665efc253a628175c7afa95c431b746ea20052794Andy Qiu    bool ret = false;
23765efc253a628175c7afa95c431b746ea20052794Andy Qiu    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
238eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!layer.handle) {
239eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return false;
240eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
241eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle);
24265efc253a628175c7afa95c431b746ea20052794Andy Qiu     if (!buffer) {
24365efc253a628175c7afa95c431b746ea20052794Andy Qiu         ETRACE("failed to get buffer");
24465efc253a628175c7afa95c431b746ea20052794Andy Qiu     } else {
24565efc253a628175c7afa95c431b746ea20052794Andy Qiu        ret = DisplayQuery::isVideoFormat(buffer->getFormat());
246eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        bm->unlockDataBuffer(buffer);
24765efc253a628175c7afa95c431b746ea20052794Andy Qiu    }
24865efc253a628175c7afa95c431b746ea20052794Andy Qiu    return ret;
24965efc253a628175c7afa95c431b746ea20052794Andy Qiu}
25065efc253a628175c7afa95c431b746ea20052794Andy Qiu
2510131f123eba74813aca3eaaf99cd418b6b558416Andy Qiubool DisplayAnalyzer::isVideoFullScreen(int device, hwc_layer_1_t &layer)
252bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie{
2530131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    IDisplayDevice *displayDevice = Hwcomposer::getInstance().getDisplayDevice(device);
2540131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (!displayDevice) {
255bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie        return false;
256bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    }
2570131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    int width = 0, height = 0;
2580131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (!displayDevice->getDisplaySize(&width, &height)) {
2590131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
2600131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    }
2610131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu
2629332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu    VTRACE("video left %d, right %d, top %d, bottom %d, device width %d, height %d",
2630131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        layer.displayFrame.left, layer.displayFrame.right,
2640131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        layer.displayFrame.top, layer.displayFrame.bottom,
2650131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        width, height);
266bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie
267bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    int dstW = layer.displayFrame.right - layer.displayFrame.left;
268bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    int dstH = layer.displayFrame.bottom - layer.displayFrame.top;
2690131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    if (dstW < width - 1 &&
2700131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        dstH < height - 1) {
2719332f677fa9b02f55ff910ca08a36eb6f23030d6Andy Qiu        VTRACE("video is not full-screen");
2720131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu        return false;
273bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie    }
2740131f123eba74813aca3eaaf99cd418b6b558416Andy Qiu    return true;
275bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie}
276bd5ed146ffeb236f3c5cc20b2ebaf6a850b54007Lin Xie
277eb726af21649d79ed720bdf329e0849270995c45Andy Qiubool DisplayAnalyzer::isOverlayAllowed()
278eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
279eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    return mOverlayAllowed;
280eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
281eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
28235fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhiint DisplayAnalyzer::getVideoInstances()
28335fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi{
284b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return (int)mVideoStateMap.size();
28535fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi}
28635fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi
287eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected)
288eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
289eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (!connected) {
290eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        // enable vsync on the primary device immediately
291177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        Hwcomposer::getInstance().getVsyncManager()->enableDynamicVsync(true);
292eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
293177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
294177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // handle hotplug event (vsync switch) asynchronously
295177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
296177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = HOTPLUG_EVENT;
297177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.bValue = connected;
298177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
299177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().invalidate();
300eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
301eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
302b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::postVideoEvent(int instanceID, int state)
303eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
304eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Event e;
305eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.type = VIDEO_EVENT;
306b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    e.videoEvent.instanceID = instanceID;
307b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e.videoEvent.state = state;
308eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    postEvent(e);
309b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
310b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if ((state == VIDEO_PLAYBACK_STARTING) ||
311b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) {
3124ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Hwcomposer::getInstance().invalidate();
3134ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        Mutex::Autolock lock(mEventMutex);
3144ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // ideally overlay should be disabled in the surface flinger thread, if it is not processed
315b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // in close to one vsync cycle (50ms)  it will be safely disabled in this thread context
3164ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        // there is no threading issue
317b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        status_t err = mEventHandledCondition.waitRelative(mEventMutex, milliseconds(50));
3184ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        if (err == -ETIMEDOUT) {
3194ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu            WTRACE("timeout waiting for event handling");
3204ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu            Hwcomposer::getInstance().getPlaneManager()->disableOverlayPlanes();
3214ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu        }
3224ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    }
323eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
324eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
325eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postBlankEvent(bool blank)
326eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
327eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Event e;
328eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    e.type = BLANK_EVENT;
329b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e.bValue = blank;
330eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    postEvent(e);
331d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    Hwcomposer::getInstance().invalidate();
332d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
333d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
334177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::postInputEvent(bool active)
335177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
336177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
337177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = INPUT_EVENT;
338177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.bValue = active;
339177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
340177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().invalidate();
341177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
342177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
343eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e)
344d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{
345eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
346eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.add(e);
347eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
348eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
349b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::getEvent(Event& e)
350eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
351eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
352eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (mPendingEvents.size() == 0) {
353b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
354b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
355b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e = mPendingEvents[0];
356b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mPendingEvents.removeAt(0);
357b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return true;
358b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe}
359b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
360b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handlePendingEvents()
361b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{
362b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // handle one event per analysis to avoid blocking surface flinger
363b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // some event may take lengthy time to process
364b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    Event e;
365b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!getEvent(e)) {
366eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
367eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
368eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
369b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    switch (e.type) {
370b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case HOTPLUG_EVENT:
371b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleHotplugEvent(e.bValue);
372b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
373b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case BLANK_EVENT:
374b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleBlankEvent(e.bValue);
375b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
376b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case VIDEO_EVENT:
377b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleVideoEvent(e.videoEvent.instanceID, e.videoEvent.state);
378b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
379b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case TIMING_EVENT:
380b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleTimingEvent();
381b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
382177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    case INPUT_EVENT:
383177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        handleInputEvent(e.bValue);
384177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        break;
385177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    case DPMS_EVENT:
386177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        handleDpmsEvent(e.nValue);
387177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        break;
388eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
389eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
390eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
391eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected)
392eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
393eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
394eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
395eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleBlankEvent(bool blank)
396eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
397eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mBlankDevice = blank;
398eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // force geometry changed in the secondary device to reset layer composition type
399eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
400eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (i == IDisplayDevice::DEVICE_PRIMARY) {
401eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            continue;
402eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
403eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        if (mCachedDisplays[i]) {
404eb726af21649d79ed720bdf329e0849270995c45Andy Qiu            mCachedDisplays[i]->flags |= HWC_GEOMETRY_CHANGED;
405eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        }
406d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
407eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    blankSecondaryDevice();
408eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
409d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
410b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleTimingEvent()
411b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie{
412b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // check whether external device is connected, reset refresh rate to match video frame rate
413b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // if video is in playing state or reset refresh rate to default preferred one if video is not
414b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    // at playing state
415b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    Hwcomposer *hwc = &Hwcomposer::getInstance();
416b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    ExternalDevice *dev = NULL;
417b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    dev = (ExternalDevice *)hwc->getDisplayDevice(IDisplayDevice::DEVICE_EXTERNAL);
418b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!dev) {
419b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        return;
420b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
421b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
422b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!dev->isConnected()) {
423b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return;
424b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
425b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
426f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie    if (hwc->getMultiDisplayObserver()->isExternalDeviceTimingFixed()) {
427b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        VTRACE("Timing of external device is fixed.");
428f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie        return;
429f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie    }
430f320f1a53d9adba5885304f3589962a58a1b4e67Lin Xie
431853b12aa319e4557a300923590538282c88314beAndy Qiu    int hz = 0;
432b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mVideoStateMap.size() == 1) {
43384e17af0350016243463b4fe7a82e76524e01651Lin Xie        VideoSourceInfo info;
434b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        int instanceID = mVideoStateMap.keyAt(0);
435b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        status_t err = hwc->getMultiDisplayObserver()->getVideoSourceInfo(
436b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe                instanceID, &info);
43784e17af0350016243463b4fe7a82e76524e01651Lin Xie        if (err == NO_ERROR) {
438853b12aa319e4557a300923590538282c88314beAndy Qiu            hz = info.frameRate;
439b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie        }
440b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
4412413102f33fdefa6bdb80ed2c4f56fae83cd5bd8fu jin
442b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    dev->setRefreshRate(hz);
443b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie}
444b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
445b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handleVideoEvent(int instanceID, int state)
446eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
447b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mVideoStateMap.removeItem(instanceID);
448b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (state != VIDEO_PLAYBACK_STOPPED) {
449b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mVideoStateMap.add(instanceID, state);
450b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
451b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
452b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    Hwcomposer *hwc = &Hwcomposer::getInstance();
453b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
454b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // sanity check
455b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (hwc->getMultiDisplayObserver()->getVideoSessionNumber() !=
456b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        (int)mVideoStateMap.size()) {
457b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        WTRACE("session number does not match!!");
458b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mVideoStateMap.clear();
459b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        if (state != VIDEO_PLAYBACK_STOPPED) {
460b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe            mVideoStateMap.add(instanceID, state);
461b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        }
462b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
463b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
464f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    // check if composition type needs to be reset
465f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    bool reset = false;
466b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if ((state == VIDEO_PLAYBACK_STARTING) ||
467b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        (state == VIDEO_PLAYBACK_STOPPING && hasProtectedLayer())) {
468b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // if video is in starting or stopping stage, overlay use is temporarily not allowed to
469b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // avoid scrambed RGB overlay if video is protected.
470b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mOverlayAllowed = false;
471f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        reset = true;
472b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
473b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        // disable overlay plane and acknolwdge the waiting thread
474b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        hwc->getPlaneManager()->disableOverlayPlanes();
475b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mEventHandledCondition.signal();
476b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    } else {
477f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        reset = !mOverlayAllowed;
478b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        mOverlayAllowed = true;
479b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie    }
480b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
481f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    if (reset) {
482f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        hwc_display_contents_1_t *content = NULL;
483f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        for (int i = 0; i < (int)mCachedNumDisplays; i++) {
484177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu            setCompositionType(i, HWC_FRAMEBUFFER, true);
485f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu        }
486f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu    }
487f98aecf56f66cd2501eb621a45658e421b3e3a8cAndy Qiu
488b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // delay changing timing as it is a lengthy operation
489b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (state == VIDEO_PLAYBACK_STARTED ||
490b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        state == VIDEO_PLAYBACK_STOPPED) {
491b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        Event e;
492b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        e.type = TIMING_EVENT;
493b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        postEvent(e);
4944ffa9f40b823e4c99cd7a21598373969517d93a8Andy Qiu    }
495eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
496eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
497eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::blankSecondaryDevice()
498eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
499d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    hwc_display_contents_1_t *content = NULL;
500d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    hwc_layer_1 *layer = NULL;
501eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    for (int i = 0; i < (int)mCachedNumDisplays; i++) {
502d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        if (i == IDisplayDevice::DEVICE_PRIMARY) {
503d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            continue;
504d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
505eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        content = mCachedDisplays[i];
506d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        if (content == NULL) {
507d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            continue;
508d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
509d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu
510d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        for (int j = 0; j < (int)content->numHwLayers - 1; j++) {
511d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            layer = &content->hwLayers[j];
512d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            if (!layer) {
513d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                continue;
514d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            }
515d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            if (mBlankDevice) {
516d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->hints |= HWC_HINT_CLEAR_FB;
517d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->flags &= ~HWC_SKIP_LAYER;
518d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->compositionType = HWC_OVERLAY;
519d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            } else {
520d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->hints &= ~HWC_HINT_CLEAR_FB;
521d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu                layer->compositionType = HWC_FRAMEBUFFER;
522d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu            }
523d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu        }
524d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu    }
525d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu}
52665efc253a628175c7afa95c431b746ea20052794Andy Qiu
527177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleInputEvent(bool active)
528177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
529177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mActiveInputState = active;
530177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (!mVideoExtModeEligible) {
531177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ITRACE("not eligible for video extended mode");
532177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
533177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
534177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
535177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (active) {
536177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        exitVideoExtMode();
537177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    } else {
538177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        enterVideoExtMode();
539177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
540177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
541177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
542177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::handleDpmsEvent(int delayCount)
543177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
544177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mActiveInputState || !mVideoExtModeEligible) {
545177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ITRACE("aborting display power off in video extended mode");
546177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
547177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
548177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
549177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (delayCount < DELAY_BEFORE_DPMS_OFF) {
550177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        Event e;
551177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        e.type = DPMS_EVENT;
552177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        e.nValue = delayCount + 1;
553177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        postEvent(e);
554177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
555177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
556177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
557177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (Hwcomposer::getInstance().getVsyncManager()->getVsyncSource() ==
558177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_PRIMARY) {
559177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ETRACE("primary display is source of vsync, it can't be powered off");
560177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
561177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
562177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
563177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    ITRACE("powering off primary display...");
564177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getDrm()->setDpmsMode(
565177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_PRIMARY,
566177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_DISPLAY_OFF);
567177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
568177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
569177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::enterVideoExtMode()
570177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
571177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (mVideoExtModeActive) {
572177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        WTRACE("already in video extended mode.");
573177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
574177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
575177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
576177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    ITRACE("entering video extended mode...");
577177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeActive = true;
578177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource();
579177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
580177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(0, HWC_OVERLAY, true);
581177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
582177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // Do not power off primary display immediately as flip is asynchronous
583177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
584177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = DPMS_EVENT;
585177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.nValue = 0;
586177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
587177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
588177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
589177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::exitVideoExtMode()
590177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
591177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (!mVideoExtModeActive) {
592177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        WTRACE("Not in video extended mode");
593177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
594177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
595177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
596177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    ITRACE("exitting video extended mode...");
597177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
598177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    mVideoExtModeActive = false;
599177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
600177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getDrm()->setDpmsMode(
601177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_PRIMARY,
602177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        IDisplayDevice::DEVICE_DISPLAY_ON);
603177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
604177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().getVsyncManager()->resetVsyncSource();
605177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
606177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(0, HWC_FRAMEBUFFER, true);
607177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
608177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
609d248396b4f48861e1e27c5e316c776121ab44938mamatha balguribool DisplayAnalyzer::isPresentationLayer(hwc_layer_1_t &layer)
610d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri{
611177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (layer.handle == NULL) {
612177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return false;
613177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
614d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    if (mCachedDisplays == NULL) {
615d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        return false;
616d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
617d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    // check if the given layer exists in the primary device
618d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    hwc_display_contents_1_t *content = mCachedDisplays[0];
619d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    if (content == NULL) {
620d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        return false;
621d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
622d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    for (size_t i = 0; i < content->numHwLayers - 1; i++) {
623d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        if ((uint32_t)content->hwLayers[i].handle == (uint32_t)layer.handle) {
624d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri            VTRACE("Layer exists for Primary device");
625d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri            return false;
626d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri        }
627d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    }
628d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri    return true;
629d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri}
630d248396b4f48861e1e27c5e316c776121ab44938mamatha balguri
631b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::hasProtectedLayer()
632b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{
633b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    DataBuffer * buffer = NULL;
634b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    hwc_display_contents_1_t *content = NULL;
635b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
636b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
637b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (bm == NULL){
638b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
639b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
640b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
641b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (mCachedDisplays == NULL) {
642b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
643b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
644b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // check if the given layer exists in the primary device
645b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    for (int index = 0; index < (int)mCachedNumDisplays; index++) {
646b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        content = mCachedDisplays[index];
647b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        if (content == NULL) {
648b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe            continue;
649b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        }
650b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
651b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        for (size_t i = 0; i < content->numHwLayers - 1; i++) {
652b16cf47b6865c4ba53e336558671d11b0325e78bLin Xie            if (isProtectedLayer(content->hwLayers[i]))
653b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe                return true;
654b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        }
655b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
656b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
657b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return false;
658b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe}
659b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
660ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhibool DisplayAnalyzer::isProtectedLayer(hwc_layer_1_t &layer)
661ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi{
662ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    if (!layer.handle) {
663177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return false;
664ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    }
665177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    bool ret = false;
666177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    BufferManager *bm = Hwcomposer::getInstance().getBufferManager();
667ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    DataBuffer *buffer = bm->lockDataBuffer((uint32_t)layer.handle);
668ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    if (!buffer) {
669ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi        ETRACE("failed to get buffer");
670ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    } else {
671ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi        ret = GraphicBuffer::isProtectedBuffer((GraphicBuffer*)buffer);
672ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi        bm->unlockDataBuffer(buffer);
673ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    }
674ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi    return ret;
675ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi}
676ef111c2d5fb42bfcefca8e774837e12cc1940d80Ashish Singhi
677177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(hwc_display_contents_1_t *display, int type)
678177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
679177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    for (size_t i = 0; i < display->numHwLayers - 1; i++) {
680177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        hwc_layer_1_t *layer = &display->hwLayers[i];
681177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (layer) layer->compositionType = type;
682177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
683177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
684177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
685177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(int device, int type, bool reset)
686177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
687177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    hwc_display_contents_1_t *content = mCachedDisplays[device];
688177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (content == NULL) {
689177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        ETRACE("Invalid device %d", device);
690177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
691177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
692177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
693177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // don't need to set geometry changed if layers are just needed to be marked
694177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (reset) {
695177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        content->flags |= HWC_GEOMETRY_CHANGED;
696177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
697177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
698177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(content, type);
699177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
700177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
70165efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel
70265efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android
70365efc253a628175c7afa95c431b746ea20052794Andy Qiu
704