From 53c936ca72e18579f446a59765bc99770a49dd20 Mon Sep 17 00:00:00 2001 From: Vishnu Nair Date: Thu, 3 Dec 2020 11:46:37 -0800 Subject: BlastBufferQueue: Update layer size immediately if the buffer can scale SurfaceView size changes should be reflected immediately instead of waiting for a new buffer. If the scaling mode is not freeze, the expected behaviour is for the layer size to be update immediately. If a buffer is present, it will be scaled to the new size. If the buffer has scaling mode freeze, then the size changes will continue to be deferred until we recieve the new buffer of the new size. Fixes: 174217687 Test: atest SurfaceViewBufferTests:GeometryTests Change-Id: I19b6378de63be905db3d9c709cce0f4f26acce18 --- libs/gui/BLASTBufferQueue.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'libs/gui/BLASTBufferQueue.cpp') diff --git a/libs/gui/BLASTBufferQueue.cpp b/libs/gui/BLASTBufferQueue.cpp index 3a3a96fc32..b9ab5613c6 100644 --- a/libs/gui/BLASTBufferQueue.cpp +++ b/libs/gui/BLASTBufferQueue.cpp @@ -150,6 +150,16 @@ void BLASTBufferQueue::update(const sp& surface, uint32_t width, if (mRequestedSize != newSize) { mRequestedSize.set(newSize); mBufferItemConsumer->setDefaultBufferSize(mRequestedSize.width, mRequestedSize.height); + if (mLastBufferScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE) { + // If the buffer supports scaling, update the frame immediately since the client may + // want to scale the existing buffer to the new size. + mSize = mRequestedSize; + SurfaceComposerClient::Transaction t; + t.setFrame(mSurfaceControl, + {0, 0, static_cast(mSize.width), + static_cast(mSize.height)}); + t.apply(); + } } } @@ -276,6 +286,8 @@ void BLASTBufferQueue::processNextBufferLocked(bool useNextTransaction) { // Ensure BLASTBufferQueue stays alive until we receive the transaction complete callback. incStrong((void*)transactionCallbackThunk); + mLastBufferScalingMode = bufferItem.mScalingMode; + t->setBuffer(mSurfaceControl, buffer); t->setAcquireFence(mSurfaceControl, bufferItem.mFence ? new Fence(bufferItem.mFence->dup()) : Fence::NO_FENCE); @@ -348,7 +360,6 @@ void BLASTBufferQueue::setNextTransaction(SurfaceComposerClient::Transaction* t) bool BLASTBufferQueue::rejectBuffer(const BufferItem& item) { if (item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE) { - mSize = mRequestedSize; // Only reject buffers if scaling mode is freeze. return false; } -- cgit v1.2.3-59-g8ed1b