From 2a1f1ae02d31dcb0ca39de2da103539cb7e4aae7 Mon Sep 17 00:00:00 2001 From: Roman Stratiienko Date: Sat, 23 Oct 2021 17:47:35 +0300 Subject: [PATCH] drm_hwcomposer: Route release fence directly Current release_fence merging logic doesn't make much sence, cleanup it. Signed-off-by: Roman Stratiienko --- DrmHwcTwo.cpp | 33 +++++++-------------------------- DrmHwcTwo.h | 5 +---- backend/Backend.cpp | 4 +++- 3 files changed, 11 insertions(+), 31 deletions(-) diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp index dada168..1f1e594 100644 --- a/DrmHwcTwo.cpp +++ b/DrmHwcTwo.cpp @@ -660,20 +660,7 @@ HWC2::Error DrmHwcTwo::HwcDisplay::GetReleaseFences(uint32_t *num_elements, 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 @@ HWC2::Error DrmHwcTwo::HwcDisplay::CreateComposition(bool test) { 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 @@ HWC2::Error DrmHwcTwo::HwcDisplay::PresentDisplay(int32_t *present_fence) { ++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 @@ HWC2::Error DrmHwcTwo::HwcDisplay::PresentDisplay(int32_t *present_fence) { 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 @@ class DrmHwcTwo : public hwc2_device_t { HwcDisplay(const HwcDisplay &) = delete; HWC2::Error Init(std::vector *planes); - HWC2::Error CreateComposition(bool test); + HWC2::Error CreateComposition(AtomicCommitArgs &a_args); std::vector GetOrderLayersByZPos(); void ClearDisplay(); @@ -327,8 +327,6 @@ class DrmHwcTwo : public hwc2_device_t { 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 @@ class DrmHwcTwo : public hwc2_device_t { uint32_t layer_idx_ = 0; std::map layers_; HwcLayer client_layer_; - UniqueFd present_fence_; int32_t color_mode_{}; std::array 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 @@ HWC2::Error Backend::ValidateDisplay(DrmHwcTwo::HwcDisplay *display, 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(); -- 2.11.0