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