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);