OSDN Git Service

drm_hwcomposer: Route release fence directly
authorRoman Stratiienko <roman.o.stratiienko@globallogic.com>
Sat, 23 Oct 2021 14:47:35 +0000 (17:47 +0300)
committerRoman Stratiienko <roman.o.stratiienko@globallogic.com>
Thu, 28 Oct 2021 18:43:01 +0000 (21:43 +0300)
Current release_fence merging logic doesn't make much sence, cleanup it.

Signed-off-by: Roman Stratiienko <roman.o.stratiienko@globallogic.com>
DrmHwcTwo.cpp
DrmHwcTwo.h
backend/Backend.cpp

index dada168..1f1e594 100644 (file)
@@ -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;
index 0d213fd..974c0a8 100644 (file)
@@ -149,7 +149,7 @@ class DrmHwcTwo : public hwc2_device_t {
     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 @@ 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<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_;
index d7eb240..bd1855f 100644 (file)
@@ -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();