12ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel/* 26e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel* Copyright (c) 2014 - 2017, The Linux Foundation. All rights reserved. 32ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 42ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* Redistribution and use in source and binary forms, with or without modification, are permitted 52ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* provided that the following conditions are met: 62ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions of source code must retain the above copyright notice, this list of 72ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* conditions and the following disclaimer. 82ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Redistributions in binary form must reproduce the above copyright notice, this list of 92ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* conditions and the following disclaimer in the documentation and/or other materials provided 102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* with the distribution. 112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* * Neither the name of The Linux Foundation nor the names of its contributors may be used to 122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* endorse or promote products derived from this software without specific prior written 132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* permission. 142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* 152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel*/ 242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#ifndef __COMP_MANAGER_H__ 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __COMP_MANAGER_H__ 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <core/display_interface.h> 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <private/extension_interface.h> 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/locker.h> 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <bitset> 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "strategy.h" 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "resource_default.h" 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "hw_interface.h" 362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "dump_impl.h" 372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm { 392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelclass CompManager : public DumpImpl { 412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel public: 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError Init(const HWResourceInfo &hw_res_info_, ExtensionInterface *extension_intf, 43b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel BufferAllocator *buffer_allocator, BufferSyncHandler *buffer_sync_handler, 44b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel SocketHandler *socket_handler); 452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError Deinit(); 462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError RegisterDisplay(DisplayType type, const HWDisplayAttributes &display_attributes, 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWPanelInfo &hw_panel_info, 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWMixerAttributes &mixer_attributes, 49eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel const DisplayConfigVariableInfo &fb_config, Handle *display_ctx); 50eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayError UnregisterDisplay(Handle display_ctx); 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ReconfigureDisplay(Handle display_ctx, const HWDisplayAttributes &display_attributes, 522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWPanelInfo &hw_panel_info, 532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWMixerAttributes &mixer_attributes, 542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const DisplayConfigVariableInfo &fb_config); 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void PrePrepare(Handle display_ctx, HWLayers *hw_layers); 562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError Prepare(Handle display_ctx, HWLayers *hw_layers); 57eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayError Commit(Handle display_ctx, HWLayers *hw_layers); 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError PostPrepare(Handle display_ctx, HWLayers *hw_layers); 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ReConfigure(Handle display_ctx, HWLayers *hw_layers); 602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError PostCommit(Handle display_ctx, HWLayers *hw_layers); 612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void Purge(Handle display_ctx); 622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void ProcessIdleTimeout(Handle display_ctx); 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void ProcessThermalEvent(Handle display_ctx, int64_t thermal_level); 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages); 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void ControlPartialUpdate(Handle display_ctx, bool enable); 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateScaling(const LayerRect &crop, const LayerRect &dst, bool rotate90); 672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, int x, int y); 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool SupportLayerAsCursor(Handle display_ctx, HWLayers *hw_layers); 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool CanSetIdleTimeout(Handle display_ctx); 706e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel bool SetDisplayState(Handle display_ctx, DisplayState state, DisplayType display_type); 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError SetMaxBandwidthMode(HWBwModes mode); 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError GetScaleLutConfig(HWScaleLutInfo *lut_info); 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError SetDetailEnhancerData(Handle display_ctx, const DisplayDetailEnhancerData &de_data); 74eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayError SetCompositionState(Handle display_ctx, LayerComposition composition_type, 75eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel bool enable); 76b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel DisplayError ControlDpps(bool enable); 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // DumpImpl method 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel virtual void AppendDump(char *buffer, uint32_t length); 802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel private: 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel static const int kMaxThermalLevel = 3; 83051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel static const int kSafeModeThreshold = 4; 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel void PrepareStrategyConstraints(Handle display_ctx, HWLayers *hw_layers); 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel struct DisplayCompositionContext { 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Strategy *strategy = NULL; 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel StrategyConstraints constraints; 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle display_resource_ctx = NULL; 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayType display_type = kPrimary; 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t max_strategies = 0; 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t remaining_strategies = 0; 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool idle_fallback = false; 956e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel bool thermal_fallback_ = false; 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Using primary panel flag of hw panel to configure Constraints. We do not need other hw 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // panel parameters for now. 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool is_primary_panel = false; 9972adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel bool valid_cursor = false; 10072adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel PUConstraints pu_constraints = {}; 101051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel bool scaled_composition = false; 1022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel }; 1032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Locker locker_; 1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ResourceInterface *resource_intf_ = NULL; 1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel std::bitset<kDisplayMax> registered_displays_; // Bit mask of registered displays 1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel std::bitset<kDisplayMax> configured_displays_; // Bit mask of sucessfully configured displays 1086e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel uint32_t display_state_[kDisplayMax] = {}; 1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool safe_mode_ = false; // Flag to notify all displays to be in resource crunch 1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // mode, where strategy manager chooses the best strategy 1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // that uses optimal number of pipes for each display 1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel HWResourceInfo hw_res_info_; 113b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel BufferAllocator *buffer_allocator_ = NULL; 1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ExtensionInterface *extension_intf_ = NULL; 1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t max_layers_ = kMaxSDELayers; 116d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel uint32_t max_sde_ext_layers_ = 0; 117b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel DppsControlInterface *dpps_ctrl_intf_ = NULL; 1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel}; 1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} // namespace sdm 1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#endif // __COMP_MANAGER_H__ 1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 124