summaryrefslogtreecommitdiff
path: root/libs/gui/BLASTBufferQueue.cpp
diff options
context:
space:
mode:
author Robert Carr <racarr@google.com> 2021-05-10 11:36:43 -0700
committer Robert Carr <racarr@google.com> 2021-05-10 12:16:26 -0700
commit82d07c9e4561ec7adc9340207d25b59b7926c3c9 (patch)
tree280ad61cc77069cf3325c86ef306efd5d655c6e9 /libs/gui/BLASTBufferQueue.cpp
parent272e1621ce7eda67b38373f960a4b37c0f79207c (diff)
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
Diffstat (limited to 'libs/gui/BLASTBufferQueue.cpp')
-rw-r--r--libs/gui/BLASTBufferQueue.cpp21
1 files changed, 21 insertions, 0 deletions
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