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#include <utils/constants.h> 262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <utils/debug.h> 272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include <core/buffer_allocator.h> 282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "comp_manager.h" 302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#include "strategy.h" 312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel#define __CLASS__ "CompManager" 332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelnamespace sdm { 352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 36051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudelstatic bool NeedsScaledComposition(const DisplayConfigVariableInfo &fb_config, 37051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel const HWMixerAttributes &mixer_attributes) { 38051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel return ((fb_config.x_pixels != mixer_attributes.width) || 39051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel (fb_config.y_pixels != mixer_attributes.height)); 40051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel} 41051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel 422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::Init(const HWResourceInfo &hw_res_info, 432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel ExtensionInterface *extension_intf, 44eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel BufferAllocator *buffer_allocator, 45b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel BufferSyncHandler *buffer_sync_handler, 46b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel SocketHandler *socket_handler) { 472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorNone; 502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (extension_intf) { 52eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel error = extension_intf->CreateResourceExtn(hw_res_info, &resource_intf_, buffer_allocator, 53eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel buffer_sync_handler); 54b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel extension_intf->CreateDppsControlExtn(&dpps_ctrl_intf_, socket_handler); 552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 56eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel error = ResourceDefault::CreateResourceDefault(hw_res_info, &resource_intf_); 572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 60b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel if (extension_intf) { 61b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel extension_intf->DestroyDppsControlExtn(dpps_ctrl_intf_); 62b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel } 632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel hw_res_info_ = hw_res_info; 67b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel buffer_allocator_ = buffer_allocator; 682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel extension_intf_ = extension_intf; 692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::Deinit() { 742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (extension_intf_) { 772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel extension_intf_->DestroyResourceExtn(resource_intf_); 78b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel extension_intf_->DestroyDppsControlExtn(dpps_ctrl_intf_); 792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 80eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel ResourceDefault::DestroyResourceDefault(resource_intf_); 812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::RegisterDisplay(DisplayType type, 872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWDisplayAttributes &display_attributes, 882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWPanelInfo &hw_panel_info, 892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWMixerAttributes &mixer_attributes, 902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const DisplayConfigVariableInfo &fb_config, 912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle *display_ctx) { 922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorNone; 952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = new DisplayCompositionContext(); 972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!display_comp_ctx) { 982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorMemory; 992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Strategy *&strategy = display_comp_ctx->strategy; 102b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel strategy = new Strategy(extension_intf_, buffer_allocator_, type, hw_res_info_, hw_panel_info, 103b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel mixer_attributes, display_attributes, fb_config); 1042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!strategy) { 1052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGE("Unable to create strategy"); 1062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete display_comp_ctx; 1072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorMemory; 1082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = strategy->Init(); 1112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 1122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete strategy; 1132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete display_comp_ctx; 1142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 1152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = resource_intf_->RegisterDisplay(type, display_attributes, hw_panel_info, mixer_attributes, 1182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel &display_comp_ctx->display_resource_ctx); 1192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 1202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel strategy->Deinit(); 1212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete strategy; 1222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete display_comp_ctx; 1232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx = NULL; 1242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 1252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel registered_displays_[type] = 1; 1282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->is_primary_panel = hw_panel_info.is_primary_panel; 1292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->display_type = type; 1302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel *display_ctx = display_comp_ctx; 1312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // New non-primary display device has been added, so move the composition mode to safe mode until 1322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // resources for the added display is configured properly. 1332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!display_comp_ctx->is_primary_panel) { 1342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel safe_mode_ = true; 135d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel max_sde_ext_layers_ = UINT32(Debug::GetExtMaxlayers()); 1362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 138051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel display_comp_ctx->scaled_composition = NeedsScaledComposition(fb_config, mixer_attributes); 1392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGV_IF(kTagCompManager, "registered display bit mask 0x%x, configured display bit mask 0x%x, " \ 1402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel "display type %d", registered_displays_.to_ulong(), configured_displays_.to_ulong(), 1412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->display_type); 1422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 1442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 146eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError CompManager::UnregisterDisplay(Handle display_ctx) { 1472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 1482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 150eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 1512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!display_comp_ctx) { 1532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorParameters; 1542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel resource_intf_->UnregisterDisplay(display_comp_ctx->display_resource_ctx); 1572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Strategy *&strategy = display_comp_ctx->strategy; 1592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel strategy->Deinit(); 1602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete strategy; 1612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel registered_displays_[display_comp_ctx->display_type] = 0; 1632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel configured_displays_[display_comp_ctx->display_type] = 0; 1642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (display_comp_ctx->display_type == kHDMI) { 1662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel max_layers_ = kMaxSDELayers; 1672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGV_IF(kTagCompManager, "registered display bit mask 0x%x, configured display bit mask 0x%x, " \ 1702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel "display type %d", registered_displays_.to_ulong(), configured_displays_.to_ulong(), 1712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->display_type); 1722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete display_comp_ctx; 1742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx = NULL; 1752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 1762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 1772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::ReconfigureDisplay(Handle comp_handle, 1792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWDisplayAttributes &display_attributes, 1802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWPanelInfo &hw_panel_info, 1812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const HWMixerAttributes &mixer_attributes, 1822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const DisplayConfigVariableInfo &fb_config) { 1832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 1842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorNone; 1862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 1872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(comp_handle); 1882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = resource_intf_->ReconfigureDisplay(display_comp_ctx->display_resource_ctx, 1902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_attributes, hw_panel_info, mixer_attributes); 1912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 1922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 1932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 1942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 1952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (display_comp_ctx->strategy) { 1962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = display_comp_ctx->strategy->Reconfigure(hw_panel_info, display_attributes, 1972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel mixer_attributes, fb_config); 1982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 1992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGE("Unable to Reconfigure strategy."); 2002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->strategy->Deinit(); 2012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel delete display_comp_ctx->strategy; 2022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->strategy = NULL; 2032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 2042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // For HDMI S3D mode, set max_layers_ to 0 so that primary display would fall back 2082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // to GPU composition to release pipes for HDMI. 2092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (display_comp_ctx->display_type == kHDMI) { 2102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (hw_panel_info.s3d_mode != kS3DModeNone) { 2112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel max_layers_ = 0; 2122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 2132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel max_layers_ = kMaxSDELayers; 2142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 217051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel display_comp_ctx->scaled_composition = NeedsScaledComposition(fb_config, mixer_attributes); 218051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel 2192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 2202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::PrepareStrategyConstraints(Handle comp_handle, HWLayers *hw_layers) { 2232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 2242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(comp_handle); 2252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel StrategyConstraints *constraints = &display_comp_ctx->constraints; 2262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel constraints->safe_mode = safe_mode_; 2282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel constraints->use_cursor = false; 2292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel constraints->max_layers = max_layers_; 2302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 231051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel // Limit 2 layer SDE Comp if its not a Primary Display. 232051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel // Safe mode is the policy for External display on a low end device. 2332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!display_comp_ctx->is_primary_panel) { 234051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel bool low_end_hw = ((hw_res_info_.num_vig_pipe + hw_res_info_.num_rgb_pipe + 235051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel hw_res_info_.num_dma_pipe) <= kSafeModeThreshold); 236d62c8a289ff6b4838e543e82b655dc436f387574Thierry Strudel constraints->max_layers = max_sde_ext_layers_; 237051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel constraints->safe_mode = (low_end_hw && !hw_res_info_.separate_rotator) ? true : safe_mode_; 2382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // If a strategy fails after successfully allocating resources, then set safe mode 2412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (display_comp_ctx->remaining_strategies != display_comp_ctx->max_strategies) { 2422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel constraints->safe_mode = true; 2432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 24572adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel // Set use_cursor constraint to Strategy 24672adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel constraints->use_cursor = display_comp_ctx->valid_cursor; 24772adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel 2482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // TODO(user): App layer count will change for hybrid composition 2492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t app_layer_count = UINT32(hw_layers->info.stack->layers.size()) - 1; 2506e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel if (display_comp_ctx->idle_fallback || display_comp_ctx->thermal_fallback_) { 2512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Handle the idle timeout by falling back 2522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel constraints->safe_mode = true; 2532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2546e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel 2556e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel // Avoid safe mode, if there is only one app layer. 2566e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel if (app_layer_count == 1) { 2576e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel constraints->safe_mode = false; 2586e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel } 2592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::PrePrepare(Handle display_ctx, HWLayers *hw_layers) { 2622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 2632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 2642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 26572adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel display_comp_ctx->valid_cursor = SupportLayerAsCursor(display_comp_ctx, hw_layers); 26672adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel 26772adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel // pu constraints 26872adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel display_comp_ctx->pu_constraints.enable_cursor_pu = display_comp_ctx->valid_cursor; 26972adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel 2702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->strategy->Start(&hw_layers->info, &display_comp_ctx->max_strategies, 27172adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel display_comp_ctx->pu_constraints); 2722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->remaining_strategies = display_comp_ctx->max_strategies; 2732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 2742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::Prepare(Handle display_ctx, HWLayers *hw_layers) { 2762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 2772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 2792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 2802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle &display_resource_ctx = display_comp_ctx->display_resource_ctx; 2812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorUndefined; 2832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel PrepareStrategyConstraints(display_ctx, hw_layers); 2852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Select a composition strategy, and try to allocate resources for it. 2872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel resource_intf_->Start(display_resource_ctx); 2882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool exit = false; 2902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel uint32_t &count = display_comp_ctx->remaining_strategies; 2912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (; !exit && count > 0; count--) { 2922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = display_comp_ctx->strategy->GetNextStrategy(&display_comp_ctx->constraints); 2932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 2942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // Composition strategies exhausted. Resource Manager could not allocate resources even for 2952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel // GPU composition. This will never happen. 2962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel exit = true; 2972ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 2982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 2992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!exit) { 300eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel error = resource_intf_->Prepare(display_resource_ctx, hw_layers); 301eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel // Exit if successfully prepared resource, else try next strategy. 3022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel exit = (error == kErrorNone); 3032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 3072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGE("Composition strategies exhausted for display = %d", display_comp_ctx->display_type); 3082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel resource_intf_->Stop(display_resource_ctx); 3112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 3132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::PostPrepare(Handle display_ctx, HWLayers *hw_layers) { 3162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 3172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 3182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 3192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle &display_resource_ctx = display_comp_ctx->display_resource_ctx; 3202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorNone; 3222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = resource_intf_->PostPrepare(display_resource_ctx, hw_layers); 3232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 3242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 3252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->strategy->Stop(); 3282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 3302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 332eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError CompManager::Commit(Handle display_ctx, HWLayers *hw_layers) { 333eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel SCOPE_LOCK(locker_); 334eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel 335eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayCompositionContext *display_comp_ctx = 336eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 337eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel 338eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel return resource_intf_->Commit(display_comp_ctx->display_resource_ctx, hw_layers); 339eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel} 340eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel 3412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::ReConfigure(Handle display_ctx, HWLayers *hw_layers) { 3422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 3432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3442ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 3452ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 3462ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle &display_resource_ctx = display_comp_ctx->display_resource_ctx; 3472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorUndefined; 3492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel resource_intf_->Start(display_resource_ctx); 350eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel error = resource_intf_->Prepare(display_resource_ctx, hw_layers); 3512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 3532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGE("Reconfigure failed for display = %d", display_comp_ctx->display_type); 3542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel resource_intf_->Stop(display_resource_ctx); 3572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 3582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = resource_intf_->PostPrepare(display_resource_ctx, hw_layers); 3592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 3622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::PostCommit(Handle display_ctx, HWLayers *hw_layers) { 3652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 3662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3672ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorNone; 3682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 3692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 3702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel configured_displays_[display_comp_ctx->display_type] = 1; 3712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (configured_displays_ == registered_displays_) { 3722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel safe_mode_ = false; 3732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = resource_intf_->PostCommit(display_comp_ctx->display_resource_ctx, hw_layers); 3762ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (error != kErrorNone) { 3772ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 3782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 3792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->idle_fallback = false; 3812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DLOGV_IF(kTagCompManager, "registered display bit mask 0x%x, configured display bit mask 0x%x, " \ 3832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel "display type %d", registered_displays_, configured_displays_, 3842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->display_type); 3852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNone; 3872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::Purge(Handle display_ctx) { 3902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 3912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 3932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 3942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 3952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel resource_intf_->Purge(display_comp_ctx->display_resource_ctx); 396b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel 397b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel display_comp_ctx->strategy->Purge(); 3982ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 3992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 400cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry StrudelDisplayError CompManager::SetIdleTimeoutMs(Handle display_ctx, uint32_t active_ms) { 401cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel SCOPE_LOCK(locker_); 402cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel 403cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel DisplayCompositionContext *display_comp_ctx = 404cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 405cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel 406cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel return display_comp_ctx->strategy->SetIdleTimeoutMs(active_ms); 407cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel} 408cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel 4092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::ProcessIdleTimeout(Handle display_ctx) { 4102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 4112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 4132ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 4142ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4152ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (!display_comp_ctx) { 4162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return; 4172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 4182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel display_comp_ctx->idle_fallback = true; 4202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::ProcessThermalEvent(Handle display_ctx, int64_t thermal_level) { 4232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 4242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 4262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 4272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (thermal_level >= kMaxThermalLevel) { 4296e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel display_comp_ctx->thermal_fallback_ = true; 4302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } else { 4316e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel display_comp_ctx->thermal_fallback_ = false; 4322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 4332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 435cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudelvoid CompManager::ProcessIdlePowerCollapse(Handle display_ctx) { 436cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel SCOPE_LOCK(locker_); 437cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel 438cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel DisplayCompositionContext *display_comp_ctx = 439cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 440cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel 441cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel if (display_comp_ctx) { 442cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel resource_intf_->Perform(ResourceInterface::kCmdResetScalarLUT, 443cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel display_comp_ctx->display_resource_ctx); 444cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel } 445cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel} 446cd66324640d3290ee75bf5bf41826fbcbc55a13aThierry Strudel 4472ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::SetMaxMixerStages(Handle display_ctx, uint32_t max_mixer_stages) { 4482ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 4492ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4502ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayError error = kErrorNone; 4512ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 4522ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 4532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4542ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (display_comp_ctx) { 4552ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel error = resource_intf_->SetMaxMixerStages(display_comp_ctx->display_resource_ctx, 4562ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel max_mixer_stages); 4572ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 4582ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4592ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return error; 4602ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4612ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4622ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::ControlPartialUpdate(Handle display_ctx, bool enable) { 4632ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 4642ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4652ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 4662ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 46772adb432f6bdb99433ebb261d8e55395d10783deThierry Strudel display_comp_ctx->pu_constraints.enable = enable; 4682ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4692ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4702ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelvoid CompManager::AppendDump(char *buffer, uint32_t length) { 4712ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 4722ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4732ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4742ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::ValidateScaling(const LayerRect &crop, const LayerRect &dst, 4752ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool rotate90) { 476051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel BufferLayout layout = Debug::IsUbwcTiledFrameBuffer() ? kUBWC : kLinear; 477051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel return resource_intf_->ValidateScaling(crop, dst, rotate90, layout, true); 4782ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4792ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4802ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::ValidateCursorPosition(Handle display_ctx, HWLayers *hw_layers, 4812ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int x, int y) { 4822ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 4832ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 4842ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle &display_resource_ctx = display_comp_ctx->display_resource_ctx; 4852ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4862ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return resource_intf_->ValidateCursorPosition(display_resource_ctx, hw_layers, x, y); 4872ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 4882ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 4892ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudelbool CompManager::SupportLayerAsCursor(Handle comp_handle, HWLayers *hw_layers) { 4902ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 4912ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(comp_handle); 4922ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Handle &display_resource_ctx = display_comp_ctx->display_resource_ctx; 4932ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel LayerStack *layer_stack = hw_layers->info.stack; 4942ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel bool supported = false; 4952ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel int32_t gpu_index = -1; 4962ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 497051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel // HW Cursor cannot be used, if Display configuration needs scaled composition. 498051dfd82677c3ad0bb124eb403b75e243650234eThierry Strudel if (display_comp_ctx->scaled_composition || !layer_stack->flags.cursor_present) { 4992ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return supported; 5002ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 5012ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5022ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel for (int32_t i = INT32(layer_stack->layers.size() - 1); i >= 0; i--) { 5032ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Layer *layer = layer_stack->layers.at(UINT32(i)); 5042ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (layer->composition == kCompositionGPUTarget) { 5052ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel gpu_index = i; 5062ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel break; 5072ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 5082ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 5092ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if (gpu_index <= 0) { 5102ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return supported; 5112ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 5122ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel Layer *cursor_layer = layer_stack->layers.at(UINT32(gpu_index) - 1); 5136cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel if (cursor_layer->flags.cursor && !cursor_layer->flags.skip && 5146cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel resource_intf_->ValidateCursorConfig(display_resource_ctx, 5156cfbcfa35e4da3a5975d9904a8caae9968acc768Thierry Strudel cursor_layer, true) == kErrorNone) { 5162ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel supported = true; 5172ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 5182ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5192ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return supported; 5202ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 5212ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5222ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::SetMaxBandwidthMode(HWBwModes mode) { 5232ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel if ((hw_res_info_.has_dyn_bw_support == false) || (mode >= kBwModeMax)) { 5242ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return kErrorNotSupported; 5252ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel } 5262ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5272ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return resource_intf_->SetMaxBandwidthMode(mode); 5282ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 5292ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5302ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::GetScaleLutConfig(HWScaleLutInfo *lut_info) { 5312ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return resource_intf_->GetScaleLutConfig(lut_info); 5322ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 5332ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5342ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry StrudelDisplayError CompManager::SetDetailEnhancerData(Handle display_ctx, 5352ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel const DisplayDetailEnhancerData &de_data) { 5362ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel SCOPE_LOCK(locker_); 5372ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5382ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel DisplayCompositionContext *display_comp_ctx = 5392ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 5402ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 5412ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel return resource_intf_->SetDetailEnhancerData(display_comp_ctx->display_resource_ctx, de_data); 5422ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel} 5432ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 544eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry StrudelDisplayError CompManager::SetCompositionState(Handle display_ctx, 545eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel LayerComposition composition_type, bool enable) { 546eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel SCOPE_LOCK(locker_); 547eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel 548eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel DisplayCompositionContext *display_comp_ctx = 549eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel reinterpret_cast<DisplayCompositionContext *>(display_ctx); 550eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel 551eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel return display_comp_ctx->strategy->SetCompositionState(composition_type, enable); 552eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel} 5532ebc25b87caae537b8cd97beb8a86a7ff5f0cdf4Thierry Strudel 554b06147dd70f03970c8f3b30837a82394b814cb43Thierry StrudelDisplayError CompManager::ControlDpps(bool enable) { 555b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel if (dpps_ctrl_intf_) { 556b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel return enable ? dpps_ctrl_intf_->On() : dpps_ctrl_intf_->Off(); 557b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel } 558b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel 559b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel return kErrorNone; 560b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel} 561b06147dd70f03970c8f3b30837a82394b814cb43Thierry Strudel 5626e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudelbool CompManager::SetDisplayState(Handle display_ctx, 5636e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel DisplayState state, DisplayType display_type) { 5646e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel display_state_[display_type] = state; 5656e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel 5666e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel switch (state) { 5676e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel case kStateOff: 5686e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel Purge(display_ctx); 5696e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel configured_displays_.reset(display_type); 5706e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel DLOGV_IF(kTagCompManager, "configured_displays_ = 0x%x", configured_displays_); 5716e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel break; 5726e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel 5736e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel case kStateOn: 5746e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel if (registered_displays_.count() > 1) { 5756e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel safe_mode_ = true; 5766e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel DLOGV_IF(kTagCompManager, "safe_mode = %d", safe_mode_); 5776e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel } 5786e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel break; 5796e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel 5806e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel default: 5816e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel break; 5826e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel } 5836e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel 5846e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel return true; 5856e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel} 5866e71b7f95e9fdc03147c5f235060dd4ed4f23b86Thierry Strudel 587eb58d55cd4aa3010d6e9e5d8f19d36869b369805Thierry Strudel} // namespace sdm 588