1 /* 2 * Copyright 2021, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "HalImpl.h" 18 19 #include <aidl/android/hardware/graphics/composer3/IComposerCallback.h> 20 #include <android-base/logging.h> 21 #include <hardware/hwcomposer2.h> 22 23 #include "ExynosDevice.h" 24 #include "ExynosDeviceModule.h" 25 #include "ExynosDisplay.h" 26 #include "ExynosHWCService.h" 27 #include "ExynosLayer.h" 28 #include "TranslateHwcAidl.h" 29 #include "Util.h" 30 31 using namespace SOC_VERSION; 32 33 namespace { 34 35 static constexpr int32_t kMinComposerInterfaceVersionForVrrApi = 3; 36 static constexpr int32_t kMinComposerInterfaceVersionForHwcBatching = 3; 37 }; 38 39 namespace aidl::android::hardware::graphics::composer3::impl { 40 create(int32_t composerInterfaceVersion)41 std::unique_ptr<IComposerHal> IComposerHal::create(int32_t composerInterfaceVersion) { 42 bool vrrApiSupported = composerInterfaceVersion >= kMinComposerInterfaceVersionForVrrApi; 43 bool batchingSupported = composerInterfaceVersion >= kMinComposerInterfaceVersionForHwcBatching; 44 auto device = std::make_unique<ExynosDeviceModule>(vrrApiSupported); 45 if (!device) { 46 return nullptr; 47 } 48 auto halImp = std::make_unique<HalImpl>(std::move(device), batchingSupported); 49 return halImp; 50 } 51 52 namespace hook { 53 hotplug(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,int32_t connected)54 void hotplug(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay, 55 int32_t connected) { 56 auto hal = static_cast<HalImpl*>(callbackData); 57 int64_t display; 58 59 h2a::translate(hwcDisplay, display); 60 hal->getEventCallback()->onHotplug(display, connected == HWC2_CONNECTION_CONNECTED); 61 } 62 refresh(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)63 void refresh(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) { 64 auto hal = static_cast<HalImpl*>(callbackData); 65 int64_t display; 66 67 h2a::translate(hwcDisplay, display); 68 hal->getEventCallback()->onRefresh(display); 69 } 70 vsync(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,int64_t timestamp,hwc2_vsync_period_t hwcVsyncPeriodNanos)71 void vsync(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay, 72 int64_t timestamp, hwc2_vsync_period_t hwcVsyncPeriodNanos) { 73 auto hal = static_cast<HalImpl*>(callbackData); 74 int64_t display; 75 int32_t vsyncPeriodNanos; 76 77 h2a::translate(hwcDisplay, display); 78 h2a::translate(hwcVsyncPeriodNanos, vsyncPeriodNanos); 79 hal->getEventCallback()->onVsync(display, timestamp, vsyncPeriodNanos); 80 } 81 vsyncPeriodTimingChanged(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,hwc_vsync_period_change_timeline_t * hwcTimeline)82 void vsyncPeriodTimingChanged(hwc2_callback_data_t callbackData, 83 hwc2_display_t hwcDisplay, 84 hwc_vsync_period_change_timeline_t* hwcTimeline) { 85 auto hal = static_cast<HalImpl*>(callbackData); 86 int64_t display; 87 VsyncPeriodChangeTimeline timeline; 88 89 h2a::translate(hwcDisplay, display); 90 h2a::translate(*hwcTimeline, timeline); 91 hal->getEventCallback()->onVsyncPeriodTimingChanged(display, timeline); 92 } 93 vsyncIdle(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)94 void vsyncIdle(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) { 95 auto hal = static_cast<HalImpl*>(callbackData); 96 int64_t display; 97 98 h2a::translate(hwcDisplay, display); 99 hal->getEventCallback()->onVsyncIdle(display); 100 } 101 seamlessPossible(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay)102 void seamlessPossible(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay) { 103 auto hal = static_cast<HalImpl*>(callbackData); 104 int64_t display; 105 106 h2a::translate(hwcDisplay, display); 107 hal->getEventCallback()->onSeamlessPossible(display); 108 } 109 refreshRateChangedDebug(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,hwc2_vsync_period_t hwcVsyncPeriodNanos,int32_t hwcRefreshPeriodNanos)110 void refreshRateChangedDebug(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay, 111 hwc2_vsync_period_t hwcVsyncPeriodNanos, 112 int32_t hwcRefreshPeriodNanos) { 113 auto hal = static_cast<HalImpl*>(callbackData); 114 int64_t display; 115 int32_t vsyncPeriodNanos; 116 117 h2a::translate(hwcDisplay, display); 118 h2a::translate(hwcVsyncPeriodNanos, vsyncPeriodNanos); 119 // TODO (b/314527560) Update refreshPeriodNanos for VRR display 120 hal->getEventCallback()->onRefreshRateChangedDebug(RefreshRateChangedDebugData{ 121 .display = display, 122 .vsyncPeriodNanos = vsyncPeriodNanos, 123 .refreshPeriodNanos = hwcRefreshPeriodNanos, 124 }); 125 } 126 hotplugEvent(hwc2_callback_data_t callbackData,hwc2_display_t hwcDisplay,common::DisplayHotplugEvent hotplugEvent)127 void hotplugEvent(hwc2_callback_data_t callbackData, hwc2_display_t hwcDisplay, 128 common::DisplayHotplugEvent hotplugEvent) { 129 auto hal = static_cast<HalImpl*>(callbackData); 130 int64_t display; 131 132 h2a::translate(hwcDisplay, display); 133 hal->getEventCallback()->onHotplugEvent(display, hotplugEvent); 134 } 135 136 } // nampesapce hook 137 HalImpl(std::unique_ptr<ExynosDevice> device,bool batchingSupported)138 HalImpl::HalImpl(std::unique_ptr<ExynosDevice> device, bool batchingSupported) 139 : mDevice(std::move(device)) { 140 initCaps(batchingSupported); 141 #ifdef USES_HWC_SERVICES 142 LOG(DEBUG) << "Start HWCService"; 143 mHwcCtx = std::make_unique<ExynosHWCCtx>(); 144 memset(&mHwcCtx->base, 0, sizeof(mHwcCtx->base)); 145 mHwcCtx->device = mDevice.get(); 146 147 auto hwcService = ::android::ExynosHWCService::getExynosHWCService(); 148 hwcService->setExynosHWCCtx(mHwcCtx.get()); 149 // This callback is for DP hotplug event if connected 150 // hwcService->setBootFinishedCallback(...); 151 #endif 152 } 153 initCaps(bool batchingSupported)154 void HalImpl::initCaps(bool batchingSupported) { 155 uint32_t count = 0; 156 mDevice->getCapabilities(&count, nullptr); 157 158 std::vector<int32_t> halCaps(count); 159 mDevice->getCapabilities(&count, halCaps.data()); 160 161 for (auto hwcCap : halCaps) { 162 Capability cap; 163 h2a::translate(hwcCap, cap); 164 mCaps.insert(cap); 165 } 166 167 mCaps.insert(Capability::BOOT_DISPLAY_CONFIG); 168 mCaps.insert(Capability::REFRESH_RATE_CHANGED_CALLBACK_DEBUG); 169 if (batchingSupported) { 170 mCaps.insert(Capability::LAYER_LIFECYCLE_BATCH_COMMAND); 171 } 172 } 173 getHalDisplay(int64_t display,ExynosDisplay * & halDisplay)174 int32_t HalImpl::getHalDisplay(int64_t display, ExynosDisplay*& halDisplay) { 175 hwc2_display_t hwcDisplay; 176 a2h::translate(display, hwcDisplay); 177 halDisplay = mDevice->getDisplay(static_cast<uint32_t>(hwcDisplay)); 178 179 if (!halDisplay) { [[unlikely]] 180 return HWC2_ERROR_BAD_DISPLAY; 181 } 182 return HWC2_ERROR_NONE; 183 } 184 getHalLayer(int64_t display,int64_t layer,ExynosLayer * & halLayer)185 int32_t HalImpl::getHalLayer(int64_t display, int64_t layer, ExynosLayer*& halLayer) { 186 ExynosDisplay* halDisplay; 187 RET_IF_ERR(getHalDisplay(display, halDisplay)); 188 189 hwc2_layer_t mapped_layer; 190 RET_IF_ERR(layerSf2Hwc(display, layer, mapped_layer)); 191 halLayer = halDisplay->checkLayer(mapped_layer); 192 if (!halLayer) { [[unlikely]] 193 return HWC2_ERROR_BAD_LAYER; 194 } 195 196 return HWC2_ERROR_NONE; 197 } 198 layerSf2Hwc(int64_t display,int64_t layer,hwc2_layer_t & outMappedLayer)199 int32_t HalImpl::layerSf2Hwc(int64_t display, int64_t layer, hwc2_layer_t& outMappedLayer) { 200 ExynosDisplay* halDisplay; 201 RET_IF_ERR(getHalDisplay(display, halDisplay)); 202 auto iter = mSfLayerToHalLayerMap.find(layer); 203 if (iter == mSfLayerToHalLayerMap.end()) { 204 return HWC2_ERROR_BAD_LAYER; 205 } 206 outMappedLayer = iter->second; 207 return HWC2_ERROR_NONE; 208 } 209 hasCapability(Capability cap)210 bool HalImpl::hasCapability(Capability cap) { 211 return mCaps.find(cap) != mCaps.end(); 212 } 213 getCapabilities(std::vector<Capability> * caps)214 void HalImpl::getCapabilities(std::vector<Capability>* caps) { 215 caps->clear(); 216 caps->insert(caps->begin(), mCaps.begin(), mCaps.end()); 217 } 218 dumpDebugInfo(std::string * output)219 void HalImpl::dumpDebugInfo(std::string* output) { 220 if (output == nullptr) return; 221 222 String8 result; 223 mDevice->dump(result); 224 225 output->resize(result.size()); 226 output->assign(result.c_str()); 227 } 228 registerEventCallback(EventCallback * callback)229 void HalImpl::registerEventCallback(EventCallback* callback) { 230 mEventCallback = callback; 231 232 mDevice->registerCallback(HWC2_CALLBACK_HOTPLUG, this, 233 reinterpret_cast<hwc2_function_pointer_t>(hook::hotplug)); 234 mDevice->registerCallback(HWC2_CALLBACK_REFRESH, this, 235 reinterpret_cast<hwc2_function_pointer_t>(hook::refresh)); 236 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_2_4, this, 237 reinterpret_cast<hwc2_function_pointer_t>(hook::vsync)); 238 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this, 239 reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncPeriodTimingChanged)); 240 mDevice->registerCallback(HWC2_CALLBACK_SEAMLESS_POSSIBLE, this, 241 reinterpret_cast<hwc2_function_pointer_t>(hook::seamlessPossible)); 242 243 // register HWC3 Callback 244 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this, 245 reinterpret_cast<hwc2_function_pointer_t>(hook::vsyncIdle)); 246 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onRefreshRateChangedDebug, this, 247 reinterpret_cast<hwc2_function_pointer_t>( 248 hook::refreshRateChangedDebug)); 249 // Don't register onHotplugEvent until it's available in nextfood (b/323291596) 250 // mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onHotplugEvent, this, 251 // reinterpret_cast<hwc2_function_pointer_t>(hook::hotplugEvent)); 252 } 253 unregisterEventCallback()254 void HalImpl::unregisterEventCallback() { 255 mDevice->registerCallback(HWC2_CALLBACK_HOTPLUG, this, nullptr); 256 mDevice->registerCallback(HWC2_CALLBACK_REFRESH, this, nullptr); 257 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_2_4, this, nullptr); 258 mDevice->registerCallback(HWC2_CALLBACK_VSYNC_PERIOD_TIMING_CHANGED, this, nullptr); 259 mDevice->registerCallback(HWC2_CALLBACK_SEAMLESS_POSSIBLE, this, nullptr); 260 261 // unregister HWC3 Callback 262 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onVsyncIdle, this, nullptr); 263 mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onRefreshRateChangedDebug, this, 264 nullptr); 265 // Don't register onHotplugEvent until it's available in nextfood (b/323291596) 266 // mDevice->registerHwc3Callback(IComposerCallback::TRANSACTION_onHotplugEvent, this, nullptr); 267 268 mEventCallback = nullptr; 269 } 270 acceptDisplayChanges(int64_t display)271 int32_t HalImpl::acceptDisplayChanges(int64_t display) { 272 ExynosDisplay* halDisplay; 273 RET_IF_ERR(getHalDisplay(display, halDisplay)); 274 275 return halDisplay->acceptDisplayChanges(); 276 } 277 createLayer(int64_t display,int64_t * outLayer)278 int32_t HalImpl::createLayer(int64_t display, int64_t* outLayer) { 279 ExynosDisplay* halDisplay; 280 RET_IF_ERR(getHalDisplay(display, halDisplay)); 281 282 hwc2_layer_t hwcLayer = 0; 283 RET_IF_ERR(halDisplay->createLayer(&hwcLayer)); 284 285 h2a::translate(hwcLayer, *outLayer); 286 // Adding this to stay backward compatible with new batching command, 287 // if HWC supports batching, and create does not. 288 mSfLayerToHalLayerMap[*outLayer] = hwcLayer; 289 mHalLayerToSfLayerMap[hwcLayer] = *outLayer; 290 return HWC2_ERROR_NONE; 291 } 292 batchedCreateDestroyLayer(int64_t display,int64_t layer,LayerLifecycleBatchCommandType cmd)293 int32_t HalImpl::batchedCreateDestroyLayer(int64_t display, int64_t layer, 294 LayerLifecycleBatchCommandType cmd) { 295 int32_t err = HWC2_ERROR_NONE; 296 ExynosDisplay* halDisplay; 297 RET_IF_ERR(getHalDisplay(display, halDisplay)); 298 if (cmd == LayerLifecycleBatchCommandType::CREATE) { 299 if (mSfLayerToHalLayerMap.find(layer) != mSfLayerToHalLayerMap.end()) { 300 return HWC2_ERROR_BAD_LAYER; 301 } 302 hwc2_layer_t hwcLayer = 0; 303 RET_IF_ERR(halDisplay->createLayer(&hwcLayer)); 304 int64_t hwclayerAidl; 305 h2a::translate(hwcLayer, hwclayerAidl); 306 mSfLayerToHalLayerMap[layer] = hwclayerAidl; 307 308 mHalLayerToSfLayerMap[hwcLayer] = layer; 309 } else if (cmd == LayerLifecycleBatchCommandType::DESTROY) { 310 int64_t HalLayerAidl; 311 ExynosLayer* halLayer; 312 auto iter = mSfLayerToHalLayerMap.find(layer); 313 if (iter == mSfLayerToHalLayerMap.end()) { 314 return HWC2_ERROR_BAD_LAYER; 315 } 316 HalLayerAidl = iter->second; 317 318 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 319 err = halDisplay->destroyLayer(reinterpret_cast<hwc2_layer_t>(halLayer)); 320 if (err != HWC2_ERROR_NONE) { 321 ALOGW("HalImpl: destroyLayer failed with error: %u", err); 322 } 323 mSfLayerToHalLayerMap.erase(iter); 324 auto iterator = mHalLayerToSfLayerMap.find(reinterpret_cast<hwc2_layer_t>(halLayer)); 325 if (iterator == mHalLayerToSfLayerMap.end()) { 326 return HWC2_ERROR_BAD_LAYER; 327 } 328 329 mHalLayerToSfLayerMap.erase(iterator); 330 } 331 return err; 332 } 333 destroyLayer(int64_t display,int64_t layer)334 int32_t HalImpl::destroyLayer(int64_t display, int64_t layer) { 335 int32_t err = HWC2_ERROR_NONE; 336 ExynosDisplay* halDisplay; 337 RET_IF_ERR(getHalDisplay(display, halDisplay)); 338 339 ExynosLayer *halLayer; 340 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 341 err = halDisplay->destroyLayer(reinterpret_cast<hwc2_layer_t>(halLayer)); 342 auto iter = mSfLayerToHalLayerMap.find(layer); 343 if (iter != mSfLayerToHalLayerMap.end()) { 344 mSfLayerToHalLayerMap.erase(iter); 345 } 346 auto iterator = mHalLayerToSfLayerMap.find(reinterpret_cast<hwc2_layer_t>(halLayer)); 347 if (iterator != mHalLayerToSfLayerMap.end()) { 348 mHalLayerToSfLayerMap.erase(iterator); 349 } 350 return err; 351 } 352 createVirtualDisplay(uint32_t width,uint32_t height,AidlPixelFormat format,VirtualDisplay * outDisplay)353 int32_t HalImpl::createVirtualDisplay(uint32_t width, uint32_t height, AidlPixelFormat format, 354 VirtualDisplay* outDisplay) { 355 int32_t hwcFormat; 356 a2h::translate(format, hwcFormat); 357 hwc2_display_t hwcDisplay = getDisplayId(HWC_DISPLAY_VIRTUAL, 0); 358 auto halDisplay = mDevice->getDisplay(static_cast<uint32_t>(hwcDisplay)); 359 if (!halDisplay) { 360 return HWC2_ERROR_BAD_PARAMETER; 361 } 362 363 RET_IF_ERR(mDevice->createVirtualDisplay(width, height, &hwcFormat, halDisplay)); 364 365 h2a::translate(hwcDisplay, outDisplay->display); 366 h2a::translate(hwcFormat, outDisplay->format); 367 368 return HWC2_ERROR_NONE; 369 } 370 destroyVirtualDisplay(int64_t display)371 int32_t HalImpl::destroyVirtualDisplay(int64_t display) { 372 ExynosDisplay* halDisplay; 373 RET_IF_ERR(getHalDisplay(display, halDisplay)); 374 375 return mDevice->destroyVirtualDisplay(halDisplay); 376 } 377 getActiveConfig(int64_t display,int32_t * outConfig)378 int32_t HalImpl::getActiveConfig(int64_t display, int32_t* outConfig) { 379 ExynosDisplay* halDisplay; 380 RET_IF_ERR(getHalDisplay(display, halDisplay)); 381 382 hwc2_config_t hwcConfig; 383 RET_IF_ERR(halDisplay->getActiveConfig(&hwcConfig)); 384 385 h2a::translate(hwcConfig, *outConfig); 386 return HWC2_ERROR_NONE; 387 } 388 getColorModes(int64_t display,std::vector<ColorMode> * outModes)389 int32_t HalImpl::getColorModes(int64_t display, std::vector<ColorMode>* outModes) { 390 ExynosDisplay* halDisplay; 391 RET_IF_ERR(getHalDisplay(display, halDisplay)); 392 393 uint32_t count = 0; 394 RET_IF_ERR(halDisplay->getColorModes(&count, nullptr)); 395 396 std::vector<int32_t> hwcModes(count); 397 RET_IF_ERR(halDisplay->getColorModes(&count, hwcModes.data())); 398 399 h2a::translate(hwcModes, *outModes); 400 return HWC2_ERROR_NONE; 401 } 402 getDataspaceSaturationMatrix(common::Dataspace dataspace,std::vector<float> * matrix)403 int32_t HalImpl::getDataspaceSaturationMatrix([[maybe_unused]] common::Dataspace dataspace, 404 std::vector<float>* matrix) { 405 // Pixel HWC does not support dataspace saturation matrix, return unit matrix. 406 std::vector<float> unitMatrix = { 407 1.0f, 0.0f, 0.0f, 0.0f, 408 0.0f, 1.0f, 0.0f, 0.0f, 409 0.0f, 0.0f, 1.0f, 0.0f, 410 0.0f, 0.0f, 0.0f, 1.0f, 411 }; 412 413 *matrix = std::move(unitMatrix); 414 return HWC2_ERROR_NONE; 415 } 416 getDisplayAttribute(int64_t display,int32_t config,DisplayAttribute attribute,int32_t * outValue)417 int32_t HalImpl::getDisplayAttribute(int64_t display, int32_t config, 418 DisplayAttribute attribute, int32_t* outValue) { 419 ExynosDisplay* halDisplay; 420 RET_IF_ERR(getHalDisplay(display, halDisplay)); 421 422 hwc2_config_t hwcConfig; 423 int32_t hwcAttr; 424 a2h::translate(config, hwcConfig); 425 a2h::translate(attribute, hwcAttr); 426 427 auto err = halDisplay->getDisplayAttribute(hwcConfig, hwcAttr, outValue); 428 if (err != HWC2_ERROR_NONE && *outValue == -1) { 429 return HWC2_ERROR_BAD_PARAMETER; 430 } 431 return HWC2_ERROR_NONE; 432 } 433 getDisplayBrightnessSupport(int64_t display,bool & outSupport)434 int32_t HalImpl::getDisplayBrightnessSupport(int64_t display, bool& outSupport) { 435 ExynosDisplay* halDisplay; 436 RET_IF_ERR(getHalDisplay(display, halDisplay)); 437 438 return halDisplay->getDisplayBrightnessSupport(&outSupport); 439 } 440 getDisplayCapabilities(int64_t display,std::vector<DisplayCapability> * caps)441 int32_t HalImpl::getDisplayCapabilities(int64_t display, 442 std::vector<DisplayCapability>* caps) { 443 ExynosDisplay* halDisplay; 444 RET_IF_ERR(getHalDisplay(display, halDisplay)); 445 446 uint32_t count = 0; 447 RET_IF_ERR(halDisplay->getDisplayCapabilities(&count, nullptr)); 448 449 std::vector<uint32_t> hwcCaps(count); 450 RET_IF_ERR(halDisplay->getDisplayCapabilities(&count, hwcCaps.data())); 451 452 h2a::translate(hwcCaps, *caps); 453 return HWC2_ERROR_NONE; 454 } 455 getDisplayConfigs(int64_t display,std::vector<int32_t> * configs)456 int32_t HalImpl::getDisplayConfigs(int64_t display, std::vector<int32_t>* configs) { 457 ExynosDisplay* halDisplay; 458 RET_IF_ERR(getHalDisplay(display, halDisplay)); 459 460 uint32_t count = 0; 461 RET_IF_ERR(halDisplay->getDisplayConfigs(&count, nullptr)); 462 463 std::vector<hwc2_config_t> hwcConfigs(count); 464 RET_IF_ERR(halDisplay->getDisplayConfigs(&count, hwcConfigs.data())); 465 466 h2a::translate(hwcConfigs, *configs); 467 return HWC2_ERROR_NONE; 468 } 469 getDisplayConfigurations(int64_t display,int32_t,std::vector<DisplayConfiguration> * outConfigs)470 int32_t HalImpl::getDisplayConfigurations(int64_t display, int32_t, 471 std::vector<DisplayConfiguration>* outConfigs) { 472 ExynosDisplay* halDisplay; 473 RET_IF_ERR(getHalDisplay(display, halDisplay)); 474 475 std::vector<int32_t> configIds; 476 RET_IF_ERR(getDisplayConfigs(display, &configIds)); 477 478 for (const auto configId : configIds) { 479 DisplayConfiguration config; 480 config.configId = configId; 481 // Get required display attributes 482 RET_IF_ERR(getDisplayAttribute(display, configId, DisplayAttribute::WIDTH, &config.width)); 483 RET_IF_ERR( 484 getDisplayAttribute(display, configId, DisplayAttribute::HEIGHT, &config.height)); 485 RET_IF_ERR(getDisplayAttribute(display, configId, DisplayAttribute::VSYNC_PERIOD, 486 &config.vsyncPeriod)); 487 RET_IF_ERR(getDisplayAttribute(display, configId, DisplayAttribute::CONFIG_GROUP, 488 &config.configGroup)); 489 // Get optional display attributes 490 int32_t dpiX, dpiY; 491 auto statusDpiX = getDisplayAttribute(display, configId, DisplayAttribute::DPI_X, &dpiX); 492 auto statusDpiY = getDisplayAttribute(display, configId, DisplayAttribute::DPI_Y, &dpiY); 493 // TODO(b/294120341): getDisplayAttribute for DPI should return dots per inch 494 if (statusDpiX == HWC2_ERROR_NONE && statusDpiY == HWC2_ERROR_NONE) { 495 config.dpi = {dpiX / 1000.0f, dpiY / 1000.0f}; 496 } 497 // Determine whether there is a need to configure VRR. 498 hwc2_config_t hwcConfigId; 499 a2h::translate(configId, hwcConfigId); 500 std::optional<VrrConfig_t> vrrConfig = halDisplay->getVrrConfigs(hwcConfigId); 501 if (vrrConfig.has_value() && vrrConfig->isFullySupported) { 502 // TODO(b/290843234): complete the remaining values within vrrConfig. 503 VrrConfig hwc3VrrConfig; 504 VrrConfig::NotifyExpectedPresentConfig notifyExpectedPresentConfig; 505 hwc3VrrConfig.minFrameIntervalNs = vrrConfig->minFrameIntervalNs; 506 if (vrrConfig->notifyExpectedPresentConfig.has_value()) { 507 notifyExpectedPresentConfig.headsUpNs = 508 vrrConfig->notifyExpectedPresentConfig->HeadsUpNs; 509 notifyExpectedPresentConfig.timeoutNs = 510 vrrConfig->notifyExpectedPresentConfig->TimeoutNs; 511 hwc3VrrConfig.notifyExpectedPresentConfig = 512 std::make_optional(notifyExpectedPresentConfig); 513 } 514 config.vrrConfig = std::make_optional(hwc3VrrConfig); 515 } 516 outConfigs->push_back(config); 517 } 518 519 return HWC2_ERROR_NONE; 520 } 521 notifyExpectedPresent(int64_t display,const ClockMonotonicTimestamp & expectedPresentTime,int32_t frameIntervalNs)522 int32_t HalImpl::notifyExpectedPresent(int64_t display, 523 const ClockMonotonicTimestamp& expectedPresentTime, 524 int32_t frameIntervalNs) { 525 ExynosDisplay* halDisplay; 526 RET_IF_ERR(getHalDisplay(display, halDisplay)); 527 528 RET_IF_ERR( 529 halDisplay->notifyExpectedPresent(expectedPresentTime.timestampNanos, frameIntervalNs)); 530 return HWC2_ERROR_NONE; 531 } 532 getDisplayConnectionType(int64_t display,DisplayConnectionType * outType)533 int32_t HalImpl::getDisplayConnectionType(int64_t display, DisplayConnectionType* outType) { 534 ExynosDisplay* halDisplay; 535 RET_IF_ERR(getHalDisplay(display, halDisplay)); 536 537 uint32_t hwcType = HWC2_DISPLAY_CONNECTION_TYPE_INTERNAL; 538 RET_IF_ERR(halDisplay->getDisplayConnectionType(&hwcType)); 539 h2a::translate(hwcType, *outType); 540 541 return HWC2_ERROR_NONE; 542 } 543 getDisplayIdentificationData(int64_t display,DisplayIdentification * id)544 int32_t HalImpl::getDisplayIdentificationData(int64_t display, DisplayIdentification *id) { 545 ExynosDisplay* halDisplay; 546 RET_IF_ERR(getHalDisplay(display, halDisplay)); 547 548 uint8_t port; 549 uint32_t count = 0; 550 RET_IF_ERR(halDisplay->getDisplayIdentificationData(&port, &count, nullptr)); 551 552 id->data.resize(count); 553 RET_IF_ERR(halDisplay->getDisplayIdentificationData(&port, &count, id->data.data())); 554 555 h2a::translate(port, id->port); 556 return HWC2_ERROR_NONE; 557 } 558 getDisplayName(int64_t display,std::string * outName)559 int32_t HalImpl::getDisplayName(int64_t display, std::string* outName) { 560 ExynosDisplay* halDisplay; 561 RET_IF_ERR(getHalDisplay(display, halDisplay)); 562 563 uint32_t count = 0; 564 RET_IF_ERR(halDisplay->getDisplayName(&count, nullptr)); 565 566 outName->resize(count); 567 RET_IF_ERR(halDisplay->getDisplayName(&count, outName->data())); 568 569 return HWC2_ERROR_NONE; 570 } 571 getDisplayVsyncPeriod(int64_t display,int32_t * outVsyncPeriod)572 int32_t HalImpl::getDisplayVsyncPeriod(int64_t display, int32_t* outVsyncPeriod) { 573 ExynosDisplay* halDisplay; 574 RET_IF_ERR(getHalDisplay(display, halDisplay)); 575 576 hwc2_vsync_period_t hwcVsyncPeriod; 577 RET_IF_ERR(halDisplay->getDisplayVsyncPeriod(&hwcVsyncPeriod)); 578 579 h2a::translate(hwcVsyncPeriod, *outVsyncPeriod); 580 return HWC2_ERROR_NONE; 581 } 582 getDisplayedContentSample(int64_t display,int64_t maxFrames,int64_t timestamp,DisplayContentSample * samples)583 int32_t HalImpl::getDisplayedContentSample([[maybe_unused]] int64_t display, 584 [[maybe_unused]] int64_t maxFrames, 585 [[maybe_unused]] int64_t timestamp, 586 [[maybe_unused]] DisplayContentSample* samples) { 587 return HWC2_ERROR_UNSUPPORTED; 588 } 589 getDisplayedContentSamplingAttributes(int64_t display,DisplayContentSamplingAttributes * attrs)590 int32_t HalImpl::getDisplayedContentSamplingAttributes( 591 [[maybe_unused]] int64_t display, 592 [[maybe_unused]] DisplayContentSamplingAttributes* attrs) { 593 return HWC2_ERROR_UNSUPPORTED; 594 } 595 getDisplayPhysicalOrientation(int64_t display,common::Transform * orientation)596 int32_t HalImpl::getDisplayPhysicalOrientation(int64_t display, 597 common::Transform* orientation) { 598 ExynosDisplay* halDisplay; 599 RET_IF_ERR(getHalDisplay(display, halDisplay)); 600 601 HwcMountOrientation hwcOrientation; 602 RET_IF_ERR(halDisplay->getMountOrientation(&hwcOrientation)); 603 h2a::translate(hwcOrientation, *orientation); 604 605 return HWC2_ERROR_NONE; 606 } 607 getDozeSupport(int64_t display,bool & support)608 int32_t HalImpl::getDozeSupport(int64_t display, bool& support) { 609 ExynosDisplay* halDisplay; 610 RET_IF_ERR(getHalDisplay(display, halDisplay)); 611 612 int32_t hwcSupport; 613 RET_IF_ERR(halDisplay->getDozeSupport(&hwcSupport)); 614 615 h2a::translate(hwcSupport, support); 616 return HWC2_ERROR_NONE; 617 } 618 getHdrCapabilities(int64_t display,HdrCapabilities * caps)619 int32_t HalImpl::getHdrCapabilities(int64_t display, HdrCapabilities* caps) { 620 ExynosDisplay* halDisplay; 621 RET_IF_ERR(getHalDisplay(display, halDisplay)); 622 623 uint32_t count = 0; 624 RET_IF_ERR(halDisplay->getHdrCapabilities(&count, nullptr, &caps->maxLuminance, 625 &caps->maxAverageLuminance, 626 &caps->minLuminance)); 627 std::vector<int32_t> hwcHdrTypes(count); 628 RET_IF_ERR(halDisplay->getHdrCapabilities(&count, hwcHdrTypes.data(), 629 &caps->maxLuminance, 630 &caps->maxAverageLuminance, 631 &caps->minLuminance)); 632 633 h2a::translate(hwcHdrTypes, caps->types); 634 return HWC2_ERROR_NONE; 635 } 636 getOverlaySupport(OverlayProperties * caps)637 int32_t HalImpl::getOverlaySupport(OverlayProperties* caps) { 638 return mDevice->getOverlaySupport(caps); 639 } 640 getMaxVirtualDisplayCount(int32_t * count)641 int32_t HalImpl::getMaxVirtualDisplayCount(int32_t* count) { 642 uint32_t hwcCount = mDevice->getMaxVirtualDisplayCount(); 643 h2a::translate(hwcCount, *count); 644 645 return HWC2_ERROR_NONE; 646 } 647 getPerFrameMetadataKeys(int64_t display,std::vector<PerFrameMetadataKey> * keys)648 int32_t HalImpl::getPerFrameMetadataKeys(int64_t display, 649 std::vector<PerFrameMetadataKey>* keys) { 650 ExynosDisplay* halDisplay; 651 RET_IF_ERR(getHalDisplay(display, halDisplay)); 652 653 uint32_t numKeys = 0; 654 auto resManager = mDevice->mResourceManager; 655 if (resManager->hasHDR10PlusMPP()) { 656 numKeys = HWC2_HDR10_PLUS_SEI + 1; 657 } else { 658 numKeys = HWC2_MAX_FRAME_AVERAGE_LIGHT_LEVEL + 1; 659 } 660 for (uint32_t i = 0; i < numKeys; ++i) { 661 PerFrameMetadataKey key; 662 h2a::translate(i, key); 663 keys->push_back(key); 664 } 665 666 return HWC2_ERROR_NONE; 667 } 668 getReadbackBufferAttributes(int64_t display,ReadbackBufferAttributes * attrs)669 int32_t HalImpl::getReadbackBufferAttributes(int64_t display, 670 ReadbackBufferAttributes* attrs) { 671 ExynosDisplay* halDisplay; 672 RET_IF_ERR(getHalDisplay(display, halDisplay)); 673 674 int32_t format = -1; 675 int32_t dataspace = -1; 676 RET_IF_ERR(halDisplay->getReadbackBufferAttributes(&format, &dataspace)); 677 678 h2a::translate(format, attrs->format); 679 h2a::translate(dataspace, attrs->dataspace); 680 681 return HWC2_ERROR_NONE; 682 } 683 getReadbackBufferFence(int64_t display,ndk::ScopedFileDescriptor * acquireFence)684 int32_t HalImpl::getReadbackBufferFence(int64_t display, 685 ndk::ScopedFileDescriptor* acquireFence) { 686 ExynosDisplay* halDisplay; 687 RET_IF_ERR(getHalDisplay(display, halDisplay)); 688 689 int32_t fd = -1; 690 RET_IF_ERR(halDisplay->getReadbackBufferFence(&fd)); 691 692 h2a::translate(fd, *acquireFence); 693 return HWC2_ERROR_NONE; 694 } 695 getRenderIntents(int64_t display,ColorMode mode,std::vector<RenderIntent> * intents)696 int32_t HalImpl::getRenderIntents(int64_t display, ColorMode mode, 697 std::vector<RenderIntent>* intents) { 698 ExynosDisplay* halDisplay; 699 RET_IF_ERR(getHalDisplay(display, halDisplay)); 700 701 int32_t hwcMode; 702 uint32_t count = 0; 703 a2h::translate(mode, hwcMode); 704 RET_IF_ERR(halDisplay->getRenderIntents(hwcMode, &count, nullptr)); 705 706 std::vector<int32_t> hwcIntents(count); 707 RET_IF_ERR(halDisplay->getRenderIntents(hwcMode, &count, hwcIntents.data())); 708 709 h2a::translate(hwcIntents, *intents); 710 return HWC2_ERROR_NONE; 711 } 712 getSupportedContentTypes(int64_t display,std::vector<ContentType> * types)713 int32_t HalImpl::getSupportedContentTypes(int64_t display, std::vector<ContentType>* types) { 714 ExynosDisplay* halDisplay; 715 RET_IF_ERR(getHalDisplay(display, halDisplay)); 716 717 uint32_t count = 0; 718 RET_IF_ERR(halDisplay->getSupportedContentTypes(&count, nullptr)); 719 720 std::vector<uint32_t> hwcTypes(count); 721 RET_IF_ERR(halDisplay->getSupportedContentTypes(&count, hwcTypes.data())); 722 723 h2a::translate(hwcTypes, *types); 724 return HWC2_ERROR_NONE; 725 } 726 flushDisplayBrightnessChange(int64_t display)727 int32_t HalImpl::flushDisplayBrightnessChange(int64_t display) { 728 ExynosDisplay* halDisplay; 729 RET_IF_ERR(getHalDisplay(display, halDisplay)); 730 731 return halDisplay->flushDisplayBrightnessChange(); 732 } 733 presentDisplay(int64_t display,ndk::ScopedFileDescriptor & fence,std::vector<int64_t> * outLayers,std::vector<ndk::ScopedFileDescriptor> * outReleaseFences)734 int32_t HalImpl::presentDisplay(int64_t display, ndk::ScopedFileDescriptor& fence, 735 std::vector<int64_t>* outLayers, 736 std::vector<ndk::ScopedFileDescriptor>* outReleaseFences) { 737 ExynosDisplay* halDisplay; 738 RET_IF_ERR(getHalDisplay(display, halDisplay)); 739 740 // TODO: not expect acceptDisplayChanges if there are no changes to accept 741 if (halDisplay->mRenderingState == RENDERING_STATE_VALIDATED) { 742 LOG(INFO) << halDisplay->mDisplayName.c_str() 743 << ": acceptDisplayChanges was not called"; 744 if (halDisplay->acceptDisplayChanges() != HWC2_ERROR_NONE) { 745 LOG(ERROR) << halDisplay->mDisplayName.c_str() 746 << ": acceptDisplayChanges is failed"; 747 } 748 } 749 750 int32_t hwcFence; 751 RET_IF_ERR(halDisplay->presentDisplay(&hwcFence)); 752 h2a::translate(hwcFence, fence); 753 754 uint32_t count = 0; 755 RET_IF_ERR(halDisplay->getReleaseFences(&count, nullptr, nullptr)); 756 757 std::vector<hwc2_layer_t> hwcLayers(count); 758 std::vector<int32_t> hwcFences(count); 759 RET_IF_ERR(halDisplay->getReleaseFences(&count, hwcLayers.data(), hwcFences.data())); 760 std::vector<int64_t> sfLayers(count); 761 762 for (int i = 0; i < count; i++) { 763 auto iter = mHalLayerToSfLayerMap.find(hwcLayers[i]); 764 if (iter != mHalLayerToSfLayerMap.end()) { 765 sfLayers[i] = iter->second; 766 } else { 767 LOG(ERROR) << "HalImpl::presentDisplay incorrect hal mapping. "; 768 } 769 } 770 h2a::translate(sfLayers, *outLayers); 771 h2a::translate(hwcFences, *outReleaseFences); 772 773 return HWC2_ERROR_NONE; 774 } 775 setActiveConfig(int64_t display,int32_t config)776 int32_t HalImpl::setActiveConfig(int64_t display, int32_t config) { 777 ExynosDisplay* halDisplay; 778 RET_IF_ERR(getHalDisplay(display, halDisplay)); 779 780 hwc2_config_t hwcConfig; 781 a2h::translate(config, hwcConfig); 782 return halDisplay->setActiveConfig(hwcConfig); 783 } 784 setActiveConfigWithConstraints(int64_t display,int32_t config,const VsyncPeriodChangeConstraints & vsyncPeriodChangeConstraints,VsyncPeriodChangeTimeline * timeline)785 int32_t HalImpl::setActiveConfigWithConstraints( 786 int64_t display, int32_t config, 787 const VsyncPeriodChangeConstraints& vsyncPeriodChangeConstraints, 788 VsyncPeriodChangeTimeline* timeline) { 789 ExynosDisplay* halDisplay; 790 RET_IF_ERR(getHalDisplay(display, halDisplay)); 791 792 hwc2_config_t hwcConfig; 793 hwc_vsync_period_change_constraints_t hwcConstraints; 794 hwc_vsync_period_change_timeline_t hwcTimeline; 795 796 a2h::translate(config, hwcConfig); 797 a2h::translate(vsyncPeriodChangeConstraints, hwcConstraints); 798 RET_IF_ERR(halDisplay->setActiveConfigWithConstraints(hwcConfig, &hwcConstraints, &hwcTimeline)); 799 800 h2a::translate(hwcTimeline, *timeline); 801 return HWC2_ERROR_NONE; 802 } 803 setBootDisplayConfig(int64_t display,int32_t config)804 int32_t HalImpl::setBootDisplayConfig(int64_t display, int32_t config) { 805 ExynosDisplay* halDisplay; 806 RET_IF_ERR(getHalDisplay(display, halDisplay)); 807 808 return halDisplay->setBootDisplayConfig(config); 809 } 810 clearBootDisplayConfig(int64_t display)811 int32_t HalImpl::clearBootDisplayConfig(int64_t display) { 812 ExynosDisplay* halDisplay; 813 RET_IF_ERR(getHalDisplay(display, halDisplay)); 814 815 return halDisplay->clearBootDisplayConfig(); 816 } 817 getPreferredBootDisplayConfig(int64_t display,int32_t * config)818 int32_t HalImpl::getPreferredBootDisplayConfig(int64_t display, int32_t* config) { 819 ExynosDisplay* halDisplay; 820 RET_IF_ERR(getHalDisplay(display, halDisplay)); 821 822 return halDisplay->getPreferredBootDisplayConfig(config); 823 } 824 getHdrConversionCapabilities(std::vector<common::HdrConversionCapability> *)825 int32_t HalImpl::getHdrConversionCapabilities(std::vector<common::HdrConversionCapability>*) { 826 return HWC2_ERROR_UNSUPPORTED; 827 } 828 setHdrConversionStrategy(const common::HdrConversionStrategy &,common::Hdr *)829 int32_t HalImpl::setHdrConversionStrategy(const common::HdrConversionStrategy&, common::Hdr*) { 830 return HWC2_ERROR_UNSUPPORTED; 831 } 832 setAutoLowLatencyMode(int64_t display,bool on)833 int32_t HalImpl::setAutoLowLatencyMode(int64_t display, bool on) { 834 ExynosDisplay* halDisplay; 835 RET_IF_ERR(getHalDisplay(display, halDisplay)); 836 837 return halDisplay->setAutoLowLatencyMode(on); 838 } 839 setClientTarget(int64_t display,buffer_handle_t target,const ndk::ScopedFileDescriptor & fence,common::Dataspace dataspace,const std::vector<common::Rect> & damage)840 int32_t HalImpl::setClientTarget(int64_t display, buffer_handle_t target, 841 const ndk::ScopedFileDescriptor& fence, 842 common::Dataspace dataspace, 843 const std::vector<common::Rect>& damage) { 844 ExynosDisplay* halDisplay; 845 RET_IF_ERR(getHalDisplay(display, halDisplay)); 846 847 int32_t hwcFence; 848 int32_t hwcDataspace; 849 std::vector<hwc_rect_t> hwcDamage; 850 851 a2h::translate(fence, hwcFence); 852 a2h::translate(dataspace, hwcDataspace); 853 a2h::translate(damage, hwcDamage); 854 hwc_region_t region = { hwcDamage.size(), hwcDamage.data() }; 855 UNUSED(region); 856 857 return halDisplay->setClientTarget(target, hwcFence, hwcDataspace); 858 } 859 getHasClientComposition(int64_t display,bool & outHasClientComp)860 int32_t HalImpl::getHasClientComposition(int64_t display, bool& outHasClientComp) { 861 ExynosDisplay* halDisplay; 862 RET_IF_ERR(getHalDisplay(display, halDisplay)); 863 864 outHasClientComp = halDisplay->hasClientComposition(); 865 866 return HWC2_ERROR_NONE; 867 } 868 setColorMode(int64_t display,ColorMode mode,RenderIntent intent)869 int32_t HalImpl::setColorMode(int64_t display, ColorMode mode, RenderIntent intent) { 870 ExynosDisplay* halDisplay; 871 RET_IF_ERR(getHalDisplay(display, halDisplay)); 872 873 int32_t hwcMode; 874 int32_t hwcIntent; 875 876 a2h::translate(mode, hwcMode); 877 a2h::translate(intent, hwcIntent); 878 return halDisplay->setColorModeWithRenderIntent(hwcMode, hwcIntent); 879 } 880 setColorTransform(int64_t display,const std::vector<float> & matrix)881 int32_t HalImpl::setColorTransform(int64_t display, const std::vector<float>& matrix) { 882 // clang-format off 883 constexpr std::array<float, 16> kIdentity = { 884 1.0f, 0.0f, 0.0f, 0.0f, 885 0.0f, 1.0f, 0.0f, 0.0f, 886 0.0f, 0.0f, 1.0f, 0.0f, 887 0.0f, 0.0f, 0.0f, 1.0f, 888 }; 889 // clang-format on 890 const bool isIdentity = (std::equal(matrix.begin(), matrix.end(), kIdentity.begin())); 891 const common::ColorTransform hint = isIdentity ? common::ColorTransform::IDENTITY 892 : common::ColorTransform::ARBITRARY_MATRIX; 893 894 ExynosDisplay* halDisplay; 895 RET_IF_ERR(getHalDisplay(display, halDisplay)); 896 897 int32_t hwcHint; 898 a2h::translate(hint, hwcHint); 899 return halDisplay->setColorTransform(matrix.data(), hwcHint); 900 } 901 setContentType(int64_t display,ContentType contentType)902 int32_t HalImpl::setContentType(int64_t display, ContentType contentType) { 903 ExynosDisplay* halDisplay; 904 RET_IF_ERR(getHalDisplay(display, halDisplay)); 905 906 int32_t type; 907 a2h::translate(contentType, type); 908 return halDisplay->setContentType(type); 909 } 910 setDisplayBrightness(int64_t display,float brightness)911 int32_t HalImpl::setDisplayBrightness(int64_t display, float brightness) { 912 ExynosDisplay* halDisplay; 913 RET_IF_ERR(getHalDisplay(display, halDisplay)); 914 915 return halDisplay->setDisplayBrightness(brightness, true /* wait present */); 916 } 917 setDisplayedContentSamplingEnabled(int64_t display,bool enable,FormatColorComponent componentMask,int64_t maxFrames)918 int32_t HalImpl::setDisplayedContentSamplingEnabled( 919 [[maybe_unused]] int64_t display, 920 [[maybe_unused]] bool enable, 921 [[maybe_unused]] FormatColorComponent componentMask, 922 [[maybe_unused]] int64_t maxFrames) { 923 return HWC2_ERROR_UNSUPPORTED; 924 } 925 setLayerBlendMode(int64_t display,int64_t layer,common::BlendMode mode)926 int32_t HalImpl::setLayerBlendMode(int64_t display, int64_t layer, common::BlendMode mode) { 927 ExynosLayer *halLayer; 928 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 929 930 int32_t hwcMode; 931 a2h::translate(mode, hwcMode); 932 return halLayer->setLayerBlendMode(hwcMode); 933 } 934 setLayerBuffer(int64_t display,int64_t layer,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & acquireFence)935 int32_t HalImpl::setLayerBuffer(int64_t display, int64_t layer, buffer_handle_t buffer, 936 const ndk::ScopedFileDescriptor& acquireFence) { 937 ExynosLayer *halLayer; 938 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 939 940 int32_t hwcFd; 941 a2h::translate(acquireFence, hwcFd); 942 943 return halLayer->setLayerBuffer(buffer, hwcFd); 944 } 945 uncacheLayerBuffers(int64_t display,int64_t layer,const std::vector<buffer_handle_t> & buffers,std::vector<buffer_handle_t> & outClearableBuffers)946 int32_t HalImpl::uncacheLayerBuffers(int64_t display, int64_t layer, 947 const std::vector<buffer_handle_t>& buffers, 948 std::vector<buffer_handle_t>& outClearableBuffers) { 949 ExynosDisplay* halDisplay; 950 RET_IF_ERR(getHalDisplay(display, halDisplay)); 951 952 ExynosLayer* halLayer; 953 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 954 955 return halDisplay->uncacheLayerBuffers(halLayer, buffers, outClearableBuffers); 956 } 957 setLayerColor(int64_t display,int64_t layer,Color color)958 int32_t HalImpl::setLayerColor(int64_t display, int64_t layer, Color color) { 959 ExynosLayer *halLayer; 960 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 961 962 hwc_color_t hwcColor; 963 a2h::translate(color, hwcColor); 964 return halLayer->setLayerColor(hwcColor); 965 } 966 setLayerColorTransform(int64_t display,int64_t layer,const std::vector<float> & matrix)967 int32_t HalImpl::setLayerColorTransform(int64_t display, int64_t layer, 968 const std::vector<float>& matrix) { 969 ExynosLayer *halLayer; 970 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 971 972 return halLayer->setLayerColorTransform(matrix.data()); 973 } 974 setLayerCompositionType(int64_t display,int64_t layer,Composition type)975 int32_t HalImpl::setLayerCompositionType(int64_t display, int64_t layer, Composition type) { 976 ExynosLayer *halLayer; 977 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 978 979 int32_t hwcType; 980 a2h::translate(type, hwcType); 981 return halLayer->setLayerCompositionType(hwcType); 982 } 983 setLayerCursorPosition(int64_t display,int64_t layer,int32_t x,int32_t y)984 int32_t HalImpl::setLayerCursorPosition(int64_t display, int64_t layer, int32_t x, int32_t y) { 985 ExynosLayer *halLayer; 986 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 987 988 return halLayer->setCursorPosition(x, y); 989 } 990 setLayerDataspace(int64_t display,int64_t layer,common::Dataspace dataspace)991 int32_t HalImpl::setLayerDataspace(int64_t display, int64_t layer, common::Dataspace dataspace) { 992 ExynosLayer *halLayer; 993 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 994 995 int32_t hwcDataspace; 996 a2h::translate(dataspace, hwcDataspace); 997 return halLayer->setLayerDataspace(hwcDataspace); 998 } 999 setLayerDisplayFrame(int64_t display,int64_t layer,const common::Rect & frame)1000 int32_t HalImpl::setLayerDisplayFrame(int64_t display, int64_t layer, const common::Rect& frame) { 1001 ExynosLayer *halLayer; 1002 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1003 1004 hwc_rect_t hwcFrame; 1005 a2h::translate(frame, hwcFrame); 1006 return halLayer->setLayerDisplayFrame(hwcFrame); 1007 } 1008 setLayerPerFrameMetadata(int64_t display,int64_t layer,const std::vector<std::optional<PerFrameMetadata>> & metadata)1009 int32_t HalImpl::setLayerPerFrameMetadata(int64_t display, int64_t layer, 1010 const std::vector<std::optional<PerFrameMetadata>>& metadata) { 1011 ExynosLayer *halLayer; 1012 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1013 1014 uint32_t count = metadata.size(); 1015 std::vector<int32_t> keys; 1016 std::vector<float> values; 1017 1018 for (uint32_t ix = 0; ix < count; ++ix) { 1019 if (metadata[ix]) { 1020 int32_t key; 1021 a2h::translate(metadata[ix]->key, key); 1022 keys.push_back(key); 1023 values.push_back(metadata[ix]->value); 1024 } 1025 } 1026 1027 return halLayer->setLayerPerFrameMetadata(count, keys.data(), values.data()); 1028 } 1029 setLayerPerFrameMetadataBlobs(int64_t display,int64_t layer,const std::vector<std::optional<PerFrameMetadataBlob>> & blobs)1030 int32_t HalImpl::setLayerPerFrameMetadataBlobs(int64_t display, int64_t layer, 1031 const std::vector<std::optional<PerFrameMetadataBlob>>& blobs) { 1032 ExynosLayer *halLayer; 1033 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1034 1035 uint32_t count = blobs.size(); 1036 std::vector<int32_t> keys; 1037 std::vector<uint32_t> sizes; 1038 std::vector<uint8_t> values; 1039 1040 for (uint32_t ix = 0; ix < count; ++ix) { 1041 if (blobs[ix]) { 1042 int32_t key; 1043 a2h::translate(blobs[ix]->key, key); 1044 keys.push_back(key); 1045 sizes.push_back(blobs[ix]->blob.size()); 1046 values.insert(values.end(), blobs[ix]->blob.begin(), blobs[ix]->blob.end()); 1047 } 1048 } 1049 1050 return halLayer->setLayerPerFrameMetadataBlobs(count, keys.data(), sizes.data(), 1051 values.data()); 1052 } 1053 setLayerPlaneAlpha(int64_t display,int64_t layer,float alpha)1054 int32_t HalImpl::setLayerPlaneAlpha(int64_t display, int64_t layer, float alpha) { 1055 ExynosLayer *halLayer; 1056 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1057 1058 return halLayer->setLayerPlaneAlpha(alpha); 1059 } 1060 setLayerSidebandStream(int64_t display,int64_t layer,buffer_handle_t stream)1061 int32_t HalImpl::setLayerSidebandStream([[maybe_unused]] int64_t display, 1062 [[maybe_unused]] int64_t layer, 1063 [[maybe_unused]] buffer_handle_t stream) { 1064 return HWC2_ERROR_UNSUPPORTED; 1065 } 1066 setLayerSourceCrop(int64_t display,int64_t layer,const common::FRect & crop)1067 int32_t HalImpl::setLayerSourceCrop(int64_t display, int64_t layer, const common::FRect& crop) { 1068 ExynosLayer *halLayer; 1069 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1070 1071 hwc_frect_t hwcCrop; 1072 a2h::translate(crop, hwcCrop); 1073 return halLayer->setLayerSourceCrop(hwcCrop); 1074 } 1075 setLayerSurfaceDamage(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & damage)1076 int32_t HalImpl::setLayerSurfaceDamage(int64_t display, int64_t layer, 1077 const std::vector<std::optional<common::Rect>>& damage) { 1078 ExynosLayer *halLayer; 1079 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1080 1081 std::vector<hwc_rect_t> hwcDamage; 1082 a2h::translate(damage, hwcDamage); 1083 hwc_region_t region = { hwcDamage.size(), hwcDamage.data() }; 1084 1085 return halLayer->setLayerSurfaceDamage(region); 1086 } 1087 setLayerTransform(int64_t display,int64_t layer,common::Transform transform)1088 int32_t HalImpl::setLayerTransform(int64_t display, int64_t layer, common::Transform transform) { 1089 ExynosLayer *halLayer; 1090 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1091 1092 int32_t hwcTransform; 1093 a2h::translate(transform, hwcTransform); 1094 1095 return halLayer->setLayerTransform(hwcTransform); 1096 } 1097 setLayerVisibleRegion(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & visible)1098 int32_t HalImpl::setLayerVisibleRegion(int64_t display, int64_t layer, 1099 const std::vector<std::optional<common::Rect>>& visible) { 1100 ExynosLayer *halLayer; 1101 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1102 1103 std::vector<hwc_rect_t> hwcVisible; 1104 a2h::translate(visible, hwcVisible); 1105 hwc_region_t region = { hwcVisible.size(), hwcVisible.data() }; 1106 1107 return halLayer->setLayerVisibleRegion(region); 1108 } 1109 setLayerBrightness(int64_t display,int64_t layer,float brightness)1110 int32_t HalImpl::setLayerBrightness(int64_t display, int64_t layer, float brightness) { 1111 ExynosLayer *halLayer; 1112 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1113 1114 return halLayer->setLayerBrightness(brightness); 1115 } 1116 setLayerZOrder(int64_t display,int64_t layer,uint32_t z)1117 int32_t HalImpl::setLayerZOrder(int64_t display, int64_t layer, uint32_t z) { 1118 ExynosLayer *halLayer; 1119 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1120 1121 return halLayer->setLayerZOrder(z); 1122 } 1123 setOutputBuffer(int64_t display,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & releaseFence)1124 int32_t HalImpl::setOutputBuffer(int64_t display, buffer_handle_t buffer, 1125 const ndk::ScopedFileDescriptor& releaseFence) { 1126 ExynosDisplay* halDisplay; 1127 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1128 1129 int32_t hwcFence; 1130 a2h::translate(releaseFence, hwcFence); 1131 1132 auto err = halDisplay->setOutputBuffer(buffer, hwcFence); 1133 // unlike in setClientTarget, releaseFence is owned by us 1134 if (err == HWC2_ERROR_NONE && hwcFence >= 0) { 1135 close(hwcFence); 1136 } 1137 1138 return err; 1139 } 1140 setPowerMode(int64_t display,PowerMode mode)1141 int32_t HalImpl::setPowerMode(int64_t display, PowerMode mode) { 1142 if (mode == PowerMode::ON_SUSPEND || mode == PowerMode::DOZE_SUSPEND) { 1143 return HWC2_ERROR_UNSUPPORTED; 1144 } 1145 1146 ExynosDisplay* halDisplay; 1147 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1148 1149 int32_t hwcMode; 1150 a2h::translate(mode, hwcMode); 1151 return halDisplay->setPowerMode(hwcMode); 1152 } 1153 getPowerMode(int64_t display,std::optional<PowerMode> & outMode)1154 int32_t HalImpl::getPowerMode(int64_t display, std::optional<PowerMode>& outMode) { 1155 ExynosDisplay* halDisplay; 1156 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1157 1158 auto mode = halDisplay->getPowerMode(); 1159 h2a::translate(mode, outMode); 1160 return HWC2_ERROR_NONE; 1161 } 1162 setReadbackBuffer(int64_t display,buffer_handle_t buffer,const ndk::ScopedFileDescriptor & releaseFence)1163 int32_t HalImpl::setReadbackBuffer(int64_t display, buffer_handle_t buffer, 1164 const ndk::ScopedFileDescriptor& releaseFence) { 1165 ExynosDisplay* halDisplay; 1166 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1167 1168 int32_t hwcFence; 1169 a2h::translate(releaseFence, hwcFence); 1170 1171 return halDisplay->setReadbackBuffer(buffer, hwcFence); 1172 } 1173 setVsyncEnabled(int64_t display,bool enabled)1174 int32_t HalImpl::setVsyncEnabled(int64_t display, bool enabled) { 1175 ExynosDisplay* halDisplay; 1176 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1177 1178 hwc2_vsync_t hwcEnable; 1179 a2h::translate(enabled, hwcEnable); 1180 return halDisplay->setVsyncEnabled(hwcEnable); 1181 } 1182 setIdleTimerEnabled(int64_t display,int32_t timeout)1183 int32_t HalImpl::setIdleTimerEnabled(int64_t display, int32_t timeout) { 1184 ExynosDisplay* halDisplay; 1185 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1186 1187 return halDisplay->setDisplayIdleTimer(timeout); 1188 } 1189 validateDisplay(int64_t display,std::vector<int64_t> * outChangedLayers,std::vector<Composition> * outCompositionTypes,uint32_t * outDisplayRequestMask,std::vector<int64_t> * outRequestedLayers,std::vector<int32_t> * outRequestMasks,ClientTargetProperty * outClientTargetProperty,DimmingStage * outDimmingStage)1190 int32_t HalImpl::validateDisplay(int64_t display, std::vector<int64_t>* outChangedLayers, 1191 std::vector<Composition>* outCompositionTypes, 1192 uint32_t* outDisplayRequestMask, 1193 std::vector<int64_t>* outRequestedLayers, 1194 std::vector<int32_t>* outRequestMasks, 1195 ClientTargetProperty* outClientTargetProperty, 1196 DimmingStage* outDimmingStage) { 1197 ExynosDisplay* halDisplay; 1198 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1199 1200 uint32_t typesCount = 0; 1201 uint32_t reqsCount = 0; 1202 auto err = halDisplay->validateDisplay(&typesCount, &reqsCount); 1203 1204 if (err != HWC2_ERROR_NONE && err != HWC2_ERROR_HAS_CHANGES) { 1205 return err; 1206 } 1207 1208 std::vector<hwc2_layer_t> hwcChangedLayers(typesCount); 1209 std::vector<int32_t> hwcCompositionTypes(typesCount); 1210 RET_IF_ERR(halDisplay->getChangedCompositionTypes(&typesCount, hwcChangedLayers.data(), 1211 hwcCompositionTypes.data())); 1212 1213 int32_t displayReqs; 1214 std::vector<hwc2_layer_t> hwcRequestedLayers(reqsCount); 1215 outRequestMasks->resize(reqsCount); 1216 RET_IF_ERR(halDisplay->getDisplayRequests(&displayReqs, &reqsCount, 1217 hwcRequestedLayers.data(), outRequestMasks->data())); 1218 std::vector<int64_t> sfChangedLayers(typesCount); 1219 1220 for (int i = 0; i < typesCount; i++) { 1221 auto iter = mHalLayerToSfLayerMap.find(hwcChangedLayers[i]); 1222 if (iter != mHalLayerToSfLayerMap.end()) { 1223 sfChangedLayers[i] = iter->second; 1224 } else { 1225 LOG(ERROR) << "HalImpl::validateDisplay incorrect hal mapping. "; 1226 } 1227 } 1228 h2a::translate(sfChangedLayers, *outChangedLayers); 1229 h2a::translate(hwcCompositionTypes, *outCompositionTypes); 1230 *outDisplayRequestMask = displayReqs; 1231 std::vector<int64_t> sfRequestedLayers(reqsCount); 1232 1233 for (int i = 0; i < reqsCount; i++) { 1234 auto iter = mHalLayerToSfLayerMap.find(hwcRequestedLayers[i]); 1235 if (iter != mHalLayerToSfLayerMap.end()) { 1236 sfRequestedLayers[i] = iter->second; 1237 } else { 1238 LOG(ERROR) << "HalImpl::validateDisplay incorrect hal mapping. "; 1239 } 1240 } 1241 h2a::translate(sfRequestedLayers, *outRequestedLayers); 1242 hwc_client_target_property hwcProperty; 1243 HwcDimmingStage hwcDimmingStage; 1244 if (!halDisplay->getClientTargetProperty(&hwcProperty, &hwcDimmingStage)) { 1245 h2a::translate(hwcDimmingStage, *outDimmingStage); 1246 h2a::translate(hwcProperty, *outClientTargetProperty); 1247 } // else ignore this error 1248 1249 return err; 1250 } 1251 setExpectedPresentTime(int64_t display,const std::optional<ClockMonotonicTimestamp> expectedPresentTime,int frameIntervalNs)1252 int HalImpl::setExpectedPresentTime( 1253 int64_t display, const std::optional<ClockMonotonicTimestamp> expectedPresentTime, 1254 int frameIntervalNs) { 1255 ExynosDisplay* halDisplay; 1256 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1257 1258 if (!expectedPresentTime.has_value()) return HWC2_ERROR_NONE; 1259 1260 if (halDisplay->getPendingExpectedPresentTime() != 0) { 1261 ALOGW("HalImpl: set expected present time multiple times in one frame"); 1262 } 1263 1264 halDisplay->setExpectedPresentTime(expectedPresentTime->timestampNanos, frameIntervalNs); 1265 1266 return HWC2_ERROR_NONE; 1267 } 1268 getRCDLayerSupport(int64_t display,bool & outSupport)1269 int32_t HalImpl::getRCDLayerSupport(int64_t display, bool& outSupport) { 1270 ExynosDisplay* halDisplay; 1271 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1272 1273 return halDisplay->getRCDLayerSupport(outSupport); 1274 } 1275 setLayerBlockingRegion(int64_t display,int64_t layer,const std::vector<std::optional<common::Rect>> & blockingRegion)1276 int32_t HalImpl::setLayerBlockingRegion( 1277 int64_t display, int64_t layer, 1278 const std::vector<std::optional<common::Rect>>& blockingRegion) { 1279 ExynosLayer* halLayer; 1280 RET_IF_ERR(getHalLayer(display, layer, halLayer)); 1281 1282 std::vector<hwc_rect_t> halBlockingRegion; 1283 a2h::translate(blockingRegion, halBlockingRegion); 1284 1285 return halLayer->setLayerBlockingRegion(halBlockingRegion); 1286 } 1287 getDisplayIdleTimerSupport(int64_t display,bool & outSupport)1288 int32_t HalImpl::getDisplayIdleTimerSupport(int64_t display, bool& outSupport) { 1289 ExynosDisplay* halDisplay; 1290 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1291 1292 return halDisplay->getDisplayIdleTimerSupport(outSupport); 1293 } 1294 getDisplayMultiThreadedPresentSupport(const int64_t & display,bool & outSupport)1295 int32_t HalImpl::getDisplayMultiThreadedPresentSupport(const int64_t& display, bool& outSupport) { 1296 ExynosDisplay* halDisplay; 1297 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1298 1299 return halDisplay->getDisplayMultiThreadedPresentSupport(outSupport); 1300 } 1301 setRefreshRateChangedCallbackDebugEnabled(int64_t display,bool enabled)1302 int32_t HalImpl::setRefreshRateChangedCallbackDebugEnabled(int64_t display, bool enabled) { 1303 ExynosDisplay* halDisplay; 1304 RET_IF_ERR(getHalDisplay(display, halDisplay)); 1305 1306 return halDisplay->setRefreshRateChangedCallbackDebugEnabled(enabled); 1307 } 1308 1309 } // namespace aidl::android::hardware::graphics::composer3::impl 1310