hwc2: Clean up acquire fence handling
Simplify closing of acquire fences of all displays.
Close hwc layer's acquire fence fd only when new fence
is set on hwc layer or while deleting layer.
Change-Id: Iebd5e0eacb863ee36780aec414b8b5abbbcb9748
CRs-fixed: 2111956
diff --git a/sdm/libs/hwc2/hwc_display.cpp b/sdm/libs/hwc2/hwc_display.cpp
index 3a02983..ec16b79 100644
--- a/sdm/libs/hwc2/hwc_display.cpp
+++ b/sdm/libs/hwc2/hwc_display.cpp
@@ -1920,22 +1920,6 @@
return display_class_;
}
-void HWCDisplay::CloseAcquireFds() {
- for (auto hwc_layer : layer_set_) {
- auto layer = hwc_layer->GetSDMLayer();
- if (layer->input_buffer.acquire_fence_fd >= 0) {
- close(layer->input_buffer.acquire_fence_fd);
- layer->input_buffer.acquire_fence_fd = -1;
- }
- }
- int32_t &client_target_acquire_fence =
- client_target_->GetSDMLayer()->input_buffer.acquire_fence_fd;
- if (client_target_acquire_fence >= 0) {
- close(client_target_acquire_fence);
- client_target_acquire_fence = -1;
- }
-}
-
void HWCDisplay::ClearRequestFlags() {
for (Layer *layer : layer_stack_.layers) {
layer->request.flags = {};
diff --git a/sdm/libs/hwc2/hwc_display.h b/sdm/libs/hwc2/hwc_display.h
index e90dbdd..250b491 100644
--- a/sdm/libs/hwc2/hwc_display.h
+++ b/sdm/libs/hwc2/hwc_display.h
@@ -240,7 +240,6 @@
bool IsSurfaceUpdated(const std::vector<LayerRect> &dirty_regions);
bool IsLayerUpdating(const Layer *layer);
uint32_t SanitizeRefreshRate(uint32_t req_refresh_rate);
- virtual void CloseAcquireFds();
virtual void ClearRequestFlags();
virtual void GetUnderScanConfig() { }
diff --git a/sdm/libs/hwc2/hwc_display_external.cpp b/sdm/libs/hwc2/hwc_display_external.cpp
index cfeb8a4..2bc2d18 100644
--- a/sdm/libs/hwc2/hwc_display_external.cpp
+++ b/sdm/libs/hwc2/hwc_display_external.cpp
@@ -137,7 +137,6 @@
status = HWCDisplay::PostCommitLayerStack(out_retire_fence);
}
}
- CloseAcquireFds();
return status;
}
diff --git a/sdm/libs/hwc2/hwc_display_primary.cpp b/sdm/libs/hwc2/hwc_display_primary.cpp
index 71f6b4e..fb94715 100644
--- a/sdm/libs/hwc2/hwc_display_primary.cpp
+++ b/sdm/libs/hwc2/hwc_display_primary.cpp
@@ -233,7 +233,6 @@
}
}
- CloseAcquireFds();
return status;
}
diff --git a/sdm/libs/hwc2/hwc_display_virtual.cpp b/sdm/libs/hwc2/hwc_display_virtual.cpp
index 0ad37bc..7505b01 100644
--- a/sdm/libs/hwc2/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc2/hwc_display_virtual.cpp
@@ -166,8 +166,10 @@
status = HWCDisplay::PostCommitLayerStack(out_retire_fence);
}
}
- CloseAcquireFds();
- close(output_buffer_->acquire_fence_fd);
+ if (output_buffer_->acquire_fence_fd >= 0) {
+ close(output_buffer_->acquire_fence_fd);
+ output_buffer_->acquire_fence_fd = -1;
+ }
return status;
}
diff --git a/sdm/libs/hwc2/hwc_layers.cpp b/sdm/libs/hwc2/hwc_layers.cpp
index fee67b4..7761791 100644
--- a/sdm/libs/hwc2/hwc_layers.cpp
+++ b/sdm/libs/hwc2/hwc_layers.cpp
@@ -184,6 +184,9 @@
release_fences_.pop();
}
if (layer_) {
+ if (layer_->input_buffer.acquire_fence_fd >= 0) {
+ close(layer_->input_buffer.acquire_fence_fd);
+ }
delete layer_;
}
}
@@ -251,10 +254,13 @@
layer_buffer->flags.secure_camera = secure_camera;
layer_buffer->flags.secure_display = secure_display;
+ if (layer_buffer->acquire_fence_fd >= 0) {
+ close(layer_buffer->acquire_fence_fd);
+ }
+ layer_buffer->acquire_fence_fd = acquire_fence;
layer_buffer->planes[0].fd = handle->fd;
layer_buffer->planes[0].offset = handle->offset;
layer_buffer->planes[0].stride = UINT32(handle->width);
- layer_buffer->acquire_fence_fd = acquire_fence;
layer_buffer->size = handle->size;
layer_buffer->buffer_id = reinterpret_cast<uint64_t>(handle);