1 /* 2 * Copyright 2016 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 #undef LOG_TAG 18 #define LOG_TAG "HwcComposer" 19 20 #include <inttypes.h> 21 #include <log/log.h> 22 23 #include "ComposerHal.h" 24 25 #include <composer-command-buffer/2.2/ComposerCommandBuffer.h> 26 #include <gui/BufferQueue.h> 27 #include <hidl/HidlTransportUtils.h> 28 29 namespace android { 30 31 using hardware::Return; 32 using hardware::hidl_vec; 33 using hardware::hidl_handle; 34 35 namespace Hwc2 { 36 37 Composer::~Composer() = default; 38 39 namespace { 40 41 class BufferHandle { 42 public: 43 explicit BufferHandle(const native_handle_t* buffer) { 44 // nullptr is not a valid handle to HIDL 45 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0); 46 } 47 48 operator const hidl_handle&() const // NOLINT(google-explicit-constructor) 49 { 50 return mHandle; 51 } 52 53 private: 54 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0); 55 hidl_handle mHandle; 56 }; 57 58 class FenceHandle 59 { 60 public: 61 FenceHandle(int fd, bool owned) 62 : mOwned(owned) 63 { 64 native_handle_t* handle; 65 if (fd >= 0) { 66 handle = native_handle_init(mStorage, 1, 0); 67 handle->data[0] = fd; 68 } else { 69 // nullptr is not a valid handle to HIDL 70 handle = native_handle_init(mStorage, 0, 0); 71 } 72 mHandle = handle; 73 } 74 75 ~FenceHandle() 76 { 77 if (mOwned) { 78 native_handle_close(mHandle); 79 } 80 } 81 82 operator const hidl_handle&() const // NOLINT(google-explicit-constructor) 83 { 84 return mHandle; 85 } 86 87 private: 88 bool mOwned; 89 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0); 90 hidl_handle mHandle; 91 }; 92 93 // assume NO_RESOURCES when Status::isOk returns false 94 constexpr Error kDefaultError = Error::NO_RESOURCES; 95 96 template<typename T, typename U> 97 T unwrapRet(Return<T>& ret, const U& default_val) 98 { 99 return (ret.isOk()) ? static_cast<T>(ret) : 100 static_cast<T>(default_val); 101 } 102 103 Error unwrapRet(Return<Error>& ret) 104 { 105 return unwrapRet(ret, kDefaultError); 106 } 107 108 } // anonymous namespace 109 110 namespace impl { 111 112 Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize) 113 : CommandWriterBase(initialMaxSize) {} 114 115 Composer::CommandWriter::~CommandWriter() 116 { 117 } 118 119 void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId) 120 { 121 constexpr uint16_t kSetLayerInfoLength = 2; 122 beginCommand(static_cast<V2_1::IComposerClient::Command>( 123 IVrComposerClient::VrCommand::SET_LAYER_INFO), 124 kSetLayerInfoLength); 125 write(type); 126 write(appId); 127 endCommand(); 128 } 129 130 void Composer::CommandWriter::setClientTargetMetadata( 131 const IVrComposerClient::BufferMetadata& metadata) 132 { 133 constexpr uint16_t kSetClientTargetMetadataLength = 7; 134 beginCommand(static_cast<V2_1::IComposerClient::Command>( 135 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA), 136 kSetClientTargetMetadataLength); 137 writeBufferMetadata(metadata); 138 endCommand(); 139 } 140 141 void Composer::CommandWriter::setLayerBufferMetadata( 142 const IVrComposerClient::BufferMetadata& metadata) 143 { 144 constexpr uint16_t kSetLayerBufferMetadataLength = 7; 145 beginCommand(static_cast<V2_1::IComposerClient::Command>( 146 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA), 147 kSetLayerBufferMetadataLength); 148 writeBufferMetadata(metadata); 149 endCommand(); 150 } 151 152 void Composer::CommandWriter::writeBufferMetadata( 153 const IVrComposerClient::BufferMetadata& metadata) 154 { 155 write(metadata.width); 156 write(metadata.height); 157 write(metadata.stride); 158 write(metadata.layerCount); 159 writeSigned(static_cast<int32_t>(metadata.format)); 160 write64(metadata.usage); 161 } 162 163 Composer::Composer(const std::string& serviceName) 164 : mWriter(kWriterInitialSize), 165 mIsUsingVrComposer(serviceName == std::string("vr")) 166 { 167 mComposer = V2_1::IComposer::getService(serviceName); 168 169 if (mComposer == nullptr) { 170 LOG_ALWAYS_FATAL("failed to get hwcomposer service"); 171 } 172 173 if (sp<IComposer> composer_2_3 = IComposer::castFrom(mComposer)) { 174 composer_2_3->createClient_2_3([&](const auto& tmpError, const auto& tmpClient) { 175 if (tmpError == Error::NONE) { 176 mClient = tmpClient; 177 mClient_2_2 = tmpClient; 178 mClient_2_3 = tmpClient; 179 } 180 }); 181 } else { 182 mComposer->createClient([&](const auto& tmpError, const auto& tmpClient) { 183 if (tmpError != Error::NONE) { 184 return; 185 } 186 187 mClient = tmpClient; 188 if (sp<V2_2::IComposer> composer_2_2 = V2_2::IComposer::castFrom(mComposer)) { 189 mClient_2_2 = V2_2::IComposerClient::castFrom(mClient); 190 LOG_ALWAYS_FATAL_IF(mClient_2_2 == nullptr, 191 "IComposer 2.2 did not return IComposerClient 2.2"); 192 } 193 }); 194 } 195 196 if (mClient == nullptr) { 197 LOG_ALWAYS_FATAL("failed to create composer client"); 198 } 199 200 if (mIsUsingVrComposer) { 201 sp<IVrComposerClient> vrClient = IVrComposerClient::castFrom(mClient); 202 if (vrClient == nullptr) { 203 LOG_ALWAYS_FATAL("failed to create vr composer client"); 204 } 205 } 206 } 207 208 Composer::~Composer() = default; 209 210 std::vector<IComposer::Capability> Composer::getCapabilities() 211 { 212 std::vector<IComposer::Capability> capabilities; 213 mComposer->getCapabilities( 214 [&](const auto& tmpCapabilities) { 215 capabilities = tmpCapabilities; 216 }); 217 return capabilities; 218 } 219 220 std::string Composer::dumpDebugInfo() 221 { 222 std::string info; 223 mComposer->dumpDebugInfo([&](const auto& tmpInfo) { 224 info = tmpInfo.c_str(); 225 }); 226 227 return info; 228 } 229 230 void Composer::registerCallback(const sp<IComposerCallback>& callback) 231 { 232 auto ret = mClient->registerCallback(callback); 233 if (!ret.isOk()) { 234 ALOGE("failed to register IComposerCallback"); 235 } 236 } 237 238 bool Composer::isRemote() { 239 return mClient->isRemote(); 240 } 241 242 void Composer::resetCommands() { 243 mWriter.reset(); 244 } 245 246 Error Composer::executeCommands() { 247 return execute(); 248 } 249 250 uint32_t Composer::getMaxVirtualDisplayCount() 251 { 252 auto ret = mClient->getMaxVirtualDisplayCount(); 253 return unwrapRet(ret, 0); 254 } 255 256 Error Composer::createVirtualDisplay(uint32_t width, uint32_t height, 257 PixelFormat* format, Display* outDisplay) 258 { 259 const uint32_t bufferSlotCount = 1; 260 Error error = kDefaultError; 261 if (mClient_2_2) { 262 mClient_2_2->createVirtualDisplay_2_2(width, height, 263 static_cast<types::V1_1::PixelFormat>(*format), 264 bufferSlotCount, 265 [&](const auto& tmpError, const auto& tmpDisplay, 266 const auto& tmpFormat) { 267 error = tmpError; 268 if (error != Error::NONE) { 269 return; 270 } 271 272 *outDisplay = tmpDisplay; 273 *format = static_cast<types::V1_2::PixelFormat>( 274 tmpFormat); 275 }); 276 } else { 277 mClient->createVirtualDisplay(width, height, 278 static_cast<types::V1_0::PixelFormat>(*format), bufferSlotCount, 279 [&](const auto& tmpError, const auto& tmpDisplay, 280 const auto& tmpFormat) { 281 error = tmpError; 282 if (error != Error::NONE) { 283 return; 284 } 285 286 *outDisplay = tmpDisplay; 287 *format = static_cast<PixelFormat>(tmpFormat); 288 }); 289 } 290 291 return error; 292 } 293 294 Error Composer::destroyVirtualDisplay(Display display) 295 { 296 auto ret = mClient->destroyVirtualDisplay(display); 297 return unwrapRet(ret); 298 } 299 300 Error Composer::acceptDisplayChanges(Display display) 301 { 302 mWriter.selectDisplay(display); 303 mWriter.acceptDisplayChanges(); 304 return Error::NONE; 305 } 306 307 Error Composer::createLayer(Display display, Layer* outLayer) 308 { 309 Error error = kDefaultError; 310 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS, 311 [&](const auto& tmpError, const auto& tmpLayer) { 312 error = tmpError; 313 if (error != Error::NONE) { 314 return; 315 } 316 317 *outLayer = tmpLayer; 318 }); 319 320 return error; 321 } 322 323 Error Composer::destroyLayer(Display display, Layer layer) 324 { 325 auto ret = mClient->destroyLayer(display, layer); 326 return unwrapRet(ret); 327 } 328 329 Error Composer::getActiveConfig(Display display, Config* outConfig) 330 { 331 Error error = kDefaultError; 332 mClient->getActiveConfig(display, 333 [&](const auto& tmpError, const auto& tmpConfig) { 334 error = tmpError; 335 if (error != Error::NONE) { 336 return; 337 } 338 339 *outConfig = tmpConfig; 340 }); 341 342 return error; 343 } 344 345 Error Composer::getChangedCompositionTypes(Display display, 346 std::vector<Layer>* outLayers, 347 std::vector<IComposerClient::Composition>* outTypes) 348 { 349 mReader.takeChangedCompositionTypes(display, outLayers, outTypes); 350 return Error::NONE; 351 } 352 353 Error Composer::getColorModes(Display display, 354 std::vector<ColorMode>* outModes) 355 { 356 Error error = kDefaultError; 357 358 if (mClient_2_3) { 359 mClient_2_3->getColorModes_2_3(display, [&](const auto& tmpError, const auto& tmpModes) { 360 error = tmpError; 361 if (error != Error::NONE) { 362 return; 363 } 364 365 *outModes = tmpModes; 366 }); 367 } else if (mClient_2_2) { 368 mClient_2_2->getColorModes_2_2(display, [&](const auto& tmpError, const auto& tmpModes) { 369 error = tmpError; 370 if (error != Error::NONE) { 371 return; 372 } 373 374 for (types::V1_1::ColorMode colorMode : tmpModes) { 375 outModes->push_back(static_cast<ColorMode>(colorMode)); 376 } 377 }); 378 } else { 379 mClient->getColorModes(display, 380 [&](const auto& tmpError, const auto& tmpModes) { 381 error = tmpError; 382 if (error != Error::NONE) { 383 return; 384 } 385 for (types::V1_0::ColorMode colorMode : tmpModes) { 386 outModes->push_back(static_cast<ColorMode>(colorMode)); 387 } 388 }); 389 } 390 391 return error; 392 } 393 394 Error Composer::getDisplayAttribute(Display display, Config config, 395 IComposerClient::Attribute attribute, int32_t* outValue) 396 { 397 Error error = kDefaultError; 398 mClient->getDisplayAttribute(display, config, attribute, 399 [&](const auto& tmpError, const auto& tmpValue) { 400 error = tmpError; 401 if (error != Error::NONE) { 402 return; 403 } 404 405 *outValue = tmpValue; 406 }); 407 408 return error; 409 } 410 411 Error Composer::getDisplayConfigs(Display display, 412 std::vector<Config>* outConfigs) 413 { 414 Error error = kDefaultError; 415 mClient->getDisplayConfigs(display, 416 [&](const auto& tmpError, const auto& tmpConfigs) { 417 error = tmpError; 418 if (error != Error::NONE) { 419 return; 420 } 421 422 *outConfigs = tmpConfigs; 423 }); 424 425 return error; 426 } 427 428 Error Composer::getDisplayName(Display display, std::string* outName) 429 { 430 Error error = kDefaultError; 431 mClient->getDisplayName(display, 432 [&](const auto& tmpError, const auto& tmpName) { 433 error = tmpError; 434 if (error != Error::NONE) { 435 return; 436 } 437 438 *outName = tmpName.c_str(); 439 }); 440 441 return error; 442 } 443 444 Error Composer::getDisplayRequests(Display display, 445 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 446 std::vector<uint32_t>* outLayerRequestMasks) 447 { 448 mReader.takeDisplayRequests(display, outDisplayRequestMask, 449 outLayers, outLayerRequestMasks); 450 return Error::NONE; 451 } 452 453 Error Composer::getDisplayType(Display display, 454 IComposerClient::DisplayType* outType) 455 { 456 Error error = kDefaultError; 457 mClient->getDisplayType(display, 458 [&](const auto& tmpError, const auto& tmpType) { 459 error = tmpError; 460 if (error != Error::NONE) { 461 return; 462 } 463 464 *outType = tmpType; 465 }); 466 467 return error; 468 } 469 470 Error Composer::getDozeSupport(Display display, bool* outSupport) 471 { 472 Error error = kDefaultError; 473 mClient->getDozeSupport(display, 474 [&](const auto& tmpError, const auto& tmpSupport) { 475 error = tmpError; 476 if (error != Error::NONE) { 477 return; 478 } 479 480 *outSupport = tmpSupport; 481 }); 482 483 return error; 484 } 485 486 Error Composer::getHdrCapabilities(Display display, 487 std::vector<Hdr>* outTypes, float* outMaxLuminance, 488 float* outMaxAverageLuminance, float* outMinLuminance) 489 { 490 Error error = kDefaultError; 491 if (mClient_2_3) { 492 mClient_2_3->getHdrCapabilities_2_3(display, 493 [&](const auto& tmpError, const auto& tmpTypes, 494 const auto& tmpMaxLuminance, 495 const auto& tmpMaxAverageLuminance, 496 const auto& tmpMinLuminance) { 497 error = tmpError; 498 if (error != Error::NONE) { 499 return; 500 } 501 502 *outTypes = tmpTypes; 503 *outMaxLuminance = tmpMaxLuminance; 504 *outMaxAverageLuminance = tmpMaxAverageLuminance; 505 *outMinLuminance = tmpMinLuminance; 506 }); 507 } else { 508 mClient->getHdrCapabilities(display, 509 [&](const auto& tmpError, const auto& tmpTypes, 510 const auto& tmpMaxLuminance, 511 const auto& tmpMaxAverageLuminance, 512 const auto& tmpMinLuminance) { 513 error = tmpError; 514 if (error != Error::NONE) { 515 return; 516 } 517 518 outTypes->clear(); 519 for (auto type : tmpTypes) { 520 outTypes->push_back(static_cast<Hdr>(type)); 521 } 522 523 *outMaxLuminance = tmpMaxLuminance; 524 *outMaxAverageLuminance = tmpMaxAverageLuminance; 525 *outMinLuminance = tmpMinLuminance; 526 }); 527 } 528 529 return error; 530 } 531 532 Error Composer::getReleaseFences(Display display, 533 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 534 { 535 mReader.takeReleaseFences(display, outLayers, outReleaseFences); 536 return Error::NONE; 537 } 538 539 Error Composer::presentDisplay(Display display, int* outPresentFence) 540 { 541 mWriter.selectDisplay(display); 542 mWriter.presentDisplay(); 543 544 Error error = execute(); 545 if (error != Error::NONE) { 546 return error; 547 } 548 549 mReader.takePresentFence(display, outPresentFence); 550 551 return Error::NONE; 552 } 553 554 Error Composer::setActiveConfig(Display display, Config config) 555 { 556 auto ret = mClient->setActiveConfig(display, config); 557 return unwrapRet(ret); 558 } 559 560 Error Composer::setClientTarget(Display display, uint32_t slot, 561 const sp<GraphicBuffer>& target, 562 int acquireFence, Dataspace dataspace, 563 const std::vector<IComposerClient::Rect>& damage) 564 { 565 mWriter.selectDisplay(display); 566 if (mIsUsingVrComposer && target.get()) { 567 IVrComposerClient::BufferMetadata metadata = { 568 .width = target->getWidth(), 569 .height = target->getHeight(), 570 .stride = target->getStride(), 571 .layerCount = target->getLayerCount(), 572 .format = static_cast<types::V1_0::PixelFormat>(target->getPixelFormat()), 573 .usage = target->getUsage(), 574 }; 575 mWriter.setClientTargetMetadata(metadata); 576 } 577 578 const native_handle_t* handle = nullptr; 579 if (target.get()) { 580 handle = target->getNativeBuffer()->handle; 581 } 582 583 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage); 584 return Error::NONE; 585 } 586 587 Error Composer::setColorMode(Display display, ColorMode mode, 588 RenderIntent renderIntent) 589 { 590 hardware::Return<Error> ret(kDefaultError); 591 if (mClient_2_3) { 592 ret = mClient_2_3->setColorMode_2_3(display, mode, renderIntent); 593 } else if (mClient_2_2) { 594 ret = mClient_2_2->setColorMode_2_2(display, static_cast<types::V1_1::ColorMode>(mode), 595 renderIntent); 596 } else { 597 ret = mClient->setColorMode(display, 598 static_cast<types::V1_0::ColorMode>(mode)); 599 } 600 return unwrapRet(ret); 601 } 602 603 Error Composer::setColorTransform(Display display, const float* matrix, 604 ColorTransform hint) 605 { 606 mWriter.selectDisplay(display); 607 mWriter.setColorTransform(matrix, hint); 608 return Error::NONE; 609 } 610 611 Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer, 612 int releaseFence) 613 { 614 mWriter.selectDisplay(display); 615 mWriter.setOutputBuffer(0, buffer, dup(releaseFence)); 616 return Error::NONE; 617 } 618 619 Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) { 620 Return<Error> ret(Error::UNSUPPORTED); 621 if (mClient_2_2) { 622 ret = mClient_2_2->setPowerMode_2_2(display, mode); 623 } else if (mode != IComposerClient::PowerMode::ON_SUSPEND) { 624 ret = mClient->setPowerMode(display, static_cast<V2_1::IComposerClient::PowerMode>(mode)); 625 } 626 627 return unwrapRet(ret); 628 } 629 630 Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) 631 { 632 auto ret = mClient->setVsyncEnabled(display, enabled); 633 return unwrapRet(ret); 634 } 635 636 Error Composer::setClientTargetSlotCount(Display display) 637 { 638 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS; 639 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount); 640 return unwrapRet(ret); 641 } 642 643 Error Composer::validateDisplay(Display display, uint32_t* outNumTypes, 644 uint32_t* outNumRequests) 645 { 646 mWriter.selectDisplay(display); 647 mWriter.validateDisplay(); 648 649 Error error = execute(); 650 if (error != Error::NONE) { 651 return error; 652 } 653 654 mReader.hasChanges(display, outNumTypes, outNumRequests); 655 656 return Error::NONE; 657 } 658 659 Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes, 660 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) { 661 mWriter.selectDisplay(display); 662 mWriter.presentOrvalidateDisplay(); 663 664 Error error = execute(); 665 if (error != Error::NONE) { 666 return error; 667 } 668 669 mReader.takePresentOrValidateStage(display, state); 670 671 if (*state == 1) { // Present succeeded 672 mReader.takePresentFence(display, outPresentFence); 673 } 674 675 if (*state == 0) { // Validate succeeded. 676 mReader.hasChanges(display, outNumTypes, outNumRequests); 677 } 678 679 return Error::NONE; 680 } 681 682 Error Composer::setCursorPosition(Display display, Layer layer, 683 int32_t x, int32_t y) 684 { 685 mWriter.selectDisplay(display); 686 mWriter.selectLayer(layer); 687 mWriter.setLayerCursorPosition(x, y); 688 return Error::NONE; 689 } 690 691 Error Composer::setLayerBuffer(Display display, Layer layer, 692 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence) 693 { 694 mWriter.selectDisplay(display); 695 mWriter.selectLayer(layer); 696 if (mIsUsingVrComposer && buffer.get()) { 697 IVrComposerClient::BufferMetadata metadata = { 698 .width = buffer->getWidth(), 699 .height = buffer->getHeight(), 700 .stride = buffer->getStride(), 701 .layerCount = buffer->getLayerCount(), 702 .format = static_cast<types::V1_0::PixelFormat>(buffer->getPixelFormat()), 703 .usage = buffer->getUsage(), 704 }; 705 mWriter.setLayerBufferMetadata(metadata); 706 } 707 708 const native_handle_t* handle = nullptr; 709 if (buffer.get()) { 710 handle = buffer->getNativeBuffer()->handle; 711 } 712 713 mWriter.setLayerBuffer(slot, handle, acquireFence); 714 return Error::NONE; 715 } 716 717 Error Composer::setLayerSurfaceDamage(Display display, Layer layer, 718 const std::vector<IComposerClient::Rect>& damage) 719 { 720 mWriter.selectDisplay(display); 721 mWriter.selectLayer(layer); 722 mWriter.setLayerSurfaceDamage(damage); 723 return Error::NONE; 724 } 725 726 Error Composer::setLayerBlendMode(Display display, Layer layer, 727 IComposerClient::BlendMode mode) 728 { 729 mWriter.selectDisplay(display); 730 mWriter.selectLayer(layer); 731 mWriter.setLayerBlendMode(mode); 732 return Error::NONE; 733 } 734 735 Error Composer::setLayerColor(Display display, Layer layer, 736 const IComposerClient::Color& color) 737 { 738 mWriter.selectDisplay(display); 739 mWriter.selectLayer(layer); 740 mWriter.setLayerColor(color); 741 return Error::NONE; 742 } 743 744 Error Composer::setLayerCompositionType(Display display, Layer layer, 745 IComposerClient::Composition type) 746 { 747 mWriter.selectDisplay(display); 748 mWriter.selectLayer(layer); 749 mWriter.setLayerCompositionType(type); 750 return Error::NONE; 751 } 752 753 Error Composer::setLayerDataspace(Display display, Layer layer, 754 Dataspace dataspace) 755 { 756 mWriter.selectDisplay(display); 757 mWriter.selectLayer(layer); 758 mWriter.setLayerDataspace(dataspace); 759 return Error::NONE; 760 } 761 762 Error Composer::setLayerDisplayFrame(Display display, Layer layer, 763 const IComposerClient::Rect& frame) 764 { 765 mWriter.selectDisplay(display); 766 mWriter.selectLayer(layer); 767 mWriter.setLayerDisplayFrame(frame); 768 return Error::NONE; 769 } 770 771 Error Composer::setLayerPlaneAlpha(Display display, Layer layer, 772 float alpha) 773 { 774 mWriter.selectDisplay(display); 775 mWriter.selectLayer(layer); 776 mWriter.setLayerPlaneAlpha(alpha); 777 return Error::NONE; 778 } 779 780 Error Composer::setLayerSidebandStream(Display display, Layer layer, 781 const native_handle_t* stream) 782 { 783 mWriter.selectDisplay(display); 784 mWriter.selectLayer(layer); 785 mWriter.setLayerSidebandStream(stream); 786 return Error::NONE; 787 } 788 789 Error Composer::setLayerSourceCrop(Display display, Layer layer, 790 const IComposerClient::FRect& crop) 791 { 792 mWriter.selectDisplay(display); 793 mWriter.selectLayer(layer); 794 mWriter.setLayerSourceCrop(crop); 795 return Error::NONE; 796 } 797 798 Error Composer::setLayerTransform(Display display, Layer layer, 799 Transform transform) 800 { 801 mWriter.selectDisplay(display); 802 mWriter.selectLayer(layer); 803 mWriter.setLayerTransform(transform); 804 return Error::NONE; 805 } 806 807 Error Composer::setLayerVisibleRegion(Display display, Layer layer, 808 const std::vector<IComposerClient::Rect>& visible) 809 { 810 mWriter.selectDisplay(display); 811 mWriter.selectLayer(layer); 812 mWriter.setLayerVisibleRegion(visible); 813 return Error::NONE; 814 } 815 816 Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z) 817 { 818 mWriter.selectDisplay(display); 819 mWriter.selectLayer(layer); 820 mWriter.setLayerZOrder(z); 821 return Error::NONE; 822 } 823 824 Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type, 825 uint32_t appId) 826 { 827 if (mIsUsingVrComposer) { 828 mWriter.selectDisplay(display); 829 mWriter.selectLayer(layer); 830 mWriter.setLayerInfo(type, appId); 831 } 832 return Error::NONE; 833 } 834 835 Error Composer::execute() 836 { 837 // prepare input command queue 838 bool queueChanged = false; 839 uint32_t commandLength = 0; 840 hidl_vec<hidl_handle> commandHandles; 841 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) { 842 mWriter.reset(); 843 return Error::NO_RESOURCES; 844 } 845 846 // set up new input command queue if necessary 847 if (queueChanged) { 848 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor()); 849 auto error = unwrapRet(ret); 850 if (error != Error::NONE) { 851 mWriter.reset(); 852 return error; 853 } 854 } 855 856 if (commandLength == 0) { 857 mWriter.reset(); 858 return Error::NONE; 859 } 860 861 Error error = kDefaultError; 862 hardware::Return<void> ret; 863 auto hidl_callback = [&](const auto& tmpError, const auto& tmpOutChanged, 864 const auto& tmpOutLength, const auto& tmpOutHandles) 865 { 866 error = tmpError; 867 868 // set up new output command queue if necessary 869 if (error == Error::NONE && tmpOutChanged) { 870 error = kDefaultError; 871 mClient->getOutputCommandQueue( 872 [&](const auto& tmpError, 873 const auto& tmpDescriptor) 874 { 875 error = tmpError; 876 if (error != Error::NONE) { 877 return; 878 } 879 880 mReader.setMQDescriptor(tmpDescriptor); 881 }); 882 } 883 884 if (error != Error::NONE) { 885 return; 886 } 887 888 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) { 889 error = mReader.parse(); 890 mReader.reset(); 891 } else { 892 error = Error::NO_RESOURCES; 893 } 894 }; 895 if (mClient_2_2) { 896 ret = mClient_2_2->executeCommands_2_2(commandLength, commandHandles, hidl_callback); 897 } else { 898 ret = mClient->executeCommands(commandLength, commandHandles, hidl_callback); 899 } 900 // executeCommands can fail because of out-of-fd and we do not want to 901 // abort() in that case 902 if (!ret.isOk()) { 903 ALOGE("executeCommands failed because of %s", ret.description().c_str()); 904 } 905 906 if (error == Error::NONE) { 907 std::vector<CommandReader::CommandError> commandErrors = 908 mReader.takeErrors(); 909 910 for (const auto& cmdErr : commandErrors) { 911 auto command = 912 static_cast<IComposerClient::Command>(mWriter.getCommand(cmdErr.location)); 913 914 if (command == IComposerClient::Command::VALIDATE_DISPLAY || 915 command == IComposerClient::Command::PRESENT_DISPLAY || 916 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) { 917 error = cmdErr.error; 918 } else { 919 ALOGW("command 0x%x generated error %d", 920 command, cmdErr.error); 921 } 922 } 923 } 924 925 mWriter.reset(); 926 927 return error; 928 } 929 930 // Composer HAL 2.2 931 932 Error Composer::setLayerPerFrameMetadata(Display display, Layer layer, 933 const std::vector<IComposerClient::PerFrameMetadata>& perFrameMetadatas) { 934 if (!mClient_2_2) { 935 return Error::UNSUPPORTED; 936 } 937 938 mWriter.selectDisplay(display); 939 mWriter.selectLayer(layer); 940 mWriter.setLayerPerFrameMetadata(perFrameMetadatas); 941 return Error::NONE; 942 } 943 944 std::vector<IComposerClient::PerFrameMetadataKey> Composer::getPerFrameMetadataKeys( 945 Display display) { 946 std::vector<IComposerClient::PerFrameMetadataKey> keys; 947 if (!mClient_2_2) { 948 return keys; 949 } 950 951 Error error = kDefaultError; 952 if (mClient_2_3) { 953 mClient_2_3->getPerFrameMetadataKeys_2_3(display, 954 [&](const auto& tmpError, const auto& tmpKeys) { 955 error = tmpError; 956 if (error != Error::NONE) { 957 ALOGW("getPerFrameMetadataKeys failed " 958 "with %d", 959 tmpError); 960 return; 961 } 962 keys = tmpKeys; 963 }); 964 } else { 965 mClient_2_2 966 ->getPerFrameMetadataKeys(display, [&](const auto& tmpError, const auto& tmpKeys) { 967 error = tmpError; 968 if (error != Error::NONE) { 969 ALOGW("getPerFrameMetadataKeys failed with %d", tmpError); 970 return; 971 } 972 973 keys.clear(); 974 for (auto key : tmpKeys) { 975 keys.push_back(static_cast<IComposerClient::PerFrameMetadataKey>(key)); 976 } 977 }); 978 } 979 980 return keys; 981 } 982 983 Error Composer::getRenderIntents(Display display, ColorMode colorMode, 984 std::vector<RenderIntent>* outRenderIntents) { 985 if (!mClient_2_2) { 986 outRenderIntents->push_back(RenderIntent::COLORIMETRIC); 987 return Error::NONE; 988 } 989 990 Error error = kDefaultError; 991 992 auto getRenderIntentsLambda = [&](const auto& tmpError, const auto& tmpKeys) { 993 error = tmpError; 994 if (error != Error::NONE) { 995 return; 996 } 997 998 *outRenderIntents = tmpKeys; 999 }; 1000 1001 if (mClient_2_3) { 1002 mClient_2_3->getRenderIntents_2_3(display, colorMode, getRenderIntentsLambda); 1003 } else { 1004 mClient_2_2->getRenderIntents(display, static_cast<types::V1_1::ColorMode>(colorMode), 1005 getRenderIntentsLambda); 1006 } 1007 1008 return error; 1009 } 1010 1011 Error Composer::getDataspaceSaturationMatrix(Dataspace dataspace, mat4* outMatrix) 1012 { 1013 if (!mClient_2_2) { 1014 *outMatrix = mat4(); 1015 return Error::NONE; 1016 } 1017 1018 Error error = kDefaultError; 1019 mClient_2_2->getDataspaceSaturationMatrix(static_cast<types::V1_1::Dataspace>(dataspace), 1020 [&](const auto& tmpError, const auto& tmpMatrix) { 1021 error = tmpError; 1022 if (error != Error::NONE) { 1023 return; 1024 } 1025 *outMatrix = mat4(tmpMatrix.data()); 1026 }); 1027 1028 return error; 1029 } 1030 1031 // Composer HAL 2.3 1032 1033 Error Composer::getDisplayIdentificationData(Display display, uint8_t* outPort, 1034 std::vector<uint8_t>* outData) { 1035 if (!mClient_2_3) { 1036 return Error::UNSUPPORTED; 1037 } 1038 1039 Error error = kDefaultError; 1040 mClient_2_3->getDisplayIdentificationData(display, 1041 [&](const auto& tmpError, const auto& tmpPort, 1042 const auto& tmpData) { 1043 error = tmpError; 1044 if (error != Error::NONE) { 1045 return; 1046 } 1047 1048 *outPort = tmpPort; 1049 *outData = tmpData; 1050 }); 1051 1052 return error; 1053 } 1054 1055 Error Composer::setLayerColorTransform(Display display, Layer layer, const float* matrix) 1056 { 1057 if (!mClient_2_3) { 1058 return Error::UNSUPPORTED; 1059 } 1060 1061 mWriter.selectDisplay(display); 1062 mWriter.selectLayer(layer); 1063 mWriter.setLayerColorTransform(matrix); 1064 return Error::NONE; 1065 } 1066 1067 Error Composer::getDisplayedContentSamplingAttributes(Display display, PixelFormat* outFormat, 1068 Dataspace* outDataspace, 1069 uint8_t* outComponentMask) { 1070 if (!outFormat || !outDataspace || !outComponentMask) { 1071 return Error::BAD_PARAMETER; 1072 } 1073 if (!mClient_2_3) { 1074 return Error::UNSUPPORTED; 1075 } 1076 Error error = kDefaultError; 1077 mClient_2_3->getDisplayedContentSamplingAttributes(display, 1078 [&](const auto tmpError, 1079 const auto& tmpFormat, 1080 const auto& tmpDataspace, 1081 const auto& tmpComponentMask) { 1082 error = tmpError; 1083 if (error == Error::NONE) { 1084 *outFormat = tmpFormat; 1085 *outDataspace = tmpDataspace; 1086 *outComponentMask = 1087 static_cast<uint8_t>( 1088 tmpComponentMask); 1089 } 1090 }); 1091 return error; 1092 } 1093 1094 Error Composer::getDisplayCapabilities(Display display, 1095 std::vector<DisplayCapability>* outCapabilities) { 1096 if (!mClient_2_3) { 1097 return Error::UNSUPPORTED; 1098 } 1099 Error error = kDefaultError; 1100 mClient_2_3->getDisplayCapabilities(display, 1101 [&](const auto& tmpError, const auto& tmpCapabilities) { 1102 error = tmpError; 1103 if (error != Error::NONE) { 1104 return; 1105 } 1106 *outCapabilities = tmpCapabilities; 1107 }); 1108 return error; 1109 } 1110 1111 Error Composer::setDisplayContentSamplingEnabled(Display display, bool enabled, 1112 uint8_t componentMask, uint64_t maxFrames) { 1113 if (!mClient_2_3) { 1114 return Error::UNSUPPORTED; 1115 } 1116 1117 auto enable = enabled ? V2_3::IComposerClient::DisplayedContentSampling::ENABLE 1118 : V2_3::IComposerClient::DisplayedContentSampling::DISABLE; 1119 return mClient_2_3->setDisplayedContentSamplingEnabled(display, enable, componentMask, 1120 maxFrames); 1121 } 1122 1123 Error Composer::getDisplayedContentSample(Display display, uint64_t maxFrames, uint64_t timestamp, 1124 DisplayedFrameStats* outStats) { 1125 if (!outStats) { 1126 return Error::BAD_PARAMETER; 1127 } 1128 if (!mClient_2_3) { 1129 return Error::UNSUPPORTED; 1130 } 1131 Error error = kDefaultError; 1132 mClient_2_3->getDisplayedContentSample(display, maxFrames, timestamp, 1133 [&](const auto tmpError, auto tmpNumFrames, 1134 const auto& tmpSamples0, const auto& tmpSamples1, 1135 const auto& tmpSamples2, const auto& tmpSamples3) { 1136 error = tmpError; 1137 if (error == Error::NONE) { 1138 outStats->numFrames = tmpNumFrames; 1139 outStats->component_0_sample = tmpSamples0; 1140 outStats->component_1_sample = tmpSamples1; 1141 outStats->component_2_sample = tmpSamples2; 1142 outStats->component_3_sample = tmpSamples3; 1143 } 1144 }); 1145 return error; 1146 } 1147 1148 Error Composer::setLayerPerFrameMetadataBlobs( 1149 Display display, Layer layer, 1150 const std::vector<IComposerClient::PerFrameMetadataBlob>& metadata) { 1151 if (!mClient_2_3) { 1152 return Error::UNSUPPORTED; 1153 } 1154 1155 mWriter.selectDisplay(display); 1156 mWriter.selectLayer(layer); 1157 mWriter.setLayerPerFrameMetadataBlobs(metadata); 1158 return Error::NONE; 1159 } 1160 1161 Error Composer::setDisplayBrightness(Display display, float brightness) { 1162 if (!mClient_2_3) { 1163 return Error::UNSUPPORTED; 1164 } 1165 return mClient_2_3->setDisplayBrightness(display, brightness); 1166 } 1167 1168 CommandReader::~CommandReader() 1169 { 1170 resetData(); 1171 } 1172 1173 Error CommandReader::parse() 1174 { 1175 resetData(); 1176 1177 IComposerClient::Command command; 1178 uint16_t length = 0; 1179 1180 while (!isEmpty()) { 1181 auto command_2_1 = reinterpret_cast<V2_1::IComposerClient::Command*>(&command); 1182 if (!beginCommand(command_2_1, &length)) { 1183 break; 1184 } 1185 1186 bool parsed = false; 1187 switch (command) { 1188 case IComposerClient::Command::SELECT_DISPLAY: 1189 parsed = parseSelectDisplay(length); 1190 break; 1191 case IComposerClient::Command::SET_ERROR: 1192 parsed = parseSetError(length); 1193 break; 1194 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES: 1195 parsed = parseSetChangedCompositionTypes(length); 1196 break; 1197 case IComposerClient::Command::SET_DISPLAY_REQUESTS: 1198 parsed = parseSetDisplayRequests(length); 1199 break; 1200 case IComposerClient::Command::SET_PRESENT_FENCE: 1201 parsed = parseSetPresentFence(length); 1202 break; 1203 case IComposerClient::Command::SET_RELEASE_FENCES: 1204 parsed = parseSetReleaseFences(length); 1205 break; 1206 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT: 1207 parsed = parseSetPresentOrValidateDisplayResult(length); 1208 break; 1209 default: 1210 parsed = false; 1211 break; 1212 } 1213 1214 endCommand(); 1215 1216 if (!parsed) { 1217 ALOGE("failed to parse command 0x%x length %" PRIu16, 1218 command, length); 1219 break; 1220 } 1221 } 1222 1223 return isEmpty() ? Error::NONE : Error::NO_RESOURCES; 1224 } 1225 1226 bool CommandReader::parseSelectDisplay(uint16_t length) 1227 { 1228 if (length != CommandWriterBase::kSelectDisplayLength) { 1229 return false; 1230 } 1231 1232 mCurrentReturnData = &mReturnData[read64()]; 1233 1234 return true; 1235 } 1236 1237 bool CommandReader::parseSetError(uint16_t length) 1238 { 1239 if (length != CommandWriterBase::kSetErrorLength) { 1240 return false; 1241 } 1242 1243 auto location = read(); 1244 auto error = static_cast<Error>(readSigned()); 1245 1246 mErrors.emplace_back(CommandError{location, error}); 1247 1248 return true; 1249 } 1250 1251 bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) 1252 { 1253 // (layer id, composition type) pairs 1254 if (length % 3 != 0 || !mCurrentReturnData) { 1255 return false; 1256 } 1257 1258 uint32_t count = length / 3; 1259 mCurrentReturnData->changedLayers.reserve(count); 1260 mCurrentReturnData->compositionTypes.reserve(count); 1261 while (count > 0) { 1262 auto layer = read64(); 1263 auto type = static_cast<IComposerClient::Composition>(readSigned()); 1264 1265 mCurrentReturnData->changedLayers.push_back(layer); 1266 mCurrentReturnData->compositionTypes.push_back(type); 1267 1268 count--; 1269 } 1270 1271 return true; 1272 } 1273 1274 bool CommandReader::parseSetDisplayRequests(uint16_t length) 1275 { 1276 // display requests followed by (layer id, layer requests) pairs 1277 if (length % 3 != 1 || !mCurrentReturnData) { 1278 return false; 1279 } 1280 1281 mCurrentReturnData->displayRequests = read(); 1282 1283 uint32_t count = (length - 1) / 3; 1284 mCurrentReturnData->requestedLayers.reserve(count); 1285 mCurrentReturnData->requestMasks.reserve(count); 1286 while (count > 0) { 1287 auto layer = read64(); 1288 auto layerRequestMask = read(); 1289 1290 mCurrentReturnData->requestedLayers.push_back(layer); 1291 mCurrentReturnData->requestMasks.push_back(layerRequestMask); 1292 1293 count--; 1294 } 1295 1296 return true; 1297 } 1298 1299 bool CommandReader::parseSetPresentFence(uint16_t length) 1300 { 1301 if (length != CommandWriterBase::kSetPresentFenceLength || 1302 !mCurrentReturnData) { 1303 return false; 1304 } 1305 1306 if (mCurrentReturnData->presentFence >= 0) { 1307 close(mCurrentReturnData->presentFence); 1308 } 1309 mCurrentReturnData->presentFence = readFence(); 1310 1311 return true; 1312 } 1313 1314 bool CommandReader::parseSetReleaseFences(uint16_t length) 1315 { 1316 // (layer id, release fence index) pairs 1317 if (length % 3 != 0 || !mCurrentReturnData) { 1318 return false; 1319 } 1320 1321 uint32_t count = length / 3; 1322 mCurrentReturnData->releasedLayers.reserve(count); 1323 mCurrentReturnData->releaseFences.reserve(count); 1324 while (count > 0) { 1325 auto layer = read64(); 1326 auto fence = readFence(); 1327 1328 mCurrentReturnData->releasedLayers.push_back(layer); 1329 mCurrentReturnData->releaseFences.push_back(fence); 1330 1331 count--; 1332 } 1333 1334 return true; 1335 } 1336 1337 bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) 1338 { 1339 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) { 1340 return false; 1341 } 1342 mCurrentReturnData->presentOrValidateState = read(); 1343 return true; 1344 } 1345 1346 void CommandReader::resetData() 1347 { 1348 mErrors.clear(); 1349 1350 for (auto& data : mReturnData) { 1351 if (data.second.presentFence >= 0) { 1352 close(data.second.presentFence); 1353 } 1354 for (auto fence : data.second.releaseFences) { 1355 if (fence >= 0) { 1356 close(fence); 1357 } 1358 } 1359 } 1360 1361 mReturnData.clear(); 1362 mCurrentReturnData = nullptr; 1363 } 1364 1365 std::vector<CommandReader::CommandError> CommandReader::takeErrors() 1366 { 1367 return std::move(mErrors); 1368 } 1369 1370 bool CommandReader::hasChanges(Display display, 1371 uint32_t* outNumChangedCompositionTypes, 1372 uint32_t* outNumLayerRequestMasks) const 1373 { 1374 auto found = mReturnData.find(display); 1375 if (found == mReturnData.end()) { 1376 *outNumChangedCompositionTypes = 0; 1377 *outNumLayerRequestMasks = 0; 1378 return false; 1379 } 1380 1381 const ReturnData& data = found->second; 1382 1383 *outNumChangedCompositionTypes = data.compositionTypes.size(); 1384 *outNumLayerRequestMasks = data.requestMasks.size(); 1385 1386 return !(data.compositionTypes.empty() && data.requestMasks.empty()); 1387 } 1388 1389 void CommandReader::takeChangedCompositionTypes(Display display, 1390 std::vector<Layer>* outLayers, 1391 std::vector<IComposerClient::Composition>* outTypes) 1392 { 1393 auto found = mReturnData.find(display); 1394 if (found == mReturnData.end()) { 1395 outLayers->clear(); 1396 outTypes->clear(); 1397 return; 1398 } 1399 1400 ReturnData& data = found->second; 1401 1402 *outLayers = std::move(data.changedLayers); 1403 *outTypes = std::move(data.compositionTypes); 1404 } 1405 1406 void CommandReader::takeDisplayRequests(Display display, 1407 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 1408 std::vector<uint32_t>* outLayerRequestMasks) 1409 { 1410 auto found = mReturnData.find(display); 1411 if (found == mReturnData.end()) { 1412 *outDisplayRequestMask = 0; 1413 outLayers->clear(); 1414 outLayerRequestMasks->clear(); 1415 return; 1416 } 1417 1418 ReturnData& data = found->second; 1419 1420 *outDisplayRequestMask = data.displayRequests; 1421 *outLayers = std::move(data.requestedLayers); 1422 *outLayerRequestMasks = std::move(data.requestMasks); 1423 } 1424 1425 void CommandReader::takeReleaseFences(Display display, 1426 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 1427 { 1428 auto found = mReturnData.find(display); 1429 if (found == mReturnData.end()) { 1430 outLayers->clear(); 1431 outReleaseFences->clear(); 1432 return; 1433 } 1434 1435 ReturnData& data = found->second; 1436 1437 *outLayers = std::move(data.releasedLayers); 1438 *outReleaseFences = std::move(data.releaseFences); 1439 } 1440 1441 void CommandReader::takePresentFence(Display display, int* outPresentFence) 1442 { 1443 auto found = mReturnData.find(display); 1444 if (found == mReturnData.end()) { 1445 *outPresentFence = -1; 1446 return; 1447 } 1448 1449 ReturnData& data = found->second; 1450 1451 *outPresentFence = data.presentFence; 1452 data.presentFence = -1; 1453 } 1454 1455 void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) { 1456 auto found = mReturnData.find(display); 1457 if (found == mReturnData.end()) { 1458 *state= -1; 1459 return; 1460 } 1461 ReturnData& data = found->second; 1462 *state = data.presentOrValidateState; 1463 } 1464 1465 } // namespace impl 1466 1467 } // namespace Hwc2 1468 1469 } // namespace android 1470