drm_hwcomposer: Fix missing present and release fence handling
- Use wrappers instead of exposed raw fd in the HwcDisplay API.
- Add fences to the HWC3 command stream.
Fixes: b864ccf845e5 ("drm_hwcomposer: Remove HWC2 usage for Present")
Change-Id: Iadfa39d9b3f58d1e542a1738f27809155fdbf3f6
Signed-off-by: Roman Stratiienko <r.stratiienko@gmail.com>
diff --git a/hwc3/ComposerClient.cpp b/hwc3/ComposerClient.cpp
index f067147..04beb3a 100644
--- a/hwc3/ComposerClient.cpp
+++ b/hwc3/ComposerClient.cpp
@@ -593,14 +593,25 @@
cmd_result_writer_->AddError(hwc3::Error::kNotValidated);
return;
}
- int32_t present_fence = -1;
+ ::android::SharedFd present_fence;
std::vector<HwcDisplay::ReleaseFence> release_fences;
- error = Hwc2toHwc3Error(
- display->PresentStagedComposition(&present_fence, &release_fences));
- if (error != hwc3::Error::kNone) {
- cmd_result_writer_->AddError(error);
+ bool ret = display->PresentStagedComposition(present_fence, release_fences);
+
+ if (!ret) {
+ cmd_result_writer_->AddError(hwc3::Error::kBadDisplay);
return;
}
+
+ using ::android::base::unique_fd;
+ cmd_result_writer_->AddPresentFence( //
+ display_id, unique_fd(::android::DupFd(present_fence)));
+
+ std::unordered_map<int64_t, unique_fd> hal_release_fences;
+ for (const auto& [layer_id, release_fence] : release_fences) {
+ hal_release_fences[Hwc2LayerToHwc3(layer_id)] = //
+ unique_fd(::android::DupFd(release_fence));
+ }
+ cmd_result_writer_->AddReleaseFence(display_id, hal_release_fences);
}
}