From 82d07c9e4561ec7adc9340207d25b59b7926c3c9 Mon Sep 17 00:00:00 2001 From: Robert Carr Date: Mon, 10 May 2021 11:36:43 -0700 Subject: BBQSurface: Give client a chance to observe transform hint earlier The client may be observing the transform hint through the Surface.cpp codepath however Surface#mTransformHint will only be updated on queueBuffer. However imagine a scenario like this: 1. transform hint changes on server 2. queue buffer 2. repeat queue buffer 3. callback for queue buffer 1 and 2, updates transform hint on client 4. queue buffer 4 5. Client now observes transform hint 6. Queue buffer 5(!) will finally contain the transform hint. With this change we give the client a chance to observe the tranform hint in this scenario before queue buffer 4. In the case of the ScreenDecorOverlay's which rarely redraw, this seems to fix some persistent pre-rotation issues. Bug: 184842607 Test: Existing tests pass. Change-Id: I34524ee40c6076f497bb0c60af901e9c93798a48 --- libs/gui/BLASTBufferQueue.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'libs/gui/BLASTBufferQueue.cpp') diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index 3d854c2b92..a023067887 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -316,6 +316,11 @@ void BLASTBufferQueue::releaseBufferCallback(uint64_t graphicBufferId, std::unique_lock _lock{mMutex}; BQA_LOGV("releaseBufferCallback graphicBufferId=%" PRIu64, graphicBufferId); + if (mSurfaceControl != nullptr) { + mTransformHint = mSurfaceControl->getTransformHint(); + mBufferItemConsumer->setTransformHint(mTransformHint); + } + auto it = mSubmitted.find(graphicBufferId); if (it == mSubmitted.end()) { BQA_LOGE("ERROR: releaseBufferCallback without corresponding submitted buffer %" PRIu64, @@ -608,6 +613,14 @@ public: status_t setFrameTimelineInfo(const FrameTimelineInfo& frameTimelineInfo) override { return mBbq->setFrameTimelineInfo(frameTimelineInfo); } + protected: + uint32_t getTransformHint() const override { + if (mStickyTransform == 0 && !transformToDisplayInverse()) { + return mBbq->getLastTransformHint(); + } else { + return 0; + } + } }; // TODO: Can we coalesce this with frame updates? Need to confirm @@ -777,4 +790,12 @@ PixelFormat BLASTBufferQueue::convertBufferFormat(PixelFormat& format) { return convertedFormat; } +uint32_t BLASTBufferQueue::getLastTransformHint() const { + if (mSurfaceControl != nullptr) { + return mSurfaceControl->getTransformHint(); + } else { + return 0; + } +} + } // namespace android -- cgit v1.2.3-59-g8ed1b