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