diff options
author | 2022-01-21 11:11:31 -0800 | |
---|---|---|
committer | 2022-02-09 19:26:09 -0800 | |
commit | 461296a52224f58ea4ffe7235d744260cb3ad01d (patch) | |
tree | b2cc77da6e3d2dbcbdcb0eb7deb718f7b75d1e77 /services/surfaceflinger/BufferStateLayer.cpp | |
parent | 9dada820366f73c702224aaaddd4e7237e5035b3 (diff) |
SF: pass 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: SF unit tests
Change-Id: Ic7ad9b603b60dbf46a62eaf6b76bfbdeeebf6cec
Diffstat (limited to 'services/surfaceflinger/BufferStateLayer.cpp')
-rw-r--r-- | services/surfaceflinger/BufferStateLayer.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/services/surfaceflinger/BufferStateLayer.cpp b/services/surfaceflinger/BufferStateLayer.cpp index fccd8f149a..02e444df8e 100644 --- a/services/surfaceflinger/BufferStateLayer.cpp +++ b/services/surfaceflinger/BufferStateLayer.cpp @@ -416,8 +416,14 @@ bool BufferStateLayer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& ? bufferData.acquireFence : Fence::NO_FENCE; mDrawingState.acquireFenceTime = std::make_unique<FenceTime>(mDrawingState.acquireFence); - // The acquire fences of BufferStateLayers have already signaled before they are set - mCallbackHandleAcquireTime = mDrawingState.acquireFenceTime->getSignalTime(); + if (mDrawingState.acquireFenceTime->getSignalTime() == Fence::SIGNAL_TIME_PENDING) { + // We latched this buffer unsiganled, so we need to pass the acquire fence + // on the callback instead of just the acquire time, since it's unknown at + // this point. + mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFence; + } else { + mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFenceTime->getSignalTime(); + } mDrawingState.modified = true; setTransactionFlags(eTransactionNeeded); @@ -527,7 +533,7 @@ bool BufferStateLayer::setTransactionCompletedListeners( // If this layer will be presented in this frame if (willPresent) { // If this transaction set an acquire fence on this layer, set its acquire time - handle->acquireTime = mCallbackHandleAcquireTime; + handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence; handle->frameNumber = mDrawingState.frameNumber; // Store so latched time and release fence can be set @@ -540,7 +546,7 @@ bool BufferStateLayer::setTransactionCompletedListeners( } mReleasePreviousBuffer = false; - mCallbackHandleAcquireTime = -1; + mCallbackHandleAcquireTimeOrFence = -1; return willPresent; } |