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);