18b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol/* 28b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Copyright (c) 2014 Intel Corporation 38b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 48b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Licensed under the Apache License, Version 2.0 (the "License"); 58b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// you may not use this file except in compliance with the License. 68b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// You may obtain a copy of the License at 78b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 88b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// http://www.apache.org/licenses/LICENSE-2.0 98b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// 108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// Unless required by applicable law or agreed to in writing, software 118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// distributed under the License is distributed on an "AS IS" BASIS, 128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// See the License for the specific language governing permissions and 148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol// limitations under the License. 158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol*/ 168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#ifndef DISPLAY_ANALYZER_H 178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#define DISPLAY_ANALYZER_H 188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <utils/threads.h> 208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#include <utils/Vector.h> 218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace android { 248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolnamespace intel { 258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolclass DisplayAnalyzer { 288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic: 298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DisplayAnalyzer(); 308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol virtual ~DisplayAnalyzer(); 318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolpublic: 338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool initialize(); 348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void deinitialize(); 358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void analyzeContents(size_t numDisplays, hwc_display_contents_1_t** displays); 368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isVideoExtModeActive(); 378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isVideoExtModeEnabled(); 388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isVideoLayer(hwc_layer_1_t &layer); 398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isVideoFullScreen(int device, hwc_layer_1_t &layer); 408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isOverlayAllowed(); 418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int getVideoInstances(); 428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void postHotplugEvent(bool connected); 438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void postVideoEvent(int instanceID, int state); 448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void postInputEvent(bool active); 458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void postVideoEvent(int instances, int instanceID, bool preparing, bool playing); 468b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void postBlankEvent(bool blank); 478b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void postIdleEntryEvent(); 488b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isPresentationLayer(hwc_layer_1_t &layer); 498b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool isProtectedLayer(hwc_layer_1_t &layer); 508b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool ignoreVideoSkipFlag(); 518b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int getFirstVideoInstanceSessionID(); 528b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 538b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate: 548b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol enum DisplayEventType { 558b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol HOTPLUG_EVENT, 568b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol BLANK_EVENT, 578b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_EVENT, 588b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol TIMING_EVENT, 598b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol INPUT_EVENT, 608b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DPMS_EVENT, 618b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol IDLE_ENTRY_EVENT, 628b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol IDLE_EXIT_EVENT, 638b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_CHECK_EVENT, 648b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol }; 658b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 668b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct Event { 678b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int type; 688b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 698b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol struct VideoEvent { 708b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int instanceID; 718b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int state; 728b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol }; 738b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 748b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol union { 758b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool bValue; 768b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int nValue; 778b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VideoEvent videoEvent; 788b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol }; 798b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol }; 808b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol inline void postEvent(Event& e); 818b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol inline bool getEvent(Event& e); 828b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handlePendingEvents(); 838b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleHotplugEvent(bool connected); 848b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleBlankEvent(bool blank); 858b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleVideoEvent(int instanceID, int state); 868b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleTimingEvent(); 878b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleInputEvent(bool active); 888b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleDpmsEvent(int delayCount); 898b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleIdleEntryEvent(int count); 908b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleIdleExitEvent(); 918b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleVideoCheckEvent(); 928b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 938b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void blankSecondaryDevice(); 948b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void handleVideoExtMode(); 958b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void checkVideoExtMode(); 968b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void enterVideoExtMode(); 978b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol void exitVideoExtMode(); 988b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool hasProtectedLayer(); 998b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol inline void setCompositionType(hwc_display_contents_1_t *content, int type); 1008b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol inline void setCompositionType(int device, int type, bool reset); 1018b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1028b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate: 1038b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // Video playback state, must match defintion in Multi Display Service 1048b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol enum 1058b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol { 1068b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_PLAYBACK_IDLE, 1078b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_PLAYBACK_STARTING, 1088b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_PLAYBACK_STARTED, 1098b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_PLAYBACK_STOPPING, 1108b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol VIDEO_PLAYBACK_STOPPED, 1118b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol }; 1128b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1138b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol enum 1148b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol { 1158b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // number of flips before display can be powered off in video extended mode 1168b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol DELAY_BEFORE_DPMS_OFF = 0, 1178b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol }; 1188b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1198b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujolprivate: 1208b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mInitialized; 1218b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mVideoExtModeEnabled; 1228b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mVideoExtModeEligible; 1238b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mVideoExtModeActive; 1248b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mBlankDevice; 1258b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mOverlayAllowed; 1268b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mActiveInputState; 1278b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // workaround HWC_SKIP_LAYER set during rotation for extended video mode 1288b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // by default if layer has HWC_SKIP_LAYER flag it should not be processed by HWC 1298b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mIgnoreVideoSkipFlag; 1308b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol bool mProtectedVideoSession; 1318b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol // map video instance ID to video state 1328b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol KeyedVector<int, int> mVideoStateMap; 1338b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol int mCachedNumDisplays; 1348b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol hwc_display_contents_1_t** mCachedDisplays; 1358b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Vector<Event> mPendingEvents; 1368b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Mutex mEventMutex; 1378b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol Condition mEventHandledCondition; 1388b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol}; 1398b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1408b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace intel 1418b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol} // namespace android 1428b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1438b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1448b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol 1458b0063f7f46289983bd1bf9ca61662b4a2ddf5b6Benjamin Pujol#endif /* DISPLAY_ANALYZER_H */ 146