blob: 574e2f5bedb217ea113e3a3a458de68a2b62d75a [file] [log] [blame]
Marissa Wall61c58622018-07-18 10:12:20 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#undef LOG_TAG
19#define LOG_TAG "BufferStateLayer"
20#define ATRACE_TAG ATRACE_TAG_GRAPHICS
21
Lloyd Pique9755fb72019-03-26 14:44:40 -070022#include "BufferStateLayer.h"
23
Lloyd Pique37c2c9b2018-12-04 17:25:10 -080024#include <limits>
Marissa Wall61c58622018-07-18 10:12:20 -070025
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000026#include <FrameTimeline/FrameTimeline.h>
Lloyd Pique9755fb72019-03-26 14:44:40 -070027#include <compositionengine/LayerFECompositionState.h>
Marissa Wall947d34e2019-03-29 14:03:53 -070028#include <gui/BufferQueue.h>
Marissa Wall61c58622018-07-18 10:12:20 -070029#include <private/gui/SyncFeatures.h>
Peiyong Lincbc184f2018-08-22 13:24:10 -070030#include <renderengine/Image.h>
Robert Carr38d25002021-06-11 14:30:09 -070031#include "TunnelModeEnabledReporter.h"
Marissa Wall61c58622018-07-18 10:12:20 -070032
Chavi Weingartend00e0f72022-07-14 15:59:20 +000033#include <gui/TraceUtils.h>
Vishnu Nairfa247b12020-02-11 08:58:26 -080034#include "EffectLayer.h"
Adithya Srinivasanb238cd52021-02-04 17:54:05 +000035#include "FrameTracer/FrameTracer.h"
Lloyd Pique37c2c9b2018-12-04 17:25:10 -080036#include "TimeStats/TimeStats.h"
Valerie Hau0bc09152018-12-20 07:42:47 -080037
Robert Carrb6450492022-06-23 11:17:16 -070038#define EARLY_RELEASE_ENABLED false
39
Marissa Wall61c58622018-07-18 10:12:20 -070040namespace android {
41
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000042using PresentState = frametimeline::SurfaceFrame::PresentState;
Chavi Weingartend00e0f72022-07-14 15:59:20 +000043
44void BufferStateLayer::callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener,
45 const sp<GraphicBuffer>& buffer,
46 uint64_t framenumber,
47 const sp<Fence>& releaseFence,
48 uint32_t currentMaxAcquiredBufferCount) {
Vishnu Nair1506b182021-02-22 14:35:15 -080049 if (!listener) {
50 return;
51 }
Chavi Weingartend00e0f72022-07-14 15:59:20 +000052 ATRACE_FORMAT_INSTANT("callReleaseBufferCallback %s - %" PRIu64, getDebugName(), framenumber);
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070053 listener->onReleaseBuffer({buffer->getId(), framenumber},
chaviw69058fb2021-09-27 09:37:30 -050054 releaseFence ? releaseFence : Fence::NO_FENCE,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070055 currentMaxAcquiredBufferCount);
Vishnu Nair1506b182021-02-22 14:35:15 -080056}
Vishnu Nair1506b182021-02-22 14:35:15 -080057
Marissa Wall947d34e2019-03-29 14:03:53 -070058BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args)
59 : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) {
Robert Carr6a160312021-05-17 12:08:20 -070060 mDrawingState.dataspace = ui::Dataspace::V0_SRGB;
Vishnu Nair60356342018-11-13 13:00:45 -080061}
Marissa Wall61c58622018-07-18 10:12:20 -070062
Alec Mouri4545a8a2019-08-08 20:05:32 -070063BufferStateLayer::~BufferStateLayer() {
chaviwb4c6e582019-08-16 14:35:07 -070064 // The original layer and the clone layer share the same texture and buffer. Therefore, only
65 // one of the layers, in this case the original layer, needs to handle the deletion. The
66 // original layer and the clone should be removed at the same time so there shouldn't be any
67 // issue with the clone layer trying to use the texture.
Vishnu Nair3bb11d02021-11-26 09:24:11 -080068 if (mBufferInfo.mBuffer != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +000069 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070070 mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFrameNumber,
chaviw69058fb2021-09-27 09:37:30 -050071 mBufferInfo.mFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -070072 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
73 mOwnerUid));
Alec Mouri4545a8a2019-08-08 20:05:32 -070074 }
75}
76
Marissa Wall61c58622018-07-18 10:12:20 -070077// -----------------------------------------------------------------------
78// Interface implementation for Layer
79// -----------------------------------------------------------------------
Dominik Laskowskib17c6212022-05-09 09:36:19 -070080void BufferStateLayer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult) {
Robert Carrc2f84132022-03-09 16:26:43 -080081 // If we are displayed on multiple displays in a single composition cycle then we would
82 // need to do careful tracking to enable the use of the mLastClientCompositionFence.
83 // For example we can only use it if all the displays are client comp, and we need
84 // to merge all the client comp fences. We could do this, but for now we just
85 // disable the optimization when a layer is composed on multiple displays.
Robert Carr05da0082022-05-25 23:29:34 -070086 if (mClearClientCompositionFenceOnLayerDisplayed) {
Robert Carrccab4242021-09-28 16:53:03 -070087 mLastClientCompositionFence = nullptr;
Robert Carrc2f84132022-03-09 16:26:43 -080088 } else {
Robert Carr05da0082022-05-25 23:29:34 -070089 mClearClientCompositionFenceOnLayerDisplayed = true;
Robert Carrccab4242021-09-28 16:53:03 -070090 }
91
Marissa Wall5a68a772018-12-22 17:43:42 -080092 // The previous release fence notifies the client that SurfaceFlinger is done with the previous
93 // buffer that was presented on this layer. The first transaction that came in this frame that
94 // replaced the previous buffer on this layer needs this release fence, because the fence will
95 // let the client know when that previous buffer is removed from the screen.
96 //
97 // Every other transaction on this layer does not need a release fence because no other
98 // Transactions that were set on this layer this frame are going to have their preceeding buffer
99 // removed from the display this frame.
100 //
101 // For example, if we have 3 transactions this frame. The first transaction doesn't contain a
102 // buffer so it doesn't need a previous release fence because the layer still needs the previous
103 // buffer. The second transaction contains a buffer so it needs a previous release fence because
104 // the previous buffer will be released this frame. The third transaction also contains a
105 // buffer. It replaces the buffer in the second transaction. The buffer in the second
106 // transaction will now no longer be presented so it is released immediately and the third
107 // transaction doesn't need a previous release fence.
Robert Carr8d958532020-11-10 14:09:16 -0800108 sp<CallbackHandle> ch;
Marissa Wall5a68a772018-12-22 17:43:42 -0800109 for (auto& handle : mDrawingState.callbackHandles) {
chaviw0b06a8d2021-08-06 11:49:08 -0500110 if (handle->releasePreviousBuffer &&
111 mDrawingState.releaseBufferEndpoint == handle->listener) {
Robert Carr8d958532020-11-10 14:09:16 -0800112 ch = handle;
Marissa Wall5a68a772018-12-22 17:43:42 -0800113 break;
114 }
115 }
Valerie Haubf784642020-01-29 07:25:23 -0800116
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700117 // Prevent tracing the same release multiple times.
118 if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700119 mPreviousReleasedFrameNumber = mPreviousFrameNumber;
120 }
Sally Qi59a9f502021-10-12 18:53:23 +0000121
122 if (ch != nullptr) {
123 ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
Dominik Laskowskibb448ce2022-05-07 15:52:55 -0700124 ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
Sally Qi59a9f502021-10-12 18:53:23 +0000125 ch->name = mName;
126 }
Marissa Wall61c58622018-07-18 10:12:20 -0700127}
128
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100129void BufferStateLayer::onSurfaceFrameCreated(
130 const std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame) {
Adithya Srinivasand17c7da2021-03-05 20:43:32 +0000131 while (mPendingJankClassifications.size() >= kPendingClassificationMaxSurfaceFrames) {
132 // Too many SurfaceFrames pending classification. The front of the deque is probably not
133 // tracked by FrameTimeline and will never be presented. This will only result in a memory
134 // leak.
135 ALOGW("Removing the front of pending jank deque from layer - %s to prevent memory leak",
136 mName.c_str());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000137 std::string miniDump = mPendingJankClassifications.front()->miniDump();
138 ALOGD("Head SurfaceFrame mini dump\n%s", miniDump.c_str());
Adithya Srinivasand17c7da2021-03-05 20:43:32 +0000139 mPendingJankClassifications.pop_front();
140 }
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100141 mPendingJankClassifications.emplace_back(surfaceFrame);
142}
143
Valerie Haubf784642020-01-29 07:25:23 -0800144void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
Valerie Hau32cdc1f2019-10-21 14:45:54 -0700145 for (const auto& handle : mDrawingState.callbackHandles) {
146 handle->transformHint = mTransformHint;
Valerie Hau871d6352020-01-29 08:44:02 -0800147 handle->dequeueReadyTime = dequeueReadyTime;
Ady Abraham899dcdb2021-06-15 16:56:21 -0700148 handle->currentMaxAcquiredBufferCount =
149 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);
Chavi Weingartend00e0f72022-07-14 15:59:20 +0000150 ATRACE_FORMAT_INSTANT("releasePendingBuffer %s - %" PRIu64, getDebugName(),
151 handle->previousReleaseCallbackId.framenumber);
Valerie Hau32cdc1f2019-10-21 14:45:54 -0700152 }
153
Vishnu Nair1506b182021-02-22 14:35:15 -0800154 for (auto& handle : mDrawingState.callbackHandles) {
chaviw0b06a8d2021-08-06 11:49:08 -0500155 if (handle->releasePreviousBuffer &&
156 mDrawingState.releaseBufferEndpoint == handle->listener) {
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700157 handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;
Vishnu Nair1506b182021-02-22 14:35:15 -0800158 break;
159 }
160 }
161
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100162 std::vector<JankData> jankData;
163 jankData.reserve(mPendingJankClassifications.size());
164 while (!mPendingJankClassifications.empty()
165 && mPendingJankClassifications.front()->getJankType()) {
166 std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame =
167 mPendingJankClassifications.front();
168 mPendingJankClassifications.pop_front();
169 jankData.emplace_back(
170 JankData(surfaceFrame->getToken(), surfaceFrame->getJankType().value()));
171 }
172
Robert Carr3d1047b2021-09-20 18:22:32 -0700173 mFlinger->getTransactionCallbackInvoker().addCallbackHandles(
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100174 mDrawingState.callbackHandles, jankData);
Marissa Wall5a68a772018-12-22 17:43:42 -0800175
Sally Qi59a9f502021-10-12 18:53:23 +0000176 sp<Fence> releaseFence = Fence::NO_FENCE;
177 for (auto& handle : mDrawingState.callbackHandles) {
178 if (handle->releasePreviousBuffer &&
179 mDrawingState.releaseBufferEndpoint == handle->listener) {
180 releaseFence =
181 handle->previousReleaseFence ? handle->previousReleaseFence : Fence::NO_FENCE;
182 break;
183 }
184 }
185
Marissa Wall5a68a772018-12-22 17:43:42 -0800186 mDrawingState.callbackHandles = {};
Marissa Wall61c58622018-07-18 10:12:20 -0700187}
188
Valerie Hau871d6352020-01-29 08:44:02 -0800189void BufferStateLayer::finalizeFrameEventHistory(const std::shared_ptr<FenceTime>& glDoneFence,
190 const CompositorTiming& compositorTiming) {
191 for (const auto& handle : mDrawingState.callbackHandles) {
192 handle->gpuCompositionDoneFence = glDoneFence;
193 handle->compositorTiming = compositorTiming;
194 }
195}
196
Marissa Walle2ffb422018-10-12 11:33:52 -0700197bool BufferStateLayer::willPresentCurrentTransaction() const {
198 // Returns true if the most recent Transaction applied to CurrentState will be presented.
Robert Carr321e83c2019-08-19 15:49:30 -0700199 return (getSidebandStreamChanged() || getAutoRefresh() ||
Robert Carr6a160312021-05-17 12:08:20 -0700200 (mDrawingState.modified &&
201 (mDrawingState.buffer != nullptr || mDrawingState.bgColorLayer != nullptr)));
Marissa Wall61c58622018-07-18 10:12:20 -0700202}
203
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000204Rect BufferStateLayer::getCrop(const Layer::State& s) const {
205 return s.crop;
Marissa Wall61c58622018-07-18 10:12:20 -0700206}
207
208bool BufferStateLayer::setTransform(uint32_t transform) {
Robert Carr6a160312021-05-17 12:08:20 -0700209 if (mDrawingState.bufferTransform == transform) return false;
210 mDrawingState.bufferTransform = transform;
211 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700212 setTransactionFlags(eTransactionNeeded);
213 return true;
214}
215
216bool BufferStateLayer::setTransformToDisplayInverse(bool transformToDisplayInverse) {
Robert Carr6a160312021-05-17 12:08:20 -0700217 if (mDrawingState.transformToDisplayInverse == transformToDisplayInverse) return false;
218 mDrawingState.sequence++;
219 mDrawingState.transformToDisplayInverse = transformToDisplayInverse;
220 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700221 setTransactionFlags(eTransactionNeeded);
222 return true;
223}
224
225bool BufferStateLayer::setCrop(const Rect& crop) {
Robert Carr6a160312021-05-17 12:08:20 -0700226 if (mDrawingState.crop == crop) return false;
227 mDrawingState.sequence++;
228 mDrawingState.crop = crop;
Marissa Wall290ad082019-03-06 13:23:47 -0800229
Robert Carr6a160312021-05-17 12:08:20 -0700230 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700231 setTransactionFlags(eTransactionNeeded);
232 return true;
233}
234
chaviwf3f40fe2021-04-27 15:54:02 -0500235bool BufferStateLayer::setBufferCrop(const Rect& bufferCrop) {
Robert Carr6a160312021-05-17 12:08:20 -0700236 if (mDrawingState.bufferCrop == bufferCrop) return false;
chaviwf3f40fe2021-04-27 15:54:02 -0500237
Robert Carr6a160312021-05-17 12:08:20 -0700238 mDrawingState.sequence++;
239 mDrawingState.bufferCrop = bufferCrop;
chaviwf3f40fe2021-04-27 15:54:02 -0500240
Robert Carr6a160312021-05-17 12:08:20 -0700241 mDrawingState.modified = true;
chaviwf3f40fe2021-04-27 15:54:02 -0500242 setTransactionFlags(eTransactionNeeded);
243 return true;
244}
245
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700246bool BufferStateLayer::setDestinationFrame(const Rect& destinationFrame) {
Robert Carr6a160312021-05-17 12:08:20 -0700247 if (mDrawingState.destinationFrame == destinationFrame) return false;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700248
Robert Carr6a160312021-05-17 12:08:20 -0700249 mDrawingState.sequence++;
250 mDrawingState.destinationFrame = destinationFrame;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700251
Robert Carr6a160312021-05-17 12:08:20 -0700252 mDrawingState.modified = true;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700253 setTransactionFlags(eTransactionNeeded);
254 return true;
255}
256
Robert Carr6a160312021-05-17 12:08:20 -0700257static bool assignTransform(ui::Transform* dst, ui::Transform& from) {
258 if (*dst == from) {
259 return false;
260 }
261 *dst = from;
262 return true;
263}
264
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700265// Translate destination frame into scale and position. If a destination frame is not set, use the
266// provided scale and position
Robert Carr6a160312021-05-17 12:08:20 -0700267bool BufferStateLayer::updateGeometry() {
Vishnu Naird2aaab12022-02-10 14:49:09 -0800268 if ((mDrawingState.flags & layer_state_t::eIgnoreDestinationFrame) ||
269 mDrawingState.destinationFrame.isEmpty()) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700270 // If destination frame is not set, use the requested transform set via
271 // BufferStateLayer::setPosition and BufferStateLayer::setMatrix.
Robert Carr6a160312021-05-17 12:08:20 -0700272 return assignTransform(&mDrawingState.transform, mRequestedTransform);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700273 }
274
Robert Carr6a160312021-05-17 12:08:20 -0700275 Rect destRect = mDrawingState.destinationFrame;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700276 int32_t destW = destRect.width();
277 int32_t destH = destRect.height();
278 if (destRect.left < 0) {
279 destRect.left = 0;
280 destRect.right = destW;
281 }
282 if (destRect.top < 0) {
283 destRect.top = 0;
284 destRect.bottom = destH;
285 }
286
Robert Carr6a160312021-05-17 12:08:20 -0700287 if (!mDrawingState.buffer) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700288 ui::Transform t;
289 t.set(destRect.left, destRect.top);
Robert Carr6a160312021-05-17 12:08:20 -0700290 return assignTransform(&mDrawingState.transform, t);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700291 }
292
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800293 uint32_t bufferWidth = mDrawingState.buffer->getWidth();
294 uint32_t bufferHeight = mDrawingState.buffer->getHeight();
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700295 // Undo any transformations on the buffer.
Robert Carr6a160312021-05-17 12:08:20 -0700296 if (mDrawingState.bufferTransform & ui::Transform::ROT_90) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700297 std::swap(bufferWidth, bufferHeight);
298 }
299 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
Robert Carr6a160312021-05-17 12:08:20 -0700300 if (mDrawingState.transformToDisplayInverse) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700301 if (invTransform & ui::Transform::ROT_90) {
302 std::swap(bufferWidth, bufferHeight);
303 }
304 }
305
306 float sx = destW / static_cast<float>(bufferWidth);
307 float sy = destH / static_cast<float>(bufferHeight);
308 ui::Transform t;
309 t.set(sx, 0, 0, sy);
310 t.set(destRect.left, destRect.top);
Robert Carr6a160312021-05-17 12:08:20 -0700311 return assignTransform(&mDrawingState.transform, t);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700312}
313
Robert Carrde6d7b42022-01-07 18:23:06 -0800314bool BufferStateLayer::setMatrix(const layer_state_t::matrix22_t& matrix) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700315 if (mRequestedTransform.dsdx() == matrix.dsdx && mRequestedTransform.dtdy() == matrix.dtdy &&
316 mRequestedTransform.dtdx() == matrix.dtdx && mRequestedTransform.dsdy() == matrix.dsdy) {
Marissa Wall861616d2018-10-22 12:52:23 -0700317 return false;
318 }
319
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000320 ui::Transform t;
321 t.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
322
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700323 mRequestedTransform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
chaviw9a93ea62021-03-11 16:44:42 -0600324
Robert Carr6a160312021-05-17 12:08:20 -0700325 mDrawingState.sequence++;
326 mDrawingState.modified = true;
chaviw9a93ea62021-03-11 16:44:42 -0600327 setTransactionFlags(eTransactionNeeded);
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000328
329 return true;
330}
331
332bool BufferStateLayer::setPosition(float x, float y) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700333 if (mRequestedTransform.tx() == x && mRequestedTransform.ty() == y) {
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000334 return false;
335 }
336
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700337 mRequestedTransform.set(x, y);
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000338
Robert Carr6a160312021-05-17 12:08:20 -0700339 mDrawingState.sequence++;
340 mDrawingState.modified = true;
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000341 setTransactionFlags(eTransactionNeeded);
342
Marissa Wall861616d2018-10-22 12:52:23 -0700343 return true;
344}
345
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800346bool BufferStateLayer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
347 const BufferData& bufferData, nsecs_t postTime,
Alec Mouria90a5702021-04-16 16:36:21 +0000348 nsecs_t desiredPresentTime, bool isAutoTimestamp,
chaviwba4320c2021-09-15 15:20:53 -0500349 std::optional<nsecs_t> dequeueTime,
350 const FrameTimelineInfo& info) {
Alex Chaucf6b4b42021-12-07 10:48:52 +0000351 ATRACE_CALL();
Robert Carr0c1966e2020-10-19 12:12:08 -0700352
chaviwba4320c2021-09-15 15:20:53 -0500353 if (!buffer) {
354 return false;
355 }
356
357 const bool frameNumberChanged =
358 bufferData.flags.test(BufferData::BufferDataChange::frameNumberChanged);
359 const uint64_t frameNumber =
360 frameNumberChanged ? bufferData.frameNumber : mDrawingState.frameNumber + 1;
361
Robert Carr6a160312021-05-17 12:08:20 -0700362 if (mDrawingState.buffer) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700363 mReleasePreviousBuffer = true;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800364 if (!mBufferInfo.mBuffer ||
365 (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) ||
366 mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) {
Robert Carr6a160312021-05-17 12:08:20 -0700367 // If mDrawingState has a buffer, and we are about to update again
Robert Carr7121caf2020-12-15 13:07:32 -0800368 // before swapping to drawing state, then the first buffer will be
Vishnu Nair1506b182021-02-22 14:35:15 -0800369 // dropped and we should decrement the pending buffer count and
370 // call any release buffer callbacks if set.
Robert Carr6a160312021-05-17 12:08:20 -0700371 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700372 mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500373 mDrawingState.acquireFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -0700374 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
375 mOwnerUid));
Robert Carr7121caf2020-12-15 13:07:32 -0800376 decrementPendingBufferCount();
Robert Carr6a160312021-05-17 12:08:20 -0700377 if (mDrawingState.bufferSurfaceFrameTX != nullptr &&
378 mDrawingState.bufferSurfaceFrameTX->getPresentState() != PresentState::Presented) {
379 addSurfaceFrameDroppedForBuffer(mDrawingState.bufferSurfaceFrameTX);
380 mDrawingState.bufferSurfaceFrameTX.reset();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000381 }
Robert Carrb6450492022-06-23 11:17:16 -0700382 } else if (EARLY_RELEASE_ENABLED && mLastClientCompositionFence != nullptr) {
Robert Carrccab4242021-09-28 16:53:03 -0700383 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
384 mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500385 mLastClientCompositionFence,
Robert Carrccab4242021-09-28 16:53:03 -0700386 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
chaviw69058fb2021-09-27 09:37:30 -0500387 mOwnerUid));
Robert Carrccab4242021-09-28 16:53:03 -0700388 mLastClientCompositionFence = nullptr;
Robert Carr7121caf2020-12-15 13:07:32 -0800389 }
Marissa Wallfda30bb2018-10-12 11:34:28 -0700390 }
Robert Carr6a160312021-05-17 12:08:20 -0700391
392 mDrawingState.frameNumber = frameNumber;
chaviwba4320c2021-09-15 15:20:53 -0500393 mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800394 mDrawingState.buffer = std::move(buffer);
chaviwba4320c2021-09-15 15:20:53 -0500395 mDrawingState.clientCacheId = bufferData.cachedBuffer;
396
397 mDrawingState.acquireFence = bufferData.flags.test(BufferData::BufferDataChange::fenceChanged)
398 ? bufferData.acquireFence
399 : Fence::NO_FENCE;
400 mDrawingState.acquireFenceTime = std::make_unique<FenceTime>(mDrawingState.acquireFence);
Ady Abraham461296a2022-01-21 11:11:31 -0800401 if (mDrawingState.acquireFenceTime->getSignalTime() == Fence::SIGNAL_TIME_PENDING) {
402 // We latched this buffer unsiganled, so we need to pass the acquire fence
403 // on the callback instead of just the acquire time, since it's unknown at
404 // this point.
405 mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFence;
406 } else {
407 mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFenceTime->getSignalTime();
408 }
chaviwba4320c2021-09-15 15:20:53 -0500409
Robert Carr6a160312021-05-17 12:08:20 -0700410 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700411 setTransactionFlags(eTransactionNeeded);
Ady Abraham09bd3922019-04-08 10:44:56 -0700412
Yiwei Zhang1a88c402019-11-18 10:43:58 -0800413 const int32_t layerId = getSequence();
Robert Carr6a160312021-05-17 12:08:20 -0700414 mFlinger->mTimeStats->setPostTime(layerId, mDrawingState.frameNumber, getName().c_str(),
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000415 mOwnerUid, postTime, getGameMode());
Robert Carr6a160312021-05-17 12:08:20 -0700416 mDrawingState.desiredPresentTime = desiredPresentTime;
417 mDrawingState.isAutoTimestamp = isAutoTimestamp;
Ady Abraham09bd3922019-04-08 10:44:56 -0700418
Ady Abrahamb7f15562021-03-15 18:34:08 -0700419 const nsecs_t presentTime = [&] {
420 if (!isAutoTimestamp) return desiredPresentTime;
421
422 const auto prediction =
423 mFlinger->mFrameTimeline->getTokenManager()->getPredictionsForToken(info.vsyncId);
424 if (prediction.has_value()) return prediction->presentTime;
425
426 return static_cast<nsecs_t>(0);
427 }();
Dominik Laskowski068173d2021-08-11 17:22:59 -0700428
429 using LayerUpdateType = scheduler::LayerHistory::LayerUpdateType;
430 mFlinger->mScheduler->recordLayerHistory(this, presentTime, LayerUpdateType::Buffer);
Ady Abraham09bd3922019-04-08 10:44:56 -0700431
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000432 setFrameTimelineVsyncForBufferTransaction(info, postTime);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000433
Vishnu Nair26c49762022-01-18 22:58:52 +0000434 if (dequeueTime && *dequeueTime != 0) {
435 const uint64_t bufferId = mDrawingState.buffer->getId();
Adithya Srinivasanb238cd52021-02-04 17:54:05 +0000436 mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str());
437 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, *dequeueTime,
438 FrameTracer::FrameEvent::DEQUEUE);
439 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, postTime,
440 FrameTracer::FrameEvent::QUEUE);
441 }
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000442
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800443 mDrawingState.width = mDrawingState.buffer->getWidth();
444 mDrawingState.height = mDrawingState.buffer->getHeight();
chaviwba4320c2021-09-15 15:20:53 -0500445 mDrawingState.releaseBufferEndpoint = bufferData.releaseBufferEndpoint;
Marissa Wall61c58622018-07-18 10:12:20 -0700446 return true;
447}
448
449bool BufferStateLayer::setDataspace(ui::Dataspace dataspace) {
Robert Carr6a160312021-05-17 12:08:20 -0700450 if (mDrawingState.dataspace == dataspace) return false;
451 mDrawingState.dataspace = dataspace;
452 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700453 setTransactionFlags(eTransactionNeeded);
454 return true;
455}
456
457bool BufferStateLayer::setHdrMetadata(const HdrMetadata& hdrMetadata) {
Robert Carr6a160312021-05-17 12:08:20 -0700458 if (mDrawingState.hdrMetadata == hdrMetadata) return false;
459 mDrawingState.hdrMetadata = hdrMetadata;
460 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700461 setTransactionFlags(eTransactionNeeded);
462 return true;
463}
464
465bool BufferStateLayer::setSurfaceDamageRegion(const Region& surfaceDamage) {
Robert Carr6a160312021-05-17 12:08:20 -0700466 mDrawingState.surfaceDamageRegion = surfaceDamage;
467 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700468 setTransactionFlags(eTransactionNeeded);
469 return true;
470}
471
472bool BufferStateLayer::setApi(int32_t api) {
Robert Carr6a160312021-05-17 12:08:20 -0700473 if (mDrawingState.api == api) return false;
474 mDrawingState.api = api;
475 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700476 setTransactionFlags(eTransactionNeeded);
477 return true;
478}
479
480bool BufferStateLayer::setSidebandStream(const sp<NativeHandle>& sidebandStream) {
Robert Carr6a160312021-05-17 12:08:20 -0700481 if (mDrawingState.sidebandStream == sidebandStream) return false;
Robert Carr3e2a2992021-06-11 13:42:55 -0700482
483 if (mDrawingState.sidebandStream != nullptr && sidebandStream == nullptr) {
484 mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
485 } else if (sidebandStream != nullptr) {
486 mFlinger->mTunnelModeEnabledReporter->incrementTunnelModeCount();
487 }
488
Robert Carr6a160312021-05-17 12:08:20 -0700489 mDrawingState.sidebandStream = sidebandStream;
490 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700491 setTransactionFlags(eTransactionNeeded);
Marissa Wall61c58622018-07-18 10:12:20 -0700492 if (!mSidebandStreamChanged.exchange(true)) {
493 // mSidebandStreamChanged was false
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700494 mFlinger->onLayerUpdate();
Marissa Wall61c58622018-07-18 10:12:20 -0700495 }
496 return true;
497}
498
Marissa Walle2ffb422018-10-12 11:33:52 -0700499bool BufferStateLayer::setTransactionCompletedListeners(
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000500 const std::vector<sp<CallbackHandle>>& handles) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700501 // If there is no handle, we will not send a callback so reset mReleasePreviousBuffer and return
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000502 if (handles.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700503 mReleasePreviousBuffer = false;
Marissa Walle2ffb422018-10-12 11:33:52 -0700504 return false;
505 }
506
507 const bool willPresent = willPresentCurrentTransaction();
508
509 for (const auto& handle : handles) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700510 // If this transaction set a buffer on this layer, release its previous buffer
511 handle->releasePreviousBuffer = mReleasePreviousBuffer;
512
Marissa Walle2ffb422018-10-12 11:33:52 -0700513 // If this layer will be presented in this frame
514 if (willPresent) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700515 // If this transaction set an acquire fence on this layer, set its acquire time
Ady Abraham461296a2022-01-21 11:11:31 -0800516 handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence;
Robert Carr6a160312021-05-17 12:08:20 -0700517 handle->frameNumber = mDrawingState.frameNumber;
Marissa Wallfda30bb2018-10-12 11:34:28 -0700518
Marissa Walle2ffb422018-10-12 11:33:52 -0700519 // Store so latched time and release fence can be set
Robert Carr6a160312021-05-17 12:08:20 -0700520 mDrawingState.callbackHandles.push_back(handle);
Marissa Walle2ffb422018-10-12 11:33:52 -0700521
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000522 } else { // If this layer will NOT need to be relatched and presented this frame
Marissa Walle2ffb422018-10-12 11:33:52 -0700523 // Notify the transaction completed thread this handle is done
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000524 mFlinger->getTransactionCallbackInvoker().registerUnpresentedCallbackHandle(handle);
Marissa Walle2ffb422018-10-12 11:33:52 -0700525 }
526 }
527
Marissa Wallfda30bb2018-10-12 11:34:28 -0700528 mReleasePreviousBuffer = false;
Ady Abraham461296a2022-01-21 11:11:31 -0800529 mCallbackHandleAcquireTimeOrFence = -1;
Marissa Wallfda30bb2018-10-12 11:34:28 -0700530
Marissa Walle2ffb422018-10-12 11:33:52 -0700531 return willPresent;
532}
533
Marissa Wall61c58622018-07-18 10:12:20 -0700534bool BufferStateLayer::setTransparentRegionHint(const Region& transparent) {
Vishnu Nair27e3ed52021-07-08 18:24:25 -0700535 mDrawingState.sequence++;
Robert Carr6a160312021-05-17 12:08:20 -0700536 mDrawingState.transparentRegionHint = transparent;
537 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700538 setTransactionFlags(eTransactionNeeded);
539 return true;
540}
541
rnleeed20fa42021-08-10 18:00:03 -0700542Rect BufferStateLayer::getBufferSize(const State& /*s*/) const {
Marissa Wall861616d2018-10-22 12:52:23 -0700543 // for buffer state layers we use the display frame size as the buffer size.
Marissa Wall61c58622018-07-18 10:12:20 -0700544
chaviw7e72caf2020-12-02 16:50:43 -0800545 if (mBufferInfo.mBuffer == nullptr) {
546 return Rect::INVALID_RECT;
547 }
548
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800549 uint32_t bufWidth = mBufferInfo.mBuffer->getWidth();
550 uint32_t bufHeight = mBufferInfo.mBuffer->getHeight();
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700551
552 // Undo any transformations on the buffer and return the result.
553 if (mBufferInfo.mTransform & ui::Transform::ROT_90) {
554 std::swap(bufWidth, bufHeight);
555 }
556
557 if (getTransformToDisplayInverse()) {
558 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
559 if (invTransform & ui::Transform::ROT_90) {
560 std::swap(bufWidth, bufHeight);
Marissa Wall861616d2018-10-22 12:52:23 -0700561 }
562 }
563
rnleeed20fa42021-08-10 18:00:03 -0700564 return Rect(0, 0, static_cast<int32_t>(bufWidth), static_cast<int32_t>(bufHeight));
Marissa Wall61c58622018-07-18 10:12:20 -0700565}
Vishnu Nair4351ad52019-02-11 14:13:02 -0800566
567FloatRect BufferStateLayer::computeSourceBounds(const FloatRect& parentBounds) const {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700568 if (mBufferInfo.mBuffer == nullptr) {
569 return parentBounds;
Vishnu Nair4351ad52019-02-11 14:13:02 -0800570 }
571
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700572 return getBufferSize(getDrawingState()).toFloatRect();
Vishnu Nair4351ad52019-02-11 14:13:02 -0800573}
574
Marissa Wall61c58622018-07-18 10:12:20 -0700575// -----------------------------------------------------------------------
576
577// -----------------------------------------------------------------------
578// Interface implementation for BufferLayer
579// -----------------------------------------------------------------------
580bool BufferStateLayer::fenceHasSignaled() const {
ramindani4d48f902021-09-20 21:07:45 +0000581 if (SurfaceFlinger::enableLatchUnsignaledConfig != LatchUnsignaledConfig::Disabled) {
Huihong Luo86c80e32021-06-16 15:41:07 -0700582 return true;
583 }
584
Alec Mouri91f6df32020-01-30 08:48:58 -0800585 const bool fenceSignaled =
586 getDrawingState().acquireFence->getStatus() == Fence::Status::Signaled;
587 if (!fenceSignaled) {
588 mFlinger->mTimeStats->incrementLatchSkipped(getSequence(),
589 TimeStats::LatchSkipReason::LateAcquire);
590 }
591
592 return fenceSignaled;
Marissa Wall61c58622018-07-18 10:12:20 -0700593}
594
Dominik Laskowskia8955dd2019-07-10 10:19:09 -0700595bool BufferStateLayer::framePresentTimeIsCurrent(nsecs_t expectedPresentTime) const {
Ady Abrahamcd1580c2019-04-29 15:40:03 -0700596 if (!hasFrameUpdate() || isRemovedFromCurrentState()) {
597 return true;
598 }
599
Robert Carr6a160312021-05-17 12:08:20 -0700600 return mDrawingState.isAutoTimestamp || mDrawingState.desiredPresentTime <= expectedPresentTime;
Ady Abrahamcd1580c2019-04-29 15:40:03 -0700601}
602
Valerie Hau871d6352020-01-29 08:44:02 -0800603bool BufferStateLayer::onPreComposition(nsecs_t refreshStartTime) {
604 for (const auto& handle : mDrawingState.callbackHandles) {
605 handle->refreshStartTime = refreshStartTime;
606 }
607 return BufferLayer::onPreComposition(refreshStartTime);
608}
609
Vishnu Naircf26a0a2020-11-13 12:56:20 -0800610void BufferStateLayer::setAutoRefresh(bool autoRefresh) {
Vishnu Nair86653e92021-11-03 17:19:36 -0700611 mDrawingState.autoRefresh = autoRefresh;
Marissa Wall61c58622018-07-18 10:12:20 -0700612}
613
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800614bool BufferStateLayer::latchSidebandStream(bool& recomputeVisibleRegions) {
baocheng suna663c2b2021-05-13 18:51:28 +0800615 // We need to update the sideband stream if the layer has both a buffer and a sideband stream.
baocheng sun9691b9c2021-08-03 19:27:06 +0800616 editCompositionState()->sidebandStreamHasFrame = hasFrameUpdate() && mSidebandStream.get();
baocheng suna663c2b2021-05-13 18:51:28 +0800617
baocheng sun9691b9c2021-08-03 19:27:06 +0800618 if (mSidebandStreamChanged.exchange(false)) {
Marissa Wall61c58622018-07-18 10:12:20 -0700619 const State& s(getDrawingState());
620 // mSidebandStreamChanged was true
Lloyd Pique0b785d82018-12-04 17:25:27 -0800621 mSidebandStream = s.sidebandStream;
Lloyd Piquede196652020-01-22 17:29:58 -0800622 editCompositionState()->sidebandStream = mSidebandStream;
Lloyd Pique0b785d82018-12-04 17:25:27 -0800623 if (mSidebandStream != nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700624 setTransactionFlags(eTransactionNeeded);
625 mFlinger->setTransactionFlags(eTraversalNeeded);
626 }
627 recomputeVisibleRegions = true;
628
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800629 return true;
Marissa Wall61c58622018-07-18 10:12:20 -0700630 }
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800631 return false;
Marissa Wall61c58622018-07-18 10:12:20 -0700632}
633
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800634bool BufferStateLayer::hasFrameUpdate() const {
Robert Carr6a160312021-05-17 12:08:20 -0700635 const State& c(getDrawingState());
Robert Carr315f3c72021-06-24 21:58:09 -0700636 return (mDrawingStateModified || mDrawingState.modified) && (c.buffer != nullptr || c.bgColorLayer != nullptr);
Marissa Wall61c58622018-07-18 10:12:20 -0700637}
638
Dominik Laskowskia8955dd2019-07-10 10:19:09 -0700639status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nsecs_t latchTime,
640 nsecs_t /*expectedPresentTime*/) {
Marissa Wall61c58622018-07-18 10:12:20 -0700641 const State& s(getDrawingState());
642
643 if (!s.buffer) {
Valerie Hauaa194562019-02-05 16:21:38 -0800644 if (s.bgColorLayer) {
645 for (auto& handle : mDrawingState.callbackHandles) {
646 handle->latchTime = latchTime;
647 }
648 }
Marissa Wall61c58622018-07-18 10:12:20 -0700649 return NO_ERROR;
650 }
651
Marissa Wall5a68a772018-12-22 17:43:42 -0800652 for (auto& handle : mDrawingState.callbackHandles) {
Vishnu Nair935590e2021-02-10 13:05:52 -0800653 if (handle->frameNumber == mDrawingState.frameNumber) {
654 handle->latchTime = latchTime;
655 }
Marissa Wall5a68a772018-12-22 17:43:42 -0800656 }
Marissa Walle2ffb422018-10-12 11:33:52 -0700657
Vishnu Nairea0de002020-11-17 17:42:37 -0800658 const int32_t layerId = getSequence();
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800659 const uint64_t bufferId = mDrawingState.buffer->getId();
Adithya Srinivasanb238cd52021-02-04 17:54:05 +0000660 const uint64_t frameNumber = mDrawingState.frameNumber;
661 const auto acquireFence = std::make_shared<FenceTime>(mDrawingState.acquireFence);
662 mFlinger->mTimeStats->setAcquireFence(layerId, frameNumber, acquireFence);
663 mFlinger->mTimeStats->setLatchTime(layerId, frameNumber, latchTime);
664
665 mFlinger->mFrameTracer->traceFence(layerId, bufferId, frameNumber, acquireFence,
666 FrameTracer::FrameEvent::ACQUIRE_FENCE);
667 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, latchTime,
668 FrameTracer::FrameEvent::LATCH);
Marissa Wall61c58622018-07-18 10:12:20 -0700669
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000670 auto& bufferSurfaceFrame = mDrawingState.bufferSurfaceFrameTX;
671 if (bufferSurfaceFrame != nullptr &&
672 bufferSurfaceFrame->getPresentState() != PresentState::Presented) {
673 // Update only if the bufferSurfaceFrame wasn't already presented. A Presented
674 // bufferSurfaceFrame could be seen here if a pending state was applied successfully and we
675 // are processing the next state.
676 addSurfaceFramePresentedForBuffer(bufferSurfaceFrame,
Ady Abraham6c1b7ac2021-03-31 16:56:03 -0700677 mDrawingState.acquireFenceTime->getSignalTime(),
678 latchTime);
Robert Carr6a160312021-05-17 12:08:20 -0700679 mDrawingState.bufferSurfaceFrameTX.reset();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000680 }
681
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700682 std::deque<sp<CallbackHandle>> remainingHandles;
683 mFlinger->getTransactionCallbackInvoker()
Robert Carr3d1047b2021-09-20 18:22:32 -0700684 .addOnCommitCallbackHandles(mDrawingState.callbackHandles, remainingHandles);
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700685 mDrawingState.callbackHandles = remainingHandles;
686
Robert Carr6a160312021-05-17 12:08:20 -0700687 mDrawingStateModified = false;
Marissa Wall16c112d2019-03-20 13:21:13 -0700688
Marissa Wall61c58622018-07-18 10:12:20 -0700689 return NO_ERROR;
690}
691
692status_t BufferStateLayer::updateActiveBuffer() {
693 const State& s(getDrawingState());
694
695 if (s.buffer == nullptr) {
696 return BAD_VALUE;
697 }
chaviwdf3c5e82021-01-07 13:00:37 -0800698
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800699 if (!mBufferInfo.mBuffer || !s.buffer->hasSameBuffer(*mBufferInfo.mBuffer)) {
chaviwdf3c5e82021-01-07 13:00:37 -0800700 decrementPendingBufferCount();
701 }
Marissa Wall61c58622018-07-18 10:12:20 -0700702
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700703 mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};
chaviwd62d3062019-09-04 14:48:02 -0700704 mBufferInfo.mBuffer = s.buffer;
705 mBufferInfo.mFence = s.acquireFence;
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700706 mBufferInfo.mFrameNumber = s.frameNumber;
Marissa Wall61c58622018-07-18 10:12:20 -0700707
708 return NO_ERROR;
709}
710
Alec Mouri8977ce92022-05-07 00:34:50 +0000711status_t BufferStateLayer::updateFrameNumber() {
Marissa Wall61c58622018-07-18 10:12:20 -0700712 // TODO(marissaw): support frame history events
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700713 mPreviousFrameNumber = mCurrentFrameNumber;
Valerie Hau134651a2020-01-28 16:21:22 -0800714 mCurrentFrameNumber = mDrawingState.frameNumber;
Marissa Wall61c58622018-07-18 10:12:20 -0700715 return NO_ERROR;
716}
717
Marissa Wall947d34e2019-03-29 14:03:53 -0700718void BufferStateLayer::HwcSlotGenerator::bufferErased(const client_cache_t& clientCacheId) {
719 std::lock_guard lock(mMutex);
720 if (!clientCacheId.isValid()) {
721 ALOGE("invalid process, failed to erase buffer");
722 return;
723 }
724 eraseBufferLocked(clientCacheId);
725}
726
rnleeed20fa42021-08-10 18:00:03 -0700727int BufferStateLayer::HwcSlotGenerator::getHwcCacheSlot(const client_cache_t& clientCacheId) {
Marissa Wall947d34e2019-03-29 14:03:53 -0700728 std::lock_guard<std::mutex> lock(mMutex);
729 auto itr = mCachedBuffers.find(clientCacheId);
730 if (itr == mCachedBuffers.end()) {
731 return addCachedBuffer(clientCacheId);
732 }
733 auto& [hwcCacheSlot, counter] = itr->second;
734 counter = mCounter++;
735 return hwcCacheSlot;
736}
737
rnleeed20fa42021-08-10 18:00:03 -0700738int BufferStateLayer::HwcSlotGenerator::addCachedBuffer(const client_cache_t& clientCacheId)
Marissa Wall947d34e2019-03-29 14:03:53 -0700739 REQUIRES(mMutex) {
740 if (!clientCacheId.isValid()) {
741 ALOGE("invalid process, returning invalid slot");
742 return BufferQueue::INVALID_BUFFER_SLOT;
743 }
744
745 ClientCache::getInstance().registerErasedRecipient(clientCacheId, wp<ErasedRecipient>(this));
746
rnleeed20fa42021-08-10 18:00:03 -0700747 int hwcCacheSlot = getFreeHwcCacheSlot();
Marissa Wall947d34e2019-03-29 14:03:53 -0700748 mCachedBuffers[clientCacheId] = {hwcCacheSlot, mCounter++};
749 return hwcCacheSlot;
750}
751
rnleeed20fa42021-08-10 18:00:03 -0700752int BufferStateLayer::HwcSlotGenerator::getFreeHwcCacheSlot() REQUIRES(mMutex) {
Marissa Wall947d34e2019-03-29 14:03:53 -0700753 if (mFreeHwcCacheSlots.empty()) {
754 evictLeastRecentlyUsed();
755 }
756
rnleeed20fa42021-08-10 18:00:03 -0700757 int hwcCacheSlot = mFreeHwcCacheSlots.top();
Marissa Wall947d34e2019-03-29 14:03:53 -0700758 mFreeHwcCacheSlots.pop();
759 return hwcCacheSlot;
760}
761
762void BufferStateLayer::HwcSlotGenerator::evictLeastRecentlyUsed() REQUIRES(mMutex) {
763 uint64_t minCounter = UINT_MAX;
764 client_cache_t minClientCacheId = {};
765 for (const auto& [clientCacheId, slotCounter] : mCachedBuffers) {
766 const auto& [hwcCacheSlot, counter] = slotCounter;
767 if (counter < minCounter) {
768 minCounter = counter;
769 minClientCacheId = clientCacheId;
770 }
771 }
772 eraseBufferLocked(minClientCacheId);
773
774 ClientCache::getInstance().unregisterErasedRecipient(minClientCacheId, this);
775}
776
777void BufferStateLayer::HwcSlotGenerator::eraseBufferLocked(const client_cache_t& clientCacheId)
778 REQUIRES(mMutex) {
779 auto itr = mCachedBuffers.find(clientCacheId);
780 if (itr == mCachedBuffers.end()) {
781 return;
782 }
783 auto& [hwcCacheSlot, counter] = itr->second;
784
785 // TODO send to hwc cache and resources
786
787 mFreeHwcCacheSlots.push(hwcCacheSlot);
788 mCachedBuffers.erase(clientCacheId);
789}
chaviw4244e032019-09-04 11:27:49 -0700790
791void BufferStateLayer::gatherBufferInfo() {
chaviwdebadb82020-03-26 14:57:24 -0700792 BufferLayer::gatherBufferInfo();
chaviw4244e032019-09-04 11:27:49 -0700793
chaviwdebadb82020-03-26 14:57:24 -0700794 const State& s(getDrawingState());
chaviw4244e032019-09-04 11:27:49 -0700795 mBufferInfo.mDesiredPresentTime = s.desiredPresentTime;
796 mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);
797 mBufferInfo.mFence = s.acquireFence;
chaviw766c9c52021-02-10 17:36:47 -0800798 mBufferInfo.mTransform = s.bufferTransform;
Robert Carr167bdde2021-07-28 11:26:51 -0700799 auto lastDataspace = mBufferInfo.mDataspace;
chaviw4244e032019-09-04 11:27:49 -0700800 mBufferInfo.mDataspace = translateDataspace(s.dataspace);
Robert Carr167bdde2021-07-28 11:26:51 -0700801 if (lastDataspace != mBufferInfo.mDataspace) {
802 mFlinger->mSomeDataspaceChanged = true;
803 }
Vishnu Nair5cc9ac02021-04-19 13:23:38 -0700804 mBufferInfo.mCrop = computeBufferCrop(s);
chaviw4244e032019-09-04 11:27:49 -0700805 mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
806 mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion;
807 mBufferInfo.mHdrMetadata = s.hdrMetadata;
808 mBufferInfo.mApi = s.api;
chaviw4244e032019-09-04 11:27:49 -0700809 mBufferInfo.mTransformToDisplayInverse = s.transformToDisplayInverse;
chaviwf83ce182019-09-12 14:43:08 -0700810 mBufferInfo.mBufferSlot = mHwcSlotGenerator->getHwcCacheSlot(s.clientCacheId);
chaviw4244e032019-09-04 11:27:49 -0700811}
812
Robert Carr916b0362020-10-06 13:53:03 -0700813uint32_t BufferStateLayer::getEffectiveScalingMode() const {
814 return NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
815}
816
Vishnu Nair5cc9ac02021-04-19 13:23:38 -0700817Rect BufferStateLayer::computeBufferCrop(const State& s) {
chaviwf3f40fe2021-04-27 15:54:02 -0500818 if (s.buffer && !s.bufferCrop.isEmpty()) {
819 Rect bufferCrop;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800820 s.buffer->getBounds().intersect(s.bufferCrop, &bufferCrop);
chaviwf3f40fe2021-04-27 15:54:02 -0500821 return bufferCrop;
822 } else if (s.buffer) {
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800823 return s.buffer->getBounds();
chaviwf3f40fe2021-04-27 15:54:02 -0500824 } else {
825 return s.bufferCrop;
chaviw4244e032019-09-04 11:27:49 -0700826 }
chaviw4244e032019-09-04 11:27:49 -0700827}
828
chaviwb4c6e582019-08-16 14:35:07 -0700829sp<Layer> BufferStateLayer::createClone() {
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -0800830 LayerCreationArgs args(mFlinger.get(), nullptr, mName + " (Mirror)", 0, LayerMetadata());
chaviwb4c6e582019-08-16 14:35:07 -0700831 args.textureName = mTextureName;
Lloyd Pique1c3a5eb2019-10-03 13:07:08 -0700832 sp<BufferStateLayer> layer = mFlinger->getFactory().createBufferStateLayer(args);
chaviwb4c6e582019-08-16 14:35:07 -0700833 layer->mHwcSlotGenerator = mHwcSlotGenerator;
834 layer->setInitialValuesForClone(this);
835 return layer;
836}
Valerie Hau92bf5482020-02-10 09:49:08 -0800837
Vishnu Naire7f79c52020-10-29 14:45:03 -0700838bool BufferStateLayer::bufferNeedsFiltering() const {
839 const State& s(getDrawingState());
840 if (!s.buffer) {
841 return false;
842 }
843
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800844 int32_t bufferWidth = static_cast<int32_t>(s.buffer->getWidth());
845 int32_t bufferHeight = static_cast<int32_t>(s.buffer->getHeight());
Vishnu Naire7f79c52020-10-29 14:45:03 -0700846
847 // Undo any transformations on the buffer and return the result.
chaviw766c9c52021-02-10 17:36:47 -0800848 if (s.bufferTransform & ui::Transform::ROT_90) {
Vishnu Naire7f79c52020-10-29 14:45:03 -0700849 std::swap(bufferWidth, bufferHeight);
850 }
851
852 if (s.transformToDisplayInverse) {
853 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
854 if (invTransform & ui::Transform::ROT_90) {
855 std::swap(bufferWidth, bufferHeight);
856 }
857 }
858
859 const Rect layerSize{getBounds()};
Yiwei Zhang22ca2c42022-07-07 07:00:16 +0000860 int32_t layerWidth = layerSize.getWidth();
861 int32_t layerHeight = layerSize.getHeight();
862
863 // Align the layer orientation with the buffer before comparism
864 if (mTransformHint & ui::Transform::ROT_90) {
865 std::swap(layerWidth, layerHeight);
866 }
867
868 return layerWidth != bufferWidth || layerHeight != bufferHeight;
Vishnu Naire7f79c52020-10-29 14:45:03 -0700869}
Robert Carr7121caf2020-12-15 13:07:32 -0800870
Robert Carr7121caf2020-12-15 13:07:32 -0800871void BufferStateLayer::decrementPendingBufferCount() {
Vishnu Nair8eda69e2021-02-26 10:42:10 -0800872 int32_t pendingBuffers = --mPendingBufferTransactions;
873 tracePendingBufferCount(pendingBuffers);
Robert Carr7121caf2020-12-15 13:07:32 -0800874}
875
Vishnu Nair8eda69e2021-02-26 10:42:10 -0800876void BufferStateLayer::tracePendingBufferCount(int32_t pendingBuffers) {
877 ATRACE_INT(mBlastTransactionName.c_str(), pendingBuffers);
Robert Carr7121caf2020-12-15 13:07:32 -0800878}
879
Robert Carr7121caf2020-12-15 13:07:32 -0800880
chaviw39d01472021-04-08 14:26:24 -0500881/*
882 * We don't want to send the layer's transform to input, but rather the
883 * parent's transform. This is because BufferStateLayer's transform is
884 * information about how the buffer is placed on screen. The parent's
885 * transform makes more sense to send since it's information about how the
886 * layer is placed on screen. This transform is used by input to determine
887 * how to go from screen space back to window space.
888 */
889ui::Transform BufferStateLayer::getInputTransform() const {
Rob Carrc6d2d2b2021-10-25 16:51:49 +0000890 sp<Layer> parent = mDrawingParent.promote();
chaviw39d01472021-04-08 14:26:24 -0500891 if (parent == nullptr) {
892 return ui::Transform();
893 }
894
895 return parent->getTransform();
896}
897
898/**
899 * Similar to getInputTransform, we need to update the bounds to include the transform.
900 * This is because bounds for BSL doesn't include buffer transform, where the input assumes
901 * that's already included.
902 */
903Rect BufferStateLayer::getInputBounds() const {
904 Rect bufferBounds = getCroppedBufferSize(getDrawingState());
905 if (mDrawingState.transform.getType() == ui::Transform::IDENTITY || !bufferBounds.isValid()) {
906 return bufferBounds;
907 }
908 return mDrawingState.transform.transform(bufferBounds);
909}
910
Ady Abraham9dada822022-02-03 10:26:59 -0800911bool BufferStateLayer::simpleBufferUpdate(const layer_state_t& s) const {
912 const uint64_t requiredFlags = layer_state_t::eBufferChanged;
913
914 const uint64_t deniedFlags = layer_state_t::eProducerDisconnect | layer_state_t::eLayerChanged |
915 layer_state_t::eRelativeLayerChanged | layer_state_t::eTransparentRegionChanged |
916 layer_state_t::eFlagsChanged | layer_state_t::eBlurRegionsChanged |
917 layer_state_t::eLayerStackChanged | layer_state_t::eAutoRefreshChanged |
918 layer_state_t::eReparent;
919
920 const uint64_t allowedFlags = layer_state_t::eHasListenerCallbacksChanged |
921 layer_state_t::eFrameRateSelectionPriority | layer_state_t::eFrameRateChanged |
922 layer_state_t::eSurfaceDamageRegionChanged | layer_state_t::eApiChanged |
923 layer_state_t::eMetadataChanged | layer_state_t::eDropInputModeChanged |
924 layer_state_t::eInputInfoChanged;
925
926 if ((s.what & requiredFlags) != requiredFlags) {
927 ALOGV("%s: false [missing required flags 0x%" PRIx64 "]", __func__,
928 (s.what | requiredFlags) & ~s.what);
929 return false;
930 }
931
932 if (s.what & deniedFlags) {
933 ALOGV("%s: false [has denied flags 0x%" PRIx64 "]", __func__, s.what & deniedFlags);
934 return false;
935 }
936
937 if (s.what & allowedFlags) {
938 ALOGV("%s: [has allowed flags 0x%" PRIx64 "]", __func__, s.what & allowedFlags);
939 }
940
941 if (s.what & layer_state_t::ePositionChanged) {
942 if (mRequestedTransform.tx() != s.x || mRequestedTransform.ty() != s.y) {
943 ALOGV("%s: false [ePositionChanged changed]", __func__);
944 return false;
945 }
946 }
947
948 if (s.what & layer_state_t::eAlphaChanged) {
949 if (mDrawingState.color.a != s.alpha) {
950 ALOGV("%s: false [eAlphaChanged changed]", __func__);
951 return false;
952 }
953 }
954
955 if (s.what & layer_state_t::eColorTransformChanged) {
956 if (mDrawingState.colorTransform != s.colorTransform) {
957 ALOGV("%s: false [eColorTransformChanged changed]", __func__);
958 return false;
959 }
960 }
961
962 if (s.what & layer_state_t::eBackgroundColorChanged) {
963 if (mDrawingState.bgColorLayer || s.bgColorAlpha != 0) {
964 ALOGV("%s: false [eBackgroundColorChanged changed]", __func__);
965 return false;
966 }
967 }
968
969 if (s.what & layer_state_t::eMatrixChanged) {
970 if (mRequestedTransform.dsdx() != s.matrix.dsdx ||
971 mRequestedTransform.dtdy() != s.matrix.dtdy ||
972 mRequestedTransform.dtdx() != s.matrix.dtdx ||
973 mRequestedTransform.dsdy() != s.matrix.dsdy) {
974 ALOGV("%s: false [eMatrixChanged changed]", __func__);
975 return false;
976 }
977 }
978
979 if (s.what & layer_state_t::eCornerRadiusChanged) {
980 if (mDrawingState.cornerRadius != s.cornerRadius) {
981 ALOGV("%s: false [eCornerRadiusChanged changed]", __func__);
982 return false;
983 }
984 }
985
986 if (s.what & layer_state_t::eBackgroundBlurRadiusChanged) {
987 if (mDrawingState.backgroundBlurRadius != static_cast<int>(s.backgroundBlurRadius)) {
988 ALOGV("%s: false [eBackgroundBlurRadiusChanged changed]", __func__);
989 return false;
990 }
991 }
992
993 if (s.what & layer_state_t::eTransformChanged) {
994 if (mDrawingState.bufferTransform != s.transform) {
995 ALOGV("%s: false [eTransformChanged changed]", __func__);
996 return false;
997 }
998 }
999
1000 if (s.what & layer_state_t::eTransformToDisplayInverseChanged) {
1001 if (mDrawingState.transformToDisplayInverse != s.transformToDisplayInverse) {
1002 ALOGV("%s: false [eTransformToDisplayInverseChanged changed]", __func__);
1003 return false;
1004 }
1005 }
1006
1007 if (s.what & layer_state_t::eCropChanged) {
1008 if (mDrawingState.crop != s.crop) {
1009 ALOGV("%s: false [eCropChanged changed]", __func__);
1010 return false;
1011 }
1012 }
1013
1014 if (s.what & layer_state_t::eDataspaceChanged) {
1015 if (mDrawingState.dataspace != s.dataspace) {
1016 ALOGV("%s: false [eDataspaceChanged changed]", __func__);
1017 return false;
1018 }
1019 }
1020
1021 if (s.what & layer_state_t::eHdrMetadataChanged) {
1022 if (mDrawingState.hdrMetadata != s.hdrMetadata) {
1023 ALOGV("%s: false [eHdrMetadataChanged changed]", __func__);
1024 return false;
1025 }
1026 }
1027
1028 if (s.what & layer_state_t::eSidebandStreamChanged) {
1029 if (mDrawingState.sidebandStream != s.sidebandStream) {
1030 ALOGV("%s: false [eSidebandStreamChanged changed]", __func__);
1031 return false;
1032 }
1033 }
1034
1035 if (s.what & layer_state_t::eColorSpaceAgnosticChanged) {
1036 if (mDrawingState.colorSpaceAgnostic != s.colorSpaceAgnostic) {
1037 ALOGV("%s: false [eColorSpaceAgnosticChanged changed]", __func__);
1038 return false;
1039 }
1040 }
1041
1042 if (s.what & layer_state_t::eShadowRadiusChanged) {
1043 if (mDrawingState.shadowRadius != s.shadowRadius) {
1044 ALOGV("%s: false [eShadowRadiusChanged changed]", __func__);
1045 return false;
1046 }
1047 }
1048
1049 if (s.what & layer_state_t::eFixedTransformHintChanged) {
1050 if (mDrawingState.fixedTransformHint != s.fixedTransformHint) {
1051 ALOGV("%s: false [eFixedTransformHintChanged changed]", __func__);
1052 return false;
1053 }
1054 }
1055
1056 if (s.what & layer_state_t::eTrustedOverlayChanged) {
1057 if (mDrawingState.isTrustedOverlay != s.isTrustedOverlay) {
1058 ALOGV("%s: false [eTrustedOverlayChanged changed]", __func__);
1059 return false;
1060 }
1061 }
1062
1063 if (s.what & layer_state_t::eStretchChanged) {
1064 StretchEffect temp = s.stretchEffect;
1065 temp.sanitize();
1066 if (mDrawingState.stretchEffect != temp) {
1067 ALOGV("%s: false [eStretchChanged changed]", __func__);
1068 return false;
1069 }
1070 }
1071
1072 if (s.what & layer_state_t::eBufferCropChanged) {
1073 if (mDrawingState.bufferCrop != s.bufferCrop) {
1074 ALOGV("%s: false [eBufferCropChanged changed]", __func__);
1075 return false;
1076 }
1077 }
1078
1079 if (s.what & layer_state_t::eDestinationFrameChanged) {
1080 if (mDrawingState.destinationFrame != s.destinationFrame) {
1081 ALOGV("%s: false [eDestinationFrameChanged changed]", __func__);
1082 return false;
1083 }
1084 }
1085
Sally Qi81d95e62022-03-21 19:41:33 -07001086 if (s.what & layer_state_t::eDimmingEnabledChanged) {
1087 if (mDrawingState.dimmingEnabled != s.dimmingEnabled) {
1088 ALOGV("%s: false [eDimmingEnabledChanged changed]", __func__);
1089 return false;
1090 }
1091 }
1092
Ady Abraham9dada822022-02-03 10:26:59 -08001093 ALOGV("%s: true", __func__);
1094 return true;
1095}
1096
Marissa Wall61c58622018-07-18 10:12:20 -07001097} // namespace android