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