18089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch/*
26457d5b6b5201fc37f9c9b01b1f4102f338a2fdfNaseer Ahmed * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved.
38089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Not a Contribution.
48089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
58089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Copyright 2015 The Android Open Source Project
68089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
78089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Licensed under the Apache License, Version 2.0 (the "License");
88089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * you may not use this file except in compliance with the License.
98089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * You may obtain a copy of the License at
108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *      http://www.apache.org/licenses/LICENSE-2.0
128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch *
138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * Unless required by applicable law or agreed to in writing, software
148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * distributed under the License is distributed on an "AS IS" BASIS,
158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * See the License for the specific language governing permissions and
178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch * limitations under the License.
188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch */
198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <core/dump_interface.h>
218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <core/buffer_allocator.h>
228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <private/color_params.h>
238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <utils/constants.h>
248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <utils/String16.h>
258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <cutils/properties.h>
268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <hardware_legacy/uevent.h>
278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <sys/resource.h>
288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <sys/prctl.h>
298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <binder/Parcel.h>
308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <QService.h>
318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <display_config.h>
328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <utils/debug.h>
338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <sync/sync.h>
348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include <profiler.h>
3552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch#include <string>
36efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed#include <bitset>
378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_buffer_allocator.h"
398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_buffer_sync_handler.h"
408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_session.h"
418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_debugger.h"
428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_display_primary.h"
438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#include "hwc_display_virtual.h"
448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#define __CLASS__ "HWCSession"
468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#define HWC_UEVENT_SWITCH_HDMI "change@/devices/virtual/switch/hdmi"
488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch#define HWC_UEVENT_GRAPHICS_FB0 "change@/devices/virtual/graphics/fb0"
498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic sdm::HWCSession::HWCModuleMethods g_hwc_module_methods;
518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschhwc_module_t HAL_MODULE_INFO_SYM = {
538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  .common = {
548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .tag = HARDWARE_MODULE_TAG,
558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .version_major = 3,
568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .version_minor = 0,
578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .id = HWC_HARDWARE_MODULE_ID,
588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .name = "QTI Hardware Composer Module",
598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .author = "CodeAurora Forum",
608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .methods = &g_hwc_module_methods,
618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .dso = 0,
628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    .reserved = {0},
638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch};
658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschnamespace sdm {
678089858bfb034e36d45172ff6a5437d7dce86cb7Steve PfetschLocker HWCSession::locker_;
688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
698089858bfb034e36d45172ff6a5437d7dce86cb7Steve PfetschHWCSession::HWCSession(const hw_module_t *module) {
708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t::common.tag = HARDWARE_DEVICE_TAG;
718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t::common.version = HWC_DEVICE_API_VERSION_2_0;
728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t::common.module = const_cast<hw_module_t *>(module);
738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t::common.close = Close;
748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t::getCapabilities = GetCapabilities;
758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t::getFunction = GetFunction;
768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::Init() {
798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int status = -EINVAL;
808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  const char *qservice_name = "display.qservice";
818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Start QService and connect to it.
838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  qService::QService::init();
848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  android::sp<qService::IQService> iqservice = android::interface_cast<qService::IQService>(
858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      android::defaultServiceManager()->getService(android::String16(qservice_name)));
868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (iqservice.get()) {
888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    iqservice->connect(android::sp<qClient::IQClient>(this));
898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    qservice_ = reinterpret_cast<qService::QService *>(iqservice.get());
908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Failed to acquire %s", qservice_name);
928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -EINVAL;
938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
95b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  buffer_allocator_ = new HWCBufferAllocator();
96b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed
97b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  DisplayError error = CoreInterface::CreateCore(HWCDebugHandler::Get(), buffer_allocator_,
9888cc3f22647f6ab81085a550a2127cb1c6a24ed2Naseer Ahmed                                                 &buffer_sync_handler_, &core_intf_);
998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (error != kErrorNone) {
1008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Display core initialization failed. Error = %d", error);
1018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -EINVAL;
1028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Read which display is first, and create it and store it in primary slot
1058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // TODO(user): This will need to be redone for HWC2 - right now we validate only
1068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // the primary physical path
1078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWDisplayInterfaceInfo hw_disp_info;
1088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  error = core_intf_->GetFirstDisplayInterfaceType(&hw_disp_info);
1098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (error == kErrorNone && hw_disp_info.type == kHDMI && hw_disp_info.is_connected) {
1108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // HDMI is primary display. If already connected, then create it and store in
1118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // primary display slot. If not connected, create a NULL display for now.
112b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed    status = HWCDisplayExternal::Create(core_intf_, buffer_allocator_, &callbacks_, qservice_,
1138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                        &hwc_display_[HWC_DISPLAY_PRIMARY]);
1148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
1158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // Create and power on primary display
116b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed    status = HWCDisplayPrimary::Create(core_intf_, buffer_allocator_, &callbacks_, qservice_,
1178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       &hwc_display_[HWC_DISPLAY_PRIMARY]);
1188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (status) {
1218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    CoreInterface::DestroyCore();
1228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return status;
1238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
125b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  color_mgr_ = HWCColorManager::CreateColorManager(buffer_allocator_);
1268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!color_mgr_) {
1278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGW("Failed to load HWCColorManager.");
1288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (pthread_create(&uevent_thread_, NULL, &HWCUeventThread, this) < 0) {
1318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Failed to start = %s, error = %s", uevent_thread_name_, strerror(errno));
1328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCDisplayPrimary::Destroy(hwc_display_[HWC_DISPLAY_PRIMARY]);
1338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    hwc_display_[HWC_DISPLAY_PRIMARY] = 0;
1348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    CoreInterface::DestroyCore();
1358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -errno;
1368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
1398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
1408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::Deinit() {
1428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCDisplayPrimary::Destroy(hwc_display_[HWC_DISPLAY_PRIMARY]);
1438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc_display_[HWC_DISPLAY_PRIMARY] = 0;
1448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (color_mgr_) {
1458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    color_mgr_->DestroyColorManager();
1468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uevent_thread_exit_ = true;
14856e7134a25c8bf08aa8b07f25f352ebb1acd5d17Naseer Ahmed  DLOGD("Terminating uevent thread");
14956e7134a25c8bf08aa8b07f25f352ebb1acd5d17Naseer Ahmed  Sys::pthread_cancel_(uevent_thread_);
1508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayError error = CoreInterface::DestroyCore();
1528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (error != kErrorNone) {
1538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Display core de-initialization failed. Error = %d", error);
1548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
156b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  if (buffer_allocator_ != nullptr) {
157b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed    delete buffer_allocator_;
158b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  }
159b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  buffer_allocator_ = nullptr;
160b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed
1618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
1628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
1638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::Open(const hw_module_t *module, const char *name, hw_device_t **device) {
1658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
1668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!module || !name || !device) {
1688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Invalid parameters.");
1698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -EINVAL;
1708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!strcmp(name, HWC_HARDWARE_COMPOSER)) {
1738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCSession *hwc_session = new HWCSession(module);
1748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (!hwc_session) {
1758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return -ENOMEM;
1768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
1778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    int status = hwc_session->Init();
1798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (status != 0) {
1808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return status;
1818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
1828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    hwc2_device_t *composer_device = hwc_session;
1848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    *device = reinterpret_cast<hw_device_t *>(composer_device);
1858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
1888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
1898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::Close(hw_device_t *device) {
1918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
1928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
1948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -EINVAL;
1958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
1968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc2_device_t *composer_device = reinterpret_cast<hwc2_device_t *>(device);
1988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCSession *hwc_session = static_cast<HWCSession *>(composer_device);
1998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc_session->Deinit();
2018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
2038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschvoid HWCSession::GetCapabilities(struct hwc2_device *device, uint32_t *outCount,
2068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                 int32_t *outCapabilities) {
207503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed  if (outCapabilities != nullptr && *outCount >= 2) {
208221812af2e20ae3b8c78adadccfdbbc3b4c4f351Naseer Ahmed    outCapabilities[0] = HWC2_CAPABILITY_SKIP_CLIENT_COLOR_TRANSFORM;
209503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed    outCapabilities[1] = HWC2_CAPABILITY_SKIP_VALIDATE;
2108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
211503cff39e91695866f06b40f07e5f664f57ee4f4Naseer Ahmed  *outCount = 2;
2128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschtemplate <typename PFN, typename T>
2158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic hwc2_function_pointer_t AsFP(T function) {
2168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  static_assert(std::is_same<PFN, T>::value, "Incompatible function pointer");
2178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return reinterpret_cast<hwc2_function_pointer_t>(function);
2188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch// HWC2 functions returned in GetFunction
2218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch// Defined in the same order as in the HWC2 header
2228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
22342e04375ae388ac311a41d1a6c7500253617e2bbNaseer Ahmedint32_t HWCSession::AcceptDisplayChanges(hwc2_device_t *device,
22442e04375ae388ac311a41d1a6c7500253617e2bbNaseer Ahmed                                         hwc2_display_t display) {
22542e04375ae388ac311a41d1a6c7500253617e2bbNaseer Ahmed  SCOPE_LOCK(locker_);
2268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::AcceptDisplayChanges);
2278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
22952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint32_t HWCSession::CreateLayer(hwc2_device_t *device, hwc2_display_t display,
23052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                hwc2_layer_t *out_layer_id) {
23152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SCOPE_LOCK(locker_);
23252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return CallDisplayFunction(device, display, &HWCDisplay::CreateLayer, out_layer_id);
2338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::CreateVirtualDisplay(hwc2_device_t *device, uint32_t width, uint32_t height,
23629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                         int32_t *format, hwc2_display_t *out_display_id) {
23729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  // TODO(user): Handle concurrency with HDMI
23829e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  SCOPE_LOCK(locker_);
2398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
2408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
2418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
2428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCSession *hwc_session = static_cast<HWCSession *>(device);
24429e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  auto status = hwc_session->CreateVirtualDisplayObject(width, height, format);
24538c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed  if (status == HWC2::Error::None) {
2468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    *out_display_id = HWC_DISPLAY_VIRTUAL;
24738c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed    DLOGI("Created virtual display id:% " PRIu64 " with res: %dx%d",
24838c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed          *out_display_id, width, height);
24938c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed  } else {
25038c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed    DLOGE("Failed to create virtual display: %s", to_string(status).c_str());
25138c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed  }
2528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return INT32(status);
2538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
25552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint32_t HWCSession::DestroyLayer(hwc2_device_t *device, hwc2_display_t display,
25652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                 hwc2_layer_t layer) {
25752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SCOPE_LOCK(locker_);
25852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return CallDisplayFunction(device, display, &HWCDisplay::DestroyLayer, layer);
2598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::DestroyVirtualDisplay(hwc2_device_t *device, hwc2_display_t display) {
26229e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  SCOPE_LOCK(locker_);
2638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
2648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
2658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
2668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
26729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  DLOGI("Destroying virtual display id:%" PRIu64, display);
2688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto *hwc_session = static_cast<HWCSession *>(device);
2698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_session->hwc_display_[display]) {
2718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCDisplayVirtual::Destroy(hwc_session->hwc_display_[display]);
27238c12eb937bb0770c162fcfabcbf881178cdc0a7Naseer Ahmed    hwc_session->hwc_display_[display] = nullptr;
2738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_NONE;
2748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
2758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
2768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
2778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
2788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
27952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschvoid HWCSession::Dump(hwc2_device_t *device, uint32_t *out_size, char *out_buffer) {
28052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
28152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
2828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
2838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return;
2848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
28552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  auto *hwc_session = static_cast<HWCSession *>(device);
286fefc08ba505367a02615f20fe54173e6b13aeca3Naseer Ahmed  const size_t max_dump_size = 8192;
2878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
2888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (out_buffer == nullptr) {
289fefc08ba505367a02615f20fe54173e6b13aeca3Naseer Ahmed    *out_size = max_dump_size;
2908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
29152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    char sdm_dump[4096];
29252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    DumpInterface::GetDump(sdm_dump, 4096);  // TODO(user): Fix this workaround
293efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed    std::string s("");
294efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed    for (int id = HWC_DISPLAY_PRIMARY; id <= HWC_DISPLAY_VIRTUAL; id++) {
295efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed      if (hwc_session->hwc_display_[id]) {
296efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed        s += hwc_session->hwc_display_[id]->Dump();
297efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed      }
298efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed    }
29952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    s += sdm_dump;
300fefc08ba505367a02615f20fe54173e6b13aeca3Naseer Ahmed    auto copied = s.copy(out_buffer, std::min(s.size(), max_dump_size), 0);
301fefc08ba505367a02615f20fe54173e6b13aeca3Naseer Ahmed    *out_size = UINT32(copied);
3028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
3038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetActiveConfig(hwc2_device_t *device, hwc2_display_t display,
3068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                               hwc2_config_t *out_config) {
3078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetActiveConfig, out_config);
3088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetChangedCompositionTypes(hwc2_device_t *device, hwc2_display_t display,
3118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                          uint32_t *out_num_elements, hwc2_layer_t *out_layers,
3128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                          int32_t *out_types) {
3138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetChangedCompositionTypes,
3148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         out_num_elements, out_layers, out_types);
3158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetClientTargetSupport(hwc2_device_t *device, hwc2_display_t display, uint32_t width,
3188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                      uint32_t height, int32_t format, int32_t dataspace) {
3198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetClientTargetSupport,
3208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         width, height, format, dataspace);
3218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
32352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschstatic int32_t GetColorModes(hwc2_device_t *device, hwc2_display_t display, uint32_t *out_num_modes,
324efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed                             int32_t /*android_color_mode_t*/ *int_out_modes) {
325efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  auto out_modes = reinterpret_cast<android_color_mode_t *>(int_out_modes);
32652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetColorModes, out_num_modes,
32752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                         out_modes);
32852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch}
3298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetDisplayAttribute(hwc2_device_t *device, hwc2_display_t display,
3318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                   hwc2_config_t config, int32_t int_attribute,
3328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                   int32_t *out_value) {
3338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto attribute = static_cast<HWC2::Attribute>(int_attribute);
3348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetDisplayAttribute, config,
3358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         attribute, out_value);
3368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetDisplayConfigs(hwc2_device_t *device, hwc2_display_t display,
3398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                 uint32_t *out_num_configs, hwc2_config_t *out_configs) {
3408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetDisplayConfigs,
3418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         out_num_configs, out_configs);
3428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetDisplayName(hwc2_device_t *device, hwc2_display_t display, uint32_t *out_size,
3458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                              char *out_name) {
3468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetDisplayName, out_size,
3478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         out_name);
3488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetDisplayRequests(hwc2_device_t *device, hwc2_display_t display,
3518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                  int32_t *out_display_requests, uint32_t *out_num_elements,
3528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                  hwc2_layer_t *out_layers, int32_t *out_layer_requests) {
3538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetDisplayRequests,
3548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         out_display_requests, out_num_elements, out_layers,
3558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         out_layer_requests);
3568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetDisplayType(hwc2_device_t *device, hwc2_display_t display, int32_t *out_type) {
3598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetDisplayType, out_type);
3608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetDozeSupport(hwc2_device_t *device, hwc2_display_t display, int32_t *out_support) {
3638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // TODO(user): Check if it is an HDMI as primary display and disable support for it
3648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (display == HWC_DISPLAY_PRIMARY) {
3658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    *out_support = 1;
3668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
3678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    *out_support = 0;
3688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
3698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWC2_ERROR_NONE;
3708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
37275223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetschstatic int32_t GetHdrCapabilities(hwc2_device_t* device, hwc2_display_t display,
37375223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch                                  uint32_t* out_num_types, int32_t* out_types,
37475223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch                                  float* out_max_luminance, float* out_max_average_luminance,
37575223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch                                  float* out_min_luminance) {
37675223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch  *out_num_types = 0;
37775223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch  return HWC2_ERROR_NONE;
37875223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch}
37975223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch
3808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic uint32_t GetMaxVirtualDisplayCount(hwc2_device_t *device) {
3818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 1;
3828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t GetReleaseFences(hwc2_device_t *device, hwc2_display_t display,
3858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                uint32_t *out_num_elements, hwc2_layer_t *out_layers,
3868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                int32_t *out_fences) {
3878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::GetReleaseFences,
3888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         out_num_elements, out_layers, out_fences);
3898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
3908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
3918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::PresentDisplay(hwc2_device_t *device, hwc2_display_t display,
3928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                   int32_t *out_retire_fence) {
3938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCSession *hwc_session = static_cast<HWCSession *>(device);
3948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DTRACE_SCOPED();
3958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  SEQUENCE_EXIT_SCOPE_LOCK(locker_);
3968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
3978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
3988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
39976b754cff2be01f754ec43e021b86d92f4922d06Naseer Ahmed
4008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto status = HWC2::Error::BadDisplay;
4018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // TODO(user): Handle virtual display/HDMI concurrency
4028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_session->hwc_display_[display]) {
4038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    status = hwc_session->hwc_display_[display]->Present(out_retire_fence);
4048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // This is only indicative of how many times SurfaceFlinger posts
4058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // frames to the display.
4068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    CALC_FPS();
4078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
4088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return INT32(status);
4108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::RegisterCallback(hwc2_device_t *device, int32_t descriptor,
4138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                     hwc2_callback_data_t callback_data,
4148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                     hwc2_function_pointer_t pointer) {
4158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCSession *hwc_session = static_cast<HWCSession *>(device);
4168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
4178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
4188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
4198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto desc = static_cast<HWC2::Callback>(descriptor);
4208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto error = hwc_session->callbacks_.Register(desc, callback_data, pointer);
4218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGD("Registering callback: %s", to_string(desc).c_str());
42275223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch  if (descriptor == HWC2_CALLBACK_HOTPLUG)
42375223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch    hwc_session->callbacks_.Hotplug(HWC_DISPLAY_PRIMARY, HWC2::Connection::Connected);
4248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return INT32(error);
4258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetActiveConfig(hwc2_device_t *device, hwc2_display_t display,
4288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                               hwc2_config_t config) {
4298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetActiveConfig, config);
4308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetClientTarget(hwc2_device_t *device, hwc2_display_t display,
43329e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                               buffer_handle_t target, int32_t acquire_fence,
43429e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                               int32_t dataspace, hwc_region_t damage) {
4358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetClientTarget, target,
43629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                         acquire_fence, dataspace, damage);
4378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
43952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint32_t HWCSession::SetColorMode(hwc2_device_t *device, hwc2_display_t display,
440efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed                                 int32_t /*android_color_mode_t*/ int_mode) {
441efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  auto mode = static_cast<android_color_mode_t>(int_mode);
44252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
44352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetColorMode, mode);
44452af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch}
44552af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch
44652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint32_t HWCSession::SetColorTransform(hwc2_device_t *device, hwc2_display_t display,
44752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                      const float *matrix,
44852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                      int32_t /*android_color_transform_t*/ hint) {
44952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
45052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  android_color_transform_t transform_hint = static_cast<android_color_transform_t>(hint);
45152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetColorTransform, matrix,
45252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                         transform_hint);
45352af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch}
4548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetCursorPosition(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
4568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                 int32_t x, int32_t y) {
4578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetCursorPosition, layer, x,
4588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                         y);
4598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerBlendMode(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
4628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                 int32_t int_mode) {
4638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto mode = static_cast<HWC2::BlendMode>(int_mode);
4648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerBlendMode, mode);
4658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerBuffer(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
4688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                              buffer_handle_t buffer, int32_t acquire_fence) {
4698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerBuffer, buffer,
4708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       acquire_fence);
4718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerColor(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
4748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                             hwc_color_t color) {
4758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerColor, color);
4768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerCompositionType(hwc2_device_t *device, hwc2_display_t display,
4798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       hwc2_layer_t layer, int32_t int_type) {
4808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto type = static_cast<HWC2::Composition>(int_type);
4818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerCompositionType,
4828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       type);
4838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerDataspace(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
4868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                 int32_t dataspace) {
4878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerDataspace,
4888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       dataspace);
4898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerDisplayFrame(hwc2_device_t *device, hwc2_display_t display,
4928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                    hwc2_layer_t layer, hwc_rect_t frame) {
4938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerDisplayFrame,
4948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       frame);
4958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
4968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
4978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerPlaneAlpha(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
4988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                  float alpha) {
4998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerPlaneAlpha,
5008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       alpha);
5018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerSourceCrop(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
5048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                  hwc_frect_t crop) {
5058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerSourceCrop, crop);
5068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerSurfaceDamage(hwc2_device_t *device, hwc2_display_t display,
5098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                     hwc2_layer_t layer, hwc_region_t damage) {
5108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerSurfaceDamage,
5118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       damage);
5128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerTransform(hwc2_device_t *device, hwc2_display_t display, hwc2_layer_t layer,
5158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                 int32_t int_transform) {
5168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto transform = static_cast<HWC2::Transform>(int_transform);
5178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerTransform,
5188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       transform);
5198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetLayerVisibleRegion(hwc2_device_t *device, hwc2_display_t display,
5228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                     hwc2_layer_t layer, hwc_region_t visible) {
5238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallLayerFunction(device, display, layer, &HWCLayer::SetLayerVisibleRegion,
5248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                       visible);
5258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
52752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint32_t HWCSession::SetLayerZOrder(hwc2_device_t *device, hwc2_display_t display,
52852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch                                   hwc2_layer_t layer, uint32_t z) {
52952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SCOPE_LOCK(locker_);
53052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return CallDisplayFunction(device, display, &HWCDisplay::SetLayerZOrder, layer, z);
5318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::SetOutputBuffer(hwc2_device_t *device, hwc2_display_t display,
5348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                    buffer_handle_t buffer, int32_t releaseFence) {
5358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
5368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
5378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
5388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto *hwc_session = static_cast<HWCSession *>(device);
5408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (display == HWC_DISPLAY_VIRTUAL && hwc_session->hwc_display_[display]) {
5418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    auto vds = reinterpret_cast<HWCDisplayVirtual *>(hwc_session->hwc_display_[display]);
5428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    auto status = vds->SetOutputBuffer(buffer, releaseFence);
5438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return INT32(status);
5448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
5458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
5468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
5478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
54952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetschint32_t HWCSession::SetPowerMode(hwc2_device_t *device, hwc2_display_t display, int32_t int_mode) {
5508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto mode = static_cast<HWC2::PowerMode>(int_mode);
55152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
55252af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  return CallDisplayFunction(device, display, &HWCDisplay::SetPowerMode, mode);
5538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschstatic int32_t SetVsyncEnabled(hwc2_device_t *device, hwc2_display_t display, int32_t int_enabled) {
5568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto enabled = static_cast<HWC2::Vsync>(int_enabled);
5578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWCSession::CallDisplayFunction(device, display, &HWCDisplay::SetVsyncEnabled, enabled);
5588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::ValidateDisplay(hwc2_device_t *device, hwc2_display_t display,
5618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                    uint32_t *out_num_types, uint32_t *out_num_requests) {
5628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DTRACE_SCOPED();
5638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCSession *hwc_session = static_cast<HWCSession *>(device);
5648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!device) {
5658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2_ERROR_BAD_DISPLAY;
5668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
5678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // TODO(user): Handle secure session, handle QDCM solid fill
5698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Handle external_pending_connect_ in CreateVirtualDisplay
5708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto status = HWC2::Error::BadDisplay;
5718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_session->hwc_display_[display]) {
5728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    SEQUENCE_ENTRY_SCOPE_LOCK(locker_);
5738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (display == HWC_DISPLAY_PRIMARY) {
5748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // TODO(user): This can be moved to HWCDisplayPrimary
5758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (hwc_session->reset_panel_) {
5768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        DLOGW("panel is in bad state, resetting the panel");
5778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        hwc_session->ResetPanel();
5788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
5798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (hwc_session->need_invalidate_) {
5818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        hwc_session->callbacks_.Refresh(display);
5828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
5838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
5848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    status = hwc_session->hwc_display_[display]->Validate(out_num_types, out_num_requests);
5868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
58752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  // If validate fails, cancel the sequence lock so that other operations
58852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  // (such as Dump or SetPowerMode) may succeed without blocking on the condition
58929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  if (status == HWC2::Error::BadDisplay) {
59052af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    SEQUENCE_CANCEL_SCOPE_LOCK(locker_);
59152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch  }
5928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return INT32(status);
5938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
5948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschhwc2_function_pointer_t HWCSession::GetFunction(struct hwc2_device *device,
5968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                int32_t int_descriptor) {
5978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto descriptor = static_cast<HWC2::FunctionDescriptor>(int_descriptor);
5988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
5998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  switch (descriptor) {
6008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::AcceptDisplayChanges:
60142e04375ae388ac311a41d1a6c7500253617e2bbNaseer Ahmed      return AsFP<HWC2_PFN_ACCEPT_DISPLAY_CHANGES>(HWCSession::AcceptDisplayChanges);
6028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::CreateLayer:
6038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_CREATE_LAYER>(CreateLayer);
6048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::CreateVirtualDisplay:
6058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_CREATE_VIRTUAL_DISPLAY>(HWCSession::CreateVirtualDisplay);
6068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::DestroyLayer:
6078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_DESTROY_LAYER>(DestroyLayer);
6088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::DestroyVirtualDisplay:
6098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_DESTROY_VIRTUAL_DISPLAY>(HWCSession::DestroyVirtualDisplay);
6108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::Dump:
61152af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch      return AsFP<HWC2_PFN_DUMP>(HWCSession::Dump);
6128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetActiveConfig:
6138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_ACTIVE_CONFIG>(GetActiveConfig);
6148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetChangedCompositionTypes:
6158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_CHANGED_COMPOSITION_TYPES>(GetChangedCompositionTypes);
6168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetClientTargetSupport:
6178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_CLIENT_TARGET_SUPPORT>(GetClientTargetSupport);
61852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    case HWC2::FunctionDescriptor::GetColorModes:
61952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch      return AsFP<HWC2_PFN_GET_COLOR_MODES>(GetColorModes);
6208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetDisplayAttribute:
6218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_DISPLAY_ATTRIBUTE>(GetDisplayAttribute);
6228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetDisplayConfigs:
6238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_DISPLAY_CONFIGS>(GetDisplayConfigs);
6248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetDisplayName:
6258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_DISPLAY_NAME>(GetDisplayName);
6268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetDisplayRequests:
6278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_DISPLAY_REQUESTS>(GetDisplayRequests);
6288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetDisplayType:
6298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_DISPLAY_TYPE>(GetDisplayType);
63075223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch    case HWC2::FunctionDescriptor::GetHdrCapabilities:
63175223b73dc1f71ad1cd1e029902b311f6aadfc1bSteve Pfetsch      return AsFP<HWC2_PFN_GET_HDR_CAPABILITIES>(GetHdrCapabilities);
6328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetDozeSupport:
6338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_DOZE_SUPPORT>(GetDozeSupport);
6348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetMaxVirtualDisplayCount:
6358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_MAX_VIRTUAL_DISPLAY_COUNT>(GetMaxVirtualDisplayCount);
6368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::GetReleaseFences:
6378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_GET_RELEASE_FENCES>(GetReleaseFences);
6388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::PresentDisplay:
6398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_PRESENT_DISPLAY>(PresentDisplay);
6408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::RegisterCallback:
6418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_REGISTER_CALLBACK>(RegisterCallback);
6428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetActiveConfig:
6438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_ACTIVE_CONFIG>(SetActiveConfig);
6448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetClientTarget:
6458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_CLIENT_TARGET>(SetClientTarget);
64652af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    case HWC2::FunctionDescriptor::SetColorMode:
64752af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch      return AsFP<HWC2_PFN_SET_COLOR_MODE>(SetColorMode);
64852af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch    case HWC2::FunctionDescriptor::SetColorTransform:
64952af24f45972a8124cb33e97c740fa0bfc705df6Steve Pfetsch      return AsFP<HWC2_PFN_SET_COLOR_TRANSFORM>(SetColorTransform);
6508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetCursorPosition:
6518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_CURSOR_POSITION>(SetCursorPosition);
6528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerBlendMode:
6538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_BLEND_MODE>(SetLayerBlendMode);
6548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerBuffer:
6558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_BUFFER>(SetLayerBuffer);
6568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerColor:
6578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_COLOR>(SetLayerColor);
6588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerCompositionType:
6598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_COMPOSITION_TYPE>(SetLayerCompositionType);
6608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerDataspace:
6618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_DATASPACE>(SetLayerDataspace);
6628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerDisplayFrame:
6638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_DISPLAY_FRAME>(SetLayerDisplayFrame);
6648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerPlaneAlpha:
6658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_PLANE_ALPHA>(SetLayerPlaneAlpha);
6668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // Sideband stream is not supported
6678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // case HWC2::FunctionDescriptor::SetLayerSidebandStream:
6688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerSourceCrop:
6698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_SOURCE_CROP>(SetLayerSourceCrop);
6708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerSurfaceDamage:
6718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_SURFACE_DAMAGE>(SetLayerSurfaceDamage);
6728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerTransform:
6738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_TRANSFORM>(SetLayerTransform);
6748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerVisibleRegion:
6758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_VISIBLE_REGION>(SetLayerVisibleRegion);
6768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetLayerZOrder:
6778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_LAYER_Z_ORDER>(SetLayerZOrder);
6788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetOutputBuffer:
6798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_OUTPUT_BUFFER>(SetOutputBuffer);
6808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetPowerMode:
6818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_POWER_MODE>(SetPowerMode);
6828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::SetVsyncEnabled:
6838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_SET_VSYNC_ENABLED>(SetVsyncEnabled);
6848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case HWC2::FunctionDescriptor::ValidateDisplay:
6858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return AsFP<HWC2_PFN_VALIDATE_DISPLAY>(HWCSession::ValidateDisplay);
6868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    default:
6878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGD("Unknown/Unimplemented function descriptor: %d (%s)", int_descriptor,
6888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch            to_string(descriptor).c_str());
6898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return nullptr;
6908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
6918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return nullptr;
6928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
6938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
6948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch// TODO(user): handle locking
6958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
69629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer AhmedHWC2::Error HWCSession::CreateVirtualDisplayObject(uint32_t width, uint32_t height,
69729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                                   int32_t *format) {
6988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[HWC_DISPLAY_VIRTUAL]) {
6998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2::Error::NoResources;
7008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
701b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed  auto status = HWCDisplayVirtual::Create(core_intf_, buffer_allocator_, &callbacks_, width,
702b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed                                          height, format, &hwc_display_[HWC_DISPLAY_VIRTUAL]);
7038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // TODO(user): validate width and height support
7048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (status)
7058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return HWC2::Error::Unsupported;
7068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return HWC2::Error::None;
7088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
7098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint32_t HWCSession::ConnectDisplay(int disp) {
7118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("Display = %d", disp);
7128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int status = 0;
7148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t primary_width = 0;
7158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t primary_height = 0;
7168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc_display_[HWC_DISPLAY_PRIMARY]->GetFrameBufferResolution(&primary_width, &primary_height);
7188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (disp == HWC_DISPLAY_EXTERNAL) {
720b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed    status = HWCDisplayExternal::Create(core_intf_, buffer_allocator_, &callbacks_, primary_width,
721b5950b40451f0307146f1a3f3f22d910460d7545Naseer Ahmed                                        primary_height, qservice_, false, &hwc_display_[disp]);
7228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
7238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Invalid display type");
7248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -1;
7258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
7268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!status) {
7288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    hwc_display_[disp]->SetSecureDisplay(secure_display_active_);
7298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
7308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return status;
7328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
7338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::DisconnectDisplay(int disp) {
7358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("Display = %d", disp);
7368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (disp == HWC_DISPLAY_EXTERNAL) {
7388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCDisplayExternal::Destroy(hwc_display_[disp]);
7398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else if (disp == HWC_DISPLAY_VIRTUAL) {
7408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCDisplayVirtual::Destroy(hwc_display_[disp]);
7418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
7428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Invalid display type");
7438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -1;
7448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
7458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc_display_[disp] = NULL;
7478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
7498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
7508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch// Qclient methods
7528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::notifyCallback(uint32_t command, const android::Parcel *input_parcel,
7538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                             android::Parcel *output_parcel) {
7548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  SEQUENCE_WAIT_SCOPE_LOCK(locker_);
7558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  android::status_t status = 0;
7578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  switch (command) {
7598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DYNAMIC_DEBUG:
7608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DynamicDebug(input_parcel);
7618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SCREEN_REFRESH:
7648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
7658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_IDLE_TIMEOUT:
7688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
7698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        uint32_t timeout = UINT32(input_parcel->readInt32());
7708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        hwc_display_[HWC_DISPLAY_PRIMARY]->SetIdleTimeoutMs(timeout);
7718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
7728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_FRAME_DUMP_CONFIG:
7758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      SetFrameDumpConfig(input_parcel);
7768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_MAX_PIPES_PER_MIXER:
7798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = SetMaxMixerStages(input_parcel);
7808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_DISPLAY_MODE:
7838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = SetDisplayMode(input_parcel);
7848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_SECONDARY_DISPLAY_STATUS:
7878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = SetSecondaryDisplayStatus(input_parcel, output_parcel);
7888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::CONFIGURE_DYN_REFRESH_RATE:
7918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = ConfigureRefreshRate(input_parcel);
7928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_VIEW_FRAME:
7958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
7968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
7978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::TOGGLE_SCREEN_UPDATES:
7988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = ToggleScreenUpdates(input_parcel, output_parcel);
7998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::QDCM_SVC_CMDS:
8028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = QdcmCMDHandler(input_parcel, output_parcel);
8038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::MIN_HDCP_ENCRYPTION_LEVEL_CHANGED:
8068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = OnMinHdcpEncryptionLevelChange(input_parcel, output_parcel);
8078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::CONTROL_PARTIAL_UPDATE:
8108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = ControlPartialUpdate(input_parcel, output_parcel);
8118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_ACTIVE_CONFIG:
8148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = HandleSetActiveDisplayConfig(input_parcel, output_parcel);
8158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::GET_ACTIVE_CONFIG:
8188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = HandleGetActiveDisplayConfig(input_parcel, output_parcel);
8198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::GET_CONFIG_COUNT:
8228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = HandleGetDisplayConfigCount(input_parcel, output_parcel);
8238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::GET_DISPLAY_ATTRIBUTES_FOR_CONFIG:
8268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = HandleGetDisplayAttributesForConfig(input_parcel, output_parcel);
8278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::GET_PANEL_BRIGHTNESS:
8308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = GetPanelBrightness(input_parcel, output_parcel);
8318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_PANEL_BRIGHTNESS:
8348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = SetPanelBrightness(input_parcel, output_parcel);
8358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::GET_DISPLAY_VISIBLE_REGION:
8388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = GetVisibleDisplayRect(input_parcel, output_parcel);
8398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::SET_CAMERA_STATUS:
8428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = SetDynamicBWForCamera(input_parcel, output_parcel);
8438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::GET_BW_TRANSACTION_STATUS:
8468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      status = GetBWTransactionStatus(input_parcel, output_parcel);
8478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
8488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
849efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed    case qService::IQService::SET_LAYER_MIXER_RESOLUTION:
850efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed      status = SetMixerResolution(input_parcel);
851efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed      break;
852efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed
853efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed    case qService::IQService::SET_COLOR_MODE:
854efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed      status = SetColorModeOverride(input_parcel);
855efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed      break;
85629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
8578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    default:
8588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGW("QService command = %d is not supported", command);
8598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return -EINVAL;
8608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
8618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return status;
8638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
8648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::ToggleScreenUpdates(const android::Parcel *input_parcel,
8668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                  android::Parcel *output_parcel) {
8678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int input = input_parcel->readInt32();
8688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
8698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[HWC_DISPLAY_PRIMARY] && (input <= 1) && (input >= 0)) {
8718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    error = hwc_display_[HWC_DISPLAY_PRIMARY]->ToggleScreenUpdates(input == 1);
8728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error != 0) {
8738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGE("Failed to toggle screen updates = %d. Error = %d", input, error);
8748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
8758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
8768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(error);
8778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
8798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
8808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::SetPanelBrightness(const android::Parcel *input_parcel,
8828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                 android::Parcel *output_parcel) {
8838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int level = input_parcel->readInt32();
8848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
8858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
8878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    error = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPanelBrightness(level);
8888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error != 0) {
8898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGE("Failed to set the panel brightness = %d. Error = %d", level, error);
8908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
8918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
8928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(error);
8938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
8958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
8968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
8978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::GetPanelBrightness(const android::Parcel *input_parcel,
8988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                 android::Parcel *output_parcel) {
8998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
9008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ret = error;
9018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
9038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    error = hwc_display_[HWC_DISPLAY_PRIMARY]->GetPanelBrightness(&ret);
9048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error != 0) {
9058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = error;
9068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGE("Failed to get the panel brightness. Error = %d", error);
9078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
9088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(ret);
9108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
9128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
9138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::ControlPartialUpdate(const android::Parcel *input_parcel,
9158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                   android::Parcel *out) {
9168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayError error = kErrorNone;
9178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ret = 0;
9188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t disp_id = UINT32(input_parcel->readInt32());
9198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t enable = UINT32(input_parcel->readInt32());
9208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (disp_id != HWC_DISPLAY_PRIMARY) {
9228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGW("CONTROL_PARTIAL_UPDATE is not applicable for display = %d", disp_id);
9238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    ret = -EINVAL;
9248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    out->writeInt32(ret);
9258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return ret;
9268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!hwc_display_[HWC_DISPLAY_PRIMARY]) {
9298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("primary display object is not instantiated");
9308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    ret = -EINVAL;
9318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    out->writeInt32(ret);
9328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return ret;
9338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t pending = 0;
9368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  error = hwc_display_[HWC_DISPLAY_PRIMARY]->ControlPartialUpdate(enable, &pending);
9378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (error == kErrorNone) {
9398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (!pending) {
9408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      out->writeInt32(ret);
9418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return ret;
9428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
9438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else if (error == kErrorNotSupported) {
9448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    out->writeInt32(ret);
9458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return ret;
9468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
9478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    ret = -EINVAL;
9488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    out->writeInt32(ret);
9498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return ret;
9508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Todo(user): Unlock it before sending events to client. It may cause deadlocks in future.
9538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
9548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Wait until partial update control is complete
9568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  ret = locker_.WaitFinite(kPartialUpdateControlTimeoutMs);
9578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  out->writeInt32(ret);
9598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return ret;
9618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
9628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::HandleSetActiveDisplayConfig(const android::Parcel *input_parcel,
9648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                           android::Parcel *output_parcel) {
9658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int config = input_parcel->readInt32();
9668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int dpy = input_parcel->readInt32();
9678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
9688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (dpy > HWC_DISPLAY_VIRTUAL) {
9708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return android::BAD_VALUE;
9718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[dpy]) {
9748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    error = hwc_display_[dpy]->SetActiveDisplayConfig(config);
9758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error == 0) {
9768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      callbacks_.Refresh(0);
9778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
9788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
9818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
9828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::HandleGetActiveDisplayConfig(const android::Parcel *input_parcel,
9848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                           android::Parcel *output_parcel) {
9858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int dpy = input_parcel->readInt32();
9868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
9878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (dpy > HWC_DISPLAY_VIRTUAL) {
9898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return android::BAD_VALUE;
9908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
9928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[dpy]) {
9938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    uint32_t config = 0;
9948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    error = hwc_display_[dpy]->GetActiveDisplayConfig(&config);
9958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error == 0) {
9968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      output_parcel->writeInt32(INT(config));
9978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
9988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
9998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
10018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
10028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::HandleGetDisplayConfigCount(const android::Parcel *input_parcel,
10048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                          android::Parcel *output_parcel) {
10058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int dpy = input_parcel->readInt32();
10068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
10078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (dpy > HWC_DISPLAY_VIRTUAL) {
10098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return android::BAD_VALUE;
10108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
10118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t count = 0;
10138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[dpy]) {
10148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    error = hwc_display_[dpy]->GetDisplayConfigCount(&count);
10158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error == 0) {
10168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      output_parcel->writeInt32(INT(count));
10178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
10188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
10198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
10218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
10228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
102329e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmedandroid::status_t HWCSession::HandleGetDisplayAttributesForConfig(const android::Parcel
102429e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                                                  *input_parcel,
102529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed                                                                  android::Parcel *output_parcel) {
10268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int config = input_parcel->readInt32();
10278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int dpy = input_parcel->readInt32();
10288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = android::BAD_VALUE;
102929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  DisplayConfigVariableInfo display_attributes;
10308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (dpy > HWC_DISPLAY_VIRTUAL) {
10328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return android::BAD_VALUE;
10338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
10348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[dpy]) {
103629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    error = hwc_display_[dpy]->GetDisplayAttributesForConfig(config, &display_attributes);
10378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (error == 0) {
103829e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed      output_parcel->writeInt32(INT(display_attributes.vsync_period_ns));
103929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed      output_parcel->writeInt32(INT(display_attributes.x_pixels));
104029e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed      output_parcel->writeInt32(INT(display_attributes.y_pixels));
104129e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed      output_parcel->writeFloat(display_attributes.x_dpi);
104229e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed      output_parcel->writeFloat(display_attributes.y_dpi);
10438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      output_parcel->writeInt32(0);  // Panel type, unsupported.
10448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
10458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
10468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return error;
10488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
10498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::SetSecondaryDisplayStatus(const android::Parcel *input_parcel,
10518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                        android::Parcel *output_parcel) {
10528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ret = -EINVAL;
10538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t display_id = UINT32(input_parcel->readInt32());
10558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t display_status = UINT32(input_parcel->readInt32());
10568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("Display = %d, Status = %d", display_id, display_status);
10588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (display_id >= HWC_NUM_DISPLAY_TYPES) {
10608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Invalid display_id");
10618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else if (display_id == HWC_DISPLAY_PRIMARY) {
10628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Not supported for this display");
10638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else if (!hwc_display_[display_id]) {
10648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGW("Display is not connected");
10658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
10668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    ret = hwc_display_[display_id]->SetDisplayStatus(display_status);
10678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
10688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(ret);
10708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return ret;
10728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
10738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::ConfigureRefreshRate(const android::Parcel *input_parcel) {
10758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t operation = UINT32(input_parcel->readInt32());
10768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  switch (operation) {
10778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qdutils::DISABLE_METADATA_DYN_REFRESH_RATE:
10788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform(
10798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          HWCDisplayPrimary::SET_METADATA_DYN_REFRESH_RATE, false);
10808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qdutils::ENABLE_METADATA_DYN_REFRESH_RATE:
10818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform(
10828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          HWCDisplayPrimary::SET_METADATA_DYN_REFRESH_RATE, true);
10838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qdutils::SET_BINDER_DYN_REFRESH_RATE: {
10848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      uint32_t refresh_rate = UINT32(input_parcel->readInt32());
10858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform(
10868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          HWCDisplayPrimary::SET_BINDER_DYN_REFRESH_RATE, refresh_rate);
10878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
10888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    default:
10898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGW("Invalid operation %d", operation);
10908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return -EINVAL;
10918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
10928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
10948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
10958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
10968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::SetDisplayMode(const android::Parcel *input_parcel) {
10978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t mode = UINT32(input_parcel->readInt32());
10988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return hwc_display_[HWC_DISPLAY_PRIMARY]->Perform(HWCDisplayPrimary::SET_DISPLAY_MODE, mode);
10998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
11008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::SetMaxMixerStages(const android::Parcel *input_parcel) {
11028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayError error = kErrorNone;
1103efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  std::bitset<32> bit_mask_display_type = UINT32(input_parcel->readInt32());
11048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t max_mixer_stages = UINT32(input_parcel->readInt32());
11058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1106efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (bit_mask_display_type[HWC_DISPLAY_PRIMARY]) {
11078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
11088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      error = hwc_display_[HWC_DISPLAY_PRIMARY]->SetMaxMixerStages(max_mixer_stages);
11098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (error != kErrorNone) {
11108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        return -EINVAL;
11118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
11128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1115efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (bit_mask_display_type[HWC_DISPLAY_EXTERNAL]) {
11168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (hwc_display_[HWC_DISPLAY_EXTERNAL]) {
11178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      error = hwc_display_[HWC_DISPLAY_EXTERNAL]->SetMaxMixerStages(max_mixer_stages);
11188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (error != kErrorNone) {
11198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        return -EINVAL;
11208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
11218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1124efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (bit_mask_display_type[HWC_DISPLAY_VIRTUAL]) {
11258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (hwc_display_[HWC_DISPLAY_VIRTUAL]) {
11268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      error = hwc_display_[HWC_DISPLAY_VIRTUAL]->SetMaxMixerStages(max_mixer_stages);
11278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (error != kErrorNone) {
11288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        return -EINVAL;
11298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
11308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
11348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
11358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::SetDynamicBWForCamera(const android::Parcel *input_parcel,
11378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                    android::Parcel *output_parcel) {
11388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DisplayError error = kErrorNone;
11398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t camera_status = UINT32(input_parcel->readInt32());
11408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWBwModes mode = camera_status > 0 ? kBwCamera : kBwDefault;
11418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // trigger invalidate to apply new bw caps.
11438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
11448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  error = core_intf_->SetMaxBandwidthMode(mode);
11468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (error != kErrorNone) {
11478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -EINVAL;
11488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  new_bw_mode_ = true;
11518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  need_invalidate_ = true;
11528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
11548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
11558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::GetBWTransactionStatus(const android::Parcel *input_parcel,
11578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                     android::Parcel *output_parcel) {
11588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool state = true;
11598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
11618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (sync_wait(bw_mode_release_fd_, 0) < 0) {
11628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGI("bw_transaction_release_fd is not yet signalled: err= %s", strerror(errno));
11638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      state = false;
11648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    output_parcel->writeInt32(state);
11668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
11698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
11708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
11718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschvoid HWCSession::SetFrameDumpConfig(const android::Parcel *input_parcel) {
11728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t frame_dump_count = UINT32(input_parcel->readInt32());
1173efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  std::bitset<32> bit_mask_display_type = UINT32(input_parcel->readInt32());
11748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t bit_mask_layer_type = UINT32(input_parcel->readInt32());
11758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1176efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (bit_mask_display_type[HWC_DISPLAY_PRIMARY]) {
11778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (hwc_display_[HWC_DISPLAY_PRIMARY]) {
11788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      hwc_display_[HWC_DISPLAY_PRIMARY]->SetFrameDumpConfig(frame_dump_count, bit_mask_layer_type);
11798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1182efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (bit_mask_display_type[HWC_DISPLAY_EXTERNAL]) {
11838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (hwc_display_[HWC_DISPLAY_EXTERNAL]) {
11848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      hwc_display_[HWC_DISPLAY_EXTERNAL]->SetFrameDumpConfig(frame_dump_count, bit_mask_layer_type);
11858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
1188efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (bit_mask_display_type[HWC_DISPLAY_VIRTUAL]) {
11898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (hwc_display_[HWC_DISPLAY_VIRTUAL]) {
11908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      hwc_display_[HWC_DISPLAY_VIRTUAL]->SetFrameDumpConfig(frame_dump_count, bit_mask_layer_type);
11918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
11928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
11938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
11948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
119529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmedandroid::status_t HWCSession::SetMixerResolution(const android::Parcel *input_parcel) {
119629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  DisplayError error = kErrorNone;
119729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  uint32_t dpy = UINT32(input_parcel->readInt32());
119829e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
119929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  if (dpy != HWC_DISPLAY_PRIMARY) {
120029e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    DLOGI("Resoulution change not supported for this display %d", dpy);
120129e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    return -EINVAL;
120229e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  }
120329e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
120429e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  if (!hwc_display_[HWC_DISPLAY_PRIMARY]) {
120529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    DLOGI("Primary display is not initialized");
120629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    return -EINVAL;
120729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  }
120829e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
120929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  uint32_t width = UINT32(input_parcel->readInt32());
121029e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  uint32_t height = UINT32(input_parcel->readInt32());
121129e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
121229e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  error = hwc_display_[HWC_DISPLAY_PRIMARY]->SetMixerResolution(width, height);
121329e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  if (error != kErrorNone) {
121429e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed    return -EINVAL;
121529e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  }
121629e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
121729e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed  return 0;
121829e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed}
121929e3abc7397a3745eeec375b4dcee0a3e4c67b28Naseer Ahmed
1220efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmedandroid::status_t HWCSession::SetColorModeOverride(const android::Parcel *input_parcel) {
1221efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  auto display = static_cast<hwc2_display_t >(input_parcel->readInt32());
1222efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  auto mode = static_cast<android_color_mode_t>(input_parcel->readInt32());
1223efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  auto device = static_cast<hwc2_device_t *>(this);
1224efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  auto err = CallDisplayFunction(device, display, &HWCDisplay::SetColorMode, mode);
1225efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  if (err != HWC2_ERROR_NONE)
1226efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed    return -EINVAL;
1227efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed  return 0;
1228efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed}
1229efa4d6ec10802ff9b4e2c6af85ad7f316a2e4779Naseer Ahmed
12308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschvoid HWCSession::DynamicDebug(const android::Parcel *input_parcel) {
12318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int type = input_parcel->readInt32();
12328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool enable = (input_parcel->readInt32() > 0);
12338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("type = %d enable = %d", type, enable);
12348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int verbose_level = input_parcel->readInt32();
12358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  switch (type) {
12378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DEBUG_ALL:
12388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugAll(enable, verbose_level);
12398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
12408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DEBUG_MDPCOMP:
12428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugStrategy(enable, verbose_level);
12438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugCompManager(enable, verbose_level);
12448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
12458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DEBUG_PIPE_LIFECYCLE:
12478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugResources(enable, verbose_level);
12488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
12498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DEBUG_DRIVER_CONFIG:
12518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugDriverConfig(enable, verbose_level);
12528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
12538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DEBUG_ROTATOR:
12558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugResources(enable, verbose_level);
12568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugDriverConfig(enable, verbose_level);
12578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugRotator(enable, verbose_level);
12588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
12598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case qService::IQService::DEBUG_QDCM:
12618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      HWCDebugHandler::DebugQdcm(enable, verbose_level);
12628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
12638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    default:
12658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGW("type = %d is not supported", type);
12668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
12678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
12688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::QdcmCMDHandler(const android::Parcel *input_parcel,
12708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                             android::Parcel *output_parcel) {
12718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ret = 0;
12728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int32_t *brightness_value = NULL;
12738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t display_id(0);
12748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  PPPendingParams pending_action;
12758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  PPDisplayAPIPayload resp_payload, req_payload;
12768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!color_mgr_) {
12788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return -1;
12798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
12808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  pending_action.action = kNoAction;
12828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  pending_action.params = NULL;
12838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Read display_id, payload_size and payload from in_parcel.
12858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  ret = HWCColorManager::CreatePayloadFromParcel(*input_parcel, &display_id, &req_payload);
12868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!ret) {
12878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (HWC_DISPLAY_PRIMARY == display_id && hwc_display_[HWC_DISPLAY_PRIMARY])
12888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = hwc_display_[HWC_DISPLAY_PRIMARY]->ColorSVCRequestRoute(req_payload, &resp_payload,
12898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                                    &pending_action);
12908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (HWC_DISPLAY_EXTERNAL == display_id && hwc_display_[HWC_DISPLAY_EXTERNAL])
12928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = hwc_display_[HWC_DISPLAY_EXTERNAL]->ColorSVCRequestRoute(req_payload, &resp_payload,
12938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                                     &pending_action);
12948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
12958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
12968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (ret) {
12978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    output_parcel->writeInt32(ret);  // first field in out parcel indicates return code.
12988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    req_payload.DestroyPayload();
12998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    resp_payload.DestroyPayload();
13008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return ret;
13018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
13028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  switch (pending_action.action) {
13048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kInvalidating:
13058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
13068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kEnterQDCMMode:
13088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = color_mgr_->EnableQDCMMode(true, hwc_display_[HWC_DISPLAY_PRIMARY]);
13098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kExitQDCMMode:
13118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = color_mgr_->EnableQDCMMode(false, hwc_display_[HWC_DISPLAY_PRIMARY]);
13128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kApplySolidFill:
13148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret =
13158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          color_mgr_->SetSolidFill(pending_action.params, true, hwc_display_[HWC_DISPLAY_PRIMARY]);
13168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
13178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kDisableSolidFill:
13198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret =
13208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          color_mgr_->SetSolidFill(pending_action.params, false, hwc_display_[HWC_DISPLAY_PRIMARY]);
13218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
13228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kSetPanelBrightness:
13248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      brightness_value = reinterpret_cast<int32_t *>(resp_payload.payload);
13258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (brightness_value == NULL) {
13268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        DLOGE("Brightness value is Null");
13278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        return -EINVAL;
13288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
13298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (HWC_DISPLAY_PRIMARY == display_id)
13308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        ret = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPanelBrightness(*brightness_value);
13318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kEnableFrameCapture:
13338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = color_mgr_->SetFrameCapture(pending_action.params, true,
13348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                        hwc_display_[HWC_DISPLAY_PRIMARY]);
13358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      callbacks_.Refresh(HWC_DISPLAY_PRIMARY);
13368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kDisableFrameCapture:
13388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      ret = color_mgr_->SetFrameCapture(pending_action.params, false,
13398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                        hwc_display_[HWC_DISPLAY_PRIMARY]);
13408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    case kNoAction:
13428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    default:
13448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGW("Invalid pending action = %d!", pending_action.action);
13458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      break;
13468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
13478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // for display API getter case, marshall returned params into out_parcel.
13498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(ret);
13508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWCColorManager::MarshallStructIntoParcel(resp_payload, output_parcel);
13518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  req_payload.DestroyPayload();
13528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  resp_payload.DestroyPayload();
13538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return (ret ? -EINVAL : 0);
13558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
13568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::OnMinHdcpEncryptionLevelChange(const android::Parcel *input_parcel,
13588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                             android::Parcel *output_parcel) {
13598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int ret = -EINVAL;
13608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t display_id = UINT32(input_parcel->readInt32());
13618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  uint32_t min_enc_level = UINT32(input_parcel->readInt32());
13628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("Display %d", display_id);
13648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (display_id >= HWC_NUM_DISPLAY_TYPES) {
13668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Invalid display_id");
13678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else if (display_id != HWC_DISPLAY_EXTERNAL) {
13688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Not supported for display");
13698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else if (!hwc_display_[display_id]) {
13708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGW("Display is not connected");
13718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  } else {
13728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    ret = hwc_display_[display_id]->OnMinHdcpEncryptionLevelChange(min_enc_level);
13738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
13748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(ret);
13768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return ret;
13788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
13798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschvoid *HWCSession::HWCUeventThread(void *context) {
13818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (context) {
13828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return reinterpret_cast<HWCSession *>(context)->HWCUeventThreadHandler();
13838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
13848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return NULL;
13868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
13878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschvoid *HWCSession::HWCUeventThreadHandler() {
13898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  static char uevent_data[PAGE_SIZE];
13908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int length = 0;
13918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  prctl(PR_SET_NAME, uevent_thread_name_, 0, 0, 0);
13928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  setpriority(PRIO_PROCESS, 0, HAL_PRIORITY_URGENT_DISPLAY);
13938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!uevent_init()) {
13948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Failed to init uevent");
13958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    pthread_exit(0);
13968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return NULL;
13978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
13988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
13998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  while (!uevent_thread_exit_) {
14008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // keep last 2 zeroes to ensure double 0 termination
14018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    length = uevent_next_event(uevent_data, INT32(sizeof(uevent_data)) - 2);
14028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (strcasestr(HWC_UEVENT_SWITCH_HDMI, uevent_data)) {
14048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGI("Uevent HDMI = %s", uevent_data);
14058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      int connected = GetEventValue(uevent_data, length, "SWITCH_STATE=");
14068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (connected >= 0) {
14078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        DLOGI("HDMI = %s", connected ? "connected" : "disconnected");
14088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        if (HotPlugHandler(connected) == -1) {
14098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          DLOGE("Failed handling Hotplug = %s", connected ? "connected" : "disconnected");
14108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        }
14118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
14128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    } else if (strcasestr(HWC_UEVENT_GRAPHICS_FB0, uevent_data)) {
14138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGI("Uevent FB0 = %s", uevent_data);
14148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      int panel_reset = GetEventValue(uevent_data, length, "PANEL_ALIVE=");
14158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (panel_reset == 0) {
14168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        callbacks_.Refresh(0);
14178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        reset_panel_ = true;
14188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
14198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
14208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
14218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  pthread_exit(0);
14228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return NULL;
14248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
14258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::GetEventValue(const char *uevent_data, int length, const char *event_info) {
14278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  const char *iterator_str = uevent_data;
14288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  while (((iterator_str - uevent_data) <= length) && (*iterator_str)) {
1429b08b03d6d35ae7973953bb9c075c2b83a1a7cf31Dan Stoza    const char *pstr = strstr(iterator_str, event_info);
14308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (pstr != NULL) {
14318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return (atoi(iterator_str + strlen(event_info)));
14328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
14338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    iterator_str += strlen(iterator_str) + 1;
14348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
14358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return -1;
14378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
14388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschvoid HWCSession::ResetPanel() {
14408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWC2::Error status;
14418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("Powering off primary");
14438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  status = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPowerMode(HWC2::PowerMode::Off);
14448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (status != HWC2::Error::None) {
14458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("power-off on primary failed with error = %d", status);
14468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
14478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  DLOGI("Restoring power mode on primary");
14498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  HWC2::PowerMode mode = hwc_display_[HWC_DISPLAY_PRIMARY]->GetLastPowerMode();
14508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  status = hwc_display_[HWC_DISPLAY_PRIMARY]->SetPowerMode(mode);
14518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (status != HWC2::Error::None) {
14528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("Setting power mode = %d on primary failed with error = %d", mode, status);
14538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
14548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  status = hwc_display_[HWC_DISPLAY_PRIMARY]->SetVsyncEnabled(HWC2::Vsync::Enable);
14568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (status != HWC2::Error::None) {
14578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    DLOGE("enabling vsync failed for primary with error = %d", status);
14588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
14598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  reset_panel_ = false;
14618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
14628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::HotPlugHandler(bool connected) {
14648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int status = 0;
14658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool notify_hotplug = false;
14668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  bool hdmi_primary = false;
14678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // To prevent sending events to client while a lock is held, acquire scope locks only within
14698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // below scope so that those get automatically unlocked after the scope ends.
14708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  {
14718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    SEQUENCE_WAIT_SCOPE_LOCK(locker_);
14728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (!hwc_display_[HWC_DISPLAY_PRIMARY]) {
14748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      DLOGE("Primary display is not connected.");
14758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      return -1;
14768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
14778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCDisplay *primary_display = hwc_display_[HWC_DISPLAY_PRIMARY];
14798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    HWCDisplay *external_display = NULL;
14808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (primary_display->GetDisplayClass() == DISPLAY_CLASS_EXTERNAL) {
14828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      external_display = static_cast<HWCDisplayExternal *>(hwc_display_[HWC_DISPLAY_PRIMARY]);
14838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      hdmi_primary = true;
14848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
14858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // If primary display connected is a NULL display, then replace it with the external display
14878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    if (connected) {
14888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // If we are in HDMI as primary and the primary display just got plugged in
14898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (hwc_display_[HWC_DISPLAY_EXTERNAL]) {
14908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        DLOGE("HDMI is already connected");
14918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        return -1;
14928089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
14938089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
14948089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // Connect external display if virtual display is not connected.
14958089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // Else, defer external display connection and process it when virtual display
14968089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // tears down; Do not notify SurfaceFlinger since connection is deferred now.
14978089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (!hwc_display_[HWC_DISPLAY_VIRTUAL]) {
14988089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        status = ConnectDisplay(HWC_DISPLAY_EXTERNAL);
14998089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        if (status) {
15008089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          return status;
15018089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        }
15028089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        notify_hotplug = true;
15038089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      } else {
15048089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        DLOGI("Virtual display is connected, pending connection");
15058089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        external_pending_connect_ = true;
15068089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
15078089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    } else {
15088089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // Do not return error if external display is not in connected status.
15098089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // Due to virtual display concurrency, external display connection might be still pending
15108089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      // but hdmi got disconnected before pending connection could be processed.
15118089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15128089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      if (hdmi_primary) {
15138089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        assert(external_display != NULL);
15148089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        uint32_t x_res, y_res;
15158089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        external_display->GetFrameBufferResolution(&x_res, &y_res);
15168089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        // Need to manually disable VSYNC as SF is not aware of connect/disconnect cases
15178089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        // for HDMI as primary
15188089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        external_display->SetVsyncEnabled(HWC2::Vsync::Disable);
15198089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        HWCDisplayExternal::Destroy(external_display);
15208089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15218089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        // In HWC2, primary displays can be hotplugged out
15228089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        notify_hotplug = true;
15238089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      } else {
15248089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        if (hwc_display_[HWC_DISPLAY_EXTERNAL]) {
15258089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          status = DisconnectDisplay(HWC_DISPLAY_EXTERNAL);
15268089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch          notify_hotplug = true;
15278089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        }
15288089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch        external_pending_connect_ = false;
15298089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch      }
15308089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    }
15318089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15328089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15338089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (connected && notify_hotplug) {
15348089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // trigger screen refresh to ensure sufficient resources are available to process new
15358089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    // new display connection.
15368089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    callbacks_.Refresh(0);
15378089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    uint32_t vsync_period = UINT32(GetVsyncPeriod(HWC_DISPLAY_PRIMARY));
15388089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    usleep(vsync_period * 2 / 1000);
15398089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15408089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // notify client
15418089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // Handle HDMI as primary here
15428089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (notify_hotplug) {
15438089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    callbacks_.Hotplug(HWC_DISPLAY_EXTERNAL,
15448089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                       connected ? HWC2::Connection::Connected : HWC2::Connection::Disconnected);
15458089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15468089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15478089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  qservice_->onHdmiHotplug(INT(connected));
15488089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15498089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return 0;
15508089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
15518089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15528089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschint HWCSession::GetVsyncPeriod(int disp) {
15538089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  SCOPE_LOCK(locker_);
15548089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  // default value
15558089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int32_t vsync_period = 1000000000l / 60;
15568089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  auto attribute = HWC2::Attribute::VsyncPeriod;
15578089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15588089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (hwc_display_[disp]) {
15598089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    hwc_display_[disp]->GetDisplayAttribute(0, attribute, &vsync_period);
15608089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15618089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15628089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return vsync_period;
15638089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
15648089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15658089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetschandroid::status_t HWCSession::GetVisibleDisplayRect(const android::Parcel *input_parcel,
15668089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch                                                    android::Parcel *output_parcel) {
15678089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int dpy = input_parcel->readInt32();
15688089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15698089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (dpy < HWC_DISPLAY_PRIMARY || dpy > HWC_DISPLAY_VIRTUAL) {
15708089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return android::BAD_VALUE;
15718089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15728089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15738089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (!hwc_display_[dpy]) {
15748089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return android::NO_INIT;
15758089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15768089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15778089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  hwc_rect_t visible_rect = {0, 0, 0, 0};
15788089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  int error = hwc_display_[dpy]->GetVisibleDisplayRect(&visible_rect);
15798089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  if (error < 0) {
15808089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch    return error;
15818089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  }
15828089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15838089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(visible_rect.left);
15848089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(visible_rect.top);
15858089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(visible_rect.right);
15868089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  output_parcel->writeInt32(visible_rect.bottom);
15878089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15888089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch  return android::NO_ERROR;
15898089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}
15908089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch
15918089858bfb034e36d45172ff6a5437d7dce86cb7Steve Pfetsch}  // namespace sdm
1592