drm_hwcomposer: Route release fence directly
Current release_fence merging logic doesn't make much sence, cleanup it.
Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp
index dada168..1f1e594 100644
--- a/DrmHwcTwo.cpp
+++ b/DrmHwcTwo.cpp
@@ -660,20 +660,7 @@
return HWC2::Error::None;
}
-void DrmHwcTwo::HwcDisplay::AddFenceToPresentFence(UniqueFd fd) {
- if (!fd) {
- return;
- }
-
- if (present_fence_) {
- present_fence_ = UniqueFd(
- sync_merge("dc_present", present_fence_.Get(), fd.Get()));
- } else {
- present_fence_ = std::move(fd);
- }
-}
-
-HWC2::Error DrmHwcTwo::HwcDisplay::CreateComposition(bool test) {
+HWC2::Error DrmHwcTwo::HwcDisplay::CreateComposition(AtomicCommitArgs &a_args) {
// order the layers by z-order
bool use_client_layer = false;
uint32_t client_z_order = UINT32_MAX;
@@ -741,21 +728,13 @@
i = overlay_planes.erase(i);
}
- AtomicCommitArgs a_args = {
- .test_only = test,
- .composition = composition,
- };
-
+ a_args.composition = composition;
ret = compositor_.ExecuteAtomicCommit(a_args);
if (ret) {
- if (!test)
+ if (!a_args.test_only)
ALOGE("Failed to apply the frame composition ret=%d", ret);
return HWC2::Error::BadParameter;
- } else {
- if (!test) {
- AddFenceToPresentFence(std::move(a_args.out_fence));
- }
}
return HWC2::Error::None;
}
@@ -769,7 +748,9 @@
++total_stats_.total_frames_;
- ret = CreateComposition(false);
+ AtomicCommitArgs a_args{};
+ ret = CreateComposition(a_args);
+
if (ret != HWC2::Error::None)
++total_stats_.failed_kms_present_;
@@ -781,7 +762,7 @@
if (ret != HWC2::Error::None)
return ret;
- *present_fence = present_fence_.Release();
+ *present_fence = a_args.out_fence.Release();
++frame_no_;
return HWC2::Error::None;
diff --git a/DrmHwcTwo.h b/DrmHwcTwo.h
index 0d213fd..974c0a8 100644
--- a/DrmHwcTwo.h
+++ b/DrmHwcTwo.h
@@ -149,7 +149,7 @@
HwcDisplay(const HwcDisplay &) = delete;
HWC2::Error Init(std::vector<DrmPlane *> *planes);
- HWC2::Error CreateComposition(bool test);
+ HWC2::Error CreateComposition(AtomicCommitArgs &a_args);
std::vector<DrmHwcTwo::HwcLayer *> GetOrderLayersByZPos();
void ClearDisplay();
@@ -327,8 +327,6 @@
std::atomic_int flattenning_state_{ClientFlattenningState::NotRequired};
VSyncWorker flattening_vsync_worker_;
- void AddFenceToPresentFence(UniqueFd fd);
-
constexpr static size_t MATRIX_SIZE = 16;
DrmHwcTwo *hwc2_;
@@ -351,7 +349,6 @@
uint32_t layer_idx_ = 0;
std::map<hwc2_layer_t, HwcLayer> layers_;
HwcLayer client_layer_;
- UniqueFd present_fence_;
int32_t color_mode_{};
std::array<float, MATRIX_SIZE> color_transform_matrix_{};
android_color_transform_t color_transform_hint_;
diff --git a/backend/Backend.cpp b/backend/Backend.cpp
index d7eb240..bd1855f 100644
--- a/backend/Backend.cpp
+++ b/backend/Backend.cpp
@@ -46,8 +46,10 @@
bool testing_needed = !(client_start == 0 && client_size == layers.size());
+ AtomicCommitArgs a_args = {.test_only = true};
+
if (testing_needed &&
- display->CreateComposition(true) != HWC2::Error::None) {
+ display->CreateComposition(a_args) != HWC2::Error::None) {
++display->total_stats().failed_kms_validate_;
client_start = 0;
client_size = layers.size();