surface_control: handle acquire fence on BLAST callbacks
When latching unsignaled buffers, the acquire fence is
not signaled by the time BLAST callback is invoked. In
that case pass a fence instead. For latch signaled, we still
pass the acquire time itself to avoid sending file descriptors
over binder.
Bug: 198190384
Test: TBD
Change-Id: I949fd396ec36ee759327a952239509d10259be1b
diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 5b19102..4fc3364 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -141,7 +141,7 @@
}
struct ASurfaceControlStats {
- int64_t acquireTime;
+ std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
sp<Fence> previousReleaseFence;
uint64_t frameNumber;
};
@@ -153,7 +153,7 @@
const SurfaceStats& surfaceStats) {
ASurfaceControlStats aSurfaceControlStats;
- aSurfaceControlStats.acquireTime = surfaceStats.acquireTime;
+ aSurfaceControlStats.acquireTimeOrFence = surfaceStats.acquireTimeOrFence;
aSurfaceControlStats.previousReleaseFence = surfaceStats.previousReleaseFence;
aSurfaceControlStats.frameNumber = surfaceStats.eventStats.frameNumber;
@@ -171,7 +171,15 @@
}
int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) {
- return stats->acquireTime;
+ if (const auto* fence = std::get_if<sp<Fence>>(&stats->acquireTimeOrFence)) {
+ // We got a fence instead of the acquire time due to latch unsignaled.
+ // Ideally the client could just get the acquire time dericly from
+ // the fence instead of calling this function which needs to block.
+ (*fence)->waitForever("ASurfaceControlStats_getAcquireTime");
+ return (*fence)->getSignalTime();
+ }
+
+ return std::get<int64_t>(stats->acquireTimeOrFence);
}
uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) {
@@ -250,7 +258,7 @@
aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(),
"ASurfaceControl not found");
- return aSurfaceControlStats->second.acquireTime;
+ return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second);
}
int ASurfaceTransactionStats_getPreviousReleaseFenceFd(
@@ -294,9 +302,10 @@
auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
- for (const auto& [surfaceControl, latchTime, acquireTime, presentFence, previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
+ for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
+ previousReleaseFence, transformHint, frameEvents] : surfaceControlStats) {
ASurfaceControl* aSurfaceControl = reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
- aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
+ aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence;
}
@@ -643,13 +652,12 @@
aSurfaceTransactionStats.transactionCompleted = false;
auto& aSurfaceControlStats = aSurfaceTransactionStats.aSurfaceControlStats;
- for (const auto&
- [surfaceControl, latchTime, acquireTime, presentFence,
- previousReleaseFence, transformHint,
- frameEvents] : surfaceControlStats) {
+ for (const auto& [surfaceControl, latchTime, acquireTimeOrFence, presentFence,
+ previousReleaseFence, transformHint, frameEvents] :
+ surfaceControlStats) {
ASurfaceControl* aSurfaceControl =
reinterpret_cast<ASurfaceControl*>(surfaceControl.get());
- aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime;
+ aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence;
}
(*func)(callback_context, &aSurfaceTransactionStats);