From 97e7cc0ce23e417a2355a4559d43fd9c9ccb4efa Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 7 Jun 2021 10:45:40 -0700 Subject: SF: Pass transformHint with releaseBuffer We want the client to receive the tranformHint as early as possible, in particular prior to beginning rendering of a new frame. Since the releaseBuffer callback may cause the client to begin rendering we should include our most up to date transform hint here. Bug: 184842607 Test: Existing tests pass Change-Id: I61127d78f44b7332ad9ff3cade772fa6b475365f --- libs/gui/BLASTBufferQueue.cpp | 12 +++++++----- libs/gui/ITransactionCompletedListener.cpp | 5 +++-- libs/gui/SurfaceComposerClient.cpp | 8 +++++--- libs/gui/include/gui/BLASTBufferQueue.h | 3 ++- libs/gui/include/gui/ITransactionCompletedListener.h | 3 ++- libs/gui/include/gui/SurfaceComposerClient.h | 6 ++++-- 6 files changed, 23 insertions(+), 14 deletions(-) (limited to 'libs/gui') diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index a2868c6143..b9a293f4c3 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -302,23 +302,25 @@ void BLASTBufferQueue::transactionCallback(nsecs_t /*latchTime*/, const sp context, uint64_t graphicBufferId, - const sp& releaseFence) { + const sp& releaseFence, uint32_t transformHint) { sp blastBufferQueue = context.promote(); ALOGV("releaseBufferCallbackThunk graphicBufferId=%" PRIu64 " blastBufferQueue=%s", graphicBufferId, blastBufferQueue ? "alive" : "dead"); if (blastBufferQueue) { - blastBufferQueue->releaseBufferCallback(graphicBufferId, releaseFence); + blastBufferQueue->releaseBufferCallback(graphicBufferId, releaseFence, transformHint); } } void BLASTBufferQueue::releaseBufferCallback(uint64_t graphicBufferId, - const sp& releaseFence) { + const sp& releaseFence, + uint32_t transformHint) { ATRACE_CALL(); std::unique_lock _lock{mMutex}; BQA_LOGV("releaseBufferCallback graphicBufferId=%" PRIu64, graphicBufferId); if (mSurfaceControl != nullptr) { - mTransformHint = mSurfaceControl->getTransformHint(); + mTransformHint = transformHint; + mSurfaceControl->setTransformHint(transformHint); mBufferItemConsumer->setTransformHint(mTransformHint); } @@ -412,7 +414,7 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) { auto releaseBufferCallback = std::bind(releaseBufferCallbackThunk, wp(this) /* callbackContext */, - std::placeholders::_1, std::placeholders::_2); + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); t->setBuffer(mSurfaceControl, buffer, releaseBufferCallback); t->setDataspace(mSurfaceControl, static_cast(bufferItem.mDataSpace)); t->setHdrMetadata(mSurfaceControl, bufferItem.mHdrMetadata); diff --git a/libs/gui/ITransactionCompletedListener.cpp b/libs/gui/ITransactionCompletedListener.cpp index f74f91e034..63d07ba1fb 100644 --- a/libs/gui/ITransactionCompletedListener.cpp +++ b/libs/gui/ITransactionCompletedListener.cpp @@ -251,10 +251,11 @@ public: stats); } - void onReleaseBuffer(uint64_t graphicBufferId, sp releaseFence) override { + void onReleaseBuffer(uint64_t graphicBufferId, sp releaseFence, + uint32_t transformHint) override { callRemoteAsync(Tag::ON_RELEASE_BUFFER, - graphicBufferId, releaseFence); + graphicBufferId, releaseFence, transformHint); } }; diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index 371454a3de..96104376d1 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -331,7 +331,8 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener callback(surfaceStats.previousBufferId, surfaceStats.previousReleaseFence ? surfaceStats.previousReleaseFence - : Fence::NO_FENCE); + : Fence::NO_FENCE, + surfaceStats.transformHint); } } } @@ -357,7 +358,8 @@ void TransactionCompletedListener::onTransactionCompleted(ListenerStats listener } void TransactionCompletedListener::onReleaseBuffer(uint64_t graphicBufferId, - sp releaseFence) { + sp releaseFence, + uint32_t transformHint) { ReleaseBufferCallback callback; { std::scoped_lock lock(mMutex); @@ -367,7 +369,7 @@ void TransactionCompletedListener::onReleaseBuffer(uint64_t graphicBufferId, ALOGE("Could not call release buffer callback, buffer not found %" PRIu64, graphicBufferId); return; } - callback(graphicBufferId, releaseFence); + callback(graphicBufferId, releaseFence, transformHint); } ReleaseBufferCallback TransactionCompletedListener::popReleaseBufferCallbackLocked( diff --git a/libs/gui/include/gui/BLASTBufferQueue.h b/libs/gui/include/gui/BLASTBufferQueue.h index c4ca399e37..3ab1ee103d 100644 --- a/libs/gui/include/gui/BLASTBufferQueue.h +++ b/libs/gui/include/gui/BLASTBufferQueue.h @@ -89,7 +89,8 @@ public: void transactionCallback(nsecs_t latchTime, const sp& presentFence, const std::vector& stats); - void releaseBufferCallback(uint64_t graphicBufferId, const sp& releaseFence); + void releaseBufferCallback(uint64_t graphicBufferId, const sp& releaseFence, + uint32_t transformHint); void setNextTransaction(SurfaceComposerClient::Transaction *t); void mergeWithNextTransaction(SurfaceComposerClient::Transaction* t, uint64_t frameNumber); void setTransactionCompleteCallback(uint64_t frameNumber, diff --git a/libs/gui/include/gui/ITransactionCompletedListener.h b/libs/gui/include/gui/ITransactionCompletedListener.h index 2d71194f70..3bfeef1922 100644 --- a/libs/gui/include/gui/ITransactionCompletedListener.h +++ b/libs/gui/include/gui/ITransactionCompletedListener.h @@ -158,7 +158,8 @@ public: virtual void onTransactionCompleted(ListenerStats stats) = 0; - virtual void onReleaseBuffer(uint64_t graphicBufferId, sp releaseFence) = 0; + virtual void onReleaseBuffer(uint64_t graphicBufferId, sp releaseFence, + uint32_t transformHint) = 0; }; class BnTransactionCompletedListener : public SafeBnInterface { diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index 2582882c85..62a782fd3e 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -82,7 +82,8 @@ using TransactionCompletedCallback = std::function& /*presentFence*/, const std::vector& /*stats*/)>; using ReleaseBufferCallback = - std::function& /*releaseFence*/)>; + std::function& /*releaseFence*/, + uint32_t transformHint)>; using SurfaceStatsCallback = std::function releaseFence) override; + void onReleaseBuffer(uint64_t /* graphicsBufferId */, sp releaseFence, + uint32_t transformHint) override; private: ReleaseBufferCallback popReleaseBufferCallbackLocked(uint64_t /* graphicsBufferId */); -- cgit v1.2.3-59-g8ed1b