ComposerHal.cpp revision 249c0ae80a6e5690d091294c4447cb3facafbc37
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#include <gui/BufferQueue.h> 23 24#include "ComposerHal.h" 25 26namespace android { 27 28using hardware::Return; 29using hardware::hidl_vec; 30using hardware::hidl_handle; 31 32namespace Hwc2 { 33 34namespace { 35 36class BufferHandle { 37public: 38 BufferHandle(const native_handle_t* buffer) 39 { 40 // nullptr is not a valid handle to HIDL 41 mHandle = (buffer) ? buffer : native_handle_init(mStorage, 0, 0); 42 } 43 44 operator const hidl_handle&() const 45 { 46 return mHandle; 47 } 48 49private: 50 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 0, 0); 51 hidl_handle mHandle; 52}; 53 54class FenceHandle 55{ 56public: 57 FenceHandle(int fd, bool owned) 58 : mOwned(owned) 59 { 60 native_handle_t* handle; 61 if (fd >= 0) { 62 handle = native_handle_init(mStorage, 1, 0); 63 handle->data[0] = fd; 64 } else { 65 // nullptr is not a valid handle to HIDL 66 handle = native_handle_init(mStorage, 0, 0); 67 } 68 mHandle = handle; 69 } 70 71 ~FenceHandle() 72 { 73 if (mOwned) { 74 native_handle_close(mHandle); 75 } 76 } 77 78 operator const hidl_handle&() const 79 { 80 return mHandle; 81 } 82 83private: 84 bool mOwned; 85 NATIVE_HANDLE_DECLARE_STORAGE(mStorage, 1, 0); 86 hidl_handle mHandle; 87}; 88 89// assume NO_RESOURCES when Status::isOk returns false 90constexpr Error kDefaultError = Error::NO_RESOURCES; 91 92template<typename T, typename U> 93T unwrapRet(Return<T>& ret, const U& default_val) 94{ 95 return (ret.isOk()) ? static_cast<T>(ret) : 96 static_cast<T>(default_val); 97} 98 99Error unwrapRet(Return<Error>& ret) 100{ 101 return unwrapRet(ret, kDefaultError); 102} 103 104} // anonymous namespace 105 106Composer::CommandWriter::CommandWriter(uint32_t initialMaxSize) 107 : CommandWriterBase(initialMaxSize) {} 108 109Composer::CommandWriter::~CommandWriter() 110{ 111} 112 113void Composer::CommandWriter::setLayerInfo(uint32_t type, uint32_t appId) 114{ 115 constexpr uint16_t kSetLayerInfoLength = 2; 116 beginCommand( 117 static_cast<IComposerClient::Command>( 118 IVrComposerClient::VrCommand::SET_LAYER_INFO), 119 kSetLayerInfoLength); 120 write(type); 121 write(appId); 122 endCommand(); 123} 124 125void Composer::CommandWriter::setClientTargetMetadata( 126 const IVrComposerClient::BufferMetadata& metadata) 127{ 128 constexpr uint16_t kSetClientTargetMetadataLength = 7; 129 beginCommand( 130 static_cast<IComposerClient::Command>( 131 IVrComposerClient::VrCommand::SET_CLIENT_TARGET_METADATA), 132 kSetClientTargetMetadataLength); 133 writeBufferMetadata(metadata); 134 endCommand(); 135} 136 137void Composer::CommandWriter::setLayerBufferMetadata( 138 const IVrComposerClient::BufferMetadata& metadata) 139{ 140 constexpr uint16_t kSetLayerBufferMetadataLength = 7; 141 beginCommand( 142 static_cast<IComposerClient::Command>( 143 IVrComposerClient::VrCommand::SET_LAYER_BUFFER_METADATA), 144 kSetLayerBufferMetadataLength); 145 writeBufferMetadata(metadata); 146 endCommand(); 147} 148 149void Composer::CommandWriter::writeBufferMetadata( 150 const IVrComposerClient::BufferMetadata& metadata) 151{ 152 write(metadata.width); 153 write(metadata.height); 154 write(metadata.stride); 155 write(metadata.layerCount); 156 writeSigned(static_cast<int32_t>(metadata.format)); 157 write64(metadata.usage); 158} 159 160Composer::Composer(bool useVrComposer) 161 : mWriter(kWriterInitialSize), 162 mIsUsingVrComposer(useVrComposer) 163{ 164 if (mIsUsingVrComposer) { 165 mComposer = IComposer::getService("vr"); 166 } else { 167 mComposer = IComposer::getService(); // use default name 168 } 169 170 if (mComposer == nullptr) { 171 LOG_ALWAYS_FATAL("failed to get hwcomposer service"); 172 } 173 174 mComposer->createClient( 175 [&](const auto& tmpError, const auto& tmpClient) 176 { 177 if (tmpError == Error::NONE) { 178 mClient = tmpClient; 179 } 180 }); 181 if (mClient == nullptr) { 182 LOG_ALWAYS_FATAL("failed to create composer client"); 183 } 184} 185 186std::vector<IComposer::Capability> Composer::getCapabilities() 187{ 188 std::vector<IComposer::Capability> capabilities; 189 mComposer->getCapabilities( 190 [&](const auto& tmpCapabilities) { 191 capabilities = tmpCapabilities; 192 }); 193 194 return capabilities; 195} 196 197std::string Composer::dumpDebugInfo() 198{ 199 std::string info; 200 mComposer->dumpDebugInfo([&](const auto& tmpInfo) { 201 info = tmpInfo.c_str(); 202 }); 203 204 return info; 205} 206 207void Composer::registerCallback(const sp<IComposerCallback>& callback) 208{ 209 auto ret = mClient->registerCallback(callback); 210 if (!ret.isOk()) { 211 ALOGE("failed to register IComposerCallback"); 212 } 213} 214 215void Composer::resetCommands() { 216 mWriter.reset(); 217} 218 219uint32_t Composer::getMaxVirtualDisplayCount() 220{ 221 auto ret = mClient->getMaxVirtualDisplayCount(); 222 return unwrapRet(ret, 0); 223} 224 225Error Composer::createVirtualDisplay(uint32_t width, uint32_t height, 226 PixelFormat* format, Display* outDisplay) 227{ 228 const uint32_t bufferSlotCount = 1; 229 Error error = kDefaultError; 230 mClient->createVirtualDisplay(width, height, *format, bufferSlotCount, 231 [&](const auto& tmpError, const auto& tmpDisplay, 232 const auto& tmpFormat) { 233 error = tmpError; 234 if (error != Error::NONE) { 235 return; 236 } 237 238 *outDisplay = tmpDisplay; 239 *format = tmpFormat; 240 }); 241 242 return error; 243} 244 245Error Composer::destroyVirtualDisplay(Display display) 246{ 247 auto ret = mClient->destroyVirtualDisplay(display); 248 return unwrapRet(ret); 249} 250 251Error Composer::acceptDisplayChanges(Display display) 252{ 253 mWriter.selectDisplay(display); 254 mWriter.acceptDisplayChanges(); 255 return Error::NONE; 256} 257 258Error Composer::createLayer(Display display, Layer* outLayer) 259{ 260 Error error = kDefaultError; 261 mClient->createLayer(display, BufferQueue::NUM_BUFFER_SLOTS, 262 [&](const auto& tmpError, const auto& tmpLayer) { 263 error = tmpError; 264 if (error != Error::NONE) { 265 return; 266 } 267 268 *outLayer = tmpLayer; 269 }); 270 271 return error; 272} 273 274Error Composer::destroyLayer(Display display, Layer layer) 275{ 276 auto ret = mClient->destroyLayer(display, layer); 277 return unwrapRet(ret); 278} 279 280Error Composer::getActiveConfig(Display display, Config* outConfig) 281{ 282 Error error = kDefaultError; 283 mClient->getActiveConfig(display, 284 [&](const auto& tmpError, const auto& tmpConfig) { 285 error = tmpError; 286 if (error != Error::NONE) { 287 return; 288 } 289 290 *outConfig = tmpConfig; 291 }); 292 293 return error; 294} 295 296Error Composer::getChangedCompositionTypes(Display display, 297 std::vector<Layer>* outLayers, 298 std::vector<IComposerClient::Composition>* outTypes) 299{ 300 mReader.takeChangedCompositionTypes(display, outLayers, outTypes); 301 return Error::NONE; 302} 303 304Error Composer::getColorModes(Display display, 305 std::vector<ColorMode>* outModes) 306{ 307 Error error = kDefaultError; 308 mClient->getColorModes(display, 309 [&](const auto& tmpError, const auto& tmpModes) { 310 error = tmpError; 311 if (error != Error::NONE) { 312 return; 313 } 314 315 *outModes = tmpModes; 316 }); 317 318 return error; 319} 320 321Error Composer::getDisplayAttribute(Display display, Config config, 322 IComposerClient::Attribute attribute, int32_t* outValue) 323{ 324 Error error = kDefaultError; 325 mClient->getDisplayAttribute(display, config, attribute, 326 [&](const auto& tmpError, const auto& tmpValue) { 327 error = tmpError; 328 if (error != Error::NONE) { 329 return; 330 } 331 332 *outValue = tmpValue; 333 }); 334 335 return error; 336} 337 338Error Composer::getDisplayConfigs(Display display, 339 std::vector<Config>* outConfigs) 340{ 341 Error error = kDefaultError; 342 mClient->getDisplayConfigs(display, 343 [&](const auto& tmpError, const auto& tmpConfigs) { 344 error = tmpError; 345 if (error != Error::NONE) { 346 return; 347 } 348 349 *outConfigs = tmpConfigs; 350 }); 351 352 return error; 353} 354 355Error Composer::getDisplayName(Display display, std::string* outName) 356{ 357 Error error = kDefaultError; 358 mClient->getDisplayName(display, 359 [&](const auto& tmpError, const auto& tmpName) { 360 error = tmpError; 361 if (error != Error::NONE) { 362 return; 363 } 364 365 *outName = tmpName.c_str(); 366 }); 367 368 return error; 369} 370 371Error Composer::getDisplayRequests(Display display, 372 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 373 std::vector<uint32_t>* outLayerRequestMasks) 374{ 375 mReader.takeDisplayRequests(display, outDisplayRequestMask, 376 outLayers, outLayerRequestMasks); 377 return Error::NONE; 378} 379 380Error Composer::getDisplayType(Display display, 381 IComposerClient::DisplayType* outType) 382{ 383 Error error = kDefaultError; 384 mClient->getDisplayType(display, 385 [&](const auto& tmpError, const auto& tmpType) { 386 error = tmpError; 387 if (error != Error::NONE) { 388 return; 389 } 390 391 *outType = tmpType; 392 }); 393 394 return error; 395} 396 397Error Composer::getDozeSupport(Display display, bool* outSupport) 398{ 399 Error error = kDefaultError; 400 mClient->getDozeSupport(display, 401 [&](const auto& tmpError, const auto& tmpSupport) { 402 error = tmpError; 403 if (error != Error::NONE) { 404 return; 405 } 406 407 *outSupport = tmpSupport; 408 }); 409 410 return error; 411} 412 413Error Composer::getHdrCapabilities(Display display, 414 std::vector<Hdr>* outTypes, float* outMaxLuminance, 415 float* outMaxAverageLuminance, float* outMinLuminance) 416{ 417 Error error = kDefaultError; 418 mClient->getHdrCapabilities(display, 419 [&](const auto& tmpError, const auto& tmpTypes, 420 const auto& tmpMaxLuminance, 421 const auto& tmpMaxAverageLuminance, 422 const auto& tmpMinLuminance) { 423 error = tmpError; 424 if (error != Error::NONE) { 425 return; 426 } 427 428 *outTypes = tmpTypes; 429 *outMaxLuminance = tmpMaxLuminance; 430 *outMaxAverageLuminance = tmpMaxAverageLuminance; 431 *outMinLuminance = tmpMinLuminance; 432 }); 433 434 return error; 435} 436 437Error Composer::getReleaseFences(Display display, 438 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 439{ 440 mReader.takeReleaseFences(display, outLayers, outReleaseFences); 441 return Error::NONE; 442} 443 444Error Composer::presentDisplay(Display display, int* outPresentFence) 445{ 446 mWriter.selectDisplay(display); 447 mWriter.presentDisplay(); 448 449 Error error = execute(); 450 if (error != Error::NONE) { 451 return error; 452 } 453 454 mReader.takePresentFence(display, outPresentFence); 455 456 return Error::NONE; 457} 458 459Error Composer::setActiveConfig(Display display, Config config) 460{ 461 auto ret = mClient->setActiveConfig(display, config); 462 return unwrapRet(ret); 463} 464 465Error Composer::setClientTarget(Display display, uint32_t slot, 466 const sp<GraphicBuffer>& target, 467 int acquireFence, Dataspace dataspace, 468 const std::vector<IComposerClient::Rect>& damage) 469{ 470 mWriter.selectDisplay(display); 471 if (mIsUsingVrComposer && target.get()) { 472 IVrComposerClient::BufferMetadata metadata = { 473 .width = target->getWidth(), 474 .height = target->getHeight(), 475 .stride = target->getStride(), 476 .layerCount = target->getLayerCount(), 477 .format = static_cast<PixelFormat>(target->getPixelFormat()), 478 .usage = target->getUsage(), 479 }; 480 mWriter.setClientTargetMetadata(metadata); 481 } 482 483 const native_handle_t* handle = nullptr; 484 if (target.get()) { 485 handle = target->getNativeBuffer()->handle; 486 } 487 488 mWriter.setClientTarget(slot, handle, acquireFence, dataspace, damage); 489 return Error::NONE; 490} 491 492Error Composer::setColorMode(Display display, ColorMode mode) 493{ 494 auto ret = mClient->setColorMode(display, mode); 495 return unwrapRet(ret); 496} 497 498Error Composer::setColorTransform(Display display, const float* matrix, 499 ColorTransform hint) 500{ 501 mWriter.selectDisplay(display); 502 mWriter.setColorTransform(matrix, hint); 503 return Error::NONE; 504} 505 506Error Composer::setOutputBuffer(Display display, const native_handle_t* buffer, 507 int releaseFence) 508{ 509 mWriter.selectDisplay(display); 510 mWriter.setOutputBuffer(0, buffer, dup(releaseFence)); 511 return Error::NONE; 512} 513 514Error Composer::setPowerMode(Display display, IComposerClient::PowerMode mode) 515{ 516 auto ret = mClient->setPowerMode(display, mode); 517 return unwrapRet(ret); 518} 519 520Error Composer::setVsyncEnabled(Display display, IComposerClient::Vsync enabled) 521{ 522 auto ret = mClient->setVsyncEnabled(display, enabled); 523 return unwrapRet(ret); 524} 525 526Error Composer::setClientTargetSlotCount(Display display) 527{ 528 const uint32_t bufferSlotCount = BufferQueue::NUM_BUFFER_SLOTS; 529 auto ret = mClient->setClientTargetSlotCount(display, bufferSlotCount); 530 return unwrapRet(ret); 531} 532 533Error Composer::validateDisplay(Display display, uint32_t* outNumTypes, 534 uint32_t* outNumRequests) 535{ 536 mWriter.selectDisplay(display); 537 mWriter.validateDisplay(); 538 539 Error error = execute(); 540 if (error != Error::NONE) { 541 return error; 542 } 543 544 mReader.hasChanges(display, outNumTypes, outNumRequests); 545 546 return Error::NONE; 547} 548 549Error Composer::presentOrValidateDisplay(Display display, uint32_t* outNumTypes, 550 uint32_t* outNumRequests, int* outPresentFence, uint32_t* state) { 551 mWriter.selectDisplay(display); 552 mWriter.presentOrvalidateDisplay(); 553 554 Error error = execute(); 555 if (error != Error::NONE) { 556 return error; 557 } 558 559 mReader.takePresentOrValidateStage(display, state); 560 561 if (*state == 1) { // Present succeeded 562 mReader.takePresentFence(display, outPresentFence); 563 } 564 565 if (*state == 0) { // Validate succeeded. 566 mReader.hasChanges(display, outNumTypes, outNumRequests); 567 } 568 569 return Error::NONE; 570} 571 572Error Composer::setCursorPosition(Display display, Layer layer, 573 int32_t x, int32_t y) 574{ 575 mWriter.selectDisplay(display); 576 mWriter.selectLayer(layer); 577 mWriter.setLayerCursorPosition(x, y); 578 return Error::NONE; 579} 580 581Error Composer::setLayerBuffer(Display display, Layer layer, 582 uint32_t slot, const sp<GraphicBuffer>& buffer, int acquireFence) 583{ 584 mWriter.selectDisplay(display); 585 mWriter.selectLayer(layer); 586 if (mIsUsingVrComposer && buffer.get()) { 587 IVrComposerClient::BufferMetadata metadata = { 588 .width = buffer->getWidth(), 589 .height = buffer->getHeight(), 590 .stride = buffer->getStride(), 591 .layerCount = buffer->getLayerCount(), 592 .format = static_cast<PixelFormat>(buffer->getPixelFormat()), 593 .usage = buffer->getUsage(), 594 }; 595 mWriter.setLayerBufferMetadata(metadata); 596 } 597 598 const native_handle_t* handle = nullptr; 599 if (buffer.get()) { 600 handle = buffer->getNativeBuffer()->handle; 601 } 602 603 mWriter.setLayerBuffer(slot, handle, acquireFence); 604 return Error::NONE; 605} 606 607Error Composer::setLayerSurfaceDamage(Display display, Layer layer, 608 const std::vector<IComposerClient::Rect>& damage) 609{ 610 mWriter.selectDisplay(display); 611 mWriter.selectLayer(layer); 612 mWriter.setLayerSurfaceDamage(damage); 613 return Error::NONE; 614} 615 616Error Composer::setLayerBlendMode(Display display, Layer layer, 617 IComposerClient::BlendMode mode) 618{ 619 mWriter.selectDisplay(display); 620 mWriter.selectLayer(layer); 621 mWriter.setLayerBlendMode(mode); 622 return Error::NONE; 623} 624 625Error Composer::setLayerColor(Display display, Layer layer, 626 const IComposerClient::Color& color) 627{ 628 mWriter.selectDisplay(display); 629 mWriter.selectLayer(layer); 630 mWriter.setLayerColor(color); 631 return Error::NONE; 632} 633 634Error Composer::setLayerCompositionType(Display display, Layer layer, 635 IComposerClient::Composition type) 636{ 637 mWriter.selectDisplay(display); 638 mWriter.selectLayer(layer); 639 mWriter.setLayerCompositionType(type); 640 return Error::NONE; 641} 642 643Error Composer::setLayerDataspace(Display display, Layer layer, 644 Dataspace dataspace) 645{ 646 mWriter.selectDisplay(display); 647 mWriter.selectLayer(layer); 648 mWriter.setLayerDataspace(dataspace); 649 return Error::NONE; 650} 651 652Error Composer::setLayerDisplayFrame(Display display, Layer layer, 653 const IComposerClient::Rect& frame) 654{ 655 mWriter.selectDisplay(display); 656 mWriter.selectLayer(layer); 657 mWriter.setLayerDisplayFrame(frame); 658 return Error::NONE; 659} 660 661Error Composer::setLayerPlaneAlpha(Display display, Layer layer, 662 float alpha) 663{ 664 mWriter.selectDisplay(display); 665 mWriter.selectLayer(layer); 666 mWriter.setLayerPlaneAlpha(alpha); 667 return Error::NONE; 668} 669 670Error Composer::setLayerSidebandStream(Display display, Layer layer, 671 const native_handle_t* stream) 672{ 673 mWriter.selectDisplay(display); 674 mWriter.selectLayer(layer); 675 mWriter.setLayerSidebandStream(stream); 676 return Error::NONE; 677} 678 679Error Composer::setLayerSourceCrop(Display display, Layer layer, 680 const IComposerClient::FRect& crop) 681{ 682 mWriter.selectDisplay(display); 683 mWriter.selectLayer(layer); 684 mWriter.setLayerSourceCrop(crop); 685 return Error::NONE; 686} 687 688Error Composer::setLayerTransform(Display display, Layer layer, 689 Transform transform) 690{ 691 mWriter.selectDisplay(display); 692 mWriter.selectLayer(layer); 693 mWriter.setLayerTransform(transform); 694 return Error::NONE; 695} 696 697Error Composer::setLayerVisibleRegion(Display display, Layer layer, 698 const std::vector<IComposerClient::Rect>& visible) 699{ 700 mWriter.selectDisplay(display); 701 mWriter.selectLayer(layer); 702 mWriter.setLayerVisibleRegion(visible); 703 return Error::NONE; 704} 705 706Error Composer::setLayerZOrder(Display display, Layer layer, uint32_t z) 707{ 708 mWriter.selectDisplay(display); 709 mWriter.selectLayer(layer); 710 mWriter.setLayerZOrder(z); 711 return Error::NONE; 712} 713 714Error Composer::setLayerInfo(Display display, Layer layer, uint32_t type, 715 uint32_t appId) 716{ 717 if (mIsUsingVrComposer) { 718 mWriter.selectDisplay(display); 719 mWriter.selectLayer(layer); 720 mWriter.setLayerInfo(type, appId); 721 } 722 return Error::NONE; 723} 724 725Error Composer::execute() 726{ 727 // prepare input command queue 728 bool queueChanged = false; 729 uint32_t commandLength = 0; 730 hidl_vec<hidl_handle> commandHandles; 731 if (!mWriter.writeQueue(&queueChanged, &commandLength, &commandHandles)) { 732 mWriter.reset(); 733 return Error::NO_RESOURCES; 734 } 735 736 // set up new input command queue if necessary 737 if (queueChanged) { 738 auto ret = mClient->setInputCommandQueue(*mWriter.getMQDescriptor()); 739 auto error = unwrapRet(ret); 740 if (error != Error::NONE) { 741 mWriter.reset(); 742 return error; 743 } 744 } 745 746 Error error = kDefaultError; 747 mClient->executeCommands(commandLength, commandHandles, 748 [&](const auto& tmpError, const auto& tmpOutChanged, 749 const auto& tmpOutLength, const auto& tmpOutHandles) 750 { 751 error = tmpError; 752 753 // set up new output command queue if necessary 754 if (error == Error::NONE && tmpOutChanged) { 755 error = kDefaultError; 756 mClient->getOutputCommandQueue( 757 [&](const auto& tmpError, 758 const auto& tmpDescriptor) 759 { 760 error = tmpError; 761 if (error != Error::NONE) { 762 return; 763 } 764 765 mReader.setMQDescriptor(tmpDescriptor); 766 }); 767 } 768 769 if (error != Error::NONE) { 770 return; 771 } 772 773 if (mReader.readQueue(tmpOutLength, tmpOutHandles)) { 774 error = mReader.parse(); 775 mReader.reset(); 776 } else { 777 error = Error::NO_RESOURCES; 778 } 779 }); 780 781 if (error == Error::NONE) { 782 std::vector<CommandReader::CommandError> commandErrors = 783 mReader.takeErrors(); 784 785 for (const auto& cmdErr : commandErrors) { 786 auto command = mWriter.getCommand(cmdErr.location); 787 788 if (command == IComposerClient::Command::VALIDATE_DISPLAY || 789 command == IComposerClient::Command::PRESENT_DISPLAY || 790 command == IComposerClient::Command::PRESENT_OR_VALIDATE_DISPLAY) { 791 error = cmdErr.error; 792 } else { 793 ALOGW("command 0x%x generated error %d", 794 command, cmdErr.error); 795 } 796 } 797 } 798 799 mWriter.reset(); 800 801 return error; 802} 803 804CommandReader::~CommandReader() 805{ 806 resetData(); 807} 808 809Error CommandReader::parse() 810{ 811 resetData(); 812 813 IComposerClient::Command command; 814 uint16_t length = 0; 815 816 while (!isEmpty()) { 817 if (!beginCommand(&command, &length)) { 818 break; 819 } 820 821 bool parsed = false; 822 switch (command) { 823 case IComposerClient::Command::SELECT_DISPLAY: 824 parsed = parseSelectDisplay(length); 825 break; 826 case IComposerClient::Command::SET_ERROR: 827 parsed = parseSetError(length); 828 break; 829 case IComposerClient::Command::SET_CHANGED_COMPOSITION_TYPES: 830 parsed = parseSetChangedCompositionTypes(length); 831 break; 832 case IComposerClient::Command::SET_DISPLAY_REQUESTS: 833 parsed = parseSetDisplayRequests(length); 834 break; 835 case IComposerClient::Command::SET_PRESENT_FENCE: 836 parsed = parseSetPresentFence(length); 837 break; 838 case IComposerClient::Command::SET_RELEASE_FENCES: 839 parsed = parseSetReleaseFences(length); 840 break; 841 case IComposerClient::Command ::SET_PRESENT_OR_VALIDATE_DISPLAY_RESULT: 842 parsed = parseSetPresentOrValidateDisplayResult(length); 843 break; 844 default: 845 parsed = false; 846 break; 847 } 848 849 endCommand(); 850 851 if (!parsed) { 852 ALOGE("failed to parse command 0x%x length %" PRIu16, 853 command, length); 854 break; 855 } 856 } 857 858 return isEmpty() ? Error::NONE : Error::NO_RESOURCES; 859} 860 861bool CommandReader::parseSelectDisplay(uint16_t length) 862{ 863 if (length != CommandWriterBase::kSelectDisplayLength) { 864 return false; 865 } 866 867 mCurrentReturnData = &mReturnData[read64()]; 868 869 return true; 870} 871 872bool CommandReader::parseSetError(uint16_t length) 873{ 874 if (length != CommandWriterBase::kSetErrorLength) { 875 return false; 876 } 877 878 auto location = read(); 879 auto error = static_cast<Error>(readSigned()); 880 881 mErrors.emplace_back(CommandError{location, error}); 882 883 return true; 884} 885 886bool CommandReader::parseSetChangedCompositionTypes(uint16_t length) 887{ 888 // (layer id, composition type) pairs 889 if (length % 3 != 0 || !mCurrentReturnData) { 890 return false; 891 } 892 893 uint32_t count = length / 3; 894 mCurrentReturnData->changedLayers.reserve(count); 895 mCurrentReturnData->compositionTypes.reserve(count); 896 while (count > 0) { 897 auto layer = read64(); 898 auto type = static_cast<IComposerClient::Composition>(readSigned()); 899 900 mCurrentReturnData->changedLayers.push_back(layer); 901 mCurrentReturnData->compositionTypes.push_back(type); 902 903 count--; 904 } 905 906 return true; 907} 908 909bool CommandReader::parseSetDisplayRequests(uint16_t length) 910{ 911 // display requests followed by (layer id, layer requests) pairs 912 if (length % 3 != 1 || !mCurrentReturnData) { 913 return false; 914 } 915 916 mCurrentReturnData->displayRequests = read(); 917 918 uint32_t count = (length - 1) / 3; 919 mCurrentReturnData->requestedLayers.reserve(count); 920 mCurrentReturnData->requestMasks.reserve(count); 921 while (count > 0) { 922 auto layer = read64(); 923 auto layerRequestMask = read(); 924 925 mCurrentReturnData->requestedLayers.push_back(layer); 926 mCurrentReturnData->requestMasks.push_back(layerRequestMask); 927 928 count--; 929 } 930 931 return true; 932} 933 934bool CommandReader::parseSetPresentFence(uint16_t length) 935{ 936 if (length != CommandWriterBase::kSetPresentFenceLength || 937 !mCurrentReturnData) { 938 return false; 939 } 940 941 if (mCurrentReturnData->presentFence >= 0) { 942 close(mCurrentReturnData->presentFence); 943 } 944 mCurrentReturnData->presentFence = readFence(); 945 946 return true; 947} 948 949bool CommandReader::parseSetReleaseFences(uint16_t length) 950{ 951 // (layer id, release fence index) pairs 952 if (length % 3 != 0 || !mCurrentReturnData) { 953 return false; 954 } 955 956 uint32_t count = length / 3; 957 mCurrentReturnData->releasedLayers.reserve(count); 958 mCurrentReturnData->releaseFences.reserve(count); 959 while (count > 0) { 960 auto layer = read64(); 961 auto fence = readFence(); 962 963 mCurrentReturnData->releasedLayers.push_back(layer); 964 mCurrentReturnData->releaseFences.push_back(fence); 965 966 count--; 967 } 968 969 return true; 970} 971 972bool CommandReader::parseSetPresentOrValidateDisplayResult(uint16_t length) 973{ 974 if (length != CommandWriterBase::kPresentOrValidateDisplayResultLength || !mCurrentReturnData) { 975 return false; 976 } 977 mCurrentReturnData->presentOrValidateState = read(); 978 return true; 979} 980 981void CommandReader::resetData() 982{ 983 mErrors.clear(); 984 985 for (auto& data : mReturnData) { 986 if (data.second.presentFence >= 0) { 987 close(data.second.presentFence); 988 } 989 for (auto fence : data.second.releaseFences) { 990 if (fence >= 0) { 991 close(fence); 992 } 993 } 994 } 995 996 mReturnData.clear(); 997 mCurrentReturnData = nullptr; 998} 999 1000std::vector<CommandReader::CommandError> CommandReader::takeErrors() 1001{ 1002 return std::move(mErrors); 1003} 1004 1005bool CommandReader::hasChanges(Display display, 1006 uint32_t* outNumChangedCompositionTypes, 1007 uint32_t* outNumLayerRequestMasks) const 1008{ 1009 auto found = mReturnData.find(display); 1010 if (found == mReturnData.end()) { 1011 *outNumChangedCompositionTypes = 0; 1012 *outNumLayerRequestMasks = 0; 1013 return false; 1014 } 1015 1016 const ReturnData& data = found->second; 1017 1018 *outNumChangedCompositionTypes = data.compositionTypes.size(); 1019 *outNumLayerRequestMasks = data.requestMasks.size(); 1020 1021 return !(data.compositionTypes.empty() && data.requestMasks.empty()); 1022} 1023 1024void CommandReader::takeChangedCompositionTypes(Display display, 1025 std::vector<Layer>* outLayers, 1026 std::vector<IComposerClient::Composition>* outTypes) 1027{ 1028 auto found = mReturnData.find(display); 1029 if (found == mReturnData.end()) { 1030 outLayers->clear(); 1031 outTypes->clear(); 1032 return; 1033 } 1034 1035 ReturnData& data = found->second; 1036 1037 *outLayers = std::move(data.changedLayers); 1038 *outTypes = std::move(data.compositionTypes); 1039} 1040 1041void CommandReader::takeDisplayRequests(Display display, 1042 uint32_t* outDisplayRequestMask, std::vector<Layer>* outLayers, 1043 std::vector<uint32_t>* outLayerRequestMasks) 1044{ 1045 auto found = mReturnData.find(display); 1046 if (found == mReturnData.end()) { 1047 *outDisplayRequestMask = 0; 1048 outLayers->clear(); 1049 outLayerRequestMasks->clear(); 1050 return; 1051 } 1052 1053 ReturnData& data = found->second; 1054 1055 *outDisplayRequestMask = data.displayRequests; 1056 *outLayers = std::move(data.requestedLayers); 1057 *outLayerRequestMasks = std::move(data.requestMasks); 1058} 1059 1060void CommandReader::takeReleaseFences(Display display, 1061 std::vector<Layer>* outLayers, std::vector<int>* outReleaseFences) 1062{ 1063 auto found = mReturnData.find(display); 1064 if (found == mReturnData.end()) { 1065 outLayers->clear(); 1066 outReleaseFences->clear(); 1067 return; 1068 } 1069 1070 ReturnData& data = found->second; 1071 1072 *outLayers = std::move(data.releasedLayers); 1073 *outReleaseFences = std::move(data.releaseFences); 1074} 1075 1076void CommandReader::takePresentFence(Display display, int* outPresentFence) 1077{ 1078 auto found = mReturnData.find(display); 1079 if (found == mReturnData.end()) { 1080 *outPresentFence = -1; 1081 return; 1082 } 1083 1084 ReturnData& data = found->second; 1085 1086 *outPresentFence = data.presentFence; 1087 data.presentFence = -1; 1088} 1089 1090void CommandReader::takePresentOrValidateStage(Display display, uint32_t* state) { 1091 auto found = mReturnData.find(display); 1092 if (found == mReturnData.end()) { 1093 *state= -1; 1094 return; 1095 } 1096 ReturnData& data = found->second; 1097 *state = data.presentOrValidateState; 1098} 1099 1100} // namespace Hwc2 1101 1102} // namespace android 1103