165efc253a628175c7afa95c431b746ea20052794Andy Qiu/*
2cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Copyright (c) 2014 Intel Corporation 
3cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
4cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Licensed under the Apache License, Version 2.0 (the "License");
5cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// you may not use this file except in compliance with the License.
6cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// You may obtain a copy of the License at
7cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
8cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//      http://www.apache.org/licenses/LICENSE-2.0
9cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika//
10cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// Unless required by applicable law or agreed to in writing, software
11cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// distributed under the License is distributed on an "AS IS" BASIS,
12cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// See the License for the specific language governing permissions and
14cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika// limitations under the License.
15cd727f537d5085eec7f1b8f9c1d33922d4de75d4Prodyut Hazarika*/
1665efc253a628175c7afa95c431b746ea20052794Andy Qiu
170594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/utils/HwcTrace.h>
1865efc253a628175c7afa95c431b746ea20052794Andy Qiu#include <Hwcomposer.h>
190594c42af26255fd8d3d7d39c0cb0e2da5b8841bThierry Strudel#include <common/base/DisplayAnalyzer.h>
2065efc253a628175c7afa95c431b746ea20052794Andy Qiu
2165efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace android {
2265efc253a628175c7afa95c431b746ea20052794Andy Qiunamespace intel {
2365efc253a628175c7afa95c431b746ea20052794Andy Qiu
2465efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::DisplayAnalyzer()
2565efc253a628175c7afa95c431b746ea20052794Andy Qiu    : mInitialized(false),
26eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedNumDisplays(0),
27eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mCachedDisplays(0),
28eb726af21649d79ed720bdf329e0849270995c45Andy Qiu      mPendingEvents(),
29aca1af6bab5f1aab3a7d2851e1c27253a3ed6b80Andy Qiu      mEventMutex()
3065efc253a628175c7afa95c431b746ea20052794Andy Qiu{
3165efc253a628175c7afa95c431b746ea20052794Andy Qiu}
3265efc253a628175c7afa95c431b746ea20052794Andy Qiu
3365efc253a628175c7afa95c431b746ea20052794Andy QiuDisplayAnalyzer::~DisplayAnalyzer()
3465efc253a628175c7afa95c431b746ea20052794Andy Qiu{
3565efc253a628175c7afa95c431b746ea20052794Andy Qiu}
3665efc253a628175c7afa95c431b746ea20052794Andy Qiu
3765efc253a628175c7afa95c431b746ea20052794Andy Qiubool DisplayAnalyzer::initialize()
3865efc253a628175c7afa95c431b746ea20052794Andy Qiu{
39eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = 0;
40eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = 0;
41eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
4265efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = true;
43b58f29390918c0df3bd6d0731bf98daf57511b9fLin Xie
4465efc253a628175c7afa95c431b746ea20052794Andy Qiu    return true;
4565efc253a628175c7afa95c431b746ea20052794Andy Qiu}
4665efc253a628175c7afa95c431b746ea20052794Andy Qiu
47e2ad4c047651d4442f6a0e002290016d45e9201afu jinvoid DisplayAnalyzer::deinitialize()
4865efc253a628175c7afa95c431b746ea20052794Andy Qiu{
49eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.clear();
5065efc253a628175c7afa95c431b746ea20052794Andy Qiu    mInitialized = false;
5165efc253a628175c7afa95c431b746ea20052794Andy Qiu}
5265efc253a628175c7afa95c431b746ea20052794Andy Qiu
53770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xievoid DisplayAnalyzer::analyzeContents(
54770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie        size_t numDisplays, hwc_display_contents_1_t** displays)
55770346b3b6f55e10c54c8a47d4db8f8907035173Lin Xie{
56eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    // cache and use them only in this context during analysis
57eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedNumDisplays = numDisplays;
58eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mCachedDisplays = displays;
59eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
60eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    handlePendingEvents();
6135fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi}
6235fc4846ba9657d6d2638e68d810618fedec7ecdAshish Singhi
63eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postHotplugEvent(bool connected)
64eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
65177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // handle hotplug event (vsync switch) asynchronously
66177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Event e;
67177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.type = HOTPLUG_EVENT;
68177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    e.bValue = connected;
69177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    postEvent(e);
70177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    Hwcomposer::getInstance().invalidate();
71eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
72eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
73eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::postEvent(Event& e)
74d4e9a8ac464ef6fde755c1a8c0902dc02a1270ecAndy Qiu{
75eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
76eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    mPendingEvents.add(e);
77eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
78eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
79b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpebool DisplayAnalyzer::getEvent(Event& e)
80eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
81eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    Mutex::Autolock lock(mEventMutex);
82eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    if (mPendingEvents.size() == 0) {
83b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        return false;
84b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    }
85b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    e = mPendingEvents[0];
86b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    mPendingEvents.removeAt(0);
87b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    return true;
88b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe}
89b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe
90b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpevoid DisplayAnalyzer::handlePendingEvents()
91b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe{
92b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // handle one event per analysis to avoid blocking surface flinger
93b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    // some event may take lengthy time to process
94b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    Event e;
95b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    if (!getEvent(e)) {
96eb726af21649d79ed720bdf329e0849270995c45Andy Qiu        return;
97eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
98eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
99b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    switch (e.type) {
100b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe    case HOTPLUG_EVENT:
101b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        handleHotplugEvent(e.bValue);
102b7e04bcc10f0b8aaa698b1ccae40e87664ebef18mahongpe        break;
103eb726af21649d79ed720bdf329e0849270995c45Andy Qiu    }
104eb726af21649d79ed720bdf329e0849270995c45Andy Qiu}
105eb726af21649d79ed720bdf329e0849270995c45Andy Qiu
106eb726af21649d79ed720bdf329e0849270995c45Andy Qiuvoid DisplayAnalyzer::handleHotplugEvent(bool connected)
107eb726af21649d79ed720bdf329e0849270995c45Andy Qiu{
108466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    if (connected) {
10922bcbadcc008393db4187082694175f0f33b7c67lychenx        for (int i = 0; i < mCachedNumDisplays; i++) {
11022bcbadcc008393db4187082694175f0f33b7c67lychenx            setCompositionType(i, HWC_FRAMEBUFFER, true);
11122bcbadcc008393db4187082694175f0f33b7c67lychenx        }
112466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu    }
113466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu}
114466748a6f67ce4d1ad8baa944e68a88cf3c86d26Austin Hu
115177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(hwc_display_contents_1_t *display, int type)
116177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
117177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    for (size_t i = 0; i < display->numHwLayers - 1; i++) {
118177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        hwc_layer_1_t *layer = &display->hwLayers[i];
119177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        if (layer) layer->compositionType = type;
120177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
121177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
122177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
123177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiuvoid DisplayAnalyzer::setCompositionType(int device, int type, bool reset)
124177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu{
125177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    hwc_display_contents_1_t *content = mCachedDisplays[device];
126177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (content == NULL) {
1274157ee3f6fb20e0a249b9eedc06f3b16785ba31bIliyan Malchev        ELOGTRACE("Invalid device %d", device);
128177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        return;
129177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
130177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
131177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    // don't need to set geometry changed if layers are just needed to be marked
132177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    if (reset) {
133177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu        content->flags |= HWC_GEOMETRY_CHANGED;
134177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    }
135177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
136177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu    setCompositionType(content, type);
137177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu}
138177b44e0661a92d06f8f37c51e59af86423f7a95Andy Qiu
13965efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace intel
14065efc253a628175c7afa95c431b746ea20052794Andy Qiu} // namespace android
14165efc253a628175c7afa95c431b746ea20052794Andy Qiu
142