blob: 59e2d18d88271b78a7f974c64607f89d754511f6 [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>
Vishnu Naira72f6c02022-07-01 05:33:08 +000027#include <compositionengine/CompositionEngine.h>
Lloyd Pique9755fb72019-03-26 14:44:40 -070028#include <compositionengine/LayerFECompositionState.h>
Marissa Wall947d34e2019-03-29 14:03:53 -070029#include <gui/BufferQueue.h>
Marissa Wall61c58622018-07-18 10:12:20 -070030#include <private/gui/SyncFeatures.h>
Peiyong Lincbc184f2018-08-22 13:24:10 -070031#include <renderengine/Image.h>
Robert Carr38d25002021-06-11 14:30:09 -070032#include "TunnelModeEnabledReporter.h"
Marissa Wall61c58622018-07-18 10:12:20 -070033
Chavi Weingartend00e0f72022-07-14 15:59:20 +000034#include <gui/TraceUtils.h>
Vishnu Nairfa247b12020-02-11 08:58:26 -080035#include "EffectLayer.h"
Adithya Srinivasanb238cd52021-02-04 17:54:05 +000036#include "FrameTracer/FrameTracer.h"
Lloyd Pique37c2c9b2018-12-04 17:25:10 -080037#include "TimeStats/TimeStats.h"
Valerie Hau0bc09152018-12-20 07:42:47 -080038
Robert Carrb6450492022-06-23 11:17:16 -070039#define EARLY_RELEASE_ENABLED false
40
Vishnu Naira72f6c02022-07-01 05:33:08 +000041#include <compositionengine/LayerFECompositionState.h>
42#include <compositionengine/OutputLayer.h>
43#include <compositionengine/impl/OutputLayerCompositionState.h>
44#include <cutils/compiler.h>
45#include <cutils/native_handle.h>
46#include <cutils/properties.h>
47#include <gui/BufferItem.h>
48#include <gui/BufferQueue.h>
49#include <gui/GLConsumer.h>
50#include <gui/LayerDebugInfo.h>
51#include <gui/Surface.h>
52#include <renderengine/RenderEngine.h>
53#include <ui/DebugUtils.h>
54#include <utils/Errors.h>
55#include <utils/Log.h>
56#include <utils/NativeHandle.h>
57#include <utils/StopWatch.h>
58#include <utils/Trace.h>
59
60#include <cmath>
61#include <cstdlib>
62#include <mutex>
63#include <sstream>
64
65#include "Colorizer.h"
66#include "DisplayDevice.h"
67#include "FrameTracer/FrameTracer.h"
68#include "TimeStats/TimeStats.h"
69
Marissa Wall61c58622018-07-18 10:12:20 -070070namespace android {
71
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +000072using PresentState = frametimeline::SurfaceFrame::PresentState;
Vishnu Naira72f6c02022-07-01 05:33:08 +000073using gui::WindowInfo;
Chavi Weingartend00e0f72022-07-14 15:59:20 +000074void BufferStateLayer::callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener,
75 const sp<GraphicBuffer>& buffer,
76 uint64_t framenumber,
77 const sp<Fence>& releaseFence,
78 uint32_t currentMaxAcquiredBufferCount) {
Vishnu Nair1506b182021-02-22 14:35:15 -080079 if (!listener) {
80 return;
81 }
Chavi Weingartend00e0f72022-07-14 15:59:20 +000082 ATRACE_FORMAT_INSTANT("callReleaseBufferCallback %s - %" PRIu64, getDebugName(), framenumber);
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070083 listener->onReleaseBuffer({buffer->getId(), framenumber},
chaviw69058fb2021-09-27 09:37:30 -050084 releaseFence ? releaseFence : Fence::NO_FENCE,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -070085 currentMaxAcquiredBufferCount);
Vishnu Nair1506b182021-02-22 14:35:15 -080086}
Vishnu Nair1506b182021-02-22 14:35:15 -080087
Vishnu Naira72f6c02022-07-01 05:33:08 +000088namespace {
89static constexpr float defaultMaxLuminance = 1000.0;
90} // namespace
91
Marissa Wall947d34e2019-03-29 14:03:53 -070092BufferStateLayer::BufferStateLayer(const LayerCreationArgs& args)
Vishnu Naira72f6c02022-07-01 05:33:08 +000093 : Layer(args),
94 mTextureName(args.textureName),
95 mCompositionState{mFlinger->getCompositionEngine().createLayerFECompositionState()},
96 mHwcSlotGenerator(new HwcSlotGenerator()) {
97 ALOGV("Creating Layer %s", getDebugName());
98
99 mPremultipliedAlpha = !(args.flags & ISurfaceComposerClient::eNonPremultiplied);
100
101 mPotentialCursor = args.flags & ISurfaceComposerClient::eCursorWindow;
102 mProtectedByApp = args.flags & ISurfaceComposerClient::eProtectedByApp;
Robert Carr6a160312021-05-17 12:08:20 -0700103 mDrawingState.dataspace = ui::Dataspace::V0_SRGB;
Vishnu Nair60356342018-11-13 13:00:45 -0800104}
Marissa Wall61c58622018-07-18 10:12:20 -0700105
Alec Mouri4545a8a2019-08-08 20:05:32 -0700106BufferStateLayer::~BufferStateLayer() {
chaviwb4c6e582019-08-16 14:35:07 -0700107 // The original layer and the clone layer share the same texture and buffer. Therefore, only
108 // one of the layers, in this case the original layer, needs to handle the deletion. The
109 // original layer and the clone should be removed at the same time so there shouldn't be any
110 // issue with the clone layer trying to use the texture.
Vishnu Nair3bb11d02021-11-26 09:24:11 -0800111 if (mBufferInfo.mBuffer != nullptr) {
Alec Mouria90a5702021-04-16 16:36:21 +0000112 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700113 mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFrameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500114 mBufferInfo.mFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -0700115 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
116 mOwnerUid));
Alec Mouri4545a8a2019-08-08 20:05:32 -0700117 }
Vishnu Naira72f6c02022-07-01 05:33:08 +0000118 if (!isClone()) {
119 // The original layer and the clone layer share the same texture. Therefore, only one of
120 // the layers, in this case the original layer, needs to handle the deletion. The original
121 // layer and the clone should be removed at the same time so there shouldn't be any issue
122 // with the clone layer trying to use the deleted texture.
123 mFlinger->deleteTextureAsync(mTextureName);
124 }
125 const int32_t layerId = getSequence();
126 mFlinger->mTimeStats->onDestroy(layerId);
127 mFlinger->mFrameTracer->onDestroy(layerId);
Alec Mouri4545a8a2019-08-08 20:05:32 -0700128}
129
Marissa Wall61c58622018-07-18 10:12:20 -0700130// -----------------------------------------------------------------------
131// Interface implementation for Layer
132// -----------------------------------------------------------------------
Dominik Laskowskib17c6212022-05-09 09:36:19 -0700133void BufferStateLayer::onLayerDisplayed(ftl::SharedFuture<FenceResult> futureFenceResult) {
Robert Carrc2f84132022-03-09 16:26:43 -0800134 // If we are displayed on multiple displays in a single composition cycle then we would
135 // need to do careful tracking to enable the use of the mLastClientCompositionFence.
136 // For example we can only use it if all the displays are client comp, and we need
137 // to merge all the client comp fences. We could do this, but for now we just
138 // disable the optimization when a layer is composed on multiple displays.
Robert Carr05da0082022-05-25 23:29:34 -0700139 if (mClearClientCompositionFenceOnLayerDisplayed) {
Robert Carrccab4242021-09-28 16:53:03 -0700140 mLastClientCompositionFence = nullptr;
Robert Carrc2f84132022-03-09 16:26:43 -0800141 } else {
Robert Carr05da0082022-05-25 23:29:34 -0700142 mClearClientCompositionFenceOnLayerDisplayed = true;
Robert Carrccab4242021-09-28 16:53:03 -0700143 }
144
Marissa Wall5a68a772018-12-22 17:43:42 -0800145 // The previous release fence notifies the client that SurfaceFlinger is done with the previous
146 // buffer that was presented on this layer. The first transaction that came in this frame that
147 // replaced the previous buffer on this layer needs this release fence, because the fence will
148 // let the client know when that previous buffer is removed from the screen.
149 //
150 // Every other transaction on this layer does not need a release fence because no other
151 // Transactions that were set on this layer this frame are going to have their preceeding buffer
152 // removed from the display this frame.
153 //
154 // For example, if we have 3 transactions this frame. The first transaction doesn't contain a
155 // buffer so it doesn't need a previous release fence because the layer still needs the previous
156 // buffer. The second transaction contains a buffer so it needs a previous release fence because
157 // the previous buffer will be released this frame. The third transaction also contains a
158 // buffer. It replaces the buffer in the second transaction. The buffer in the second
159 // transaction will now no longer be presented so it is released immediately and the third
160 // transaction doesn't need a previous release fence.
Robert Carr8d958532020-11-10 14:09:16 -0800161 sp<CallbackHandle> ch;
Marissa Wall5a68a772018-12-22 17:43:42 -0800162 for (auto& handle : mDrawingState.callbackHandles) {
chaviw0b06a8d2021-08-06 11:49:08 -0500163 if (handle->releasePreviousBuffer &&
164 mDrawingState.releaseBufferEndpoint == handle->listener) {
Robert Carr8d958532020-11-10 14:09:16 -0800165 ch = handle;
Marissa Wall5a68a772018-12-22 17:43:42 -0800166 break;
167 }
168 }
Valerie Haubf784642020-01-29 07:25:23 -0800169
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700170 // Prevent tracing the same release multiple times.
171 if (mPreviousFrameNumber != mPreviousReleasedFrameNumber) {
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700172 mPreviousReleasedFrameNumber = mPreviousFrameNumber;
173 }
Sally Qi59a9f502021-10-12 18:53:23 +0000174
175 if (ch != nullptr) {
176 ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
Dominik Laskowskibb448ce2022-05-07 15:52:55 -0700177 ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
Sally Qi59a9f502021-10-12 18:53:23 +0000178 ch->name = mName;
179 }
Marissa Wall61c58622018-07-18 10:12:20 -0700180}
181
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100182void BufferStateLayer::onSurfaceFrameCreated(
183 const std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame) {
Adithya Srinivasand17c7da2021-03-05 20:43:32 +0000184 while (mPendingJankClassifications.size() >= kPendingClassificationMaxSurfaceFrames) {
185 // Too many SurfaceFrames pending classification. The front of the deque is probably not
186 // tracked by FrameTimeline and will never be presented. This will only result in a memory
187 // leak.
188 ALOGW("Removing the front of pending jank deque from layer - %s to prevent memory leak",
189 mName.c_str());
Adithya Srinivasan785addd2021-03-09 00:38:00 +0000190 std::string miniDump = mPendingJankClassifications.front()->miniDump();
191 ALOGD("Head SurfaceFrame mini dump\n%s", miniDump.c_str());
Adithya Srinivasand17c7da2021-03-05 20:43:32 +0000192 mPendingJankClassifications.pop_front();
193 }
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100194 mPendingJankClassifications.emplace_back(surfaceFrame);
195}
196
Valerie Haubf784642020-01-29 07:25:23 -0800197void BufferStateLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
Valerie Hau32cdc1f2019-10-21 14:45:54 -0700198 for (const auto& handle : mDrawingState.callbackHandles) {
199 handle->transformHint = mTransformHint;
Valerie Hau871d6352020-01-29 08:44:02 -0800200 handle->dequeueReadyTime = dequeueReadyTime;
Ady Abraham899dcdb2021-06-15 16:56:21 -0700201 handle->currentMaxAcquiredBufferCount =
202 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);
Chavi Weingartend00e0f72022-07-14 15:59:20 +0000203 ATRACE_FORMAT_INSTANT("releasePendingBuffer %s - %" PRIu64, getDebugName(),
204 handle->previousReleaseCallbackId.framenumber);
Valerie Hau32cdc1f2019-10-21 14:45:54 -0700205 }
206
Vishnu Nair1506b182021-02-22 14:35:15 -0800207 for (auto& handle : mDrawingState.callbackHandles) {
chaviw0b06a8d2021-08-06 11:49:08 -0500208 if (handle->releasePreviousBuffer &&
209 mDrawingState.releaseBufferEndpoint == handle->listener) {
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700210 handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;
Vishnu Nair1506b182021-02-22 14:35:15 -0800211 break;
212 }
213 }
214
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100215 std::vector<JankData> jankData;
216 jankData.reserve(mPendingJankClassifications.size());
217 while (!mPendingJankClassifications.empty()
218 && mPendingJankClassifications.front()->getJankType()) {
219 std::shared_ptr<frametimeline::SurfaceFrame> surfaceFrame =
220 mPendingJankClassifications.front();
221 mPendingJankClassifications.pop_front();
222 jankData.emplace_back(
223 JankData(surfaceFrame->getToken(), surfaceFrame->getJankType().value()));
224 }
225
Robert Carr3d1047b2021-09-20 18:22:32 -0700226 mFlinger->getTransactionCallbackInvoker().addCallbackHandles(
Jorim Jaggi9c03b502020-11-24 23:51:31 +0100227 mDrawingState.callbackHandles, jankData);
Marissa Wall5a68a772018-12-22 17:43:42 -0800228
Sally Qi59a9f502021-10-12 18:53:23 +0000229 sp<Fence> releaseFence = Fence::NO_FENCE;
230 for (auto& handle : mDrawingState.callbackHandles) {
231 if (handle->releasePreviousBuffer &&
232 mDrawingState.releaseBufferEndpoint == handle->listener) {
233 releaseFence =
234 handle->previousReleaseFence ? handle->previousReleaseFence : Fence::NO_FENCE;
235 break;
236 }
237 }
238
Marissa Wall5a68a772018-12-22 17:43:42 -0800239 mDrawingState.callbackHandles = {};
Marissa Wall61c58622018-07-18 10:12:20 -0700240}
241
Valerie Hau871d6352020-01-29 08:44:02 -0800242void BufferStateLayer::finalizeFrameEventHistory(const std::shared_ptr<FenceTime>& glDoneFence,
243 const CompositorTiming& compositorTiming) {
244 for (const auto& handle : mDrawingState.callbackHandles) {
245 handle->gpuCompositionDoneFence = glDoneFence;
246 handle->compositorTiming = compositorTiming;
247 }
248}
249
Marissa Walle2ffb422018-10-12 11:33:52 -0700250bool BufferStateLayer::willPresentCurrentTransaction() const {
251 // Returns true if the most recent Transaction applied to CurrentState will be presented.
Robert Carr321e83c2019-08-19 15:49:30 -0700252 return (getSidebandStreamChanged() || getAutoRefresh() ||
Robert Carr6a160312021-05-17 12:08:20 -0700253 (mDrawingState.modified &&
254 (mDrawingState.buffer != nullptr || mDrawingState.bgColorLayer != nullptr)));
Marissa Wall61c58622018-07-18 10:12:20 -0700255}
256
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000257Rect BufferStateLayer::getCrop(const Layer::State& s) const {
258 return s.crop;
Marissa Wall61c58622018-07-18 10:12:20 -0700259}
260
261bool BufferStateLayer::setTransform(uint32_t transform) {
Robert Carr6a160312021-05-17 12:08:20 -0700262 if (mDrawingState.bufferTransform == transform) return false;
263 mDrawingState.bufferTransform = transform;
264 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700265 setTransactionFlags(eTransactionNeeded);
266 return true;
267}
268
269bool BufferStateLayer::setTransformToDisplayInverse(bool transformToDisplayInverse) {
Robert Carr6a160312021-05-17 12:08:20 -0700270 if (mDrawingState.transformToDisplayInverse == transformToDisplayInverse) return false;
271 mDrawingState.sequence++;
272 mDrawingState.transformToDisplayInverse = transformToDisplayInverse;
273 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700274 setTransactionFlags(eTransactionNeeded);
275 return true;
276}
277
278bool BufferStateLayer::setCrop(const Rect& crop) {
Robert Carr6a160312021-05-17 12:08:20 -0700279 if (mDrawingState.crop == crop) return false;
280 mDrawingState.sequence++;
281 mDrawingState.crop = crop;
Marissa Wall290ad082019-03-06 13:23:47 -0800282
Robert Carr6a160312021-05-17 12:08:20 -0700283 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700284 setTransactionFlags(eTransactionNeeded);
285 return true;
286}
287
chaviwf3f40fe2021-04-27 15:54:02 -0500288bool BufferStateLayer::setBufferCrop(const Rect& bufferCrop) {
Robert Carr6a160312021-05-17 12:08:20 -0700289 if (mDrawingState.bufferCrop == bufferCrop) return false;
chaviwf3f40fe2021-04-27 15:54:02 -0500290
Robert Carr6a160312021-05-17 12:08:20 -0700291 mDrawingState.sequence++;
292 mDrawingState.bufferCrop = bufferCrop;
chaviwf3f40fe2021-04-27 15:54:02 -0500293
Robert Carr6a160312021-05-17 12:08:20 -0700294 mDrawingState.modified = true;
chaviwf3f40fe2021-04-27 15:54:02 -0500295 setTransactionFlags(eTransactionNeeded);
296 return true;
297}
298
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700299bool BufferStateLayer::setDestinationFrame(const Rect& destinationFrame) {
Robert Carr6a160312021-05-17 12:08:20 -0700300 if (mDrawingState.destinationFrame == destinationFrame) return false;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700301
Robert Carr6a160312021-05-17 12:08:20 -0700302 mDrawingState.sequence++;
303 mDrawingState.destinationFrame = destinationFrame;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700304
Robert Carr6a160312021-05-17 12:08:20 -0700305 mDrawingState.modified = true;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700306 setTransactionFlags(eTransactionNeeded);
307 return true;
308}
309
Robert Carr6a160312021-05-17 12:08:20 -0700310static bool assignTransform(ui::Transform* dst, ui::Transform& from) {
311 if (*dst == from) {
312 return false;
313 }
314 *dst = from;
315 return true;
316}
317
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700318// Translate destination frame into scale and position. If a destination frame is not set, use the
319// provided scale and position
Robert Carr6a160312021-05-17 12:08:20 -0700320bool BufferStateLayer::updateGeometry() {
Vishnu Naird2aaab12022-02-10 14:49:09 -0800321 if ((mDrawingState.flags & layer_state_t::eIgnoreDestinationFrame) ||
322 mDrawingState.destinationFrame.isEmpty()) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700323 // If destination frame is not set, use the requested transform set via
324 // BufferStateLayer::setPosition and BufferStateLayer::setMatrix.
Robert Carr6a160312021-05-17 12:08:20 -0700325 return assignTransform(&mDrawingState.transform, mRequestedTransform);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700326 }
327
Robert Carr6a160312021-05-17 12:08:20 -0700328 Rect destRect = mDrawingState.destinationFrame;
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700329 int32_t destW = destRect.width();
330 int32_t destH = destRect.height();
331 if (destRect.left < 0) {
332 destRect.left = 0;
333 destRect.right = destW;
334 }
335 if (destRect.top < 0) {
336 destRect.top = 0;
337 destRect.bottom = destH;
338 }
339
Robert Carr6a160312021-05-17 12:08:20 -0700340 if (!mDrawingState.buffer) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700341 ui::Transform t;
342 t.set(destRect.left, destRect.top);
Robert Carr6a160312021-05-17 12:08:20 -0700343 return assignTransform(&mDrawingState.transform, t);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700344 }
345
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800346 uint32_t bufferWidth = mDrawingState.buffer->getWidth();
347 uint32_t bufferHeight = mDrawingState.buffer->getHeight();
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700348 // Undo any transformations on the buffer.
Robert Carr6a160312021-05-17 12:08:20 -0700349 if (mDrawingState.bufferTransform & ui::Transform::ROT_90) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700350 std::swap(bufferWidth, bufferHeight);
351 }
352 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
Robert Carr6a160312021-05-17 12:08:20 -0700353 if (mDrawingState.transformToDisplayInverse) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700354 if (invTransform & ui::Transform::ROT_90) {
355 std::swap(bufferWidth, bufferHeight);
356 }
357 }
358
359 float sx = destW / static_cast<float>(bufferWidth);
360 float sy = destH / static_cast<float>(bufferHeight);
361 ui::Transform t;
362 t.set(sx, 0, 0, sy);
363 t.set(destRect.left, destRect.top);
Robert Carr6a160312021-05-17 12:08:20 -0700364 return assignTransform(&mDrawingState.transform, t);
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700365}
366
Robert Carrde6d7b42022-01-07 18:23:06 -0800367bool BufferStateLayer::setMatrix(const layer_state_t::matrix22_t& matrix) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700368 if (mRequestedTransform.dsdx() == matrix.dsdx && mRequestedTransform.dtdy() == matrix.dtdy &&
369 mRequestedTransform.dtdx() == matrix.dtdx && mRequestedTransform.dsdy() == matrix.dsdy) {
Marissa Wall861616d2018-10-22 12:52:23 -0700370 return false;
371 }
372
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000373 ui::Transform t;
374 t.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
375
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700376 mRequestedTransform.set(matrix.dsdx, matrix.dtdy, matrix.dtdx, matrix.dsdy);
chaviw9a93ea62021-03-11 16:44:42 -0600377
Robert Carr6a160312021-05-17 12:08:20 -0700378 mDrawingState.sequence++;
379 mDrawingState.modified = true;
chaviw9a93ea62021-03-11 16:44:42 -0600380 setTransactionFlags(eTransactionNeeded);
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000381
382 return true;
383}
384
385bool BufferStateLayer::setPosition(float x, float y) {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700386 if (mRequestedTransform.tx() == x && mRequestedTransform.ty() == y) {
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000387 return false;
388 }
389
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700390 mRequestedTransform.set(x, y);
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000391
Robert Carr6a160312021-05-17 12:08:20 -0700392 mDrawingState.sequence++;
393 mDrawingState.modified = true;
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000394 setTransactionFlags(eTransactionNeeded);
395
Marissa Wall861616d2018-10-22 12:52:23 -0700396 return true;
397}
398
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800399bool BufferStateLayer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
400 const BufferData& bufferData, nsecs_t postTime,
Alec Mouria90a5702021-04-16 16:36:21 +0000401 nsecs_t desiredPresentTime, bool isAutoTimestamp,
chaviwba4320c2021-09-15 15:20:53 -0500402 std::optional<nsecs_t> dequeueTime,
403 const FrameTimelineInfo& info) {
Alex Chaucf6b4b42021-12-07 10:48:52 +0000404 ATRACE_CALL();
Robert Carr0c1966e2020-10-19 12:12:08 -0700405
chaviwba4320c2021-09-15 15:20:53 -0500406 if (!buffer) {
407 return false;
408 }
409
410 const bool frameNumberChanged =
411 bufferData.flags.test(BufferData::BufferDataChange::frameNumberChanged);
412 const uint64_t frameNumber =
413 frameNumberChanged ? bufferData.frameNumber : mDrawingState.frameNumber + 1;
414
Robert Carr6a160312021-05-17 12:08:20 -0700415 if (mDrawingState.buffer) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700416 mReleasePreviousBuffer = true;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800417 if (!mBufferInfo.mBuffer ||
418 (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) ||
419 mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) {
Robert Carr6a160312021-05-17 12:08:20 -0700420 // If mDrawingState has a buffer, and we are about to update again
Robert Carr7121caf2020-12-15 13:07:32 -0800421 // before swapping to drawing state, then the first buffer will be
Vishnu Nair1506b182021-02-22 14:35:15 -0800422 // dropped and we should decrement the pending buffer count and
423 // call any release buffer callbacks if set.
Robert Carr6a160312021-05-17 12:08:20 -0700424 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700425 mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500426 mDrawingState.acquireFence,
Ady Abraham899dcdb2021-06-15 16:56:21 -0700427 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
428 mOwnerUid));
Robert Carr7121caf2020-12-15 13:07:32 -0800429 decrementPendingBufferCount();
Robert Carr6a160312021-05-17 12:08:20 -0700430 if (mDrawingState.bufferSurfaceFrameTX != nullptr &&
431 mDrawingState.bufferSurfaceFrameTX->getPresentState() != PresentState::Presented) {
432 addSurfaceFrameDroppedForBuffer(mDrawingState.bufferSurfaceFrameTX);
433 mDrawingState.bufferSurfaceFrameTX.reset();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000434 }
Robert Carrb6450492022-06-23 11:17:16 -0700435 } else if (EARLY_RELEASE_ENABLED && mLastClientCompositionFence != nullptr) {
Robert Carrccab4242021-09-28 16:53:03 -0700436 callReleaseBufferCallback(mDrawingState.releaseBufferListener,
437 mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
chaviw69058fb2021-09-27 09:37:30 -0500438 mLastClientCompositionFence,
Robert Carrccab4242021-09-28 16:53:03 -0700439 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(
chaviw69058fb2021-09-27 09:37:30 -0500440 mOwnerUid));
Robert Carrccab4242021-09-28 16:53:03 -0700441 mLastClientCompositionFence = nullptr;
Robert Carr7121caf2020-12-15 13:07:32 -0800442 }
Marissa Wallfda30bb2018-10-12 11:34:28 -0700443 }
Robert Carr6a160312021-05-17 12:08:20 -0700444
445 mDrawingState.frameNumber = frameNumber;
chaviwba4320c2021-09-15 15:20:53 -0500446 mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800447 mDrawingState.buffer = std::move(buffer);
chaviwba4320c2021-09-15 15:20:53 -0500448 mDrawingState.clientCacheId = bufferData.cachedBuffer;
449
450 mDrawingState.acquireFence = bufferData.flags.test(BufferData::BufferDataChange::fenceChanged)
451 ? bufferData.acquireFence
452 : Fence::NO_FENCE;
453 mDrawingState.acquireFenceTime = std::make_unique<FenceTime>(mDrawingState.acquireFence);
Ady Abraham461296a2022-01-21 11:11:31 -0800454 if (mDrawingState.acquireFenceTime->getSignalTime() == Fence::SIGNAL_TIME_PENDING) {
455 // We latched this buffer unsiganled, so we need to pass the acquire fence
456 // on the callback instead of just the acquire time, since it's unknown at
457 // this point.
458 mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFence;
459 } else {
460 mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFenceTime->getSignalTime();
461 }
chaviwba4320c2021-09-15 15:20:53 -0500462
Robert Carr6a160312021-05-17 12:08:20 -0700463 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700464 setTransactionFlags(eTransactionNeeded);
Ady Abraham09bd3922019-04-08 10:44:56 -0700465
Yiwei Zhang1a88c402019-11-18 10:43:58 -0800466 const int32_t layerId = getSequence();
Robert Carr6a160312021-05-17 12:08:20 -0700467 mFlinger->mTimeStats->setPostTime(layerId, mDrawingState.frameNumber, getName().c_str(),
Adithya Srinivasan58069dc2021-06-04 20:37:02 +0000468 mOwnerUid, postTime, getGameMode());
Robert Carr6a160312021-05-17 12:08:20 -0700469 mDrawingState.desiredPresentTime = desiredPresentTime;
470 mDrawingState.isAutoTimestamp = isAutoTimestamp;
Ady Abraham09bd3922019-04-08 10:44:56 -0700471
Ady Abrahamb7f15562021-03-15 18:34:08 -0700472 const nsecs_t presentTime = [&] {
473 if (!isAutoTimestamp) return desiredPresentTime;
474
475 const auto prediction =
476 mFlinger->mFrameTimeline->getTokenManager()->getPredictionsForToken(info.vsyncId);
477 if (prediction.has_value()) return prediction->presentTime;
478
479 return static_cast<nsecs_t>(0);
480 }();
Dominik Laskowski068173d2021-08-11 17:22:59 -0700481
482 using LayerUpdateType = scheduler::LayerHistory::LayerUpdateType;
483 mFlinger->mScheduler->recordLayerHistory(this, presentTime, LayerUpdateType::Buffer);
Ady Abraham09bd3922019-04-08 10:44:56 -0700484
Adithya Srinivasan891004e2021-02-12 20:20:47 +0000485 setFrameTimelineVsyncForBufferTransaction(info, postTime);
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000486
Vishnu Nair26c49762022-01-18 22:58:52 +0000487 if (dequeueTime && *dequeueTime != 0) {
488 const uint64_t bufferId = mDrawingState.buffer->getId();
Adithya Srinivasanb238cd52021-02-04 17:54:05 +0000489 mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str());
490 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, *dequeueTime,
491 FrameTracer::FrameEvent::DEQUEUE);
492 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, postTime,
493 FrameTracer::FrameEvent::QUEUE);
494 }
Chavi Weingartena5aedbd2021-04-09 13:37:33 +0000495
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800496 mDrawingState.width = mDrawingState.buffer->getWidth();
497 mDrawingState.height = mDrawingState.buffer->getHeight();
chaviwba4320c2021-09-15 15:20:53 -0500498 mDrawingState.releaseBufferEndpoint = bufferData.releaseBufferEndpoint;
Marissa Wall61c58622018-07-18 10:12:20 -0700499 return true;
500}
501
502bool BufferStateLayer::setDataspace(ui::Dataspace dataspace) {
Robert Carr6a160312021-05-17 12:08:20 -0700503 if (mDrawingState.dataspace == dataspace) return false;
504 mDrawingState.dataspace = dataspace;
505 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700506 setTransactionFlags(eTransactionNeeded);
507 return true;
508}
509
510bool BufferStateLayer::setHdrMetadata(const HdrMetadata& hdrMetadata) {
Robert Carr6a160312021-05-17 12:08:20 -0700511 if (mDrawingState.hdrMetadata == hdrMetadata) return false;
512 mDrawingState.hdrMetadata = hdrMetadata;
513 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700514 setTransactionFlags(eTransactionNeeded);
515 return true;
516}
517
518bool BufferStateLayer::setSurfaceDamageRegion(const Region& surfaceDamage) {
Robert Carr6a160312021-05-17 12:08:20 -0700519 mDrawingState.surfaceDamageRegion = surfaceDamage;
520 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700521 setTransactionFlags(eTransactionNeeded);
522 return true;
523}
524
525bool BufferStateLayer::setApi(int32_t api) {
Robert Carr6a160312021-05-17 12:08:20 -0700526 if (mDrawingState.api == api) return false;
527 mDrawingState.api = api;
528 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700529 setTransactionFlags(eTransactionNeeded);
530 return true;
531}
532
533bool BufferStateLayer::setSidebandStream(const sp<NativeHandle>& sidebandStream) {
Robert Carr6a160312021-05-17 12:08:20 -0700534 if (mDrawingState.sidebandStream == sidebandStream) return false;
Robert Carr3e2a2992021-06-11 13:42:55 -0700535
536 if (mDrawingState.sidebandStream != nullptr && sidebandStream == nullptr) {
537 mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
538 } else if (sidebandStream != nullptr) {
539 mFlinger->mTunnelModeEnabledReporter->incrementTunnelModeCount();
540 }
541
Robert Carr6a160312021-05-17 12:08:20 -0700542 mDrawingState.sidebandStream = sidebandStream;
543 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700544 setTransactionFlags(eTransactionNeeded);
Marissa Wall61c58622018-07-18 10:12:20 -0700545 if (!mSidebandStreamChanged.exchange(true)) {
546 // mSidebandStreamChanged was false
Dominik Laskowskie0e0cde2021-07-30 10:42:05 -0700547 mFlinger->onLayerUpdate();
Marissa Wall61c58622018-07-18 10:12:20 -0700548 }
549 return true;
550}
551
Marissa Walle2ffb422018-10-12 11:33:52 -0700552bool BufferStateLayer::setTransactionCompletedListeners(
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000553 const std::vector<sp<CallbackHandle>>& handles) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700554 // If there is no handle, we will not send a callback so reset mReleasePreviousBuffer and return
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000555 if (handles.empty()) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700556 mReleasePreviousBuffer = false;
Marissa Walle2ffb422018-10-12 11:33:52 -0700557 return false;
558 }
559
560 const bool willPresent = willPresentCurrentTransaction();
561
562 for (const auto& handle : handles) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700563 // If this transaction set a buffer on this layer, release its previous buffer
564 handle->releasePreviousBuffer = mReleasePreviousBuffer;
565
Marissa Walle2ffb422018-10-12 11:33:52 -0700566 // If this layer will be presented in this frame
567 if (willPresent) {
Marissa Wallfda30bb2018-10-12 11:34:28 -0700568 // If this transaction set an acquire fence on this layer, set its acquire time
Ady Abraham461296a2022-01-21 11:11:31 -0800569 handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence;
Robert Carr6a160312021-05-17 12:08:20 -0700570 handle->frameNumber = mDrawingState.frameNumber;
Marissa Wallfda30bb2018-10-12 11:34:28 -0700571
Marissa Walle2ffb422018-10-12 11:33:52 -0700572 // Store so latched time and release fence can be set
Robert Carr6a160312021-05-17 12:08:20 -0700573 mDrawingState.callbackHandles.push_back(handle);
Marissa Walle2ffb422018-10-12 11:33:52 -0700574
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000575 } else { // If this layer will NOT need to be relatched and presented this frame
Marissa Walle2ffb422018-10-12 11:33:52 -0700576 // Notify the transaction completed thread this handle is done
Jiakai Zhanga5505cb2021-11-09 11:46:30 +0000577 mFlinger->getTransactionCallbackInvoker().registerUnpresentedCallbackHandle(handle);
Marissa Walle2ffb422018-10-12 11:33:52 -0700578 }
579 }
580
Marissa Wallfda30bb2018-10-12 11:34:28 -0700581 mReleasePreviousBuffer = false;
Ady Abraham461296a2022-01-21 11:11:31 -0800582 mCallbackHandleAcquireTimeOrFence = -1;
Marissa Wallfda30bb2018-10-12 11:34:28 -0700583
Marissa Walle2ffb422018-10-12 11:33:52 -0700584 return willPresent;
585}
586
Marissa Wall61c58622018-07-18 10:12:20 -0700587bool BufferStateLayer::setTransparentRegionHint(const Region& transparent) {
Vishnu Nair27e3ed52021-07-08 18:24:25 -0700588 mDrawingState.sequence++;
Robert Carr6a160312021-05-17 12:08:20 -0700589 mDrawingState.transparentRegionHint = transparent;
590 mDrawingState.modified = true;
Marissa Wall61c58622018-07-18 10:12:20 -0700591 setTransactionFlags(eTransactionNeeded);
592 return true;
593}
594
rnleeed20fa42021-08-10 18:00:03 -0700595Rect BufferStateLayer::getBufferSize(const State& /*s*/) const {
Marissa Wall861616d2018-10-22 12:52:23 -0700596 // for buffer state layers we use the display frame size as the buffer size.
Marissa Wall61c58622018-07-18 10:12:20 -0700597
chaviw7e72caf2020-12-02 16:50:43 -0800598 if (mBufferInfo.mBuffer == nullptr) {
599 return Rect::INVALID_RECT;
600 }
601
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800602 uint32_t bufWidth = mBufferInfo.mBuffer->getWidth();
603 uint32_t bufHeight = mBufferInfo.mBuffer->getHeight();
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700604
605 // Undo any transformations on the buffer and return the result.
606 if (mBufferInfo.mTransform & ui::Transform::ROT_90) {
607 std::swap(bufWidth, bufHeight);
608 }
609
610 if (getTransformToDisplayInverse()) {
611 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
612 if (invTransform & ui::Transform::ROT_90) {
613 std::swap(bufWidth, bufHeight);
Marissa Wall861616d2018-10-22 12:52:23 -0700614 }
615 }
616
rnleeed20fa42021-08-10 18:00:03 -0700617 return Rect(0, 0, static_cast<int32_t>(bufWidth), static_cast<int32_t>(bufHeight));
Marissa Wall61c58622018-07-18 10:12:20 -0700618}
Vishnu Nair4351ad52019-02-11 14:13:02 -0800619
620FloatRect BufferStateLayer::computeSourceBounds(const FloatRect& parentBounds) const {
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700621 if (mBufferInfo.mBuffer == nullptr) {
622 return parentBounds;
Vishnu Nair4351ad52019-02-11 14:13:02 -0800623 }
624
Vishnu Nair6bdec7d2021-05-10 15:01:13 -0700625 return getBufferSize(getDrawingState()).toFloatRect();
Vishnu Nair4351ad52019-02-11 14:13:02 -0800626}
627
Marissa Wall61c58622018-07-18 10:12:20 -0700628// -----------------------------------------------------------------------
Marissa Wall61c58622018-07-18 10:12:20 -0700629bool BufferStateLayer::fenceHasSignaled() const {
ramindani4d48f902021-09-20 21:07:45 +0000630 if (SurfaceFlinger::enableLatchUnsignaledConfig != LatchUnsignaledConfig::Disabled) {
Huihong Luo86c80e32021-06-16 15:41:07 -0700631 return true;
632 }
633
Alec Mouri91f6df32020-01-30 08:48:58 -0800634 const bool fenceSignaled =
635 getDrawingState().acquireFence->getStatus() == Fence::Status::Signaled;
636 if (!fenceSignaled) {
637 mFlinger->mTimeStats->incrementLatchSkipped(getSequence(),
638 TimeStats::LatchSkipReason::LateAcquire);
639 }
640
641 return fenceSignaled;
Marissa Wall61c58622018-07-18 10:12:20 -0700642}
643
Dominik Laskowskia8955dd2019-07-10 10:19:09 -0700644bool BufferStateLayer::framePresentTimeIsCurrent(nsecs_t expectedPresentTime) const {
Ady Abrahamcd1580c2019-04-29 15:40:03 -0700645 if (!hasFrameUpdate() || isRemovedFromCurrentState()) {
646 return true;
647 }
648
Robert Carr6a160312021-05-17 12:08:20 -0700649 return mDrawingState.isAutoTimestamp || mDrawingState.desiredPresentTime <= expectedPresentTime;
Ady Abrahamcd1580c2019-04-29 15:40:03 -0700650}
651
Valerie Hau871d6352020-01-29 08:44:02 -0800652bool BufferStateLayer::onPreComposition(nsecs_t refreshStartTime) {
653 for (const auto& handle : mDrawingState.callbackHandles) {
654 handle->refreshStartTime = refreshStartTime;
655 }
Vishnu Naira72f6c02022-07-01 05:33:08 +0000656 return hasReadyFrame();
Valerie Hau871d6352020-01-29 08:44:02 -0800657}
658
Vishnu Naircf26a0a2020-11-13 12:56:20 -0800659void BufferStateLayer::setAutoRefresh(bool autoRefresh) {
Vishnu Nair86653e92021-11-03 17:19:36 -0700660 mDrawingState.autoRefresh = autoRefresh;
Marissa Wall61c58622018-07-18 10:12:20 -0700661}
662
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800663bool BufferStateLayer::latchSidebandStream(bool& recomputeVisibleRegions) {
baocheng suna663c2b2021-05-13 18:51:28 +0800664 // 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 +0800665 editCompositionState()->sidebandStreamHasFrame = hasFrameUpdate() && mSidebandStream.get();
baocheng suna663c2b2021-05-13 18:51:28 +0800666
baocheng sun9691b9c2021-08-03 19:27:06 +0800667 if (mSidebandStreamChanged.exchange(false)) {
Marissa Wall61c58622018-07-18 10:12:20 -0700668 const State& s(getDrawingState());
669 // mSidebandStreamChanged was true
Lloyd Pique0b785d82018-12-04 17:25:27 -0800670 mSidebandStream = s.sidebandStream;
Lloyd Piquede196652020-01-22 17:29:58 -0800671 editCompositionState()->sidebandStream = mSidebandStream;
Lloyd Pique0b785d82018-12-04 17:25:27 -0800672 if (mSidebandStream != nullptr) {
Marissa Wall61c58622018-07-18 10:12:20 -0700673 setTransactionFlags(eTransactionNeeded);
674 mFlinger->setTransactionFlags(eTraversalNeeded);
675 }
676 recomputeVisibleRegions = true;
677
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800678 return true;
Marissa Wall61c58622018-07-18 10:12:20 -0700679 }
Vishnu Nair6194e2e2019-02-06 12:58:39 -0800680 return false;
Marissa Wall61c58622018-07-18 10:12:20 -0700681}
682
Lloyd Pique0449b0f2018-12-20 16:23:45 -0800683bool BufferStateLayer::hasFrameUpdate() const {
Robert Carr6a160312021-05-17 12:08:20 -0700684 const State& c(getDrawingState());
Robert Carr315f3c72021-06-24 21:58:09 -0700685 return (mDrawingStateModified || mDrawingState.modified) && (c.buffer != nullptr || c.bgColorLayer != nullptr);
Marissa Wall61c58622018-07-18 10:12:20 -0700686}
687
Dominik Laskowskia8955dd2019-07-10 10:19:09 -0700688status_t BufferStateLayer::updateTexImage(bool& /*recomputeVisibleRegions*/, nsecs_t latchTime,
689 nsecs_t /*expectedPresentTime*/) {
Marissa Wall61c58622018-07-18 10:12:20 -0700690 const State& s(getDrawingState());
691
692 if (!s.buffer) {
Valerie Hauaa194562019-02-05 16:21:38 -0800693 if (s.bgColorLayer) {
694 for (auto& handle : mDrawingState.callbackHandles) {
695 handle->latchTime = latchTime;
696 }
697 }
Marissa Wall61c58622018-07-18 10:12:20 -0700698 return NO_ERROR;
699 }
700
Marissa Wall5a68a772018-12-22 17:43:42 -0800701 for (auto& handle : mDrawingState.callbackHandles) {
Vishnu Nair935590e2021-02-10 13:05:52 -0800702 if (handle->frameNumber == mDrawingState.frameNumber) {
703 handle->latchTime = latchTime;
704 }
Marissa Wall5a68a772018-12-22 17:43:42 -0800705 }
Marissa Walle2ffb422018-10-12 11:33:52 -0700706
Vishnu Nairea0de002020-11-17 17:42:37 -0800707 const int32_t layerId = getSequence();
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800708 const uint64_t bufferId = mDrawingState.buffer->getId();
Adithya Srinivasanb238cd52021-02-04 17:54:05 +0000709 const uint64_t frameNumber = mDrawingState.frameNumber;
710 const auto acquireFence = std::make_shared<FenceTime>(mDrawingState.acquireFence);
711 mFlinger->mTimeStats->setAcquireFence(layerId, frameNumber, acquireFence);
712 mFlinger->mTimeStats->setLatchTime(layerId, frameNumber, latchTime);
713
714 mFlinger->mFrameTracer->traceFence(layerId, bufferId, frameNumber, acquireFence,
715 FrameTracer::FrameEvent::ACQUIRE_FENCE);
716 mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, latchTime,
717 FrameTracer::FrameEvent::LATCH);
Marissa Wall61c58622018-07-18 10:12:20 -0700718
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000719 auto& bufferSurfaceFrame = mDrawingState.bufferSurfaceFrameTX;
720 if (bufferSurfaceFrame != nullptr &&
721 bufferSurfaceFrame->getPresentState() != PresentState::Presented) {
722 // Update only if the bufferSurfaceFrame wasn't already presented. A Presented
723 // bufferSurfaceFrame could be seen here if a pending state was applied successfully and we
724 // are processing the next state.
725 addSurfaceFramePresentedForBuffer(bufferSurfaceFrame,
Ady Abraham6c1b7ac2021-03-31 16:56:03 -0700726 mDrawingState.acquireFenceTime->getSignalTime(),
727 latchTime);
Robert Carr6a160312021-05-17 12:08:20 -0700728 mDrawingState.bufferSurfaceFrameTX.reset();
Adithya Srinivasanb9a7dab2021-01-14 23:49:46 +0000729 }
730
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700731 std::deque<sp<CallbackHandle>> remainingHandles;
732 mFlinger->getTransactionCallbackInvoker()
Robert Carr3d1047b2021-09-20 18:22:32 -0700733 .addOnCommitCallbackHandles(mDrawingState.callbackHandles, remainingHandles);
Vishnu Nairfc46c1e2021-04-21 08:31:32 -0700734 mDrawingState.callbackHandles = remainingHandles;
735
Robert Carr6a160312021-05-17 12:08:20 -0700736 mDrawingStateModified = false;
Marissa Wall16c112d2019-03-20 13:21:13 -0700737
Marissa Wall61c58622018-07-18 10:12:20 -0700738 return NO_ERROR;
739}
740
741status_t BufferStateLayer::updateActiveBuffer() {
742 const State& s(getDrawingState());
743
744 if (s.buffer == nullptr) {
745 return BAD_VALUE;
746 }
chaviwdf3c5e82021-01-07 13:00:37 -0800747
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800748 if (!mBufferInfo.mBuffer || !s.buffer->hasSameBuffer(*mBufferInfo.mBuffer)) {
chaviwdf3c5e82021-01-07 13:00:37 -0800749 decrementPendingBufferCount();
750 }
Marissa Wall61c58622018-07-18 10:12:20 -0700751
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700752 mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};
chaviwd62d3062019-09-04 14:48:02 -0700753 mBufferInfo.mBuffer = s.buffer;
754 mBufferInfo.mFence = s.acquireFence;
Vishnu Nair4ba0c2e2021-06-24 11:27:17 -0700755 mBufferInfo.mFrameNumber = s.frameNumber;
Marissa Wall61c58622018-07-18 10:12:20 -0700756
757 return NO_ERROR;
758}
759
Alec Mouri8977ce92022-05-07 00:34:50 +0000760status_t BufferStateLayer::updateFrameNumber() {
Marissa Wall61c58622018-07-18 10:12:20 -0700761 // TODO(marissaw): support frame history events
Mikael Pessa2e1608f2019-07-19 11:25:35 -0700762 mPreviousFrameNumber = mCurrentFrameNumber;
Valerie Hau134651a2020-01-28 16:21:22 -0800763 mCurrentFrameNumber = mDrawingState.frameNumber;
Marissa Wall61c58622018-07-18 10:12:20 -0700764 return NO_ERROR;
765}
766
Marissa Wall947d34e2019-03-29 14:03:53 -0700767void BufferStateLayer::HwcSlotGenerator::bufferErased(const client_cache_t& clientCacheId) {
768 std::lock_guard lock(mMutex);
769 if (!clientCacheId.isValid()) {
770 ALOGE("invalid process, failed to erase buffer");
771 return;
772 }
773 eraseBufferLocked(clientCacheId);
774}
775
rnleeed20fa42021-08-10 18:00:03 -0700776int BufferStateLayer::HwcSlotGenerator::getHwcCacheSlot(const client_cache_t& clientCacheId) {
Marissa Wall947d34e2019-03-29 14:03:53 -0700777 std::lock_guard<std::mutex> lock(mMutex);
778 auto itr = mCachedBuffers.find(clientCacheId);
779 if (itr == mCachedBuffers.end()) {
780 return addCachedBuffer(clientCacheId);
781 }
782 auto& [hwcCacheSlot, counter] = itr->second;
783 counter = mCounter++;
784 return hwcCacheSlot;
785}
786
rnleeed20fa42021-08-10 18:00:03 -0700787int BufferStateLayer::HwcSlotGenerator::addCachedBuffer(const client_cache_t& clientCacheId)
Marissa Wall947d34e2019-03-29 14:03:53 -0700788 REQUIRES(mMutex) {
789 if (!clientCacheId.isValid()) {
790 ALOGE("invalid process, returning invalid slot");
791 return BufferQueue::INVALID_BUFFER_SLOT;
792 }
793
794 ClientCache::getInstance().registerErasedRecipient(clientCacheId, wp<ErasedRecipient>(this));
795
rnleeed20fa42021-08-10 18:00:03 -0700796 int hwcCacheSlot = getFreeHwcCacheSlot();
Marissa Wall947d34e2019-03-29 14:03:53 -0700797 mCachedBuffers[clientCacheId] = {hwcCacheSlot, mCounter++};
798 return hwcCacheSlot;
799}
800
rnleeed20fa42021-08-10 18:00:03 -0700801int BufferStateLayer::HwcSlotGenerator::getFreeHwcCacheSlot() REQUIRES(mMutex) {
Marissa Wall947d34e2019-03-29 14:03:53 -0700802 if (mFreeHwcCacheSlots.empty()) {
803 evictLeastRecentlyUsed();
804 }
805
rnleeed20fa42021-08-10 18:00:03 -0700806 int hwcCacheSlot = mFreeHwcCacheSlots.top();
Marissa Wall947d34e2019-03-29 14:03:53 -0700807 mFreeHwcCacheSlots.pop();
808 return hwcCacheSlot;
809}
810
811void BufferStateLayer::HwcSlotGenerator::evictLeastRecentlyUsed() REQUIRES(mMutex) {
812 uint64_t minCounter = UINT_MAX;
813 client_cache_t minClientCacheId = {};
814 for (const auto& [clientCacheId, slotCounter] : mCachedBuffers) {
815 const auto& [hwcCacheSlot, counter] = slotCounter;
816 if (counter < minCounter) {
817 minCounter = counter;
818 minClientCacheId = clientCacheId;
819 }
820 }
821 eraseBufferLocked(minClientCacheId);
822
823 ClientCache::getInstance().unregisterErasedRecipient(minClientCacheId, this);
824}
825
826void BufferStateLayer::HwcSlotGenerator::eraseBufferLocked(const client_cache_t& clientCacheId)
827 REQUIRES(mMutex) {
828 auto itr = mCachedBuffers.find(clientCacheId);
829 if (itr == mCachedBuffers.end()) {
830 return;
831 }
832 auto& [hwcCacheSlot, counter] = itr->second;
833
834 // TODO send to hwc cache and resources
835
836 mFreeHwcCacheSlots.push(hwcCacheSlot);
837 mCachedBuffers.erase(clientCacheId);
838}
chaviw4244e032019-09-04 11:27:49 -0700839
840void BufferStateLayer::gatherBufferInfo() {
Vishnu Naira72f6c02022-07-01 05:33:08 +0000841 mBufferInfo.mPixelFormat =
842 !mBufferInfo.mBuffer ? PIXEL_FORMAT_NONE : mBufferInfo.mBuffer->getPixelFormat();
843 mBufferInfo.mFrameLatencyNeeded = true;
chaviw4244e032019-09-04 11:27:49 -0700844
chaviwdebadb82020-03-26 14:57:24 -0700845 const State& s(getDrawingState());
chaviw4244e032019-09-04 11:27:49 -0700846 mBufferInfo.mDesiredPresentTime = s.desiredPresentTime;
847 mBufferInfo.mFenceTime = std::make_shared<FenceTime>(s.acquireFence);
848 mBufferInfo.mFence = s.acquireFence;
chaviw766c9c52021-02-10 17:36:47 -0800849 mBufferInfo.mTransform = s.bufferTransform;
Robert Carr167bdde2021-07-28 11:26:51 -0700850 auto lastDataspace = mBufferInfo.mDataspace;
chaviw4244e032019-09-04 11:27:49 -0700851 mBufferInfo.mDataspace = translateDataspace(s.dataspace);
Robert Carr167bdde2021-07-28 11:26:51 -0700852 if (lastDataspace != mBufferInfo.mDataspace) {
853 mFlinger->mSomeDataspaceChanged = true;
854 }
Vishnu Nair5cc9ac02021-04-19 13:23:38 -0700855 mBufferInfo.mCrop = computeBufferCrop(s);
chaviw4244e032019-09-04 11:27:49 -0700856 mBufferInfo.mScaleMode = NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
857 mBufferInfo.mSurfaceDamage = s.surfaceDamageRegion;
858 mBufferInfo.mHdrMetadata = s.hdrMetadata;
859 mBufferInfo.mApi = s.api;
chaviw4244e032019-09-04 11:27:49 -0700860 mBufferInfo.mTransformToDisplayInverse = s.transformToDisplayInverse;
chaviwf83ce182019-09-12 14:43:08 -0700861 mBufferInfo.mBufferSlot = mHwcSlotGenerator->getHwcCacheSlot(s.clientCacheId);
chaviw4244e032019-09-04 11:27:49 -0700862}
863
Robert Carr916b0362020-10-06 13:53:03 -0700864uint32_t BufferStateLayer::getEffectiveScalingMode() const {
865 return NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW;
866}
867
Vishnu Nair5cc9ac02021-04-19 13:23:38 -0700868Rect BufferStateLayer::computeBufferCrop(const State& s) {
chaviwf3f40fe2021-04-27 15:54:02 -0500869 if (s.buffer && !s.bufferCrop.isEmpty()) {
870 Rect bufferCrop;
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800871 s.buffer->getBounds().intersect(s.bufferCrop, &bufferCrop);
chaviwf3f40fe2021-04-27 15:54:02 -0500872 return bufferCrop;
873 } else if (s.buffer) {
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800874 return s.buffer->getBounds();
chaviwf3f40fe2021-04-27 15:54:02 -0500875 } else {
876 return s.bufferCrop;
chaviw4244e032019-09-04 11:27:49 -0700877 }
chaviw4244e032019-09-04 11:27:49 -0700878}
879
chaviwb4c6e582019-08-16 14:35:07 -0700880sp<Layer> BufferStateLayer::createClone() {
Vishnu Nair7fb9e5a2021-11-08 12:44:05 -0800881 LayerCreationArgs args(mFlinger.get(), nullptr, mName + " (Mirror)", 0, LayerMetadata());
chaviwb4c6e582019-08-16 14:35:07 -0700882 args.textureName = mTextureName;
Lloyd Pique1c3a5eb2019-10-03 13:07:08 -0700883 sp<BufferStateLayer> layer = mFlinger->getFactory().createBufferStateLayer(args);
chaviwb4c6e582019-08-16 14:35:07 -0700884 layer->mHwcSlotGenerator = mHwcSlotGenerator;
885 layer->setInitialValuesForClone(this);
886 return layer;
887}
Valerie Hau92bf5482020-02-10 09:49:08 -0800888
Vishnu Naire7f79c52020-10-29 14:45:03 -0700889bool BufferStateLayer::bufferNeedsFiltering() const {
890 const State& s(getDrawingState());
891 if (!s.buffer) {
892 return false;
893 }
894
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800895 int32_t bufferWidth = static_cast<int32_t>(s.buffer->getWidth());
896 int32_t bufferHeight = static_cast<int32_t>(s.buffer->getHeight());
Vishnu Naire7f79c52020-10-29 14:45:03 -0700897
898 // Undo any transformations on the buffer and return the result.
chaviw766c9c52021-02-10 17:36:47 -0800899 if (s.bufferTransform & ui::Transform::ROT_90) {
Vishnu Naire7f79c52020-10-29 14:45:03 -0700900 std::swap(bufferWidth, bufferHeight);
901 }
902
903 if (s.transformToDisplayInverse) {
904 uint32_t invTransform = DisplayDevice::getPrimaryDisplayRotationFlags();
905 if (invTransform & ui::Transform::ROT_90) {
906 std::swap(bufferWidth, bufferHeight);
907 }
908 }
909
910 const Rect layerSize{getBounds()};
Yiwei Zhang22ca2c42022-07-07 07:00:16 +0000911 int32_t layerWidth = layerSize.getWidth();
912 int32_t layerHeight = layerSize.getHeight();
913
914 // Align the layer orientation with the buffer before comparism
915 if (mTransformHint & ui::Transform::ROT_90) {
916 std::swap(layerWidth, layerHeight);
917 }
918
919 return layerWidth != bufferWidth || layerHeight != bufferHeight;
Vishnu Naire7f79c52020-10-29 14:45:03 -0700920}
Robert Carr7121caf2020-12-15 13:07:32 -0800921
Robert Carr7121caf2020-12-15 13:07:32 -0800922void BufferStateLayer::decrementPendingBufferCount() {
Vishnu Nair8eda69e2021-02-26 10:42:10 -0800923 int32_t pendingBuffers = --mPendingBufferTransactions;
924 tracePendingBufferCount(pendingBuffers);
Robert Carr7121caf2020-12-15 13:07:32 -0800925}
926
Vishnu Nair8eda69e2021-02-26 10:42:10 -0800927void BufferStateLayer::tracePendingBufferCount(int32_t pendingBuffers) {
928 ATRACE_INT(mBlastTransactionName.c_str(), pendingBuffers);
Robert Carr7121caf2020-12-15 13:07:32 -0800929}
930
Robert Carr7121caf2020-12-15 13:07:32 -0800931
chaviw39d01472021-04-08 14:26:24 -0500932/*
933 * We don't want to send the layer's transform to input, but rather the
934 * parent's transform. This is because BufferStateLayer's transform is
935 * information about how the buffer is placed on screen. The parent's
936 * transform makes more sense to send since it's information about how the
937 * layer is placed on screen. This transform is used by input to determine
938 * how to go from screen space back to window space.
939 */
940ui::Transform BufferStateLayer::getInputTransform() const {
Rob Carrc6d2d2b2021-10-25 16:51:49 +0000941 sp<Layer> parent = mDrawingParent.promote();
chaviw39d01472021-04-08 14:26:24 -0500942 if (parent == nullptr) {
943 return ui::Transform();
944 }
945
946 return parent->getTransform();
947}
948
949/**
950 * Similar to getInputTransform, we need to update the bounds to include the transform.
951 * This is because bounds for BSL doesn't include buffer transform, where the input assumes
952 * that's already included.
953 */
954Rect BufferStateLayer::getInputBounds() const {
955 Rect bufferBounds = getCroppedBufferSize(getDrawingState());
956 if (mDrawingState.transform.getType() == ui::Transform::IDENTITY || !bufferBounds.isValid()) {
957 return bufferBounds;
958 }
959 return mDrawingState.transform.transform(bufferBounds);
960}
961
Ady Abraham9dada822022-02-03 10:26:59 -0800962bool BufferStateLayer::simpleBufferUpdate(const layer_state_t& s) const {
963 const uint64_t requiredFlags = layer_state_t::eBufferChanged;
964
965 const uint64_t deniedFlags = layer_state_t::eProducerDisconnect | layer_state_t::eLayerChanged |
966 layer_state_t::eRelativeLayerChanged | layer_state_t::eTransparentRegionChanged |
967 layer_state_t::eFlagsChanged | layer_state_t::eBlurRegionsChanged |
968 layer_state_t::eLayerStackChanged | layer_state_t::eAutoRefreshChanged |
969 layer_state_t::eReparent;
970
971 const uint64_t allowedFlags = layer_state_t::eHasListenerCallbacksChanged |
972 layer_state_t::eFrameRateSelectionPriority | layer_state_t::eFrameRateChanged |
973 layer_state_t::eSurfaceDamageRegionChanged | layer_state_t::eApiChanged |
974 layer_state_t::eMetadataChanged | layer_state_t::eDropInputModeChanged |
975 layer_state_t::eInputInfoChanged;
976
977 if ((s.what & requiredFlags) != requiredFlags) {
978 ALOGV("%s: false [missing required flags 0x%" PRIx64 "]", __func__,
979 (s.what | requiredFlags) & ~s.what);
980 return false;
981 }
982
983 if (s.what & deniedFlags) {
984 ALOGV("%s: false [has denied flags 0x%" PRIx64 "]", __func__, s.what & deniedFlags);
985 return false;
986 }
987
988 if (s.what & allowedFlags) {
989 ALOGV("%s: [has allowed flags 0x%" PRIx64 "]", __func__, s.what & allowedFlags);
990 }
991
992 if (s.what & layer_state_t::ePositionChanged) {
993 if (mRequestedTransform.tx() != s.x || mRequestedTransform.ty() != s.y) {
994 ALOGV("%s: false [ePositionChanged changed]", __func__);
995 return false;
996 }
997 }
998
999 if (s.what & layer_state_t::eAlphaChanged) {
1000 if (mDrawingState.color.a != s.alpha) {
1001 ALOGV("%s: false [eAlphaChanged changed]", __func__);
1002 return false;
1003 }
1004 }
1005
1006 if (s.what & layer_state_t::eColorTransformChanged) {
1007 if (mDrawingState.colorTransform != s.colorTransform) {
1008 ALOGV("%s: false [eColorTransformChanged changed]", __func__);
1009 return false;
1010 }
1011 }
1012
1013 if (s.what & layer_state_t::eBackgroundColorChanged) {
1014 if (mDrawingState.bgColorLayer || s.bgColorAlpha != 0) {
1015 ALOGV("%s: false [eBackgroundColorChanged changed]", __func__);
1016 return false;
1017 }
1018 }
1019
1020 if (s.what & layer_state_t::eMatrixChanged) {
1021 if (mRequestedTransform.dsdx() != s.matrix.dsdx ||
1022 mRequestedTransform.dtdy() != s.matrix.dtdy ||
1023 mRequestedTransform.dtdx() != s.matrix.dtdx ||
1024 mRequestedTransform.dsdy() != s.matrix.dsdy) {
1025 ALOGV("%s: false [eMatrixChanged changed]", __func__);
1026 return false;
1027 }
1028 }
1029
1030 if (s.what & layer_state_t::eCornerRadiusChanged) {
1031 if (mDrawingState.cornerRadius != s.cornerRadius) {
1032 ALOGV("%s: false [eCornerRadiusChanged changed]", __func__);
1033 return false;
1034 }
1035 }
1036
1037 if (s.what & layer_state_t::eBackgroundBlurRadiusChanged) {
1038 if (mDrawingState.backgroundBlurRadius != static_cast<int>(s.backgroundBlurRadius)) {
1039 ALOGV("%s: false [eBackgroundBlurRadiusChanged changed]", __func__);
1040 return false;
1041 }
1042 }
1043
1044 if (s.what & layer_state_t::eTransformChanged) {
1045 if (mDrawingState.bufferTransform != s.transform) {
1046 ALOGV("%s: false [eTransformChanged changed]", __func__);
1047 return false;
1048 }
1049 }
1050
1051 if (s.what & layer_state_t::eTransformToDisplayInverseChanged) {
1052 if (mDrawingState.transformToDisplayInverse != s.transformToDisplayInverse) {
1053 ALOGV("%s: false [eTransformToDisplayInverseChanged changed]", __func__);
1054 return false;
1055 }
1056 }
1057
1058 if (s.what & layer_state_t::eCropChanged) {
1059 if (mDrawingState.crop != s.crop) {
1060 ALOGV("%s: false [eCropChanged changed]", __func__);
1061 return false;
1062 }
1063 }
1064
1065 if (s.what & layer_state_t::eDataspaceChanged) {
1066 if (mDrawingState.dataspace != s.dataspace) {
1067 ALOGV("%s: false [eDataspaceChanged changed]", __func__);
1068 return false;
1069 }
1070 }
1071
1072 if (s.what & layer_state_t::eHdrMetadataChanged) {
1073 if (mDrawingState.hdrMetadata != s.hdrMetadata) {
1074 ALOGV("%s: false [eHdrMetadataChanged changed]", __func__);
1075 return false;
1076 }
1077 }
1078
1079 if (s.what & layer_state_t::eSidebandStreamChanged) {
1080 if (mDrawingState.sidebandStream != s.sidebandStream) {
1081 ALOGV("%s: false [eSidebandStreamChanged changed]", __func__);
1082 return false;
1083 }
1084 }
1085
1086 if (s.what & layer_state_t::eColorSpaceAgnosticChanged) {
1087 if (mDrawingState.colorSpaceAgnostic != s.colorSpaceAgnostic) {
1088 ALOGV("%s: false [eColorSpaceAgnosticChanged changed]", __func__);
1089 return false;
1090 }
1091 }
1092
1093 if (s.what & layer_state_t::eShadowRadiusChanged) {
1094 if (mDrawingState.shadowRadius != s.shadowRadius) {
1095 ALOGV("%s: false [eShadowRadiusChanged changed]", __func__);
1096 return false;
1097 }
1098 }
1099
1100 if (s.what & layer_state_t::eFixedTransformHintChanged) {
1101 if (mDrawingState.fixedTransformHint != s.fixedTransformHint) {
1102 ALOGV("%s: false [eFixedTransformHintChanged changed]", __func__);
1103 return false;
1104 }
1105 }
1106
1107 if (s.what & layer_state_t::eTrustedOverlayChanged) {
1108 if (mDrawingState.isTrustedOverlay != s.isTrustedOverlay) {
1109 ALOGV("%s: false [eTrustedOverlayChanged changed]", __func__);
1110 return false;
1111 }
1112 }
1113
1114 if (s.what & layer_state_t::eStretchChanged) {
1115 StretchEffect temp = s.stretchEffect;
1116 temp.sanitize();
1117 if (mDrawingState.stretchEffect != temp) {
1118 ALOGV("%s: false [eStretchChanged changed]", __func__);
1119 return false;
1120 }
1121 }
1122
1123 if (s.what & layer_state_t::eBufferCropChanged) {
1124 if (mDrawingState.bufferCrop != s.bufferCrop) {
1125 ALOGV("%s: false [eBufferCropChanged changed]", __func__);
1126 return false;
1127 }
1128 }
1129
1130 if (s.what & layer_state_t::eDestinationFrameChanged) {
1131 if (mDrawingState.destinationFrame != s.destinationFrame) {
1132 ALOGV("%s: false [eDestinationFrameChanged changed]", __func__);
1133 return false;
1134 }
1135 }
1136
Sally Qi81d95e62022-03-21 19:41:33 -07001137 if (s.what & layer_state_t::eDimmingEnabledChanged) {
1138 if (mDrawingState.dimmingEnabled != s.dimmingEnabled) {
1139 ALOGV("%s: false [eDimmingEnabledChanged changed]", __func__);
1140 return false;
1141 }
1142 }
1143
Ady Abraham9dada822022-02-03 10:26:59 -08001144 ALOGV("%s: true", __func__);
1145 return true;
1146}
1147
Vishnu Naira72f6c02022-07-01 05:33:08 +00001148void BufferStateLayer::useSurfaceDamage() {
1149 if (mFlinger->mForceFullDamage) {
1150 surfaceDamageRegion = Region::INVALID_REGION;
1151 } else {
1152 surfaceDamageRegion = mBufferInfo.mSurfaceDamage;
1153 }
1154}
1155
1156void BufferStateLayer::useEmptyDamage() {
1157 surfaceDamageRegion.clear();
1158}
1159
1160bool BufferStateLayer::isOpaque(const Layer::State& s) const {
1161 // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the
1162 // layer's opaque flag.
1163 if ((mSidebandStream == nullptr) && (mBufferInfo.mBuffer == nullptr)) {
1164 return false;
1165 }
1166
1167 // if the layer has the opaque flag, then we're always opaque,
1168 // otherwise we use the current buffer's format.
1169 return ((s.flags & layer_state_t::eLayerOpaque) != 0) || getOpacityForFormat(getPixelFormat());
1170}
1171
1172bool BufferStateLayer::canReceiveInput() const {
1173 return !isHiddenByPolicy() && (mBufferInfo.mBuffer == nullptr || getAlpha() > 0.0f);
1174}
1175
1176bool BufferStateLayer::isVisible() const {
1177 return !isHiddenByPolicy() && getAlpha() > 0.0f &&
1178 (mBufferInfo.mBuffer != nullptr || mSidebandStream != nullptr);
1179}
1180
1181bool BufferStateLayer::isFixedSize() const {
1182 return true;
1183}
1184
1185bool BufferStateLayer::usesSourceCrop() const {
1186 return true;
1187}
1188
1189static constexpr mat4 inverseOrientation(uint32_t transform) {
1190 const mat4 flipH(-1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1);
1191 const mat4 flipV(1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1);
1192 const mat4 rot90(0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1);
1193 mat4 tr;
1194
1195 if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
1196 tr = tr * rot90;
1197 }
1198 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) {
1199 tr = tr * flipH;
1200 }
1201 if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) {
1202 tr = tr * flipV;
1203 }
1204 return inverse(tr);
1205}
1206
1207std::optional<compositionengine::LayerFE::LayerSettings> BufferStateLayer::prepareClientComposition(
1208 compositionengine::LayerFE::ClientCompositionTargetSettings& targetSettings) {
1209 ATRACE_CALL();
1210
1211 std::optional<compositionengine::LayerFE::LayerSettings> result =
1212 Layer::prepareClientComposition(targetSettings);
1213 if (!result) {
1214 return result;
1215 }
1216
1217 if (CC_UNLIKELY(mBufferInfo.mBuffer == 0) && mSidebandStream != nullptr) {
1218 // For surfaceview of tv sideband, there is no activeBuffer
1219 // in bufferqueue, we need return LayerSettings.
1220 return result;
1221 }
1222 const bool blackOutLayer = (isProtected() && !targetSettings.supportsProtectedContent) ||
1223 ((isSecure() || isProtected()) && !targetSettings.isSecure);
1224 const bool bufferCanBeUsedAsHwTexture =
1225 mBufferInfo.mBuffer->getUsage() & GraphicBuffer::USAGE_HW_TEXTURE;
1226 compositionengine::LayerFE::LayerSettings& layer = *result;
1227 if (blackOutLayer || !bufferCanBeUsedAsHwTexture) {
1228 ALOGE_IF(!bufferCanBeUsedAsHwTexture, "%s is blacked out as buffer is not gpu readable",
1229 mName.c_str());
1230 prepareClearClientComposition(layer, true /* blackout */);
1231 return layer;
1232 }
1233
1234 const State& s(getDrawingState());
1235 layer.source.buffer.buffer = mBufferInfo.mBuffer;
1236 layer.source.buffer.isOpaque = isOpaque(s);
1237 layer.source.buffer.fence = mBufferInfo.mFence;
1238 layer.source.buffer.textureName = mTextureName;
1239 layer.source.buffer.usePremultipliedAlpha = getPremultipledAlpha();
1240 layer.source.buffer.isY410BT2020 = isHdrY410();
1241 bool hasSmpte2086 = mBufferInfo.mHdrMetadata.validTypes & HdrMetadata::SMPTE2086;
1242 bool hasCta861_3 = mBufferInfo.mHdrMetadata.validTypes & HdrMetadata::CTA861_3;
1243 float maxLuminance = 0.f;
1244 if (hasSmpte2086 && hasCta861_3) {
1245 maxLuminance = std::min(mBufferInfo.mHdrMetadata.smpte2086.maxLuminance,
1246 mBufferInfo.mHdrMetadata.cta8613.maxContentLightLevel);
1247 } else if (hasSmpte2086) {
1248 maxLuminance = mBufferInfo.mHdrMetadata.smpte2086.maxLuminance;
1249 } else if (hasCta861_3) {
1250 maxLuminance = mBufferInfo.mHdrMetadata.cta8613.maxContentLightLevel;
1251 } else {
1252 switch (layer.sourceDataspace & HAL_DATASPACE_TRANSFER_MASK) {
1253 case HAL_DATASPACE_TRANSFER_ST2084:
1254 case HAL_DATASPACE_TRANSFER_HLG:
1255 // Behavior-match previous releases for HDR content
1256 maxLuminance = defaultMaxLuminance;
1257 break;
1258 }
1259 }
1260 layer.source.buffer.maxLuminanceNits = maxLuminance;
1261 layer.frameNumber = mCurrentFrameNumber;
1262 layer.bufferId = mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getId() : 0;
1263
1264 const bool useFiltering =
1265 targetSettings.needsFiltering || mNeedsFiltering || bufferNeedsFiltering();
1266
1267 // Query the texture matrix given our current filtering mode.
1268 float textureMatrix[16];
1269 getDrawingTransformMatrix(useFiltering, textureMatrix);
1270
1271 if (getTransformToDisplayInverse()) {
1272 /*
1273 * the code below applies the primary display's inverse transform to
1274 * the texture transform
1275 */
1276 uint32_t transform = DisplayDevice::getPrimaryDisplayRotationFlags();
1277 mat4 tr = inverseOrientation(transform);
1278
1279 /**
1280 * TODO(b/36727915): This is basically a hack.
1281 *
1282 * Ensure that regardless of the parent transformation,
1283 * this buffer is always transformed from native display
1284 * orientation to display orientation. For example, in the case
1285 * of a camera where the buffer remains in native orientation,
1286 * we want the pixels to always be upright.
1287 */
1288 sp<Layer> p = mDrawingParent.promote();
1289 if (p != nullptr) {
1290 const auto parentTransform = p->getTransform();
1291 tr = tr * inverseOrientation(parentTransform.getOrientation());
1292 }
1293
1294 // and finally apply it to the original texture matrix
1295 const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr);
1296 memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix));
1297 }
1298
1299 const Rect win{getBounds()};
1300 float bufferWidth = getBufferSize(s).getWidth();
1301 float bufferHeight = getBufferSize(s).getHeight();
1302
1303 // BufferStateLayers can have a "buffer size" of [0, 0, -1, -1] when no display frame has
1304 // been set and there is no parent layer bounds. In that case, the scale is meaningless so
1305 // ignore them.
1306 if (!getBufferSize(s).isValid()) {
1307 bufferWidth = float(win.right) - float(win.left);
1308 bufferHeight = float(win.bottom) - float(win.top);
1309 }
1310
1311 const float scaleHeight = (float(win.bottom) - float(win.top)) / bufferHeight;
1312 const float scaleWidth = (float(win.right) - float(win.left)) / bufferWidth;
1313 const float translateY = float(win.top) / bufferHeight;
1314 const float translateX = float(win.left) / bufferWidth;
1315
1316 // Flip y-coordinates because GLConsumer expects OpenGL convention.
1317 mat4 tr = mat4::translate(vec4(.5f, .5f, 0.f, 1.f)) * mat4::scale(vec4(1.f, -1.f, 1.f, 1.f)) *
1318 mat4::translate(vec4(-.5f, -.5f, 0.f, 1.f)) *
1319 mat4::translate(vec4(translateX, translateY, 0.f, 1.f)) *
1320 mat4::scale(vec4(scaleWidth, scaleHeight, 1.0f, 1.0f));
1321
1322 layer.source.buffer.useTextureFiltering = useFiltering;
1323 layer.source.buffer.textureTransform = mat4(static_cast<const float*>(textureMatrix)) * tr;
1324
1325 return layer;
1326}
1327
1328bool BufferStateLayer::isHdrY410() const {
1329 // pixel format is HDR Y410 masquerading as RGBA_1010102
1330 return (mBufferInfo.mDataspace == ui::Dataspace::BT2020_ITU_PQ &&
1331 mBufferInfo.mApi == NATIVE_WINDOW_API_MEDIA &&
1332 mBufferInfo.mPixelFormat == HAL_PIXEL_FORMAT_RGBA_1010102);
1333}
1334
1335sp<compositionengine::LayerFE> BufferStateLayer::getCompositionEngineLayerFE() const {
1336 return asLayerFE();
1337}
1338
1339compositionengine::LayerFECompositionState* BufferStateLayer::editCompositionState() {
1340 return mCompositionState.get();
1341}
1342
1343const compositionengine::LayerFECompositionState* BufferStateLayer::getCompositionState() const {
1344 return mCompositionState.get();
1345}
1346
1347void BufferStateLayer::preparePerFrameCompositionState() {
1348 Layer::preparePerFrameCompositionState();
1349
1350 // Sideband layers
1351 auto* compositionState = editCompositionState();
1352 if (compositionState->sidebandStream.get() && !compositionState->sidebandStreamHasFrame) {
1353 compositionState->compositionType =
1354 aidl::android::hardware::graphics::composer3::Composition::SIDEBAND;
1355 return;
1356 } else if ((mDrawingState.flags & layer_state_t::eLayerIsDisplayDecoration) != 0) {
1357 compositionState->compositionType =
1358 aidl::android::hardware::graphics::composer3::Composition::DISPLAY_DECORATION;
1359 } else {
1360 // Normal buffer layers
1361 compositionState->hdrMetadata = mBufferInfo.mHdrMetadata;
1362 compositionState->compositionType = mPotentialCursor
1363 ? aidl::android::hardware::graphics::composer3::Composition::CURSOR
1364 : aidl::android::hardware::graphics::composer3::Composition::DEVICE;
1365 }
1366
1367 compositionState->buffer = getBuffer();
1368 compositionState->bufferSlot = (mBufferInfo.mBufferSlot == BufferQueue::INVALID_BUFFER_SLOT)
1369 ? 0
1370 : mBufferInfo.mBufferSlot;
1371 compositionState->acquireFence = mBufferInfo.mFence;
1372 compositionState->frameNumber = mBufferInfo.mFrameNumber;
1373 compositionState->sidebandStreamHasFrame = false;
1374}
1375
1376namespace {
1377TimeStats::SetFrameRateVote frameRateToSetFrameRateVotePayload(Layer::FrameRate frameRate) {
1378 using FrameRateCompatibility = TimeStats::SetFrameRateVote::FrameRateCompatibility;
1379 using Seamlessness = TimeStats::SetFrameRateVote::Seamlessness;
1380 const auto frameRateCompatibility = [frameRate] {
1381 switch (frameRate.type) {
1382 case Layer::FrameRateCompatibility::Default:
1383 return FrameRateCompatibility::Default;
1384 case Layer::FrameRateCompatibility::ExactOrMultiple:
1385 return FrameRateCompatibility::ExactOrMultiple;
1386 default:
1387 return FrameRateCompatibility::Undefined;
1388 }
1389 }();
1390
1391 const auto seamlessness = [frameRate] {
1392 switch (frameRate.seamlessness) {
1393 case scheduler::Seamlessness::OnlySeamless:
1394 return Seamlessness::ShouldBeSeamless;
1395 case scheduler::Seamlessness::SeamedAndSeamless:
1396 return Seamlessness::NotRequired;
1397 default:
1398 return Seamlessness::Undefined;
1399 }
1400 }();
1401
1402 return TimeStats::SetFrameRateVote{.frameRate = frameRate.rate.getValue(),
1403 .frameRateCompatibility = frameRateCompatibility,
1404 .seamlessness = seamlessness};
1405}
1406} // namespace
1407
1408void BufferStateLayer::onPostComposition(const DisplayDevice* display,
1409 const std::shared_ptr<FenceTime>& glDoneFence,
1410 const std::shared_ptr<FenceTime>& presentFence,
1411 const CompositorTiming& compositorTiming) {
1412 // mFrameLatencyNeeded is true when a new frame was latched for the
1413 // composition.
1414 if (!mBufferInfo.mFrameLatencyNeeded) return;
1415
1416 // Update mFrameEventHistory.
1417 finalizeFrameEventHistory(glDoneFence, compositorTiming);
1418
1419 // Update mFrameTracker.
1420 nsecs_t desiredPresentTime = mBufferInfo.mDesiredPresentTime;
1421 mFrameTracker.setDesiredPresentTime(desiredPresentTime);
1422
1423 const int32_t layerId = getSequence();
1424 mFlinger->mTimeStats->setDesiredTime(layerId, mCurrentFrameNumber, desiredPresentTime);
1425
1426 const auto outputLayer = findOutputLayerForDisplay(display);
1427 if (outputLayer && outputLayer->requiresClientComposition()) {
1428 nsecs_t clientCompositionTimestamp = outputLayer->getState().clientCompositionTimestamp;
1429 mFlinger->mFrameTracer->traceTimestamp(layerId, getCurrentBufferId(), mCurrentFrameNumber,
1430 clientCompositionTimestamp,
1431 FrameTracer::FrameEvent::FALLBACK_COMPOSITION);
1432 // Update the SurfaceFrames in the drawing state
1433 if (mDrawingState.bufferSurfaceFrameTX) {
1434 mDrawingState.bufferSurfaceFrameTX->setGpuComposition();
1435 }
1436 for (auto& [token, surfaceFrame] : mDrawingState.bufferlessSurfaceFramesTX) {
1437 surfaceFrame->setGpuComposition();
1438 }
1439 }
1440
1441 std::shared_ptr<FenceTime> frameReadyFence = mBufferInfo.mFenceTime;
1442 if (frameReadyFence->isValid()) {
1443 mFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
1444 } else {
1445 // There was no fence for this frame, so assume that it was ready
1446 // to be presented at the desired present time.
1447 mFrameTracker.setFrameReadyTime(desiredPresentTime);
1448 }
1449
1450 if (display) {
1451 const Fps refreshRate = display->refreshRateConfigs().getActiveMode()->getFps();
1452 const std::optional<Fps> renderRate =
1453 mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
1454
1455 const auto vote = frameRateToSetFrameRateVotePayload(mDrawingState.frameRate);
1456 const auto gameMode = getGameMode();
1457
1458 if (presentFence->isValid()) {
1459 mFlinger->mTimeStats->setPresentFence(layerId, mCurrentFrameNumber, presentFence,
1460 refreshRate, renderRate, vote, gameMode);
1461 mFlinger->mFrameTracer->traceFence(layerId, getCurrentBufferId(), mCurrentFrameNumber,
1462 presentFence,
1463 FrameTracer::FrameEvent::PRESENT_FENCE);
1464 mFrameTracker.setActualPresentFence(std::shared_ptr<FenceTime>(presentFence));
1465 } else if (const auto displayId = PhysicalDisplayId::tryCast(display->getId());
1466 displayId && mFlinger->getHwComposer().isConnected(*displayId)) {
1467 // The HWC doesn't support present fences, so use the refresh
1468 // timestamp instead.
1469 const nsecs_t actualPresentTime = display->getRefreshTimestamp();
1470 mFlinger->mTimeStats->setPresentTime(layerId, mCurrentFrameNumber, actualPresentTime,
1471 refreshRate, renderRate, vote, gameMode);
1472 mFlinger->mFrameTracer->traceTimestamp(layerId, getCurrentBufferId(),
1473 mCurrentFrameNumber, actualPresentTime,
1474 FrameTracer::FrameEvent::PRESENT_FENCE);
1475 mFrameTracker.setActualPresentTime(actualPresentTime);
1476 }
1477 }
1478
1479 mFrameTracker.advanceFrame();
1480 mBufferInfo.mFrameLatencyNeeded = false;
1481}
1482
1483bool BufferStateLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime,
1484 nsecs_t expectedPresentTime) {
1485 ATRACE_FORMAT_INSTANT("latchBuffer %s - %" PRIu64, getDebugName(),
1486 getDrawingState().frameNumber);
1487
1488 bool refreshRequired = latchSidebandStream(recomputeVisibleRegions);
1489
1490 if (refreshRequired) {
1491 return refreshRequired;
1492 }
1493
1494 // If the head buffer's acquire fence hasn't signaled yet, return and
1495 // try again later
1496 if (!fenceHasSignaled()) {
1497 ATRACE_NAME("!fenceHasSignaled()");
1498 mFlinger->onLayerUpdate();
1499 return false;
1500 }
1501
1502 // Capture the old state of the layer for comparisons later
1503 const State& s(getDrawingState());
1504 const bool oldOpacity = isOpaque(s);
1505
1506 BufferInfo oldBufferInfo = mBufferInfo;
1507
1508 status_t err = updateTexImage(recomputeVisibleRegions, latchTime, expectedPresentTime);
1509 if (err != NO_ERROR) {
1510 return false;
1511 }
1512
1513 err = updateActiveBuffer();
1514 if (err != NO_ERROR) {
1515 return false;
1516 }
1517
1518 err = updateFrameNumber();
1519 if (err != NO_ERROR) {
1520 return false;
1521 }
1522
1523 gatherBufferInfo();
1524
1525 if (oldBufferInfo.mBuffer == nullptr) {
1526 // the first time we receive a buffer, we need to trigger a
1527 // geometry invalidation.
1528 recomputeVisibleRegions = true;
1529 }
1530
1531 if ((mBufferInfo.mCrop != oldBufferInfo.mCrop) ||
1532 (mBufferInfo.mTransform != oldBufferInfo.mTransform) ||
1533 (mBufferInfo.mScaleMode != oldBufferInfo.mScaleMode) ||
1534 (mBufferInfo.mTransformToDisplayInverse != oldBufferInfo.mTransformToDisplayInverse)) {
1535 recomputeVisibleRegions = true;
1536 }
1537
1538 if (oldBufferInfo.mBuffer != nullptr) {
1539 uint32_t bufWidth = mBufferInfo.mBuffer->getWidth();
1540 uint32_t bufHeight = mBufferInfo.mBuffer->getHeight();
1541 if (bufWidth != oldBufferInfo.mBuffer->getWidth() ||
1542 bufHeight != oldBufferInfo.mBuffer->getHeight()) {
1543 recomputeVisibleRegions = true;
1544 }
1545 }
1546
1547 if (oldOpacity != isOpaque(s)) {
1548 recomputeVisibleRegions = true;
1549 }
1550
1551 return true;
1552}
1553
1554bool BufferStateLayer::hasReadyFrame() const {
1555 return hasFrameUpdate() || getSidebandStreamChanged() || getAutoRefresh();
1556}
1557
1558bool BufferStateLayer::isProtected() const {
1559 return (mBufferInfo.mBuffer != nullptr) &&
1560 (mBufferInfo.mBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
1561}
1562
1563// As documented in libhardware header, formats in the range
1564// 0x100 - 0x1FF are specific to the HAL implementation, and
1565// are known to have no alpha channel
1566// TODO: move definition for device-specific range into
1567// hardware.h, instead of using hard-coded values here.
1568#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
1569
1570bool BufferStateLayer::getOpacityForFormat(PixelFormat format) {
1571 if (HARDWARE_IS_DEVICE_FORMAT(format)) {
1572 return true;
1573 }
1574 switch (format) {
1575 case PIXEL_FORMAT_RGBA_8888:
1576 case PIXEL_FORMAT_BGRA_8888:
1577 case PIXEL_FORMAT_RGBA_FP16:
1578 case PIXEL_FORMAT_RGBA_1010102:
1579 case PIXEL_FORMAT_R_8:
1580 return false;
1581 }
1582 // in all other case, we have no blending (also for unknown formats)
1583 return true;
1584}
1585
1586bool BufferStateLayer::needsFiltering(const DisplayDevice* display) const {
1587 const auto outputLayer = findOutputLayerForDisplay(display);
1588 if (outputLayer == nullptr) {
1589 return false;
1590 }
1591
1592 // We need filtering if the sourceCrop rectangle size does not match the
1593 // displayframe rectangle size (not a 1:1 render)
1594 const auto& compositionState = outputLayer->getState();
1595 const auto displayFrame = compositionState.displayFrame;
1596 const auto sourceCrop = compositionState.sourceCrop;
1597 return sourceCrop.getHeight() != displayFrame.getHeight() ||
1598 sourceCrop.getWidth() != displayFrame.getWidth();
1599}
1600
1601bool BufferStateLayer::needsFilteringForScreenshots(
1602 const DisplayDevice* display, const ui::Transform& inverseParentTransform) const {
1603 const auto outputLayer = findOutputLayerForDisplay(display);
1604 if (outputLayer == nullptr) {
1605 return false;
1606 }
1607
1608 // We need filtering if the sourceCrop rectangle size does not match the
1609 // viewport rectangle size (not a 1:1 render)
1610 const auto& compositionState = outputLayer->getState();
1611 const ui::Transform& displayTransform = display->getTransform();
1612 const ui::Transform inverseTransform = inverseParentTransform * displayTransform.inverse();
1613 // Undo the transformation of the displayFrame so that we're back into
1614 // layer-stack space.
1615 const Rect frame = inverseTransform.transform(compositionState.displayFrame);
1616 const FloatRect sourceCrop = compositionState.sourceCrop;
1617
1618 int32_t frameHeight = frame.getHeight();
1619 int32_t frameWidth = frame.getWidth();
1620 // If the display transform had a rotational component then undo the
1621 // rotation so that the orientation matches the source crop.
1622 if (displayTransform.getOrientation() & ui::Transform::ROT_90) {
1623 std::swap(frameHeight, frameWidth);
1624 }
1625 return sourceCrop.getHeight() != frameHeight || sourceCrop.getWidth() != frameWidth;
1626}
1627
1628void BufferStateLayer::latchAndReleaseBuffer() {
1629 if (hasReadyFrame()) {
1630 bool ignored = false;
1631 latchBuffer(ignored, systemTime(), 0 /* expectedPresentTime */);
1632 }
1633 releasePendingBuffer(systemTime());
1634}
1635
1636PixelFormat BufferStateLayer::getPixelFormat() const {
1637 return mBufferInfo.mPixelFormat;
1638}
1639
1640bool BufferStateLayer::getTransformToDisplayInverse() const {
1641 return mBufferInfo.mTransformToDisplayInverse;
1642}
1643
1644Rect BufferStateLayer::getBufferCrop() const {
1645 // this is the crop rectangle that applies to the buffer
1646 // itself (as opposed to the window)
1647 if (!mBufferInfo.mCrop.isEmpty()) {
1648 // if the buffer crop is defined, we use that
1649 return mBufferInfo.mCrop;
1650 } else if (mBufferInfo.mBuffer != nullptr) {
1651 // otherwise we use the whole buffer
1652 return mBufferInfo.mBuffer->getBounds();
1653 } else {
1654 // if we don't have a buffer yet, we use an empty/invalid crop
1655 return Rect();
1656 }
1657}
1658
1659uint32_t BufferStateLayer::getBufferTransform() const {
1660 return mBufferInfo.mTransform;
1661}
1662
1663ui::Dataspace BufferStateLayer::getDataSpace() const {
1664 return mBufferInfo.mDataspace;
1665}
1666
1667ui::Dataspace BufferStateLayer::translateDataspace(ui::Dataspace dataspace) {
1668 ui::Dataspace updatedDataspace = dataspace;
1669 // translate legacy dataspaces to modern dataspaces
1670 switch (dataspace) {
1671 case ui::Dataspace::SRGB:
1672 updatedDataspace = ui::Dataspace::V0_SRGB;
1673 break;
1674 case ui::Dataspace::SRGB_LINEAR:
1675 updatedDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1676 break;
1677 case ui::Dataspace::JFIF:
1678 updatedDataspace = ui::Dataspace::V0_JFIF;
1679 break;
1680 case ui::Dataspace::BT601_625:
1681 updatedDataspace = ui::Dataspace::V0_BT601_625;
1682 break;
1683 case ui::Dataspace::BT601_525:
1684 updatedDataspace = ui::Dataspace::V0_BT601_525;
1685 break;
1686 case ui::Dataspace::BT709:
1687 updatedDataspace = ui::Dataspace::V0_BT709;
1688 break;
1689 default:
1690 break;
1691 }
1692
1693 return updatedDataspace;
1694}
1695
1696sp<GraphicBuffer> BufferStateLayer::getBuffer() const {
1697 return mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getBuffer() : nullptr;
1698}
1699
1700void BufferStateLayer::getDrawingTransformMatrix(bool filteringEnabled, float outMatrix[16]) {
1701 sp<GraphicBuffer> buffer = getBuffer();
1702 if (!buffer) {
1703 ALOGE("Buffer should not be null!");
1704 return;
1705 }
1706 GLConsumer::computeTransformMatrix(outMatrix, buffer->getWidth(), buffer->getHeight(),
1707 buffer->getPixelFormat(), mBufferInfo.mCrop,
1708 mBufferInfo.mTransform, filteringEnabled);
1709}
1710
1711void BufferStateLayer::setInitialValuesForClone(const sp<Layer>& clonedFrom) {
1712 Layer::setInitialValuesForClone(clonedFrom);
1713
1714 sp<BufferStateLayer> bufferClonedFrom = static_cast<BufferStateLayer*>(clonedFrom.get());
1715 mPremultipliedAlpha = bufferClonedFrom->mPremultipliedAlpha;
1716 mPotentialCursor = bufferClonedFrom->mPotentialCursor;
1717 mProtectedByApp = bufferClonedFrom->mProtectedByApp;
1718
1719 updateCloneBufferInfo();
1720}
1721
1722void BufferStateLayer::updateCloneBufferInfo() {
1723 if (!isClone() || !isClonedFromAlive()) {
1724 return;
1725 }
1726
1727 sp<BufferStateLayer> clonedFrom = static_cast<BufferStateLayer*>(getClonedFrom().get());
1728 mBufferInfo = clonedFrom->mBufferInfo;
1729 mSidebandStream = clonedFrom->mSidebandStream;
1730 surfaceDamageRegion = clonedFrom->surfaceDamageRegion;
1731 mCurrentFrameNumber = clonedFrom->mCurrentFrameNumber.load();
1732 mPreviousFrameNumber = clonedFrom->mPreviousFrameNumber;
1733
1734 // After buffer info is updated, the drawingState from the real layer needs to be copied into
1735 // the cloned. This is because some properties of drawingState can change when latchBuffer is
1736 // called. However, copying the drawingState would also overwrite the cloned layer's relatives
1737 // and touchableRegionCrop. Therefore, temporarily store the relatives so they can be set in
1738 // the cloned drawingState again.
1739 wp<Layer> tmpZOrderRelativeOf = mDrawingState.zOrderRelativeOf;
1740 SortedVector<wp<Layer>> tmpZOrderRelatives = mDrawingState.zOrderRelatives;
1741 wp<Layer> tmpTouchableRegionCrop = mDrawingState.touchableRegionCrop;
1742 WindowInfo tmpInputInfo = mDrawingState.inputInfo;
1743
1744 cloneDrawingState(clonedFrom.get());
1745
1746 mDrawingState.touchableRegionCrop = tmpTouchableRegionCrop;
1747 mDrawingState.zOrderRelativeOf = tmpZOrderRelativeOf;
1748 mDrawingState.zOrderRelatives = tmpZOrderRelatives;
1749 mDrawingState.inputInfo = tmpInputInfo;
1750}
1751
1752void BufferStateLayer::setTransformHint(ui::Transform::RotationFlags displayTransformHint) {
1753 mTransformHint = getFixedTransformHint();
1754 if (mTransformHint == ui::Transform::ROT_INVALID) {
1755 mTransformHint = displayTransformHint;
1756 }
1757}
1758
1759const std::shared_ptr<renderengine::ExternalTexture>& BufferStateLayer::getExternalTexture() const {
1760 return mBufferInfo.mBuffer;
1761}
1762
Marissa Wall61c58622018-07-18 10:12:20 -07001763} // namespace android