hwc: Handle acquire fence closure in session
Move CloseAcquireFences implementation from hwc display objects
to hwc session.
CRs-Fixed: 936068
Change-Id: Ib29781b6aec2ae33c831b807b2ee747186768ada
diff --git a/sdm/libs/hwc/hwc_display.cpp b/sdm/libs/hwc/hwc_display.cpp
index d96c3bb..706e549 100644
--- a/sdm/libs/hwc/hwc_display.cpp
+++ b/sdm/libs/hwc/hwc_display.cpp
@@ -1247,15 +1247,6 @@
}
}
-void HWCDisplay::CloseAcquireFences(hwc_display_contents_1_t *content_list) {
- for (size_t i = 0; i < content_list->numHwLayers; i++) {
- if (content_list->hwLayers[i].acquireFenceFd >= 0) {
- close(content_list->hwLayers[i].acquireFenceFd);
- content_list->hwLayers[i].acquireFenceFd = -1;
- }
- }
-}
-
uint32_t HWCDisplay::RoundToStandardFPS(uint32_t fps) {
static const uint32_t standard_fps[4] = {30, 24, 48, 60};
diff --git a/sdm/libs/hwc/hwc_display.h b/sdm/libs/hwc/hwc_display.h
index 53d9c40..0b2c039 100644
--- a/sdm/libs/hwc/hwc_display.h
+++ b/sdm/libs/hwc/hwc_display.h
@@ -141,7 +141,6 @@
const char *GetDisplayString();
void ScaleDisplayFrame(hwc_rect_t *display_frame);
void MarkLayersForGPUBypass(hwc_display_contents_1_t *content_list);
- void CloseAcquireFences(hwc_display_contents_1_t *content_list);
uint32_t RoundToStandardFPS(uint32_t fps);
virtual void ApplyScanAdjustment(hwc_rect_t *display_frame);
DisplayError SetCSC(ColorSpace_t source, LayerCSC *target);
diff --git a/sdm/libs/hwc/hwc_display_external.cpp b/sdm/libs/hwc/hwc_display_external.cpp
index 28582f1..3fe283f 100755
--- a/sdm/libs/hwc/hwc_display_external.cpp
+++ b/sdm/libs/hwc/hwc_display_external.cpp
@@ -109,7 +109,6 @@
int status = 0;
if (secure_display_active_) {
- CloseAcquireFences(content_list);
return status;
}
diff --git a/sdm/libs/hwc/hwc_display_primary.cpp b/sdm/libs/hwc/hwc_display_primary.cpp
index fb134a9..569fc0f 100755
--- a/sdm/libs/hwc/hwc_display_primary.cpp
+++ b/sdm/libs/hwc/hwc_display_primary.cpp
@@ -164,7 +164,6 @@
close(content_list->outbufAcquireFenceFd);
content_list->outbufAcquireFenceFd = -1;
}
- CloseAcquireFences(content_list);
DisplayError error = display_intf_->Flush();
if (error != kErrorNone) {
diff --git a/sdm/libs/hwc/hwc_display_virtual.cpp b/sdm/libs/hwc/hwc_display_virtual.cpp
index 4d8c24e..f216f89 100644
--- a/sdm/libs/hwc/hwc_display_virtual.cpp
+++ b/sdm/libs/hwc/hwc_display_virtual.cpp
@@ -163,15 +163,6 @@
int HWCDisplayVirtual::Commit(hwc_display_contents_1_t *content_list) {
int status = 0;
if (display_paused_) {
- if (content_list->outbufAcquireFenceFd >= 0) {
- // If we do not handle the frame set retireFenceFd to outbufAcquireFenceFd,
- // which will make sure the framework waits on it and closes it.
- content_list->retireFenceFd = dup(content_list->outbufAcquireFenceFd);
- close(content_list->outbufAcquireFenceFd);
- content_list->outbufAcquireFenceFd = -1;
- }
- CloseAcquireFences(content_list);
-
DisplayError error = display_intf_->Flush();
if (error != kErrorNone) {
DLOGE("Flush failed. Error = %d", error);
@@ -191,11 +182,6 @@
return status;
}
- if (content_list->outbufAcquireFenceFd >= 0) {
- close(content_list->outbufAcquireFenceFd);
- content_list->outbufAcquireFenceFd = -1;
- }
-
return 0;
}
diff --git a/sdm/libs/hwc/hwc_session.cpp b/sdm/libs/hwc/hwc_session.cpp
index 779b440..ea9f8f3 100644
--- a/sdm/libs/hwc/hwc_session.cpp
+++ b/sdm/libs/hwc/hwc_session.cpp
@@ -337,32 +337,18 @@
// Drop virtual display composition if virtual display object could not be created
// due to HDMI concurrency.
if (dpy == HWC_DISPLAY_VIRTUAL && !hwc_session->hwc_display_[HWC_DISPLAY_VIRTUAL]) {
- if (!content_list) {
- continue;
+ CloseAcquireFds(content_list);
+ if (content_list) {
+ content_list->retireFenceFd = -1;
}
- for (size_t i = 0; i < content_list->numHwLayers; i++) {
- int &acquireFenceFd = content_list->hwLayers[i].acquireFenceFd;
- if (acquireFenceFd >= 0) {
- close(acquireFenceFd);
- acquireFenceFd = -1;
- }
- }
-
- int &outbufAcquireFenceFd = content_list->outbufAcquireFenceFd;
- if (outbufAcquireFenceFd >= 0) {
- close(outbufAcquireFenceFd);
- outbufAcquireFenceFd = -1;
- }
-
- content_list->retireFenceFd = -1;
-
continue;
}
if (hwc_session->hwc_display_[dpy]) {
hwc_session->hwc_display_[dpy]->Commit(content_list);
}
+ CloseAcquireFds(content_list);
}
if (hwc_session->new_bw_mode_) {
@@ -378,6 +364,24 @@
return 0;
}
+void HWCSession::CloseAcquireFds(hwc_display_contents_1_t *content_list) {
+ if (content_list) {
+ for (size_t i = 0; i < content_list->numHwLayers; i++) {
+ int &acquireFenceFd = content_list->hwLayers[i].acquireFenceFd;
+ if (acquireFenceFd >= 0) {
+ close(acquireFenceFd);
+ acquireFenceFd = -1;
+ }
+ }
+
+ int &outbufAcquireFenceFd = content_list->outbufAcquireFenceFd;
+ if (outbufAcquireFenceFd >= 0) {
+ close(outbufAcquireFenceFd);
+ outbufAcquireFenceFd = -1;
+ }
+ }
+}
+
int HWCSession::EventControl(hwc_composer_device_1 *device, int disp, int event, int enable) {
SEQUENCE_WAIT_SCOPE_LOCK(locker_);
diff --git a/sdm/libs/hwc/hwc_session.h b/sdm/libs/hwc/hwc_session.h
index 455ea83..01cd8ec 100644
--- a/sdm/libs/hwc/hwc_session.h
+++ b/sdm/libs/hwc/hwc_session.h
@@ -73,6 +73,7 @@
static int GetActiveConfig(hwc_composer_device_1 *device, int disp);
static int SetActiveConfig(hwc_composer_device_1 *device, int disp, int index);
static int SetCursorPositionAsync(hwc_composer_device_1 *device, int disp, int x, int y);
+ static void CloseAcquireFds(hwc_display_contents_1_t *content_list);
// Uevent thread
static void* HWCUeventThread(void *context);