drm_hwcomposer: Remove HWC2 usage for Present Add HwcDisplay::PresentStagedComposition to commit the changes that have been previously validated through ValidateStagedComposition. Drop usage of legacy HWC2 api in ComposerClient.cpp for DisplayCommand present commands. Change-Id: I0b7fcd4b664bf707f468cd40b1fefdfdd963f7f7 Signed-off-by: Drew Davenport <ddavenport@google.com>
diff --git a/hwc2_device/HwcDisplay.cpp b/hwc2_device/HwcDisplay.cpp index 9fbd6b9..c0fc3c5 100644 --- a/hwc2_device/HwcDisplay.cpp +++ b/hwc2_device/HwcDisplay.cpp
@@ -401,6 +401,29 @@ return changed_layers; } +auto HwcDisplay::AcceptValidatedComposition() -> void { + for (std::pair<const hwc2_layer_t, HwcLayer> &l : layers_) { + l.second.AcceptTypeChange(); + } +} + +auto HwcDisplay::PresentStagedComposition( + int32_t *out_present_fence, std::vector<ReleaseFence> *out_release_fences) + -> HWC2::Error { + auto error = PresentDisplay(out_present_fence); + if (error != HWC2::Error::None || *out_present_fence == -1) { + return error; + } + + for (auto &l : layers_) { + if (!l.second.GetPriorBufferScanOutFlag() || !present_fence_) { + continue; + } + out_release_fences->emplace_back(l.first, DupFd(present_fence_)); + } + return error; +} + void HwcDisplay::SetPipeline(std::shared_ptr<DrmDisplayPipeline> pipeline) { Deinit();
diff --git a/hwc2_device/HwcDisplay.h b/hwc2_device/HwcDisplay.h index 9c113fd..8dc059c 100644 --- a/hwc2_device/HwcDisplay.h +++ b/hwc2_device/HwcDisplay.h
@@ -95,6 +95,17 @@ using ChangedLayer = std::pair<hwc2_layer_t, HWC2::Composition>; auto ValidateStagedComposition() -> std::vector<ChangedLayer>; + // Mark previously validated properties as ready to present. + auto AcceptValidatedComposition() -> void; + + // Present previously staged properties, and return fences to indicate when + // the new content has been presented, and when the previous buffers have + // been released. + using ReleaseFence = std::pair<hwc2_layer_t, int32_t>; + auto PresentStagedComposition(int32_t *out_present_fence, + std::vector<ReleaseFence> *out_release_fences) + -> HWC2::Error; + // HWC2 Hooks - these should not be used outside of the hwc2 device. HWC2::Error AcceptDisplayChanges(); HWC2::Error CreateLayer(hwc2_layer_t *layer);
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp index d084ef0..90043d8 100644 --- a/hwc3/ComposerClient.cpp +++ b/hwc3/ComposerClient.cpp
@@ -456,51 +456,6 @@ return ToBinderStatus(err); } -hwc3::Error ComposerClient::PresentDisplayInternal( - uint64_t display_id, ::android::base::unique_fd& out_display_fence, - std::unordered_map<int64_t, ::android::base::unique_fd>& - out_release_fences) { - DEBUG_FUNC(); - auto* display = GetDisplay(display_id); - if (display == nullptr) { - return hwc3::Error::kBadDisplay; - } - - if (composer_resources_->MustValidateDisplay(display_id)) { - return hwc3::Error::kNotValidated; - } - - int32_t present_fence = -1; - auto error = Hwc2toHwc3Error(display->PresentDisplay(&present_fence)); - if (error != hwc3::Error::kNone) { - return error; - } - out_display_fence.reset(present_fence); - - uint32_t release_fence_count = 0; - error = Hwc2toHwc3Error( - display->GetReleaseFences(&release_fence_count, nullptr, nullptr)); - if (error != hwc3::Error::kNone) { - return error; - } - - std::vector<hwc2_layer_t> hwc_layers(release_fence_count); - std::vector<int32_t> hwc_fences(release_fence_count); - error = Hwc2toHwc3Error(display->GetReleaseFences(&release_fence_count, - hwc_layers.data(), - hwc_fences.data())); - if (error != hwc3::Error::kNone) { - return error; - } - - for (size_t i = 0; i < hwc_layers.size(); i++) { - auto layer = Hwc2LayerToHwc3(hwc_layers[i]); - out_release_fences[layer] = ::android::base::unique_fd{hwc_fences[i]}; - } - - return hwc3::Error::kNone; -} - ::android::HwcDisplay* ComposerClient::GetDisplay(uint64_t display_id) { return hwc_->GetDisplay(display_id); } @@ -642,10 +597,22 @@ } if (command.acceptDisplayChanges) { - ExecuteAcceptDisplayChanges(command.display); + display->AcceptDisplayChanges(); } + if (command.presentDisplay) { - ExecutePresentDisplay(command.display); + if (composer_resources_->MustValidateDisplay(display_id)) { + cmd_result_writer_->AddError(hwc3::Error::kNotValidated); + return; + } + int32_t present_fence = -1; + std::vector<HwcDisplay::ReleaseFence> release_fences; + error = Hwc2toHwc3Error( + display->PresentStagedComposition(&present_fence, &release_fences)); + if (error != hwc3::Error::kNone) { + cmd_result_writer_->AddError(error); + return; + } } } @@ -1402,40 +1369,4 @@ } } -void ComposerClient::ExecuteAcceptDisplayChanges(int64_t display_id) { - auto* display = GetDisplay(display_id); - if (display == nullptr) { - cmd_result_writer_->AddError(hwc3::Error::kBadDisplay); - return; - } - - auto error = Hwc2toHwc3Error(display->AcceptDisplayChanges()); - if (error != hwc3::Error::kNone) { - cmd_result_writer_->AddError(error); - return; - } -} - -void ComposerClient::ExecutePresentDisplay(int64_t display_id) { - auto* display = GetDisplay(display_id); - if (display == nullptr) { - cmd_result_writer_->AddError(hwc3::Error::kBadDisplay); - return; - } - - ::android::base::unique_fd display_fence; - std::unordered_map<int64_t, ::android::base::unique_fd> release_fences; - auto error = PresentDisplayInternal(display_id, display_fence, - release_fences); - if (error != hwc3::Error::kNone) { - cmd_result_writer_->AddError(error); - } - if (cmd_result_writer_->HasError()) { - return; - } - - cmd_result_writer_->AddPresentFence(display_id, std::move(display_fence)); - cmd_result_writer_->AddReleaseFence(display_id, release_fences); -} - } // namespace aidl::android::hardware::graphics::composer3::impl
diff --git a/hwc3/ComposerClient.h b/hwc3/ComposerClient.h index 9b891e7..37cb8ab 100644 --- a/hwc3/ComposerClient.h +++ b/hwc3/ComposerClient.h
@@ -171,13 +171,6 @@ void ExecuteSetDisplayClientTarget(uint64_t display_id, const ClientTarget& command); void ExecuteSetDisplayOutputBuffer(uint64_t display_id, const Buffer& buffer); - void ExecuteAcceptDisplayChanges(int64_t display_id); - void ExecutePresentDisplay(int64_t display_id); - - hwc3::Error PresentDisplayInternal( - uint64_t display_id, ::android::base::unique_fd& out_display_fence, - std::unordered_map<int64_t, ::android::base::unique_fd>& - out_release_fences); ::android::HwcDisplay* GetDisplay(uint64_t display_id);