diff options
| author | 2020-12-03 11:46:37 -0800 | |
|---|---|---|
| committer | 2020-12-03 12:26:57 -0800 | |
| commit | 53c936ca72e18579f446a59765bc99770a49dd20 (patch) | |
| tree | ce1eb53780ef7b2ef487d5760929e283ab1155fb /libs/gui/BLASTBufferQueue.cpp | |
| parent | 83d524326dc60d0cc51e6315c06398bf742f6c86 (diff) | |
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
Diffstat (limited to 'libs/gui/BLASTBufferQueue.cpp')
| -rw-r--r-- | libs/gui/BLASTBufferQueue.cpp | 13 |
1 files changed, 12 insertions, 1 deletions
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<SurfaceControl>& 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<int32_t>(mSize.width), + static_cast<int32_t>(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; } |