diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index d01a30e52749..6eff629a03f4 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -141,7 +141,7 @@ void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) { } struct ASurfaceControlStats { - int64_t acquireTime; + std::variant> acquireTimeOrFence; sp previousReleaseFence; uint64_t frameNumber; }; @@ -153,7 +153,7 @@ void ASurfaceControl_registerSurfaceStatsListener(ASurfaceControl* control, int3 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 @@ void ASurfaceControl_unregisterSurfaceStatsListener(void* context, } int64_t ASurfaceControlStats_getAcquireTime(ASurfaceControlStats* stats) { - return stats->acquireTime; + if (const auto* fence = std::get_if>(&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(stats->acquireTimeOrFence); } uint64_t ASurfaceControlStats_getFrameNumber(ASurfaceControlStats* stats) { @@ -250,7 +258,7 @@ int64_t ASurfaceTransactionStats_getAcquireTime(ASurfaceTransactionStats* aSurfa aSurfaceControlStats == aSurfaceTransactionStats->aSurfaceControlStats.end(), "ASurfaceControl not found"); - return aSurfaceControlStats->second.acquireTime; + return ASurfaceControlStats_getAcquireTime(&aSurfaceControlStats->second); } int ASurfaceTransactionStats_getPreviousReleaseFenceFd( @@ -294,9 +302,10 @@ void ASurfaceTransaction_setOnComplete(ASurfaceTransaction* aSurfaceTransaction, 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(surfaceControl.get()); - aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime; + aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence; aSurfaceControlStats[aSurfaceControl].previousReleaseFence = previousReleaseFence; } @@ -643,13 +652,12 @@ void ASurfaceTransaction_setOnCommit(ASurfaceTransaction* aSurfaceTransaction, v 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(surfaceControl.get()); - aSurfaceControlStats[aSurfaceControl].acquireTime = acquireTime; + aSurfaceControlStats[aSurfaceControl].acquireTimeOrFence = acquireTimeOrFence; } (*func)(callback_context, &aSurfaceTransactionStats);