blob: d88d7c99e9a75dfd10217a17fd5d11860bc3a4d2 [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
Vishnu Nairfa247b12020-02-11 08:58:26 -080033#include "EffectLayer.h"
Adithya Srinivasanb238cd52021-02-04 17:54:05 +000034#include "FrameTracer/FrameTracer.h"
Lloyd Pique37c2c9b2018-12-04 17:25:10 -080035#include "TimeStats/TimeStats.h"
Valerie Hau0bc09152018-12-20 07:42:47 -080036
Robert Carrb6450492022-06-23 11:17:16 -070037#define EARLY_RELEASE_ENABLED false
38
Marissa Wall61c58622018-07-18 10:12:20 -070039namespace android {
40
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000041using PresentState = frametimeline::SurfaceFrame::PresentState;
Vishnu Nair1506b182021-02-22 14:35:15 -080042namespace {
43void callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070044 const sp<GraphicBuffer>& buffer, uint64_t framenumber,
chaviw69058fb2021-09-27 09:37:30 -050045 const sp<Fence>& releaseFence,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070046 uint32_t currentMaxAcquiredBufferCount) {
Vishnu Nair1506b182021-02-22 14:35:15 -080047 if (!listener) {
48 return;
49 }
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070050 listener->onReleaseBuffer({buffer->getId(), framenumber},
chaviw69058fb2021-09-27 09:37:30 -050051 releaseFence ? releaseFence : Fence::NO_FENCE,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070052 currentMaxAcquiredBufferCount);
Vishnu Nair1506b182021-02-22 14:35:15 -080053}
54} // namespace
55
Marissa Wall947d34e2019-03-29 14:03:53 -070056BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args)
57 : BufferLayer(args), mHwcSlotGenerator(new HwcSlotGenerator()) {
Robert Carr6a160312021-05-17 12:08:20 -070058 mDrawingState.dataspace = ui::Dataspace::V0_SRGB;
Vishnu Nair60356342018-11-13 13:00:45 -080059}
Marissa Wall61c58622018-07-18 10:12:20 -070060
Alec Mouri4545a8a2019-08-08 20:05:32 -070061BufferStateLayer::~BufferStateLayer() {
chaviwb4c6e582019-08-16 14:35:07 -070062 // The original layer and the clone layer share the same texture and buffer. Therefore, only
63 // one of the layers, in this case the original layer, needs to handle the deletion. The
64 // original layer and the clone should be removed at the same time so there shouldn't be any
65 // issue with the clone layer trying to use the texture.
Vishnu Nair3bb11d02021-11-26 09:24:11 -080066 if (mBufferInfo.mBuffer != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +000067 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070068 mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFrameNumber,
chaviw69058fb2021-09-27 09:37:30 -050069 mBufferInfo.mFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -070070 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
71 mOwnerUid));
Alec Mouri4545a8a2019-08-08 20:05:32 -070072 }
73}
74
Marissa Wall61c58622018-07-18 10:12:20 -070075// -----------------------------------------------------------------------
76// Interface implementation for Layer
77// -----------------------------------------------------------------------
Dominik Laskowskib17c6212022-05-09 09:36:19 -070078void BufferStateLayer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult) {
Robert Carrc2f84132022-03-09 16:26:43 -080079 // If we are displayed on multiple displays in a single composition cycle then we would
80 // need to do careful tracking to enable the use of the mLastClientCompositionFence.
81 // For example we can only use it if all the displays are client comp, and we need
82 // to merge all the client comp fences. We could do this, but for now we just
83 // disable the optimization when a layer is composed on multiple displays.
Robert Carr05da0082022-05-25 23:29:34 -070084 if (mClearClientCompositionFenceOnLayerDisplayed) {
Robert Carrccab4242021-09-28 16:53:03 -070085 mLastClientCompositionFence = nullptr;
Robert Carrc2f84132022-03-09 16:26:43 -080086 } else {
Robert Carr05da0082022-05-25 23:29:34 -070087 mClearClientCompositionFenceOnLayerDisplayed = true;
Robert Carrccab4242021-09-28 16:53:03 -070088 }
89
Marissa Wall5a68a772018-12-22 17:43:42 -080090 // The previous release fence notifies the client that SurfaceFlinger is done with the previous
91 // buffer that was presented on this layer. The first transaction that came in this frame that
92 // replaced the previous buffer on this layer needs this release fence, because the fence will
93 // let the client know when that previous buffer is removed from the screen.
94 //
95 // Every other transaction on this layer does not need a release fence because no other
96 // Transactions that were set on this layer this frame are going to have their preceeding buffer
97 // removed from the display this frame.
98 //
99 // For example, if we have 3 transactions this frame. The first transaction doesn't contain a
100 // buffer so it doesn't need a previous release fence because the layer still needs the previous
101 // buffer. The second transaction contains a buffer so it needs a previous release fence because
102 // the previous buffer will be released this frame. The third transaction also contains a
103 // buffer. It replaces the buffer in the second transaction. The buffer in the second
104 // transaction will now no longer be presented so it is released immediately and the third
105 // transaction doesn't need a previous release fence.
Robert Carr8d958532020-11-10 14:09:16 -0800106 sp<CallbackHandle> ch;
Marissa Wall5a68a772018-12-22 17:43:42 -0800107 for (auto& handle : mDrawingState.callbackHandles) {
chaviw0b06a8d2021-08-06 11:49:08 -0500108 if (handle->releasePreviousBuffer &&
109 mDrawingState.releaseBufferEndpoint == handle->listener) {
Robert Carr8d958532020-11-10 14:09:16 -0800110 ch = handle;
Marissa Wall5a68a772018-12-22 17:43:42 -0800111 break;
112 }
113 }
Valerie Haubf784642020-01-29 07:25:23 -0800114
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700115 // Prevent tracing the same release multiple times.
116 if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700117 mPreviousReleasedFrameNumber = mPreviousFrameNumber;
118 }
Sally Qi59a9f502021-10-12 18:53:23 +0000119
120 if (ch != nullptr) {
121 ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
Dominik Laskowskibb448ce2022-05-07 15:52:55 -0700122 ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
Sally Qi59a9f502021-10-12 18:53:23 +0000123 ch->name = mName;
124 }
Marissa Wall61c58622018-07-18 10:12:20 -0700125}
126
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100127void BufferStateLayer::onSurfaceFrameCreated(
128 const std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame) {
Adithya Srinivasand17c7da2021-03-05 20:43:32 +0000129 while (mPendingJankClassifications.size() >= kPendingClassificationMaxSurfaceFrames) {
130 // Too many SurfaceFrames pending classification. The front of the deque is probably not
131 // tracked by FrameTimeline and will never be presented. This will only result in a memory
132 // leak.
133 ALOGW("Removing the front of pending jank deque from layer - %s to prevent memory leak",
134 mName.c_str());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000135 std::string miniDump = mPendingJankClassifications.front()->miniDump();
136 ALOGD("Head SurfaceFrame mini dump\n%s", miniDump.c_str());
Adithya Srinivasand17c7da2021-03-05 20:43:32 +0000137 mPendingJankClassifications.pop_front();
138 }
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100139 mPendingJankClassifications.emplace_back(surfaceFrame);
140}
141
Valerie Haubf784642020-01-29 07:25:23 -0800142void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
Valerie Hau32cdc1f2019-10-21 14:45:54 -0700143 for (const auto& handle : mDrawingState.callbackHandles) {
144 handle->transformHint = mTransformHint;
Valerie Hau871d6352020-01-29 08:44:02 -0800145 handle->dequeueReadyTime = dequeueReadyTime;
Ady Abraham899dcdb2021-06-15 16:56:21 -0700146 handle->currentMaxAcquiredBufferCount =
147 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);
Valerie Hau32cdc1f2019-10-21 14:45:54 -0700148 }
149
Vishnu Nair1506b182021-02-22 14:35:15 -0800150 for (auto& handle : mDrawingState.callbackHandles) {
chaviw0b06a8d2021-08-06 11:49:08 -0500151 if (handle->releasePreviousBuffer &&
152 mDrawingState.releaseBufferEndpoint == handle->listener) {
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700153 handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;
Vishnu Nair1506b182021-02-22 14:35:15 -0800154 break;
155 }
156 }
157
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100158 std::vector<JankData> jankData;
159 jankData.reserve(mPendingJankClassifications.size());
160 while (!mPendingJankClassifications.empty()
161 && mPendingJankClassifications.front()->getJankType()) {
162 std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame =
163 mPendingJankClassifications.front();
164 mPendingJankClassifications.pop_front();
165 jankData.emplace_back(
166 JankData(surfaceFrame->getToken(), surfaceFrame->getJankType().value()));
167 }
168
Robert Carr3d1047b2021-09-20 18:22:32 -0700169 mFlinger->getTransactionCallbackInvoker().addCallbackHandles(
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100170 mDrawingState.callbackHandles, jankData);
Marissa Wall5a68a772018-12-22 17:43:42 -0800171
Sally Qi59a9f502021-10-12 18:53:23 +0000172 sp<Fence> releaseFence = Fence::NO_FENCE;
173 for (auto& handle : mDrawingState.callbackHandles) {
174 if (handle->releasePreviousBuffer &&
175 mDrawingState.releaseBufferEndpoint == handle->listener) {
176 releaseFence =
177 handle->previousReleaseFence ? handle->previousReleaseFence : Fence::NO_FENCE;
178 break;
179 }
180 }
181
Marissa Wall5a68a772018-12-22 17:43:42 -0800182 mDrawingState.callbackHandles = {};
Marissa Wall61c58622018-07-18 10:12:20 -0700183}
184
Valerie Hau871d6352020-01-29 08:44:02 -0800185void BufferStateLayer::finalizeFrameEventHistory(const std::shared_ptr<FenceTime>& glDoneFence,
186 const CompositorTiming& compositorTiming) {
187 for (const auto& handle : mDrawingState.callbackHandles) {
188 handle->gpuCompositionDoneFence = glDoneFence;
189 handle->compositorTiming = compositorTiming;
190 }
191}
192
Marissa Walle2ffb422018-10-12 11:33:52 -0700193bool BufferStateLayer::willPresentCurrentTransaction() const {
194 // Returns true if the most recent Transaction applied to CurrentState will be presented.
Robert Carr321e83c2019-08-19 15:49:30 -0700195 return (getSidebandStreamChanged() || getAutoRefresh() ||
Robert Carr6a160312021-05-17 12:08:20 -0700196 (mDrawingState.modified &&
197 (mDrawingState.buffer != nullptr || mDrawingState.bgColorLayer != nullptr)));
Marissa Wall61c58622018-07-18 10:12:20 -0700198}
199
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000200Rect BufferStateLayer::getCrop(const Layer::State& s) const {
201 return s.crop;
Marissa Wall61c58622018-07-18 10:12:20 -0700202}
203
204bool BufferStateLayer::setTransform(uint32_t transform) {
Robert Carr6a160312021-05-17 12:08:20 -0700205 if (mDrawingState.bufferTransform == transform) return false;
206 mDrawingState.bufferTransform = transform;
207 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700208 setTransactionFlags(eTransactionNeeded);
209 return true;
210}
211
212bool BufferStateLayer::setTransformToDisplayInverse(bool transformToDisplayInverse) {
Robert Carr6a160312021-05-17 12:08:20 -0700213 if (mDrawingState.transformToDisplayInverse == transformToDisplayInverse) return false;
214 mDrawingState.sequence++;
215 mDrawingState.transformToDisplayInverse = transformToDisplayInverse;
216 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700217 setTransactionFlags(eTransactionNeeded);
218 return true;
219}
220
221bool BufferStateLayer::setCrop(const Rect& crop) {
Robert Carr6a160312021-05-17 12:08:20 -0700222 if (mDrawingState.crop == crop) return false;
223 mDrawingState.sequence++;
224 mDrawingState.crop = crop;
Marissa Wall290ad082019-03-06 13:23:47 -0800225
Robert Carr6a160312021-05-17 12:08:20 -0700226 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700227 setTransactionFlags(eTransactionNeeded);
228 return true;
229}
230
chaviwf3f40fe2021-04-27 15:54:02 -0500231bool BufferStateLayer::setBufferCrop(const Rect& bufferCrop) {
Robert Carr6a160312021-05-17 12:08:20 -0700232 if (mDrawingState.bufferCrop == bufferCrop) return false;
chaviwf3f40fe2021-04-27 15:54:02 -0500233
Robert Carr6a160312021-05-17 12:08:20 -0700234 mDrawingState.sequence++;
235 mDrawingState.bufferCrop = bufferCrop;
chaviwf3f40fe2021-04-27 15:54:02 -0500236
Robert Carr6a160312021-05-17 12:08:20 -0700237 mDrawingState.modified = true;
chaviwf3f40fe2021-04-27 15:54:02 -0500238 setTransactionFlags(eTransactionNeeded);
239 return true;
240}
241
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700242bool BufferStateLayer::setDestinationFrame(const Rect& destinationFrame) {
Robert Carr6a160312021-05-17 12:08:20 -0700243 if (mDrawingState.destinationFrame == destinationFrame) return false;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700244
Robert Carr6a160312021-05-17 12:08:20 -0700245 mDrawingState.sequence++;
246 mDrawingState.destinationFrame = destinationFrame;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700247
Robert Carr6a160312021-05-17 12:08:20 -0700248 mDrawingState.modified = true;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700249 setTransactionFlags(eTransactionNeeded);
250 return true;
251}
252
Robert Carr6a160312021-05-17 12:08:20 -0700253static bool assignTransform(ui::Transform* dst, ui::Transform& from) {
254 if (*dst == from) {
255 return false;
256 }
257 *dst = from;
258 return true;
259}
260
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700261// Translate destination frame into scale and position. If a destination frame is not set, use the
262// provided scale and position
Robert Carr6a160312021-05-17 12:08:20 -0700263bool BufferStateLayer::updateGeometry() {
Vishnu Naird2aaab12022-02-10 14:49:09 -0800264 if ((mDrawingState.flags & layer_state_t::eIgnoreDestinationFrame) ||
265 mDrawingState.destinationFrame.isEmpty()) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700266 // If destination frame is not set, use the requested transform set via
267 // BufferStateLayer::setPosition and BufferStateLayer::setMatrix.
Robert Carr6a160312021-05-17 12:08:20 -0700268 return assignTransform(&mDrawingState.transform, mRequestedTransform);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700269 }
270
Robert Carr6a160312021-05-17 12:08:20 -0700271 Rect destRect = mDrawingState.destinationFrame;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700272 int32_t destW = destRect.width();
273 int32_t destH = destRect.height();
274 if (destRect.left < 0) {
275 destRect.left = 0;
276 destRect.right = destW;
277 }
278 if (destRect.top < 0) {
279 destRect.top = 0;
280 destRect.bottom = destH;
281 }
282
Robert Carr6a160312021-05-17 12:08:20 -0700283 if (!mDrawingState.buffer) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700284 ui::Transform t;
285 t.set(destRect.left, destRect.top);
Robert Carr6a160312021-05-17 12:08:20 -0700286 return assignTransform(&mDrawingState.transform, t);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700287 }
288
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800289 uint32_t bufferWidth = mDrawingState.buffer->getWidth();
290 uint32_t bufferHeight = mDrawingState.buffer->getHeight();
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700291 // Undo any transformations on the buffer.
Robert Carr6a160312021-05-17 12:08:20 -0700292 if (mDrawingState.bufferTransform & ui::Transform::ROT_90) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700293 std::swap(bufferWidth, bufferHeight);
294 }
295 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
Robert Carr6a160312021-05-17 12:08:20 -0700296 if (mDrawingState.transformToDisplayInverse) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700297 if (invTransform & ui::Transform::ROT_90) {
298 std::swap(bufferWidth, bufferHeight);
299 }
300 }
301
302 float sx = destW / static_cast<float>(bufferWidth);
303 float sy = destH / static_cast<float>(bufferHeight);
304 ui::Transform t;
305 t.set(sx, 0, 0, sy);
306 t.set(destRect.left, destRect.top);
Robert Carr6a160312021-05-17 12:08:20 -0700307 return assignTransform(&mDrawingState.transform, t);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700308}
309
Robert Carrde6d7b42022-01-07 18:23:06 -0800310bool BufferStateLayer::setMatrix(const layer_state_t::matrix22_t& matrix) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700311 if (mRequestedTransform.dsdx() == matrix.dsdx && mRequestedTransform.dtdy() == matrix.dtdy &&
312 mRequestedTransform.dtdx() == matrix.dtdx && mRequestedTransform.dsdy() == matrix.dsdy) {
Marissa Wall861616d2018-10-22 12:52:23 -0700313 return false;
314 }
315
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000316 ui::Transform t;
317 t.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
318
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700319 mRequestedTransform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
chaviw9a93ea62021-03-11 16:44:42 -0600320
Robert Carr6a160312021-05-17 12:08:20 -0700321 mDrawingState.sequence++;
322 mDrawingState.modified = true;
chaviw9a93ea62021-03-11 16:44:42 -0600323 setTransactionFlags(eTransactionNeeded);
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000324
325 return true;
326}
327
328bool BufferStateLayer::setPosition(float x, float y) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700329 if (mRequestedTransform.tx() == x && mRequestedTransform.ty() == y) {
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000330 return false;
331 }
332
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700333 mRequestedTransform.set(x, y);
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000334
Robert Carr6a160312021-05-17 12:08:20 -0700335 mDrawingState.sequence++;
336 mDrawingState.modified = true;
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000337 setTransactionFlags(eTransactionNeeded);
338
Marissa Wall861616d2018-10-22 12:52:23 -0700339 return true;
340}
341
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800342bool BufferStateLayer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
343 const BufferData& bufferData, nsecs_t postTime,
Alec Mouria90a5702021-04-16 16:36:21 +0000344 nsecs_t desiredPresentTime, bool isAutoTimestamp,
chaviwba4320c2021-09-15 15:20:53 -0500345 std::optional<nsecs_t> dequeueTime,
346 const FrameTimelineInfo& info) {
Alex Chaucf6b4b42021-12-07 10:48:52 +0000347 ATRACE_CALL();
Robert Carr0c1966e2020-10-19 12:12:08 -0700348
chaviwba4320c2021-09-15 15:20:53 -0500349 if (!buffer) {
350 return false;
351 }
352
353 const bool frameNumberChanged =
354 bufferData.flags.test(BufferData::BufferDataChange::frameNumberChanged);
355 const uint64_t frameNumber =
356 frameNumberChanged ? bufferData.frameNumber : mDrawingState.frameNumber + 1;
357
Robert Carr6a160312021-05-17 12:08:20 -0700358 if (mDrawingState.buffer) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700359 mReleasePreviousBuffer = true;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800360 if (!mBufferInfo.mBuffer ||
361 (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) ||
362 mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) {
Robert Carr6a160312021-05-17 12:08:20 -0700363 // If mDrawingState has a buffer, and we are about to update again
Robert Carr7121caf2020-12-15 13:07:32 -0800364 // before swapping to drawing state, then the first buffer will be
Vishnu Nair1506b182021-02-22 14:35:15 -0800365 // dropped and we should decrement the pending buffer count and
366 // call any release buffer callbacks if set.
Robert Carr6a160312021-05-17 12:08:20 -0700367 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700368 mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500369 mDrawingState.acquireFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -0700370 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
371 mOwnerUid));
Robert Carr7121caf2020-12-15 13:07:32 -0800372 decrementPendingBufferCount();
Robert Carr6a160312021-05-17 12:08:20 -0700373 if (mDrawingState.bufferSurfaceFrameTX != nullptr &&
374 mDrawingState.bufferSurfaceFrameTX->getPresentState() != PresentState::Presented) {
375 addSurfaceFrameDroppedForBuffer(mDrawingState.bufferSurfaceFrameTX);
376 mDrawingState.bufferSurfaceFrameTX.reset();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000377 }
Robert Carrb6450492022-06-23 11:17:16 -0700378 } else if (EARLY_RELEASE_ENABLED && mLastClientCompositionFence != nullptr) {
Robert Carrccab4242021-09-28 16:53:03 -0700379 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
380 mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500381 mLastClientCompositionFence,
Robert Carrccab4242021-09-28 16:53:03 -0700382 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
chaviw69058fb2021-09-27 09:37:30 -0500383 mOwnerUid));
Robert Carrccab4242021-09-28 16:53:03 -0700384 mLastClientCompositionFence = nullptr;
Robert Carr7121caf2020-12-15 13:07:32 -0800385 }
Marissa Wallfda30bb2018-10-12 11:34:28 -0700386 }
Robert Carr6a160312021-05-17 12:08:20 -0700387
388 mDrawingState.frameNumber = frameNumber;
chaviwba4320c2021-09-15 15:20:53 -0500389 mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800390 mDrawingState.buffer = std::move(buffer);
chaviwba4320c2021-09-15 15:20:53 -0500391 mDrawingState.clientCacheId = bufferData.cachedBuffer;
392
393 mDrawingState.acquireFence = bufferData.flags.test(BufferData::BufferDataChange::fenceChanged)
394 ? bufferData.acquireFence
395 : Fence::NO_FENCE;
396 mDrawingState.acquireFenceTime = std::make_unique<FenceTime>(mDrawingState.acquireFence);
Ady Abraham461296a2022-01-21 11:11:31 -0800397 if (mDrawingState.acquireFenceTime->getSignalTime() == Fence::SIGNAL_TIME_PENDING) {
398 // We latched this buffer unsiganled, so we need to pass the acquire fence
399 // on the callback instead of just the acquire time, since it's unknown at
400 // this point.
401 mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFence;
402 } else {
403 mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFenceTime->getSignalTime();
404 }
chaviwba4320c2021-09-15 15:20:53 -0500405
Robert Carr6a160312021-05-17 12:08:20 -0700406 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700407 setTransactionFlags(eTransactionNeeded);
Ady Abraham09bd3922019-04-08 10:44:56 -0700408
Yiwei Zhang1a88c402019-11-18 10:43:58 -0800409 const int32_t layerId = getSequence();
Robert Carr6a160312021-05-17 12:08:20 -0700410 mFlinger->mTimeStats->setPostTime(layerId, mDrawingState.frameNumber, getName().c_str(),
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000411 mOwnerUid, postTime, getGameMode());
Robert Carr6a160312021-05-17 12:08:20 -0700412 mDrawingState.desiredPresentTime = desiredPresentTime;
413 mDrawingState.isAutoTimestamp = isAutoTimestamp;
Ady Abraham09bd3922019-04-08 10:44:56 -0700414
Ady Abrahamb7f15562021-03-15 18:34:08 -0700415 const nsecs_t presentTime = [&] {
416 if (!isAutoTimestamp) return desiredPresentTime;
417
418 const auto prediction =
419 mFlinger->mFrameTimeline->getTokenManager()->getPredictionsForToken(info.vsyncId);
420 if (prediction.has_value()) return prediction->presentTime;
421
422 return static_cast<nsecs_t>(0);
423 }();
Dominik Laskowski068173d2021-08-11 17:22:59 -0700424
425 using LayerUpdateType = scheduler::LayerHistory::LayerUpdateType;
426 mFlinger->mScheduler->recordLayerHistory(this, presentTime, LayerUpdateType::Buffer);
Ady Abraham09bd3922019-04-08 10:44:56 -0700427
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000428 setFrameTimelineVsyncForBufferTransaction(info, postTime);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000429
Vishnu Nair26c49762022-01-18 22:58:52 +0000430 if (dequeueTime && *dequeueTime != 0) {
431 const uint64_t bufferId = mDrawingState.buffer->getId();
Adithya Srinivasanb238cd52021-02-04 17:54:05 +0000432 mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str());
433 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, *dequeueTime,
434 FrameTracer::FrameEvent::DEQUEUE);
435 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, postTime,
436 FrameTracer::FrameEvent::QUEUE);
437 }
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000438
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800439 mDrawingState.width = mDrawingState.buffer->getWidth();
440 mDrawingState.height = mDrawingState.buffer->getHeight();
chaviwba4320c2021-09-15 15:20:53 -0500441 mDrawingState.releaseBufferEndpoint = bufferData.releaseBufferEndpoint;
Marissa Wall61c58622018-07-18 10:12:20 -0700442 return true;
443}
444
445bool BufferStateLayer::setDataspace(ui::Dataspace dataspace) {
Robert Carr6a160312021-05-17 12:08:20 -0700446 if (mDrawingState.dataspace == dataspace) return false;
447 mDrawingState.dataspace = dataspace;
448 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700449 setTransactionFlags(eTransactionNeeded);
450 return true;
451}
452
453bool BufferStateLayer::setHdrMetadata(const HdrMetadata& hdrMetadata) {
Robert Carr6a160312021-05-17 12:08:20 -0700454 if (mDrawingState.hdrMetadata == hdrMetadata) return false;
455 mDrawingState.hdrMetadata = hdrMetadata;
456 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700457 setTransactionFlags(eTransactionNeeded);
458 return true;
459}
460
461bool BufferStateLayer::setSurfaceDamageRegion(const Region& surfaceDamage) {
Robert Carr6a160312021-05-17 12:08:20 -0700462 mDrawingState.surfaceDamageRegion = surfaceDamage;
463 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700464 setTransactionFlags(eTransactionNeeded);
465 return true;
466}
467
468bool BufferStateLayer::setApi(int32_t api) {
Robert Carr6a160312021-05-17 12:08:20 -0700469 if (mDrawingState.api == api) return false;
470 mDrawingState.api = api;
471 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700472 setTransactionFlags(eTransactionNeeded);
473 return true;
474}
475
476bool BufferStateLayer::setSidebandStream(const sp<NativeHandle>& sidebandStream) {
Robert Carr6a160312021-05-17 12:08:20 -0700477 if (mDrawingState.sidebandStream == sidebandStream) return false;
Robert Carr3e2a2992021-06-11 13:42:55 -0700478
479 if (mDrawingState.sidebandStream != nullptr && sidebandStream == nullptr) {
480 mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
481 } else if (sidebandStream != nullptr) {
482 mFlinger->mTunnelModeEnabledReporter->incrementTunnelModeCount();
483 }
484
Robert Carr6a160312021-05-17 12:08:20 -0700485 mDrawingState.sidebandStream = sidebandStream;
486 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700487 setTransactionFlags(eTransactionNeeded);
Marissa Wall61c58622018-07-18 10:12:20 -0700488 if (!mSidebandStreamChanged.exchange(true)) {
489 // mSidebandStreamChanged was false
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700490 mFlinger->onLayerUpdate();
Marissa Wall61c58622018-07-18 10:12:20 -0700491 }
492 return true;
493}
494
Marissa Walle2ffb422018-10-12 11:33:52 -0700495bool BufferStateLayer::setTransactionCompletedListeners(
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000496 const std::vector<sp<CallbackHandle>>& handles) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700497 // If there is no handle, we will not send a callback so reset mReleasePreviousBuffer and return
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000498 if (handles.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700499 mReleasePreviousBuffer = false;
Marissa Walle2ffb422018-10-12 11:33:52 -0700500 return false;
501 }
502
503 const bool willPresent = willPresentCurrentTransaction();
504
505 for (const auto& handle : handles) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700506 // If this transaction set a buffer on this layer, release its previous buffer
507 handle->releasePreviousBuffer = mReleasePreviousBuffer;
508
Marissa Walle2ffb422018-10-12 11:33:52 -0700509 // If this layer will be presented in this frame
510 if (willPresent) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700511 // If this transaction set an acquire fence on this layer, set its acquire time
Ady Abraham461296a2022-01-21 11:11:31 -0800512 handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence;
Robert Carr6a160312021-05-17 12:08:20 -0700513 handle->frameNumber = mDrawingState.frameNumber;
Marissa Wallfda30bb2018-10-12 11:34:28 -0700514
Marissa Walle2ffb422018-10-12 11:33:52 -0700515 // Store so latched time and release fence can be set
Robert Carr6a160312021-05-17 12:08:20 -0700516 mDrawingState.callbackHandles.push_back(handle);
Marissa Walle2ffb422018-10-12 11:33:52 -0700517
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000518 } else { // If this layer will NOT need to be relatched and presented this frame
Marissa Walle2ffb422018-10-12 11:33:52 -0700519 // Notify the transaction completed thread this handle is done
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000520 mFlinger->getTransactionCallbackInvoker().registerUnpresentedCallbackHandle(handle);
Marissa Walle2ffb422018-10-12 11:33:52 -0700521 }
522 }
523
Marissa Wallfda30bb2018-10-12 11:34:28 -0700524 mReleasePreviousBuffer = false;
Ady Abraham461296a2022-01-21 11:11:31 -0800525 mCallbackHandleAcquireTimeOrFence = -1;
Marissa Wallfda30bb2018-10-12 11:34:28 -0700526
Marissa Walle2ffb422018-10-12 11:33:52 -0700527 return willPresent;
528}
529
Marissa Wall61c58622018-07-18 10:12:20 -0700530bool BufferStateLayer::setTransparentRegionHint(const Region& transparent) {
Vishnu Nair27e3ed52021-07-08 18:24:25 -0700531 mDrawingState.sequence++;
Robert Carr6a160312021-05-17 12:08:20 -0700532 mDrawingState.transparentRegionHint = transparent;
533 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700534 setTransactionFlags(eTransactionNeeded);
535 return true;
536}
537
rnleeed20fa42021-08-10 18:00:03 -0700538Rect BufferStateLayer::getBufferSize(const State& /*s*/) const {
Marissa Wall861616d2018-10-22 12:52:23 -0700539 // for buffer state layers we use the display frame size as the buffer size.
Marissa Wall61c58622018-07-18 10:12:20 -0700540
chaviw7e72caf2020-12-02 16:50:43 -0800541 if (mBufferInfo.mBuffer == nullptr) {
542 return Rect::INVALID_RECT;
543 }
544
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800545 uint32_t bufWidth = mBufferInfo.mBuffer->getWidth();
546 uint32_t bufHeight = mBufferInfo.mBuffer->getHeight();
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700547
548 // Undo any transformations on the buffer and return the result.
549 if (mBufferInfo.mTransform & ui::Transform::ROT_90) {
550 std::swap(bufWidth, bufHeight);
551 }
552
553 if (getTransformToDisplayInverse()) {
554 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
555 if (invTransform & ui::Transform::ROT_90) {
556 std::swap(bufWidth, bufHeight);
Marissa Wall861616d2018-10-22 12:52:23 -0700557 }
558 }
559
rnleeed20fa42021-08-10 18:00:03 -0700560 return Rect(0, 0, static_cast<int32_t>(bufWidth), static_cast<int32_t>(bufHeight));
Marissa Wall61c58622018-07-18 10:12:20 -0700561}
Vishnu Nair4351ad52019-02-11 14:13:02 -0800562
563FloatRect BufferStateLayer::computeSourceBounds(const FloatRect& parentBounds) const {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700564 if (mBufferInfo.mBuffer == nullptr) {
565 return parentBounds;
Vishnu Nair4351ad52019-02-11 14:13:02 -0800566 }
567
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700568 return getBufferSize(getDrawingState()).toFloatRect();
Vishnu Nair4351ad52019-02-11 14:13:02 -0800569}
570
Marissa Wall61c58622018-07-18 10:12:20 -0700571// -----------------------------------------------------------------------
572
573// -----------------------------------------------------------------------
574// Interface implementation for BufferLayer
575// -----------------------------------------------------------------------
576bool BufferStateLayer::fenceHasSignaled() const {
ramindani4d48f902021-09-20 21:07:45 +0000577 if (SurfaceFlinger::enableLatchUnsignaledConfig != LatchUnsignaledConfig::Disabled) {
Huihong Luo86c80e32021-06-16 15:41:07 -0700578 return true;
579 }
580
Alec Mouri91f6df32020-01-30 08:48:58 -0800581 const bool fenceSignaled =
582 getDrawingState().acquireFence->getStatus() == Fence::Status::Signaled;
583 if (!fenceSignaled) {
584 mFlinger->mTimeStats->incrementLatchSkipped(getSequence(),
585 TimeStats::LatchSkipReason::LateAcquire);
586 }
587
588 return fenceSignaled;
Marissa Wall61c58622018-07-18 10:12:20 -0700589}
590
Dominik Laskowskia8955dd2019-07-10 10:19:09 -0700591bool BufferStateLayer::framePresentTimeIsCurrent(nsecs_t expectedPresentTime) const {
Ady Abrahamcd1580c2019-04-29 15:40:03 -0700592 if (!hasFrameUpdate() || isRemovedFromCurrentState()) {
593 return true;
594 }
595
Robert Carr6a160312021-05-17 12:08:20 -0700596 return mDrawingState.isAutoTimestamp || mDrawingState.desiredPresentTime <= expectedPresentTime;
Ady Abrahamcd1580c2019-04-29 15:40:03 -0700597}
598
Valerie Hau871d6352020-01-29 08:44:02 -0800599bool BufferStateLayer::onPreComposition(nsecs_t refreshStartTime) {
600 for (const auto& handle : mDrawingState.callbackHandles) {
601 handle->refreshStartTime = refreshStartTime;
602 }
603 return BufferLayer::onPreComposition(refreshStartTime);
604}
605
Vishnu Naircf26a0a2020-11-13 12:56:20 -0800606void BufferStateLayer::setAutoRefresh(bool autoRefresh) {
Vishnu Nair86653e92021-11-03 17:19:36 -0700607 mDrawingState.autoRefresh = autoRefresh;
Marissa Wall61c58622018-07-18 10:12:20 -0700608}
609
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800610bool BufferStateLayer::latchSidebandStream(bool& recomputeVisibleRegions) {
baocheng suna663c2b2021-05-13 18:51:28 +0800611 // 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 +0800612 editCompositionState()->sidebandStreamHasFrame = hasFrameUpdate() && mSidebandStream.get();
baocheng suna663c2b2021-05-13 18:51:28 +0800613
baocheng sun9691b9c2021-08-03 19:27:06 +0800614 if (mSidebandStreamChanged.exchange(false)) {
Marissa Wall61c58622018-07-18 10:12:20 -0700615 const State& s(getDrawingState());
616 // mSidebandStreamChanged was true
Lloyd Pique0b785d82018-12-04 17:25:27 -0800617 mSidebandStream = s.sidebandStream;
Lloyd Piquede196652020-01-22 17:29:58 -0800618 editCompositionState()->sidebandStream = mSidebandStream;
Lloyd Pique0b785d82018-12-04 17:25:27 -0800619 if (mSidebandStream != nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700620 setTransactionFlags(eTransactionNeeded);
621 mFlinger->setTransactionFlags(eTraversalNeeded);
622 }
623 recomputeVisibleRegions = true;
624
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800625 return true;
Marissa Wall61c58622018-07-18 10:12:20 -0700626 }
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800627 return false;
Marissa Wall61c58622018-07-18 10:12:20 -0700628}
629
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800630bool BufferStateLayer::hasFrameUpdate() const {
Robert Carr6a160312021-05-17 12:08:20 -0700631 const State& c(getDrawingState());
Robert Carr315f3c72021-06-24 21:58:09 -0700632 return (mDrawingStateModified || mDrawingState.modified) && (c.buffer != nullptr || c.bgColorLayer != nullptr);
Marissa Wall61c58622018-07-18 10:12:20 -0700633}
634
Dominik Laskowskia8955dd2019-07-10 10:19:09 -0700635status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nsecs_t latchTime,
636 nsecs_t /*expectedPresentTime*/) {
Marissa Wall61c58622018-07-18 10:12:20 -0700637 const State& s(getDrawingState());
638
639 if (!s.buffer) {
Valerie Hauaa194562019-02-05 16:21:38 -0800640 if (s.bgColorLayer) {
641 for (auto& handle : mDrawingState.callbackHandles) {
642 handle->latchTime = latchTime;
643 }
644 }
Marissa Wall61c58622018-07-18 10:12:20 -0700645 return NO_ERROR;
646 }
647
Marissa Wall5a68a772018-12-22 17:43:42 -0800648 for (auto& handle : mDrawingState.callbackHandles) {
Vishnu Nair935590e2021-02-10 13:05:52 -0800649 if (handle->frameNumber == mDrawingState.frameNumber) {
650 handle->latchTime = latchTime;
651 }
Marissa Wall5a68a772018-12-22 17:43:42 -0800652 }
Marissa Walle2ffb422018-10-12 11:33:52 -0700653
Vishnu Nairea0de002020-11-17 17:42:37 -0800654 const int32_t layerId = getSequence();
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800655 const uint64_t bufferId = mDrawingState.buffer->getId();
Adithya Srinivasanb238cd52021-02-04 17:54:05 +0000656 const uint64_t frameNumber = mDrawingState.frameNumber;
657 const auto acquireFence = std::make_shared<FenceTime>(mDrawingState.acquireFence);
658 mFlinger->mTimeStats->setAcquireFence(layerId, frameNumber, acquireFence);
659 mFlinger->mTimeStats->setLatchTime(layerId, frameNumber, latchTime);
660
661 mFlinger->mFrameTracer->traceFence(layerId, bufferId, frameNumber, acquireFence,
662 FrameTracer::FrameEvent::ACQUIRE_FENCE);
663 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, latchTime,
664 FrameTracer::FrameEvent::LATCH);
Marissa Wall61c58622018-07-18 10:12:20 -0700665
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000666 auto& bufferSurfaceFrame = mDrawingState.bufferSurfaceFrameTX;
667 if (bufferSurfaceFrame != nullptr &&
668 bufferSurfaceFrame->getPresentState() != PresentState::Presented) {
669 // Update only if the bufferSurfaceFrame wasn't already presented. A Presented
670 // bufferSurfaceFrame could be seen here if a pending state was applied successfully and we
671 // are processing the next state.
672 addSurfaceFramePresentedForBuffer(bufferSurfaceFrame,
Ady Abraham6c1b7ac2021-03-31 16:56:03 -0700673 mDrawingState.acquireFenceTime->getSignalTime(),
674 latchTime);
Robert Carr6a160312021-05-17 12:08:20 -0700675 mDrawingState.bufferSurfaceFrameTX.reset();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000676 }
677
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700678 std::deque<sp<CallbackHandle>> remainingHandles;
679 mFlinger->getTransactionCallbackInvoker()
Robert Carr3d1047b2021-09-20 18:22:32 -0700680 .addOnCommitCallbackHandles(mDrawingState.callbackHandles, remainingHandles);
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700681 mDrawingState.callbackHandles = remainingHandles;
682
Robert Carr6a160312021-05-17 12:08:20 -0700683 mDrawingStateModified = false;
Marissa Wall16c112d2019-03-20 13:21:13 -0700684
Marissa Wall61c58622018-07-18 10:12:20 -0700685 return NO_ERROR;
686}
687
688status_t BufferStateLayer::updateActiveBuffer() {
689 const State& s(getDrawingState());
690
691 if (s.buffer == nullptr) {
692 return BAD_VALUE;
693 }
chaviwdf3c5e82021-01-07 13:00:37 -0800694
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800695 if (!mBufferInfo.mBuffer || !s.buffer->hasSameBuffer(*mBufferInfo.mBuffer)) {
chaviwdf3c5e82021-01-07 13:00:37 -0800696 decrementPendingBufferCount();
697 }
Marissa Wall61c58622018-07-18 10:12:20 -0700698
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700699 mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};
chaviwd62d3062019-09-04 14:48:02 -0700700 mBufferInfo.mBuffer = s.buffer;
701 mBufferInfo.mFence = s.acquireFence;
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700702 mBufferInfo.mFrameNumber = s.frameNumber;
Marissa Wall61c58622018-07-18 10:12:20 -0700703
704 return NO_ERROR;
705}
706
Alec Mouri8977ce92022-05-07 00:34:50 +0000707status_t BufferStateLayer::updateFrameNumber() {
Marissa Wall61c58622018-07-18 10:12:20 -0700708 // TODO(marissaw): support frame history events
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700709 mPreviousFrameNumber = mCurrentFrameNumber;
Valerie Hau134651a2020-01-28 16:21:22 -0800710 mCurrentFrameNumber = mDrawingState.frameNumber;
Marissa Wall61c58622018-07-18 10:12:20 -0700711 return NO_ERROR;
712}
713
Marissa Wall947d34e2019-03-29 14:03:53 -0700714void BufferStateLayer::HwcSlotGenerator::bufferErased(const client_cache_t& clientCacheId) {
715 std::lock_guard lock(mMutex);
716 if (!clientCacheId.isValid()) {
717 ALOGE("invalid process, failed to erase buffer");
718 return;
719 }
720 eraseBufferLocked(clientCacheId);
721}
722
rnleeed20fa42021-08-10 18:00:03 -0700723int BufferStateLayer::HwcSlotGenerator::getHwcCacheSlot(const client_cache_t& clientCacheId) {
Marissa Wall947d34e2019-03-29 14:03:53 -0700724 std::lock_guard<std::mutex> lock(mMutex);
725 auto itr = mCachedBuffers.find(clientCacheId);
726 if (itr == mCachedBuffers.end()) {
727 return addCachedBuffer(clientCacheId);
728 }
729 auto& [hwcCacheSlot, counter] = itr->second;
730 counter = mCounter++;
731 return hwcCacheSlot;
732}
733
rnleeed20fa42021-08-10 18:00:03 -0700734int BufferStateLayer::HwcSlotGenerator::addCachedBuffer(const client_cache_t& clientCacheId)
Marissa Wall947d34e2019-03-29 14:03:53 -0700735 REQUIRES(mMutex) {
736 if (!clientCacheId.isValid()) {
737 ALOGE("invalid process, returning invalid slot");
738 return BufferQueue::INVALID_BUFFER_SLOT;
739 }
740
741 ClientCache::getInstance().registerErasedRecipient(clientCacheId, wp<ErasedRecipient>(this));
742
rnleeed20fa42021-08-10 18:00:03 -0700743 int hwcCacheSlot = getFreeHwcCacheSlot();
Marissa Wall947d34e2019-03-29 14:03:53 -0700744 mCachedBuffers[clientCacheId] = {hwcCacheSlot, mCounter++};
745 return hwcCacheSlot;
746}
747
rnleeed20fa42021-08-10 18:00:03 -0700748int BufferStateLayer::HwcSlotGenerator::getFreeHwcCacheSlot() REQUIRES(mMutex) {
Marissa Wall947d34e2019-03-29 14:03:53 -0700749 if (mFreeHwcCacheSlots.empty()) {
750 evictLeastRecentlyUsed();
751 }
752
rnleeed20fa42021-08-10 18:00:03 -0700753 int hwcCacheSlot = mFreeHwcCacheSlots.top();
Marissa Wall947d34e2019-03-29 14:03:53 -0700754 mFreeHwcCacheSlots.pop();
755 return hwcCacheSlot;
756}
757
758void BufferStateLayer::HwcSlotGenerator::evictLeastRecentlyUsed() REQUIRES(mMutex) {
759 uint64_t minCounter = UINT_MAX;
760 client_cache_t minClientCacheId = {};
761 for (const auto& [clientCacheId, slotCounter] : mCachedBuffers) {
762 const auto& [hwcCacheSlot, counter] = slotCounter;
763 if (counter < minCounter) {
764 minCounter = counter;
765 minClientCacheId = clientCacheId;
766 }
767 }
768 eraseBufferLocked(minClientCacheId);
769
770 ClientCache::getInstance().unregisterErasedRecipient(minClientCacheId, this);
771}
772
773void BufferStateLayer::HwcSlotGenerator::eraseBufferLocked(const client_cache_t& clientCacheId)
774 REQUIRES(mMutex) {
775 auto itr = mCachedBuffers.find(clientCacheId);
776 if (itr == mCachedBuffers.end()) {
777 return;
778 }
779 auto& [hwcCacheSlot, counter] = itr->second;
780
781 // TODO send to hwc cache and resources
782
783 mFreeHwcCacheSlots.push(hwcCacheSlot);
784 mCachedBuffers.erase(clientCacheId);
785}
chaviw4244e032019-09-04 11:27:49 -0700786
787void BufferStateLayer::gatherBufferInfo() {
chaviwdebadb82020-03-26 14:57:24 -0700788 BufferLayer::gatherBufferInfo();
chaviw4244e032019-09-04 11:27:49 -0700789
chaviwdebadb82020-03-26 14:57:24 -0700790 const State& s(getDrawingState());
chaviw4244e032019-09-04 11:27:49 -0700791 mBufferInfo.mDesiredPresentTime = s.desiredPresentTime;
792 mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);
793 mBufferInfo.mFence = s.acquireFence;
chaviw766c9c52021-02-10 17:36:47 -0800794 mBufferInfo.mTransform = s.bufferTransform;
Robert Carr167bdde2021-07-28 11:26:51 -0700795 auto lastDataspace = mBufferInfo.mDataspace;
chaviw4244e032019-09-04 11:27:49 -0700796 mBufferInfo.mDataspace = translateDataspace(s.dataspace);
Robert Carr167bdde2021-07-28 11:26:51 -0700797 if (lastDataspace != mBufferInfo.mDataspace) {
798 mFlinger->mSomeDataspaceChanged = true;
799 }
Vishnu Nair5cc9ac02021-04-19 13:23:38 -0700800 mBufferInfo.mCrop = computeBufferCrop(s);
chaviw4244e032019-09-04 11:27:49 -0700801 mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
802 mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion;
803 mBufferInfo.mHdrMetadata = s.hdrMetadata;
804 mBufferInfo.mApi = s.api;
chaviw4244e032019-09-04 11:27:49 -0700805 mBufferInfo.mTransformToDisplayInverse = s.transformToDisplayInverse;
chaviwf83ce182019-09-12 14:43:08 -0700806 mBufferInfo.mBufferSlot = mHwcSlotGenerator->getHwcCacheSlot(s.clientCacheId);
chaviw4244e032019-09-04 11:27:49 -0700807}
808
Robert Carr916b0362020-10-06 13:53:03 -0700809uint32_t BufferStateLayer::getEffectiveScalingMode() const {
810 return NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
811}
812
Vishnu Nair5cc9ac02021-04-19 13:23:38 -0700813Rect BufferStateLayer::computeBufferCrop(const State& s) {
chaviwf3f40fe2021-04-27 15:54:02 -0500814 if (s.buffer && !s.bufferCrop.isEmpty()) {
815 Rect bufferCrop;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800816 s.buffer->getBounds().intersect(s.bufferCrop, &bufferCrop);
chaviwf3f40fe2021-04-27 15:54:02 -0500817 return bufferCrop;
818 } else if (s.buffer) {
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800819 return s.buffer->getBounds();
chaviwf3f40fe2021-04-27 15:54:02 -0500820 } else {
821 return s.bufferCrop;
chaviw4244e032019-09-04 11:27:49 -0700822 }
chaviw4244e032019-09-04 11:27:49 -0700823}
824
chaviwb4c6e582019-08-16 14:35:07 -0700825sp<Layer> BufferStateLayer::createClone() {
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -0800826 LayerCreationArgs args(mFlinger.get(), nullptr, mName + " (Mirror)", 0, LayerMetadata());
chaviwb4c6e582019-08-16 14:35:07 -0700827 args.textureName = mTextureName;
Lloyd Pique1c3a5eb2019-10-03 13:07:08 -0700828 sp<BufferStateLayer> layer = mFlinger->getFactory().createBufferStateLayer(args);
chaviwb4c6e582019-08-16 14:35:07 -0700829 layer->mHwcSlotGenerator = mHwcSlotGenerator;
830 layer->setInitialValuesForClone(this);
831 return layer;
832}
Valerie Hau92bf5482020-02-10 09:49:08 -0800833
Vishnu Naire7f79c52020-10-29 14:45:03 -0700834bool BufferStateLayer::bufferNeedsFiltering() const {
835 const State& s(getDrawingState());
836 if (!s.buffer) {
837 return false;
838 }
839
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800840 int32_t bufferWidth = static_cast<int32_t>(s.buffer->getWidth());
841 int32_t bufferHeight = static_cast<int32_t>(s.buffer->getHeight());
Vishnu Naire7f79c52020-10-29 14:45:03 -0700842
843 // Undo any transformations on the buffer and return the result.
chaviw766c9c52021-02-10 17:36:47 -0800844 if (s.bufferTransform & ui::Transform::ROT_90) {
Vishnu Naire7f79c52020-10-29 14:45:03 -0700845 std::swap(bufferWidth, bufferHeight);
846 }
847
848 if (s.transformToDisplayInverse) {
849 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
850 if (invTransform & ui::Transform::ROT_90) {
851 std::swap(bufferWidth, bufferHeight);
852 }
853 }
854
855 const Rect layerSize{getBounds()};
Yiwei Zhang22ca2c42022-07-07 07:00:16 +0000856 int32_t layerWidth = layerSize.getWidth();
857 int32_t layerHeight = layerSize.getHeight();
858
859 // Align the layer orientation with the buffer before comparism
860 if (mTransformHint & ui::Transform::ROT_90) {
861 std::swap(layerWidth, layerHeight);
862 }
863
864 return layerWidth != bufferWidth || layerHeight != bufferHeight;
Vishnu Naire7f79c52020-10-29 14:45:03 -0700865}
Robert Carr7121caf2020-12-15 13:07:32 -0800866
Robert Carr7121caf2020-12-15 13:07:32 -0800867void BufferStateLayer::decrementPendingBufferCount() {
Vishnu Nair8eda69e2021-02-26 10:42:10 -0800868 int32_t pendingBuffers = --mPendingBufferTransactions;
869 tracePendingBufferCount(pendingBuffers);
Robert Carr7121caf2020-12-15 13:07:32 -0800870}
871
Vishnu Nair8eda69e2021-02-26 10:42:10 -0800872void BufferStateLayer::tracePendingBufferCount(int32_t pendingBuffers) {
873 ATRACE_INT(mBlastTransactionName.c_str(), pendingBuffers);
Robert Carr7121caf2020-12-15 13:07:32 -0800874}
875
Robert Carr7121caf2020-12-15 13:07:32 -0800876
chaviw39d01472021-04-08 14:26:24 -0500877/*
878 * We don't want to send the layer's transform to input, but rather the
879 * parent's transform. This is because BufferStateLayer's transform is
880 * information about how the buffer is placed on screen. The parent's
881 * transform makes more sense to send since it's information about how the
882 * layer is placed on screen. This transform is used by input to determine
883 * how to go from screen space back to window space.
884 */
885ui::Transform BufferStateLayer::getInputTransform() const {
Rob Carrc6d2d2b2021-10-25 16:51:49 +0000886 sp<Layer> parent = mDrawingParent.promote();
chaviw39d01472021-04-08 14:26:24 -0500887 if (parent == nullptr) {
888 return ui::Transform();
889 }
890
891 return parent->getTransform();
892}
893
894/**
895 * Similar to getInputTransform, we need to update the bounds to include the transform.
896 * This is because bounds for BSL doesn't include buffer transform, where the input assumes
897 * that's already included.
898 */
899Rect BufferStateLayer::getInputBounds() const {
900 Rect bufferBounds = getCroppedBufferSize(getDrawingState());
901 if (mDrawingState.transform.getType() == ui::Transform::IDENTITY || !bufferBounds.isValid()) {
902 return bufferBounds;
903 }
904 return mDrawingState.transform.transform(bufferBounds);
905}
906
Ady Abraham9dada822022-02-03 10:26:59 -0800907bool BufferStateLayer::simpleBufferUpdate(const layer_state_t& s) const {
908 const uint64_t requiredFlags = layer_state_t::eBufferChanged;
909
910 const uint64_t deniedFlags = layer_state_t::eProducerDisconnect | layer_state_t::eLayerChanged |
911 layer_state_t::eRelativeLayerChanged | layer_state_t::eTransparentRegionChanged |
912 layer_state_t::eFlagsChanged | layer_state_t::eBlurRegionsChanged |
913 layer_state_t::eLayerStackChanged | layer_state_t::eAutoRefreshChanged |
914 layer_state_t::eReparent;
915
916 const uint64_t allowedFlags = layer_state_t::eHasListenerCallbacksChanged |
917 layer_state_t::eFrameRateSelectionPriority | layer_state_t::eFrameRateChanged |
918 layer_state_t::eSurfaceDamageRegionChanged | layer_state_t::eApiChanged |
919 layer_state_t::eMetadataChanged | layer_state_t::eDropInputModeChanged |
920 layer_state_t::eInputInfoChanged;
921
922 if ((s.what & requiredFlags) != requiredFlags) {
923 ALOGV("%s: false [missing required flags 0x%" PRIx64 "]", __func__,
924 (s.what | requiredFlags) & ~s.what);
925 return false;
926 }
927
928 if (s.what & deniedFlags) {
929 ALOGV("%s: false [has denied flags 0x%" PRIx64 "]", __func__, s.what & deniedFlags);
930 return false;
931 }
932
933 if (s.what & allowedFlags) {
934 ALOGV("%s: [has allowed flags 0x%" PRIx64 "]", __func__, s.what & allowedFlags);
935 }
936
937 if (s.what & layer_state_t::ePositionChanged) {
938 if (mRequestedTransform.tx() != s.x || mRequestedTransform.ty() != s.y) {
939 ALOGV("%s: false [ePositionChanged changed]", __func__);
940 return false;
941 }
942 }
943
944 if (s.what & layer_state_t::eAlphaChanged) {
945 if (mDrawingState.color.a != s.alpha) {
946 ALOGV("%s: false [eAlphaChanged changed]", __func__);
947 return false;
948 }
949 }
950
951 if (s.what & layer_state_t::eColorTransformChanged) {
952 if (mDrawingState.colorTransform != s.colorTransform) {
953 ALOGV("%s: false [eColorTransformChanged changed]", __func__);
954 return false;
955 }
956 }
957
958 if (s.what & layer_state_t::eBackgroundColorChanged) {
959 if (mDrawingState.bgColorLayer || s.bgColorAlpha != 0) {
960 ALOGV("%s: false [eBackgroundColorChanged changed]", __func__);
961 return false;
962 }
963 }
964
965 if (s.what & layer_state_t::eMatrixChanged) {
966 if (mRequestedTransform.dsdx() != s.matrix.dsdx ||
967 mRequestedTransform.dtdy() != s.matrix.dtdy ||
968 mRequestedTransform.dtdx() != s.matrix.dtdx ||
969 mRequestedTransform.dsdy() != s.matrix.dsdy) {
970 ALOGV("%s: false [eMatrixChanged changed]", __func__);
971 return false;
972 }
973 }
974
975 if (s.what & layer_state_t::eCornerRadiusChanged) {
976 if (mDrawingState.cornerRadius != s.cornerRadius) {
977 ALOGV("%s: false [eCornerRadiusChanged changed]", __func__);
978 return false;
979 }
980 }
981
982 if (s.what & layer_state_t::eBackgroundBlurRadiusChanged) {
983 if (mDrawingState.backgroundBlurRadius != static_cast<int>(s.backgroundBlurRadius)) {
984 ALOGV("%s: false [eBackgroundBlurRadiusChanged changed]", __func__);
985 return false;
986 }
987 }
988
989 if (s.what & layer_state_t::eTransformChanged) {
990 if (mDrawingState.bufferTransform != s.transform) {
991 ALOGV("%s: false [eTransformChanged changed]", __func__);
992 return false;
993 }
994 }
995
996 if (s.what & layer_state_t::eTransformToDisplayInverseChanged) {
997 if (mDrawingState.transformToDisplayInverse != s.transformToDisplayInverse) {
998 ALOGV("%s: false [eTransformToDisplayInverseChanged changed]", __func__);
999 return false;
1000 }
1001 }
1002
1003 if (s.what & layer_state_t::eCropChanged) {
1004 if (mDrawingState.crop != s.crop) {
1005 ALOGV("%s: false [eCropChanged changed]", __func__);
1006 return false;
1007 }
1008 }
1009
1010 if (s.what & layer_state_t::eDataspaceChanged) {
1011 if (mDrawingState.dataspace != s.dataspace) {
1012 ALOGV("%s: false [eDataspaceChanged changed]", __func__);
1013 return false;
1014 }
1015 }
1016
1017 if (s.what & layer_state_t::eHdrMetadataChanged) {
1018 if (mDrawingState.hdrMetadata != s.hdrMetadata) {
1019 ALOGV("%s: false [eHdrMetadataChanged changed]", __func__);
1020 return false;
1021 }
1022 }
1023
1024 if (s.what & layer_state_t::eSidebandStreamChanged) {
1025 if (mDrawingState.sidebandStream != s.sidebandStream) {
1026 ALOGV("%s: false [eSidebandStreamChanged changed]", __func__);
1027 return false;
1028 }
1029 }
1030
1031 if (s.what & layer_state_t::eColorSpaceAgnosticChanged) {
1032 if (mDrawingState.colorSpaceAgnostic != s.colorSpaceAgnostic) {
1033 ALOGV("%s: false [eColorSpaceAgnosticChanged changed]", __func__);
1034 return false;
1035 }
1036 }
1037
1038 if (s.what & layer_state_t::eShadowRadiusChanged) {
1039 if (mDrawingState.shadowRadius != s.shadowRadius) {
1040 ALOGV("%s: false [eShadowRadiusChanged changed]", __func__);
1041 return false;
1042 }
1043 }
1044
1045 if (s.what & layer_state_t::eFixedTransformHintChanged) {
1046 if (mDrawingState.fixedTransformHint != s.fixedTransformHint) {
1047 ALOGV("%s: false [eFixedTransformHintChanged changed]", __func__);
1048 return false;
1049 }
1050 }
1051
1052 if (s.what & layer_state_t::eTrustedOverlayChanged) {
1053 if (mDrawingState.isTrustedOverlay != s.isTrustedOverlay) {
1054 ALOGV("%s: false [eTrustedOverlayChanged changed]", __func__);
1055 return false;
1056 }
1057 }
1058
1059 if (s.what & layer_state_t::eStretchChanged) {
1060 StretchEffect temp = s.stretchEffect;
1061 temp.sanitize();
1062 if (mDrawingState.stretchEffect != temp) {
1063 ALOGV("%s: false [eStretchChanged changed]", __func__);
1064 return false;
1065 }
1066 }
1067
1068 if (s.what & layer_state_t::eBufferCropChanged) {
1069 if (mDrawingState.bufferCrop != s.bufferCrop) {
1070 ALOGV("%s: false [eBufferCropChanged changed]", __func__);
1071 return false;
1072 }
1073 }
1074
1075 if (s.what & layer_state_t::eDestinationFrameChanged) {
1076 if (mDrawingState.destinationFrame != s.destinationFrame) {
1077 ALOGV("%s: false [eDestinationFrameChanged changed]", __func__);
1078 return false;
1079 }
1080 }
1081
Sally Qi81d95e62022-03-21 19:41:33 -07001082 if (s.what & layer_state_t::eDimmingEnabledChanged) {
1083 if (mDrawingState.dimmingEnabled != s.dimmingEnabled) {
1084 ALOGV("%s: false [eDimmingEnabledChanged changed]", __func__);
1085 return false;
1086 }
1087 }
1088
Ady Abraham9dada822022-02-03 10:26:59 -08001089 ALOGV("%s: true", __func__);
1090 return true;
1091}
1092
Marissa Wall61c58622018-07-18 10:12:20 -07001093} // namespace android