xref: /aosp_15_r20/frameworks/native/services/surfaceflinger/Layer.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1 /*
2  * Copyright (C) 2007 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 // TODO(b/129481165): remove the #pragma below and fix conversion issues
18 
19 #pragma clang diagnostic push
20 #pragma clang diagnostic ignored "-Wconversion"
21 
22 //#define LOG_NDEBUG 0
23 #undef LOG_TAG
24 #define LOG_TAG "Layer"
25 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
26 
27 #include <android-base/properties.h>
28 #include <android-base/stringprintf.h>
29 #include <binder/IPCThreadState.h>
30 #include <common/trace.h>
31 #include <compositionengine/CompositionEngine.h>
32 #include <compositionengine/Display.h>
33 #include <compositionengine/LayerFECompositionState.h>
34 #include <compositionengine/OutputLayer.h>
35 #include <compositionengine/impl/OutputLayerCompositionState.h>
36 #include <cutils/compiler.h>
37 #include <cutils/native_handle.h>
38 #include <cutils/properties.h>
39 #include <ftl/enum.h>
40 #include <ftl/fake_guard.h>
41 #include <gui/BufferItem.h>
42 #include <gui/Surface.h>
43 #include <math.h>
44 #include <private/android_filesystem_config.h>
45 #include <renderengine/RenderEngine.h>
46 #include <stdint.h>
47 #include <stdlib.h>
48 #include <sys/types.h>
49 #include <system/graphics-base-v1.0.h>
50 #include <ui/DebugUtils.h>
51 #include <ui/FloatRect.h>
52 #include <ui/GraphicBuffer.h>
53 #include <ui/HdrRenderTypeUtils.h>
54 #include <ui/PixelFormat.h>
55 #include <ui/Rect.h>
56 #include <ui/Transform.h>
57 #include <utils/Errors.h>
58 #include <utils/Log.h>
59 #include <utils/NativeHandle.h>
60 #include <utils/StopWatch.h>
61 
62 #include <algorithm>
63 #include <optional>
64 
65 #include "DisplayDevice.h"
66 #include "DisplayHardware/HWComposer.h"
67 #include "FrameTimeline.h"
68 #include "FrameTracer/FrameTracer.h"
69 #include "FrontEnd/LayerCreationArgs.h"
70 #include "FrontEnd/LayerHandle.h"
71 #include "Layer.h"
72 #include "LayerProtoHelper.h"
73 #include "SurfaceFlinger.h"
74 #include "TimeStats/TimeStats.h"
75 #include "TransactionCallbackInvoker.h"
76 #include "TunnelModeEnabledReporter.h"
77 #include "Utils/FenceUtils.h"
78 
79 #define DEBUG_RESIZE 0
80 #define EARLY_RELEASE_ENABLED false
81 
82 namespace android {
83 using namespace std::chrono_literals;
84 namespace {
85 constexpr int kDumpTableRowLength = 159;
86 
87 const ui::Transform kIdentityTransform;
88 
frameRateToSetFrameRateVotePayload(Layer::FrameRate frameRate)89 TimeStats::SetFrameRateVote frameRateToSetFrameRateVotePayload(Layer::FrameRate frameRate) {
90     using FrameRateCompatibility = TimeStats::SetFrameRateVote::FrameRateCompatibility;
91     using Seamlessness = TimeStats::SetFrameRateVote::Seamlessness;
92     const auto frameRateCompatibility = [frameRate] {
93         switch (frameRate.vote.type) {
94             case Layer::FrameRateCompatibility::Default:
95                 return FrameRateCompatibility::Default;
96             case Layer::FrameRateCompatibility::ExactOrMultiple:
97                 return FrameRateCompatibility::ExactOrMultiple;
98             default:
99                 return FrameRateCompatibility::Undefined;
100         }
101     }();
102 
103     const auto seamlessness = [frameRate] {
104         switch (frameRate.vote.seamlessness) {
105             case scheduler::Seamlessness::OnlySeamless:
106                 return Seamlessness::ShouldBeSeamless;
107             case scheduler::Seamlessness::SeamedAndSeamless:
108                 return Seamlessness::NotRequired;
109             default:
110                 return Seamlessness::Undefined;
111         }
112     }();
113 
114     return TimeStats::SetFrameRateVote{.frameRate = frameRate.vote.rate.getValue(),
115                                        .frameRateCompatibility = frameRateCompatibility,
116                                        .seamlessness = seamlessness};
117 }
118 
119 } // namespace
120 
121 using namespace ftl::flag_operators;
122 
123 using base::StringAppendF;
124 using frontend::LayerSnapshot;
125 using frontend::RoundedCornerState;
126 using gui::GameMode;
127 using gui::LayerMetadata;
128 using gui::WindowInfo;
129 using ui::Size;
130 
131 using PresentState = frametimeline::SurfaceFrame::PresentState;
132 
Layer(const surfaceflinger::LayerCreationArgs & args)133 Layer::Layer(const surfaceflinger::LayerCreationArgs& args)
134       : sequence(args.sequence),
135         mFlinger(sp<SurfaceFlinger>::fromExisting(args.flinger)),
136         mName(base::StringPrintf("%s#%d", args.name.c_str(), sequence)),
137         mWindowType(static_cast<WindowInfo::Type>(
138                 args.metadata.getInt32(gui::METADATA_WINDOW_TYPE, 0))) {
139     ALOGV("Creating Layer %s", getDebugName());
140 
141     mDrawingState.crop = {0, 0, -1, -1};
142     mDrawingState.sequence = 0;
143     mDrawingState.transform.set(0, 0);
144     mDrawingState.frameNumber = 0;
145     mDrawingState.previousFrameNumber = 0;
146     mDrawingState.barrierFrameNumber = 0;
147     mDrawingState.producerId = 0;
148     mDrawingState.barrierProducerId = 0;
149     mDrawingState.bufferTransform = 0;
150     mDrawingState.transformToDisplayInverse = false;
151     mDrawingState.acquireFence = sp<Fence>::make(-1);
152     mDrawingState.acquireFenceTime = std::make_shared<FenceTime>(mDrawingState.acquireFence);
153     mDrawingState.dataspace = ui::Dataspace::V0_SRGB;
154     mDrawingState.metadata = args.metadata;
155     mDrawingState.frameTimelineInfo = {};
156     mDrawingState.postTime = -1;
157     mDeprecatedFrameTracker.setDisplayRefreshPeriod(
158             args.flinger->mScheduler->getPacesetterVsyncPeriod().ns());
159 
160     mOwnerUid = args.ownerUid;
161     mOwnerPid = args.ownerPid;
162     mOwnerAppId = mOwnerUid % PER_USER_RANGE;
163 
164     mPotentialCursor = args.flags & ISurfaceComposerClient::eCursorWindow;
165     mLayerFEs.emplace_back(frontend::LayerHierarchy::TraversalPath{static_cast<uint32_t>(sequence)},
166                            args.flinger->getFactory().createLayerFE(mName, this));
167 }
168 
onFirstRef()169 void Layer::onFirstRef() {
170     mFlinger->onLayerFirstRef(this);
171 }
172 
~Layer()173 Layer::~Layer() {
174     LOG_ALWAYS_FATAL_IF(std::this_thread::get_id() != mFlinger->mMainThreadId,
175                         "Layer destructor called off the main thread.");
176 
177     if (mBufferInfo.mBuffer != nullptr) {
178         callReleaseBufferCallback(mDrawingState.releaseBufferListener,
179                                   mBufferInfo.mBuffer->getBuffer(), mBufferInfo.mFrameNumber,
180                                   mBufferInfo.mFence);
181     }
182     const int32_t layerId = getSequence();
183     mFlinger->mTimeStats->onDestroy(layerId);
184     mFlinger->mFrameTracer->onDestroy(layerId);
185 
186     mFlinger->onLayerDestroyed(this);
187 
188     const auto currentTime = std::chrono::steady_clock::now();
189     if (mBufferInfo.mTimeSinceDataspaceUpdate > std::chrono::steady_clock::time_point::min()) {
190         mFlinger->mLayerEvents.emplace_back(mOwnerUid, getSequence(), mBufferInfo.mDataspace,
191                                             std::chrono::duration_cast<std::chrono::milliseconds>(
192                                                     currentTime -
193                                                     mBufferInfo.mTimeSinceDataspaceUpdate));
194     }
195 
196     if (mDrawingState.sidebandStream != nullptr) {
197         mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
198     }
199     if (hasTrustedPresentationListener()) {
200         mFlinger->mNumTrustedPresentationListeners--;
201         updateTrustedPresentationState(nullptr, nullptr, -1 /* time_in_ms */, true /* leaveState*/);
202     }
203 }
204 
205 // ---------------------------------------------------------------------------
206 // set-up
207 // ---------------------------------------------------------------------------
getHandle()208 sp<IBinder> Layer::getHandle() {
209     Mutex::Autolock _l(mLock);
210     if (mGetHandleCalled) {
211         ALOGE("Get handle called twice" );
212         return nullptr;
213     }
214     mGetHandleCalled = true;
215     mHandleAlive = true;
216     return sp<LayerHandle>::make(mFlinger, sp<Layer>::fromExisting(this));
217 }
218 
219 // ---------------------------------------------------------------------------
220 // h/w composer set-up
221 // ---------------------------------------------------------------------------
222 
223 // No early returns.
updateTrustedPresentationState(const DisplayDevice * display,const frontend::LayerSnapshot * snapshot,int64_t time_in_ms,bool leaveState)224 void Layer::updateTrustedPresentationState(const DisplayDevice* display,
225                                            const frontend::LayerSnapshot* snapshot,
226                                            int64_t time_in_ms, bool leaveState) {
227     if (!hasTrustedPresentationListener()) {
228         return;
229     }
230     const bool lastState = mLastComputedTrustedPresentationState;
231     mLastComputedTrustedPresentationState = false;
232 
233     if (!leaveState) {
234         const auto outputLayer = findOutputLayerForDisplay(display, snapshot->path);
235         if (outputLayer != nullptr) {
236             if (outputLayer->getState().coveredRegionExcludingDisplayOverlays) {
237                 Region coveredRegion =
238                         *outputLayer->getState().coveredRegionExcludingDisplayOverlays;
239                 mLastComputedTrustedPresentationState =
240                         computeTrustedPresentationState(snapshot->geomLayerBounds,
241                                                         snapshot->sourceBounds(), coveredRegion,
242                                                         snapshot->transformedBounds,
243                                                         snapshot->alpha,
244                                                         snapshot->geomLayerTransform,
245                                                         mTrustedPresentationThresholds);
246             } else {
247                 ALOGE("CoveredRegionExcludingDisplayOverlays was not set for %s. Don't compute "
248                       "TrustedPresentationState",
249                       getDebugName());
250             }
251         }
252     }
253     const bool newState = mLastComputedTrustedPresentationState;
254     if (lastState && !newState) {
255         // We were in the trusted presentation state, but now we left it,
256         // emit the callback if needed
257         if (mLastReportedTrustedPresentationState) {
258             mLastReportedTrustedPresentationState = false;
259             mTrustedPresentationListener.invoke(false);
260         }
261         // Reset the timer
262         mEnteredTrustedPresentationStateTime = -1;
263     } else if (!lastState && newState) {
264         // We were not in the trusted presentation state, but we entered it, begin the timer
265         // and make sure this gets called at least once more!
266         mEnteredTrustedPresentationStateTime = time_in_ms;
267         mFlinger->forceFutureUpdate(mTrustedPresentationThresholds.stabilityRequirementMs * 1.5);
268     }
269 
270     // Has the timer elapsed, but we are still in the state? Emit a callback if needed
271     if (!mLastReportedTrustedPresentationState && newState &&
272         (time_in_ms - mEnteredTrustedPresentationStateTime >
273          mTrustedPresentationThresholds.stabilityRequirementMs)) {
274         mLastReportedTrustedPresentationState = true;
275         mTrustedPresentationListener.invoke(true);
276     }
277 }
278 
279 /**
280  * See SurfaceComposerClient.h: setTrustedPresentationCallback for discussion
281  * of how the parameters and thresholds are interpreted. The general spirit is
282  * to produce an upper bound on the amount of the buffer which was presented.
283  */
computeTrustedPresentationState(const FloatRect & bounds,const FloatRect & sourceBounds,const Region & coveredRegion,const FloatRect & screenBounds,float alpha,const ui::Transform & effectiveTransform,const TrustedPresentationThresholds & thresholds)284 bool Layer::computeTrustedPresentationState(const FloatRect& bounds, const FloatRect& sourceBounds,
285                                             const Region& coveredRegion,
286                                             const FloatRect& screenBounds, float alpha,
287                                             const ui::Transform& effectiveTransform,
288                                             const TrustedPresentationThresholds& thresholds) {
289     if (alpha < thresholds.minAlpha) {
290         return false;
291     }
292     if (sourceBounds.getWidth() == 0 || sourceBounds.getHeight() == 0) {
293         return false;
294     }
295     if (screenBounds.getWidth() == 0 || screenBounds.getHeight() == 0) {
296         return false;
297     }
298 
299     const float sx = effectiveTransform.dsdx();
300     const float sy = effectiveTransform.dsdy();
301     float fractionRendered = std::min(sx * sy, 1.0f);
302 
303     float boundsOverSourceW = bounds.getWidth() / (float)sourceBounds.getWidth();
304     float boundsOverSourceH = bounds.getHeight() / (float)sourceBounds.getHeight();
305     fractionRendered *= boundsOverSourceW * boundsOverSourceH;
306 
307     Region tJunctionFreeRegion = Region::createTJunctionFreeRegion(coveredRegion);
308     // Compute the size of all the rects since they may be disconnected.
309     float coveredSize = 0;
310     for (auto rect = tJunctionFreeRegion.begin(); rect < tJunctionFreeRegion.end(); rect++) {
311         float size = rect->width() * rect->height();
312         coveredSize += size;
313     }
314 
315     fractionRendered *= (1 - (coveredSize / (screenBounds.getWidth() * screenBounds.getHeight())));
316 
317     if (fractionRendered < thresholds.minFractionRendered) {
318         return false;
319     }
320 
321     return true;
322 }
323 
getCroppedBufferSize(const State & s) const324 Rect Layer::getCroppedBufferSize(const State& s) const {
325     Rect size = getBufferSize(s);
326     Rect crop = Rect(getCrop(s));
327     if (!crop.isEmpty() && size.isValid()) {
328         size.intersect(crop, &size);
329     } else if (!crop.isEmpty()) {
330         size = crop;
331     }
332     return size;
333 }
334 
getDebugName() const335 const char* Layer::getDebugName() const {
336     return mName.c_str();
337 }
338 
339 // ---------------------------------------------------------------------------
340 // drawing...
341 // ---------------------------------------------------------------------------
342 
getCompositionType(const DisplayDevice & display) const343 aidl::android::hardware::graphics::composer3::Composition Layer::getCompositionType(
344         const DisplayDevice& display) const {
345     const auto outputLayer = findOutputLayerForDisplay(&display);
346     return getCompositionType(outputLayer);
347 }
348 
getCompositionType(const compositionengine::OutputLayer * outputLayer) const349 aidl::android::hardware::graphics::composer3::Composition Layer::getCompositionType(
350         const compositionengine::OutputLayer* outputLayer) const {
351     if (outputLayer == nullptr) {
352         return aidl::android::hardware::graphics::composer3::Composition::INVALID;
353     }
354     if (outputLayer->getState().hwc) {
355         return (*outputLayer->getState().hwc).hwcCompositionType;
356     } else {
357         return aidl::android::hardware::graphics::composer3::Composition::CLIENT;
358     }
359 }
360 
361 // ----------------------------------------------------------------------------
362 // transaction
363 // ----------------------------------------------------------------------------
364 
commitTransaction()365 void Layer::commitTransaction() {
366     // Set the present state for all bufferlessSurfaceFramesTX to Presented. The
367     // bufferSurfaceFrameTX will be presented in latchBuffer.
368     for (auto& [token, surfaceFrame] : mDrawingState.bufferlessSurfaceFramesTX) {
369         if (surfaceFrame->getPresentState() != PresentState::Presented) {
370             // With applyPendingStates, we could end up having presented surfaceframes from previous
371             // states
372             surfaceFrame->setPresentState(PresentState::Presented, mLastLatchTime);
373             mFlinger->mFrameTimeline->addSurfaceFrame(surfaceFrame);
374         }
375     }
376     mDrawingState.bufferlessSurfaceFramesTX.clear();
377 }
378 
setTransactionFlags(uint32_t mask)379 void Layer::setTransactionFlags(uint32_t mask) {
380     mTransactionFlags |= mask;
381 }
382 
setCrop(const FloatRect & crop)383 bool Layer::setCrop(const FloatRect& crop) {
384     if (mDrawingState.crop == crop) return false;
385     mDrawingState.sequence++;
386     mDrawingState.crop = crop;
387 
388     setTransactionFlags(eTransactionNeeded);
389     return true;
390 }
391 
isLayerFocusedBasedOnPriority(int32_t priority)392 bool Layer::isLayerFocusedBasedOnPriority(int32_t priority) {
393     return priority == PRIORITY_FOCUSED_WITH_MODE || priority == PRIORITY_FOCUSED_WITHOUT_MODE;
394 };
395 
setFrameTimelineVsyncForBufferTransaction(const FrameTimelineInfo & info,nsecs_t postTime,gui::GameMode gameMode)396 void Layer::setFrameTimelineVsyncForBufferTransaction(const FrameTimelineInfo& info,
397                                                       nsecs_t postTime, gui::GameMode gameMode) {
398     mDrawingState.postTime = postTime;
399 
400     // Check if one of the bufferlessSurfaceFramesTX contains the same vsyncId. This can happen if
401     // there are two transactions with the same token, the first one without a buffer and the
402     // second one with a buffer. We promote the bufferlessSurfaceFrame to a bufferSurfaceFrameTX
403     // in that case.
404     auto it = mDrawingState.bufferlessSurfaceFramesTX.find(info.vsyncId);
405     if (it != mDrawingState.bufferlessSurfaceFramesTX.end()) {
406         // Promote the bufferlessSurfaceFrame to a bufferSurfaceFrameTX
407         mDrawingState.bufferSurfaceFrameTX = it->second;
408         mDrawingState.bufferlessSurfaceFramesTX.erase(it);
409         mDrawingState.bufferSurfaceFrameTX->promoteToBuffer();
410         mDrawingState.bufferSurfaceFrameTX->setActualQueueTime(postTime);
411     } else {
412         mDrawingState.bufferSurfaceFrameTX =
413                 createSurfaceFrameForBuffer(info, postTime, mTransactionName, gameMode);
414     }
415 
416     setFrameTimelineVsyncForSkippedFrames(info, postTime, mTransactionName, gameMode);
417 }
418 
setFrameTimelineVsyncForBufferlessTransaction(const FrameTimelineInfo & info,nsecs_t postTime,gui::GameMode gameMode)419 void Layer::setFrameTimelineVsyncForBufferlessTransaction(const FrameTimelineInfo& info,
420                                                           nsecs_t postTime,
421                                                           gui::GameMode gameMode) {
422     mDrawingState.frameTimelineInfo = info;
423     mDrawingState.postTime = postTime;
424     setTransactionFlags(eTransactionNeeded);
425 
426     if (const auto& bufferSurfaceFrameTX = mDrawingState.bufferSurfaceFrameTX;
427         bufferSurfaceFrameTX != nullptr) {
428         if (bufferSurfaceFrameTX->getToken() == info.vsyncId) {
429             // BufferSurfaceFrame takes precedence over BufferlessSurfaceFrame. If the same token is
430             // being used for BufferSurfaceFrame, don't create a new one.
431             return;
432         }
433     }
434     // For Transactions without a buffer, we create only one SurfaceFrame per vsyncId. If multiple
435     // transactions use the same vsyncId, we just treat them as one SurfaceFrame (unless they are
436     // targeting different vsyncs).
437     auto it = mDrawingState.bufferlessSurfaceFramesTX.find(info.vsyncId);
438     if (it == mDrawingState.bufferlessSurfaceFramesTX.end()) {
439         auto surfaceFrame = createSurfaceFrameForTransaction(info, postTime, gameMode);
440         mDrawingState.bufferlessSurfaceFramesTX[info.vsyncId] = surfaceFrame;
441     } else {
442         if (it->second->getPresentState() == PresentState::Presented) {
443             // If the SurfaceFrame was already presented, its safe to overwrite it since it must
444             // have been from previous vsync.
445             it->second = createSurfaceFrameForTransaction(info, postTime, gameMode);
446         }
447     }
448 
449     setFrameTimelineVsyncForSkippedFrames(info, postTime, mTransactionName, gameMode);
450 }
451 
addSurfaceFrameDroppedForBuffer(std::shared_ptr<frametimeline::SurfaceFrame> & surfaceFrame,nsecs_t dropTime)452 void Layer::addSurfaceFrameDroppedForBuffer(
453         std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame, nsecs_t dropTime) {
454     surfaceFrame->setDropTime(dropTime);
455     surfaceFrame->setPresentState(PresentState::Dropped);
456     mFlinger->mFrameTimeline->addSurfaceFrame(surfaceFrame);
457 }
458 
addSurfaceFramePresentedForBuffer(std::shared_ptr<frametimeline::SurfaceFrame> & surfaceFrame,nsecs_t acquireFenceTime,nsecs_t currentLatchTime)459 void Layer::addSurfaceFramePresentedForBuffer(
460         std::shared_ptr<frametimeline::SurfaceFrame>& surfaceFrame, nsecs_t acquireFenceTime,
461         nsecs_t currentLatchTime) {
462     surfaceFrame->setAcquireFenceTime(acquireFenceTime);
463     surfaceFrame->setPresentState(PresentState::Presented, mLastLatchTime);
464     mFlinger->mFrameTimeline->addSurfaceFrame(surfaceFrame);
465     updateLastLatchTime(currentLatchTime);
466 }
467 
createSurfaceFrameForTransaction(const FrameTimelineInfo & info,nsecs_t postTime,gui::GameMode gameMode)468 std::shared_ptr<frametimeline::SurfaceFrame> Layer::createSurfaceFrameForTransaction(
469         const FrameTimelineInfo& info, nsecs_t postTime, gui::GameMode gameMode) {
470     auto surfaceFrame =
471             mFlinger->mFrameTimeline->createSurfaceFrameForToken(info, mOwnerPid, mOwnerUid,
472                                                                  getSequence(), mName,
473                                                                  mTransactionName,
474                                                                  /*isBuffer*/ false, gameMode);
475     // Buffer hasn't yet been latched, so use mDrawingState
476     surfaceFrame->setDesiredPresentTime(mDrawingState.desiredPresentTime);
477 
478     surfaceFrame->setActualStartTime(info.startTimeNanos);
479     // For Transactions, the post time is considered to be both queue and acquire fence time.
480     surfaceFrame->setActualQueueTime(postTime);
481     surfaceFrame->setAcquireFenceTime(postTime);
482     const auto fps = mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
483     if (fps) {
484         surfaceFrame->setRenderRate(*fps);
485     }
486     return surfaceFrame;
487 }
488 
createSurfaceFrameForBuffer(const FrameTimelineInfo & info,nsecs_t queueTime,std::string debugName,gui::GameMode gameMode)489 std::shared_ptr<frametimeline::SurfaceFrame> Layer::createSurfaceFrameForBuffer(
490         const FrameTimelineInfo& info, nsecs_t queueTime, std::string debugName,
491         gui::GameMode gameMode) {
492     auto surfaceFrame =
493             mFlinger->mFrameTimeline->createSurfaceFrameForToken(info, mOwnerPid, mOwnerUid,
494                                                                  getSequence(), mName, debugName,
495                                                                  /*isBuffer*/ true, gameMode);
496     // Buffer hasn't yet been latched, so use mDrawingState
497     surfaceFrame->setDesiredPresentTime(mDrawingState.desiredPresentTime);
498     surfaceFrame->setActualStartTime(info.startTimeNanos);
499     // For buffers, acquire fence time will set during latch.
500     surfaceFrame->setActualQueueTime(queueTime);
501     const auto fps = mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
502     if (fps) {
503         surfaceFrame->setRenderRate(*fps);
504     }
505     return surfaceFrame;
506 }
507 
setFrameTimelineVsyncForSkippedFrames(const FrameTimelineInfo & info,nsecs_t postTime,std::string debugName,gui::GameMode gameMode)508 void Layer::setFrameTimelineVsyncForSkippedFrames(const FrameTimelineInfo& info, nsecs_t postTime,
509                                                   std::string debugName, gui::GameMode gameMode) {
510     if (info.skippedFrameVsyncId == FrameTimelineInfo::INVALID_VSYNC_ID) {
511         return;
512     }
513 
514     FrameTimelineInfo skippedFrameTimelineInfo = info;
515     skippedFrameTimelineInfo.vsyncId = info.skippedFrameVsyncId;
516 
517     auto surfaceFrame =
518             mFlinger->mFrameTimeline->createSurfaceFrameForToken(skippedFrameTimelineInfo,
519                                                                  mOwnerPid, mOwnerUid,
520                                                                  getSequence(), mName, debugName,
521                                                                  /*isBuffer*/ false, gameMode);
522     // Buffer hasn't yet been latched, so use mDrawingState
523     surfaceFrame->setDesiredPresentTime(mDrawingState.desiredPresentTime);
524     surfaceFrame->setActualStartTime(skippedFrameTimelineInfo.skippedFrameStartTimeNanos);
525     // For Transactions, the post time is considered to be both queue and acquire fence time.
526     surfaceFrame->setActualQueueTime(postTime);
527     surfaceFrame->setAcquireFenceTime(postTime);
528     const auto fps = mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
529     if (fps) {
530         surfaceFrame->setRenderRate(*fps);
531     }
532     addSurfaceFrameDroppedForBuffer(surfaceFrame, postTime);
533 }
534 
setFrameRateForLayerTree(FrameRate frameRate,const scheduler::LayerProps & layerProps,nsecs_t now)535 bool Layer::setFrameRateForLayerTree(FrameRate frameRate, const scheduler::LayerProps& layerProps,
536                                      nsecs_t now) {
537     if (mDrawingState.frameRateForLayerTree == frameRate) {
538         return false;
539     }
540 
541     mDrawingState.frameRateForLayerTree = frameRate;
542     mFlinger->mScheduler
543             ->recordLayerHistory(sequence, layerProps, now, now,
544                                  scheduler::LayerHistory::LayerUpdateType::SetFrameRate);
545     return true;
546 }
547 
getFrameRateForLayerTree() const548 Layer::FrameRate Layer::getFrameRateForLayerTree() const {
549     return getDrawingState().frameRateForLayerTree;
550 }
551 
552 // ----------------------------------------------------------------------------
553 // debugging
554 // ----------------------------------------------------------------------------
555 
miniDumpHeader(std::string & result)556 void Layer::miniDumpHeader(std::string& result) {
557     result.append(kDumpTableRowLength, '-');
558     result.append("\n");
559     result.append(" Layer name\n");
560     result.append("           Z | ");
561     result.append(" Window Type | ");
562     result.append(" Comp Type | ");
563     result.append(" Transform | ");
564     result.append("  Disp Frame (LTRB) | ");
565     result.append("         Source Crop (LTRB) | ");
566     result.append("    Frame Rate (Explicit) (Seamlessness) [Focused]\n");
567     result.append(kDumpTableRowLength, '-');
568     result.append("\n");
569 }
570 
miniDump(std::string & result,const frontend::LayerSnapshot & snapshot,const DisplayDevice & display) const571 void Layer::miniDump(std::string& result, const frontend::LayerSnapshot& snapshot,
572                      const DisplayDevice& display) const {
573     const auto outputLayer = findOutputLayerForDisplay(&display, snapshot.path);
574     if (!outputLayer) {
575         return;
576     }
577 
578     StringAppendF(&result, " %s\n", snapshot.debugName.c_str());
579     StringAppendF(&result, "  %10zu | ", snapshot.globalZ);
580     StringAppendF(&result, "  %10d | ",
581                   snapshot.layerMetadata.getInt32(gui::METADATA_WINDOW_TYPE, 0));
582     StringAppendF(&result, "%10s | ", toString(getCompositionType(outputLayer)).c_str());
583     const auto& outputLayerState = outputLayer->getState();
584     StringAppendF(&result, "%10s | ", toString(outputLayerState.bufferTransform).c_str());
585     const Rect& frame = outputLayerState.displayFrame;
586     StringAppendF(&result, "%4d %4d %4d %4d | ", frame.left, frame.top, frame.right, frame.bottom);
587     const FloatRect& crop = outputLayerState.sourceCrop;
588     StringAppendF(&result, "%6.1f %6.1f %6.1f %6.1f | ", crop.left, crop.top, crop.right,
589                   crop.bottom);
590     const auto frameRate = snapshot.frameRate;
591     std::string frameRateStr;
592     if (frameRate.vote.rate.isValid()) {
593         StringAppendF(&frameRateStr, "%.2f", frameRate.vote.rate.getValue());
594     }
595     if (frameRate.vote.rate.isValid() || frameRate.vote.type != FrameRateCompatibility::Default) {
596         StringAppendF(&result, "%6s %15s %17s", frameRateStr.c_str(),
597                       ftl::enum_string(frameRate.vote.type).c_str(),
598                       ftl::enum_string(frameRate.vote.seamlessness).c_str());
599     } else if (frameRate.category != FrameRateCategory::Default) {
600         StringAppendF(&result, "%6s %15s %17s", frameRateStr.c_str(),
601                       (std::string("Cat::") + ftl::enum_string(frameRate.category)).c_str(),
602                       ftl::enum_string(frameRate.vote.seamlessness).c_str());
603     } else {
604         result.append(41, ' ');
605     }
606 
607     const auto focused = isLayerFocusedBasedOnPriority(snapshot.frameRateSelectionPriority);
608     StringAppendF(&result, "    [%s]\n", focused ? "*" : " ");
609 
610     result.append(kDumpTableRowLength, '-');
611     result.append("\n");
612 }
613 
dumpFrameStats(std::string & result) const614 void Layer::dumpFrameStats(std::string& result) const {
615     if (FlagManager::getInstance().deprecate_frame_tracker()) {
616         FrameStats fs = FrameStats();
617         getFrameStats(&fs);
618         for (auto desired = fs.desiredPresentTimesNano.begin(),
619                   actual = fs.actualPresentTimesNano.begin(),
620                   ready = fs.frameReadyTimesNano.begin();
621              desired != fs.desiredPresentTimesNano.end() &&
622              actual != fs.actualPresentTimesNano.end() && ready != fs.frameReadyTimesNano.end();
623              ++desired, ++actual, ++ready) {
624             result.append(std::format("{}\t{}\t{}\n", *desired, *actual, *ready));
625         }
626 
627         result.push_back('\n');
628     } else {
629         mDeprecatedFrameTracker.dumpStats(result);
630     }
631 }
632 
clearFrameStats()633 void Layer::clearFrameStats() {
634     if (FlagManager::getInstance().deprecate_frame_tracker()) {
635         mFrameStatsHistorySize = 0;
636     } else {
637         mDeprecatedFrameTracker.clearStats();
638     }
639 }
640 
getFrameStats(FrameStats * outStats) const641 void Layer::getFrameStats(FrameStats* outStats) const {
642     if (FlagManager::getInstance().deprecate_frame_tracker()) {
643         if (auto ftl = getTimeline()) {
644             float fps = ftl->get().computeFps({getSequence()});
645             ftl->get().generateFrameStats(getSequence(), mFrameStatsHistorySize, outStats);
646             outStats->refreshPeriodNano = Fps::fromValue(fps).getPeriodNsecs();
647         }
648     } else {
649         mDeprecatedFrameTracker.getStats(outStats);
650     }
651 }
652 
onDisconnect()653 void Layer::onDisconnect() {
654     const int32_t layerId = getSequence();
655     mFlinger->mTimeStats->onDestroy(layerId);
656     mFlinger->mFrameTracer->onDestroy(layerId);
657 }
658 
writeCompositionStateToProto(perfetto::protos::LayerProto * layerProto,ui::LayerStack layerStack)659 void Layer::writeCompositionStateToProto(perfetto::protos::LayerProto* layerProto,
660                                          ui::LayerStack layerStack) {
661     ftl::FakeGuard guard(mFlinger->mStateLock); // Called from the main thread.
662     ftl::FakeGuard mainThreadGuard(kMainThreadContext);
663 
664     // Only populate for the primary display.
665     if (const auto display = mFlinger->getDisplayFromLayerStack(layerStack)) {
666         const auto compositionType = getCompositionType(*display);
667         layerProto->set_hwc_composition_type(
668                 static_cast<perfetto::protos::HwcCompositionType>(compositionType));
669         LayerProtoHelper::writeToProto(getVisibleRegion(display),
670                                        [&]() { return layerProto->mutable_visible_region(); });
671     }
672 }
673 
findOutputLayerForDisplay(const DisplayDevice * display) const674 compositionengine::OutputLayer* Layer::findOutputLayerForDisplay(
675         const DisplayDevice* display) const {
676     if (!display) return nullptr;
677     sp<LayerFE> layerFE;
678     frontend::LayerHierarchy::TraversalPath path{.id = static_cast<uint32_t>(sequence)};
679     for (auto& [p, layer] : mLayerFEs) {
680         if (p == path) {
681             layerFE = layer;
682         }
683     }
684 
685     if (!layerFE) return nullptr;
686     return display->getCompositionDisplay()->getOutputLayerForLayer(layerFE);
687 }
688 
findOutputLayerForDisplay(const DisplayDevice * display,const frontend::LayerHierarchy::TraversalPath & path) const689 compositionengine::OutputLayer* Layer::findOutputLayerForDisplay(
690         const DisplayDevice* display, const frontend::LayerHierarchy::TraversalPath& path) const {
691     if (!display) return nullptr;
692     sp<LayerFE> layerFE;
693     for (auto& [p, layer] : mLayerFEs) {
694         if (p == path) {
695             layerFE = layer;
696         }
697     }
698 
699     if (!layerFE) return nullptr;
700     return display->getCompositionDisplay()->getOutputLayerForLayer(layerFE);
701 }
702 
getVisibleRegion(const DisplayDevice * display) const703 Region Layer::getVisibleRegion(const DisplayDevice* display) const {
704     const auto outputLayer = findOutputLayerForDisplay(display);
705     return outputLayer ? outputLayer->getState().visibleRegion : Region();
706 }
707 
callReleaseBufferCallback(const sp<ITransactionCompletedListener> & listener,const sp<GraphicBuffer> & buffer,uint64_t framenumber,const sp<Fence> & releaseFence)708 void Layer::callReleaseBufferCallback(const sp<ITransactionCompletedListener>& listener,
709                                       const sp<GraphicBuffer>& buffer, uint64_t framenumber,
710                                       const sp<Fence>& releaseFence) {
711     if (!listener && !mBufferReleaseChannel) {
712         return;
713     }
714 
715     SFTRACE_FORMAT_INSTANT("callReleaseBufferCallback %s - %" PRIu64, getDebugName(), framenumber);
716 
717     ReleaseCallbackId callbackId{buffer->getId(), framenumber};
718     const sp<Fence>& fence = releaseFence ? releaseFence : Fence::NO_FENCE;
719     uint32_t currentMaxAcquiredBufferCount =
720             mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);
721 
722     if (listener) {
723         listener->onReleaseBuffer(callbackId, fence, currentMaxAcquiredBufferCount);
724     }
725 
726     if (!mBufferReleaseChannel) {
727         return;
728     }
729 
730     status_t status = mBufferReleaseChannel->writeReleaseFence(callbackId, fence,
731                                                                currentMaxAcquiredBufferCount);
732     if (status != OK) {
733         int error = -status;
734         // callReleaseBufferCallback is called during Layer's destructor. In this case, it's
735         // expected to receive connection errors.
736         if (error != EPIPE && error != ECONNRESET) {
737             ALOGD("[%s] writeReleaseFence failed. error %d (%s)", getDebugName(), error,
738                   strerror(error));
739         }
740     }
741 }
742 
findCallbackHandle()743 sp<CallbackHandle> Layer::findCallbackHandle() {
744     // If we are displayed on multiple displays in a single composition cycle then we would
745     // need to do careful tracking to enable the use of the mLastClientCompositionFence.
746     //  For example we can only use it if all the displays are client comp, and we need
747     //  to merge all the client comp fences. We could do this, but for now we just
748     // disable the optimization when a layer is composed on multiple displays.
749     if (mClearClientCompositionFenceOnLayerDisplayed) {
750         mLastClientCompositionFence = nullptr;
751     } else {
752         mClearClientCompositionFenceOnLayerDisplayed = true;
753     }
754 
755     // The previous release fence notifies the client that SurfaceFlinger is done with the previous
756     // buffer that was presented on this layer. The first transaction that came in this frame that
757     // replaced the previous buffer on this layer needs this release fence, because the fence will
758     // let the client know when that previous buffer is removed from the screen.
759     //
760     // Every other transaction on this layer does not need a release fence because no other
761     // Transactions that were set on this layer this frame are going to have their preceding buffer
762     // removed from the display this frame.
763     //
764     // For example, if we have 3 transactions this frame. The first transaction doesn't contain a
765     // buffer so it doesn't need a previous release fence because the layer still needs the previous
766     // buffer. The second transaction contains a buffer so it needs a previous release fence because
767     // the previous buffer will be released this frame. The third transaction also contains a
768     // buffer. It replaces the buffer in the second transaction. The buffer in the second
769     // transaction will now no longer be presented so it is released immediately and the third
770     // transaction doesn't need a previous release fence.
771     sp<CallbackHandle> ch;
772     for (auto& handle : mDrawingState.callbackHandles) {
773         if (handle->releasePreviousBuffer && mPreviousReleaseBufferEndpoint == handle->listener) {
774             ch = handle;
775             break;
776         }
777     }
778     return ch;
779 }
780 
prepareReleaseCallbacks(ftl::Future<FenceResult> futureFenceResult,ui::LayerStack layerStack)781 void Layer::prepareReleaseCallbacks(ftl::Future<FenceResult> futureFenceResult,
782                                     ui::LayerStack layerStack) {
783     sp<CallbackHandle> ch = findCallbackHandle();
784 
785     if (ch != nullptr) {
786         ch->previousReleaseCallbackId = mPreviousReleaseCallbackId;
787         ch->previousReleaseFences.emplace_back(std::move(futureFenceResult));
788         ch->name = mName;
789     } else {
790         // If we didn't get a release callback yet (e.g. some scenarios when capturing
791         // screenshots asynchronously) then make sure we don't drop the fence.
792         // Older fences for the same layer stack can be dropped when a new fence arrives.
793         // An assumption here is that RenderEngine performs work sequentially, so an
794         // incoming fence will not fire before an existing fence.
795         mAdditionalPreviousReleaseFences.emplace_or_replace(layerStack,
796                                                             std::move(futureFenceResult));
797     }
798 
799     if (mBufferInfo.mBuffer) {
800         mPreviouslyPresentedLayerStacks.push_back(layerStack);
801     }
802 
803     if (mDrawingState.frameNumber > 0) {
804         mDrawingState.previousFrameNumber = mDrawingState.frameNumber;
805     }
806 }
807 
releasePendingBuffer(nsecs_t dequeueReadyTime)808 void Layer::releasePendingBuffer(nsecs_t dequeueReadyTime) {
809     for (const auto& handle : mDrawingState.callbackHandles) {
810         handle->bufferReleaseChannel = mBufferReleaseChannel;
811         handle->transformHint = mTransformHint;
812         handle->dequeueReadyTime = dequeueReadyTime;
813         handle->currentMaxAcquiredBufferCount =
814                 mFlinger->getMaxAcquiredBufferCountForCurrentRefreshRate(mOwnerUid);
815         SFTRACE_FORMAT_INSTANT("releasePendingBuffer %s - %" PRIu64, getDebugName(),
816                                handle->previousReleaseCallbackId.framenumber);
817     }
818 
819     for (auto& handle : mDrawingState.callbackHandles) {
820         if (handle->releasePreviousBuffer && mPreviousReleaseBufferEndpoint == handle->listener) {
821             handle->previousReleaseCallbackId = mPreviousReleaseCallbackId;
822             break;
823         }
824     }
825 
826     mFlinger->getTransactionCallbackInvoker().addCallbackHandles(mDrawingState.callbackHandles);
827     mDrawingState.callbackHandles = {};
828 }
829 
setTransform(uint32_t transform)830 bool Layer::setTransform(uint32_t transform) {
831     if (mDrawingState.bufferTransform == transform) return false;
832     mDrawingState.bufferTransform = transform;
833     setTransactionFlags(eTransactionNeeded);
834     return true;
835 }
836 
setTransformToDisplayInverse(bool transformToDisplayInverse)837 bool Layer::setTransformToDisplayInverse(bool transformToDisplayInverse) {
838     if (mDrawingState.transformToDisplayInverse == transformToDisplayInverse) return false;
839     mDrawingState.sequence++;
840     mDrawingState.transformToDisplayInverse = transformToDisplayInverse;
841     setTransactionFlags(eTransactionNeeded);
842     return true;
843 }
844 
releasePreviousBuffer()845 void Layer::releasePreviousBuffer() {
846     mReleasePreviousBuffer = true;
847     if (!mBufferInfo.mBuffer ||
848         (!mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer) ||
849          mDrawingState.frameNumber != mBufferInfo.mFrameNumber)) {
850         // If mDrawingState has a buffer, and we are about to update again
851         // before swapping to drawing state, then the first buffer will be
852         // dropped and we should decrement the pending buffer count and
853         // call any release buffer callbacks if set.
854         callReleaseBufferCallback(mDrawingState.releaseBufferListener,
855                                   mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
856                                   mDrawingState.acquireFence);
857         const int32_t layerId = getSequence();
858         mFlinger->mTimeStats->removeTimeRecord(layerId, mDrawingState.frameNumber);
859         decrementPendingBufferCount();
860         if (mDrawingState.bufferSurfaceFrameTX != nullptr &&
861             mDrawingState.bufferSurfaceFrameTX->getPresentState() != PresentState::Presented) {
862             addSurfaceFrameDroppedForBuffer(mDrawingState.bufferSurfaceFrameTX, systemTime());
863             mDrawingState.bufferSurfaceFrameTX.reset();
864         }
865     } else if (EARLY_RELEASE_ENABLED && mLastClientCompositionFence != nullptr) {
866         callReleaseBufferCallback(mDrawingState.releaseBufferListener,
867                                   mDrawingState.buffer->getBuffer(), mDrawingState.frameNumber,
868                                   mLastClientCompositionFence);
869         mLastClientCompositionFence = nullptr;
870     }
871 }
872 
resetDrawingStateBufferInfo()873 void Layer::resetDrawingStateBufferInfo() {
874     mDrawingState.producerId = 0;
875     mDrawingState.frameNumber = 0;
876     mDrawingState.previousFrameNumber = 0;
877     mDrawingState.releaseBufferListener = nullptr;
878     mDrawingState.buffer = nullptr;
879     mDrawingState.acquireFence = sp<Fence>::make(-1);
880     mDrawingState.acquireFenceTime = std::make_unique<FenceTime>(mDrawingState.acquireFence);
881     mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFenceTime->getSignalTime();
882     mDrawingState.releaseBufferEndpoint = nullptr;
883 }
884 
setBuffer(std::shared_ptr<renderengine::ExternalTexture> & buffer,const BufferData & bufferData,nsecs_t postTime,nsecs_t desiredPresentTime,bool isAutoTimestamp,const FrameTimelineInfo & info,gui::GameMode gameMode)885 bool Layer::setBuffer(std::shared_ptr<renderengine::ExternalTexture>& buffer,
886                       const BufferData& bufferData, nsecs_t postTime, nsecs_t desiredPresentTime,
887                       bool isAutoTimestamp, const FrameTimelineInfo& info, gui::GameMode gameMode) {
888     SFTRACE_FORMAT("setBuffer %s - hasBuffer=%s", getDebugName(), (buffer ? "true" : "false"));
889 
890     const bool frameNumberChanged =
891             bufferData.flags.test(BufferData::BufferDataChange::frameNumberChanged);
892     const uint64_t frameNumber =
893             frameNumberChanged ? bufferData.frameNumber : mDrawingState.frameNumber + 1;
894     SFTRACE_FORMAT_INSTANT("setBuffer %s - %" PRIu64, getDebugName(), frameNumber);
895 
896     if (mDrawingState.buffer) {
897         releasePreviousBuffer();
898     } else if (buffer) {
899         // if we are latching a buffer for the first time then clear the mLastLatchTime since
900         // we don't want to incorrectly classify a frame if we miss the desired present time.
901         updateLastLatchTime(0);
902     }
903 
904     mDrawingState.desiredPresentTime = desiredPresentTime;
905     mDrawingState.isAutoTimestamp = isAutoTimestamp;
906     mDrawingState.latchedVsyncId = info.vsyncId;
907     mDrawingState.useVsyncIdForRefreshRateSelection = info.useForRefreshRateSelection;
908     if (!buffer) {
909         resetDrawingStateBufferInfo();
910         setTransactionFlags(eTransactionNeeded);
911         mDrawingState.bufferSurfaceFrameTX = nullptr;
912         setFrameTimelineVsyncForBufferlessTransaction(info, postTime, gameMode);
913         return true;
914     } else {
915         // release sideband stream if it exists and a non null buffer is being set
916         if (mDrawingState.sidebandStream != nullptr) {
917             setSidebandStream(nullptr, info, postTime, gameMode);
918         }
919     }
920 
921     if ((mDrawingState.producerId > bufferData.producerId) ||
922         ((mDrawingState.producerId == bufferData.producerId) &&
923          (mDrawingState.frameNumber > frameNumber))) {
924         ALOGE("Out of order buffers detected for %s producedId=%d frameNumber=%" PRIu64
925               " -> producedId=%d frameNumber=%" PRIu64,
926               getDebugName(), mDrawingState.producerId, mDrawingState.frameNumber,
927               bufferData.producerId, frameNumber);
928         TransactionTraceWriter::getInstance().invoke("out_of_order_buffers_", /*overwrite=*/false);
929     }
930 
931     mDrawingState.producerId = bufferData.producerId;
932     mDrawingState.barrierProducerId =
933             std::max(mDrawingState.producerId, mDrawingState.barrierProducerId);
934     mDrawingState.frameNumber = frameNumber;
935     mDrawingState.barrierFrameNumber =
936             std::max(mDrawingState.frameNumber, mDrawingState.barrierFrameNumber);
937 
938     mDrawingState.releaseBufferListener = bufferData.releaseBufferListener;
939     mDrawingState.buffer = std::move(buffer);
940     mDrawingState.acquireFence = bufferData.flags.test(BufferData::BufferDataChange::fenceChanged)
941             ? bufferData.acquireFence
942             : Fence::NO_FENCE;
943     mDrawingState.acquireFenceTime = std::make_unique<FenceTime>(mDrawingState.acquireFence);
944     if (mDrawingState.acquireFenceTime->getSignalTime() == Fence::SIGNAL_TIME_PENDING) {
945         // We latched this buffer unsiganled, so we need to pass the acquire fence
946         // on the callback instead of just the acquire time, since it's unknown at
947         // this point.
948         mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFence;
949     } else {
950         mCallbackHandleAcquireTimeOrFence = mDrawingState.acquireFenceTime->getSignalTime();
951     }
952     setTransactionFlags(eTransactionNeeded);
953 
954     const int32_t layerId = getSequence();
955     mFlinger->mTimeStats->setPostTime(layerId, mDrawingState.frameNumber, getName().c_str(),
956                                       mOwnerUid, postTime, gameMode);
957 
958     setFrameTimelineVsyncForBufferTransaction(info, postTime, gameMode);
959 
960     if (bufferData.dequeueTime > 0) {
961         const uint64_t bufferId = mDrawingState.buffer->getId();
962         mFlinger->mFrameTracer->traceNewLayer(layerId, getName().c_str());
963         mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber,
964                                                bufferData.dequeueTime,
965                                                FrameTracer::FrameEvent::DEQUEUE);
966         mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, postTime,
967                                                FrameTracer::FrameEvent::QUEUE);
968     }
969 
970     mDrawingState.releaseBufferEndpoint = bufferData.releaseBufferEndpoint;
971 
972     // If the layer had been updated a TextureView, this would make sure the present time could be
973     // same to TextureView update when it's a small dirty, and get the correct heuristic rate.
974     if (mFlinger->mScheduler->supportSmallDirtyDetection(mOwnerAppId)) {
975         if (mDrawingState.useVsyncIdForRefreshRateSelection) {
976             mUsedVsyncIdForRefreshRateSelection = true;
977         }
978     }
979     return true;
980 }
981 
setDesiredPresentTime(nsecs_t desiredPresentTime,bool isAutoTimestamp)982 void Layer::setDesiredPresentTime(nsecs_t desiredPresentTime, bool isAutoTimestamp) {
983     mDrawingState.desiredPresentTime = desiredPresentTime;
984     mDrawingState.isAutoTimestamp = isAutoTimestamp;
985 }
986 
recordLayerHistoryBufferUpdate(const scheduler::LayerProps & layerProps,nsecs_t now)987 void Layer::recordLayerHistoryBufferUpdate(const scheduler::LayerProps& layerProps, nsecs_t now) {
988     SFTRACE_CALL();
989     const nsecs_t presentTime = [&] {
990         if (!mDrawingState.isAutoTimestamp) {
991             SFTRACE_FORMAT_INSTANT("desiredPresentTime");
992             return mDrawingState.desiredPresentTime;
993         }
994 
995         if (mDrawingState.useVsyncIdForRefreshRateSelection) {
996             const auto prediction =
997                     mFlinger->mFrameTimeline->getTokenManager()->getPredictionsForToken(
998                             mDrawingState.latchedVsyncId);
999             if (prediction.has_value()) {
1000                 SFTRACE_FORMAT_INSTANT("predictedPresentTime");
1001                 mMaxTimeForUseVsyncId = prediction->presentTime +
1002                         scheduler::LayerHistory::kMaxPeriodForHistory.count();
1003                 return prediction->presentTime;
1004             }
1005         }
1006 
1007         if (!mFlinger->mScheduler->supportSmallDirtyDetection(mOwnerAppId)) {
1008             return static_cast<nsecs_t>(0);
1009         }
1010 
1011         // If the layer is not an application and didn't set an explicit rate or desiredPresentTime,
1012         // return "0" to tell the layer history that it will use the max refresh rate without
1013         // calculating the adaptive rate.
1014         if (mWindowType != WindowInfo::Type::APPLICATION &&
1015             mWindowType != WindowInfo::Type::BASE_APPLICATION) {
1016             return static_cast<nsecs_t>(0);
1017         }
1018 
1019         // Return the valid present time only when the layer potentially updated a TextureView so
1020         // LayerHistory could heuristically calculate the rate if the UI is continually updating.
1021         if (mUsedVsyncIdForRefreshRateSelection) {
1022             const auto prediction =
1023                     mFlinger->mFrameTimeline->getTokenManager()->getPredictionsForToken(
1024                             mDrawingState.latchedVsyncId);
1025             if (prediction.has_value()) {
1026                 if (mMaxTimeForUseVsyncId >= prediction->presentTime) {
1027                     return prediction->presentTime;
1028                 }
1029                 mUsedVsyncIdForRefreshRateSelection = false;
1030             }
1031         }
1032 
1033         return static_cast<nsecs_t>(0);
1034     }();
1035 
1036     if (SFTRACE_ENABLED() && presentTime > 0) {
1037         const auto presentIn = TimePoint::fromNs(presentTime) - TimePoint::now();
1038         SFTRACE_FORMAT_INSTANT("presentIn %s", to_string(presentIn).c_str());
1039     }
1040 
1041     mFlinger->mScheduler->recordLayerHistory(sequence, layerProps, presentTime, now,
1042                                              scheduler::LayerHistory::LayerUpdateType::Buffer);
1043 }
1044 
recordLayerHistoryAnimationTx(const scheduler::LayerProps & layerProps,nsecs_t now)1045 void Layer::recordLayerHistoryAnimationTx(const scheduler::LayerProps& layerProps, nsecs_t now) {
1046     const nsecs_t presentTime =
1047             mDrawingState.isAutoTimestamp ? 0 : mDrawingState.desiredPresentTime;
1048     mFlinger->mScheduler->recordLayerHistory(sequence, layerProps, presentTime, now,
1049                                              scheduler::LayerHistory::LayerUpdateType::AnimationTX);
1050 }
1051 
setDataspace(ui::Dataspace dataspace)1052 bool Layer::setDataspace(ui::Dataspace dataspace) {
1053     if (mDrawingState.dataspace == dataspace) return false;
1054     mDrawingState.dataspace = dataspace;
1055     setTransactionFlags(eTransactionNeeded);
1056     return true;
1057 }
1058 
setExtendedRangeBrightness(float currentBufferRatio,float desiredRatio)1059 bool Layer::setExtendedRangeBrightness(float currentBufferRatio, float desiredRatio) {
1060     if (mDrawingState.currentHdrSdrRatio == currentBufferRatio &&
1061         mDrawingState.desiredHdrSdrRatio == desiredRatio)
1062         return false;
1063     mDrawingState.currentHdrSdrRatio = currentBufferRatio;
1064     mDrawingState.desiredHdrSdrRatio = desiredRatio;
1065     setTransactionFlags(eTransactionNeeded);
1066     return true;
1067 }
1068 
setDesiredHdrHeadroom(float desiredRatio)1069 bool Layer::setDesiredHdrHeadroom(float desiredRatio) {
1070     if (mDrawingState.desiredHdrSdrRatio == desiredRatio) return false;
1071     mDrawingState.desiredHdrSdrRatio = desiredRatio;
1072     setTransactionFlags(eTransactionNeeded);
1073     return true;
1074 }
1075 
setSidebandStream(const sp<NativeHandle> & sidebandStream,const FrameTimelineInfo & info,nsecs_t postTime,gui::GameMode gameMode)1076 bool Layer::setSidebandStream(const sp<NativeHandle>& sidebandStream, const FrameTimelineInfo& info,
1077                               nsecs_t postTime, gui::GameMode gameMode) {
1078     if (mDrawingState.sidebandStream == sidebandStream) return false;
1079 
1080     if (mDrawingState.sidebandStream != nullptr && sidebandStream == nullptr) {
1081         mFlinger->mTunnelModeEnabledReporter->decrementTunnelModeCount();
1082     } else if (sidebandStream != nullptr) {
1083         mFlinger->mTunnelModeEnabledReporter->incrementTunnelModeCount();
1084     }
1085 
1086     mDrawingState.sidebandStream = sidebandStream;
1087     if (sidebandStream != nullptr && mDrawingState.buffer != nullptr) {
1088         releasePreviousBuffer();
1089         resetDrawingStateBufferInfo();
1090         mDrawingState.bufferSurfaceFrameTX = nullptr;
1091         setFrameTimelineVsyncForBufferlessTransaction(info, postTime, gameMode);
1092     }
1093     setTransactionFlags(eTransactionNeeded);
1094     if (!mSidebandStreamChanged.exchange(true)) {
1095         // mSidebandStreamChanged was false
1096         mFlinger->onLayerUpdate();
1097     }
1098     return true;
1099 }
1100 
setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>> & handles,bool willPresent)1101 bool Layer::setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>>& handles,
1102                                              bool willPresent) {
1103     // If there is no handle, we will not send a callback so reset mReleasePreviousBuffer and return
1104     if (handles.empty()) {
1105         mReleasePreviousBuffer = false;
1106         return false;
1107     }
1108 
1109     std::deque<sp<CallbackHandle>> remainingHandles;
1110     for (const auto& handle : handles) {
1111         // If this transaction set a buffer on this layer, release its previous buffer
1112         handle->releasePreviousBuffer = mReleasePreviousBuffer;
1113 
1114         // If this layer will be presented in this frame
1115         if (willPresent) {
1116             // If this transaction set an acquire fence on this layer, set its acquire time
1117             handle->acquireTimeOrFence = mCallbackHandleAcquireTimeOrFence;
1118             handle->frameNumber = mDrawingState.frameNumber;
1119             handle->previousFrameNumber = mDrawingState.previousFrameNumber;
1120             if (mPreviousReleaseBufferEndpoint == handle->listener) {
1121                 // Add fence from previous screenshot now so that it can be dispatched to the
1122                 // client.
1123                 for (auto& [_, future] : mAdditionalPreviousReleaseFences) {
1124                     handle->previousReleaseFences.emplace_back(std::move(future));
1125                 }
1126                 mAdditionalPreviousReleaseFences.clear();
1127             }
1128             // Store so latched time and release fence can be set
1129             mDrawingState.callbackHandles.push_back(handle);
1130 
1131         } else { // If this layer will NOT need to be relatched and presented this frame
1132             // Queue this handle to be notified below.
1133             remainingHandles.push_back(handle);
1134         }
1135     }
1136 
1137     if (!remainingHandles.empty()) {
1138         // Notify the transaction completed threads these handles are done. These are only the
1139         // handles that were not added to the mDrawingState, which will be notified later.
1140         mFlinger->getTransactionCallbackInvoker().addCallbackHandles(remainingHandles);
1141     }
1142 
1143     mReleasePreviousBuffer = false;
1144     mCallbackHandleAcquireTimeOrFence = -1;
1145 
1146     return willPresent;
1147 }
1148 
getBufferSize(const State &) const1149 Rect Layer::getBufferSize(const State& /*s*/) const {
1150     // for buffer state layers we use the display frame size as the buffer size.
1151 
1152     if (mBufferInfo.mBuffer == nullptr) {
1153         return Rect::INVALID_RECT;
1154     }
1155 
1156     uint32_t bufWidth = mBufferInfo.mBuffer->getWidth();
1157     uint32_t bufHeight = mBufferInfo.mBuffer->getHeight();
1158 
1159     // Undo any transformations on the buffer and return the result.
1160     if (mBufferInfo.mTransform & ui::Transform::ROT_90) {
1161         std::swap(bufWidth, bufHeight);
1162     }
1163 
1164     if (getTransformToDisplayInverse()) {
1165         uint32_t invTransform = SurfaceFlinger::getActiveDisplayRotationFlags();
1166         if (invTransform & ui::Transform::ROT_90) {
1167             std::swap(bufWidth, bufHeight);
1168         }
1169     }
1170 
1171     return Rect(0, 0, static_cast<int32_t>(bufWidth), static_cast<int32_t>(bufHeight));
1172 }
1173 
fenceHasSignaled() const1174 bool Layer::fenceHasSignaled() const {
1175     if (SurfaceFlinger::enableLatchUnsignaledConfig != LatchUnsignaledConfig::Disabled) {
1176         return true;
1177     }
1178 
1179     const bool fenceSignaled =
1180             getDrawingState().acquireFence->getStatus() == Fence::Status::Signaled;
1181     if (!fenceSignaled) {
1182         mFlinger->mTimeStats->incrementLatchSkipped(getSequence(),
1183                                                     TimeStats::LatchSkipReason::LateAcquire);
1184     }
1185 
1186     return fenceSignaled;
1187 }
1188 
onPreComposition(nsecs_t refreshStartTime)1189 void Layer::onPreComposition(nsecs_t refreshStartTime) {
1190     for (const auto& handle : mDrawingState.callbackHandles) {
1191         handle->refreshStartTime = refreshStartTime;
1192     }
1193 }
1194 
latchSidebandStream(bool & recomputeVisibleRegions)1195 bool Layer::latchSidebandStream(bool& recomputeVisibleRegions) {
1196     if (mSidebandStreamChanged.exchange(false)) {
1197         const State& s(getDrawingState());
1198         // mSidebandStreamChanged was true
1199         mSidebandStream = s.sidebandStream;
1200         if (mSidebandStream != nullptr) {
1201             setTransactionFlags(eTransactionNeeded);
1202             mFlinger->setTransactionFlags(eTraversalNeeded);
1203         }
1204         recomputeVisibleRegions = true;
1205         return true;
1206     }
1207     return false;
1208 }
1209 
updateTexImage(nsecs_t latchTime,bool bgColorOnly)1210 void Layer::updateTexImage(nsecs_t latchTime, bool bgColorOnly) {
1211     const State& s(getDrawingState());
1212 
1213     if (!s.buffer) {
1214         if (bgColorOnly || mBufferInfo.mBuffer) {
1215             for (auto& handle : mDrawingState.callbackHandles) {
1216                 handle->latchTime = latchTime;
1217             }
1218         }
1219         return;
1220     }
1221 
1222     for (auto& handle : mDrawingState.callbackHandles) {
1223         if (handle->frameNumber == mDrawingState.frameNumber) {
1224             handle->latchTime = latchTime;
1225         }
1226     }
1227 
1228     const int32_t layerId = getSequence();
1229     const uint64_t bufferId = mDrawingState.buffer->getId();
1230     const uint64_t frameNumber = mDrawingState.frameNumber;
1231     const auto acquireFence = std::make_shared<FenceTime>(mDrawingState.acquireFence);
1232     mFlinger->mTimeStats->setAcquireFence(layerId, frameNumber, acquireFence);
1233     mFlinger->mTimeStats->setLatchTime(layerId, frameNumber, latchTime);
1234 
1235     mFlinger->mFrameTracer->traceFence(layerId, bufferId, frameNumber, acquireFence,
1236                                        FrameTracer::FrameEvent::ACQUIRE_FENCE);
1237     mFlinger->mFrameTracer->traceTimestamp(layerId, bufferId, frameNumber, latchTime,
1238                                            FrameTracer::FrameEvent::LATCH);
1239 
1240     auto& bufferSurfaceFrame = mDrawingState.bufferSurfaceFrameTX;
1241     if (bufferSurfaceFrame != nullptr &&
1242         bufferSurfaceFrame->getPresentState() != PresentState::Presented) {
1243         // Update only if the bufferSurfaceFrame wasn't already presented. A Presented
1244         // bufferSurfaceFrame could be seen here if a pending state was applied successfully and we
1245         // are processing the next state.
1246         addSurfaceFramePresentedForBuffer(bufferSurfaceFrame,
1247                                           mDrawingState.acquireFenceTime->getSignalTime(),
1248                                           latchTime);
1249         mDrawingState.bufferSurfaceFrameTX.reset();
1250     }
1251 
1252     std::deque<sp<CallbackHandle>> remainingHandles;
1253     mFlinger->getTransactionCallbackInvoker()
1254             .addOnCommitCallbackHandles(mDrawingState.callbackHandles, remainingHandles);
1255     mDrawingState.callbackHandles = remainingHandles;
1256 }
1257 
gatherBufferInfo()1258 void Layer::gatherBufferInfo() {
1259     mPreviousReleaseCallbackId = {getCurrentBufferId(), mBufferInfo.mFrameNumber};
1260     mPreviousReleaseBufferEndpoint = mBufferInfo.mReleaseBufferEndpoint;
1261     if (!mDrawingState.buffer) {
1262         mBufferInfo = {};
1263         return;
1264     }
1265 
1266     if ((!mBufferInfo.mBuffer || !mDrawingState.buffer->hasSameBuffer(*mBufferInfo.mBuffer))) {
1267         decrementPendingBufferCount();
1268     }
1269 
1270     mBufferInfo.mBuffer = mDrawingState.buffer;
1271     mBufferInfo.mReleaseBufferEndpoint = mDrawingState.releaseBufferEndpoint;
1272     mBufferInfo.mFence = mDrawingState.acquireFence;
1273     mBufferInfo.mFrameNumber = mDrawingState.frameNumber;
1274     mBufferInfo.mPixelFormat =
1275             !mBufferInfo.mBuffer ? PIXEL_FORMAT_NONE : mBufferInfo.mBuffer->getPixelFormat();
1276     mBufferInfo.mFrameLatencyNeeded = true;
1277     mBufferInfo.mDesiredPresentTime = mDrawingState.desiredPresentTime;
1278     mBufferInfo.mFenceTime = std::make_shared<FenceTime>(mDrawingState.acquireFence);
1279     mBufferInfo.mTransform = mDrawingState.bufferTransform;
1280     auto lastDataspace = mBufferInfo.mDataspace;
1281     mBufferInfo.mDataspace = translateDataspace(mDrawingState.dataspace);
1282     if (mBufferInfo.mBuffer != nullptr) {
1283         auto& mapper = GraphicBufferMapper::get();
1284         // TODO: We should measure if it's faster to do a blind write if we're on newer api levels
1285         // and don't need to possibly remaps buffers.
1286         ui::Dataspace dataspace = ui::Dataspace::UNKNOWN;
1287         status_t err = OK;
1288         {
1289             SFTRACE_NAME("getDataspace");
1290             err = mapper.getDataspace(mBufferInfo.mBuffer->getBuffer()->handle, &dataspace);
1291         }
1292         if (err != OK || dataspace != mBufferInfo.mDataspace) {
1293             {
1294                 SFTRACE_NAME("setDataspace");
1295                 err = mapper.setDataspace(mBufferInfo.mBuffer->getBuffer()->handle,
1296                                           static_cast<ui::Dataspace>(mBufferInfo.mDataspace));
1297             }
1298 
1299             // Some GPU drivers may cache gralloc metadata which means before we composite we need
1300             // to upsert RenderEngine's caches. Put in a special workaround to be backwards
1301             // compatible with old vendors, with a ticking clock.
1302             static const int32_t kVendorVersion =
1303                     base::GetIntProperty("ro.board.api_level", __ANDROID_API_FUTURE__);
1304             if (const auto format =
1305                         static_cast<aidl::android::hardware::graphics::common::PixelFormat>(
1306                                 mBufferInfo.mBuffer->getPixelFormat());
1307                 err == OK && kVendorVersion < __ANDROID_API_U__ &&
1308                 (format ==
1309                          aidl::android::hardware::graphics::common::PixelFormat::
1310                                  IMPLEMENTATION_DEFINED ||
1311                  format == aidl::android::hardware::graphics::common::PixelFormat::YCBCR_420_888 ||
1312                  format == aidl::android::hardware::graphics::common::PixelFormat::YV12 ||
1313                  format == aidl::android::hardware::graphics::common::PixelFormat::YCBCR_P010)) {
1314                 mBufferInfo.mBuffer->remapBuffer();
1315             }
1316         }
1317     }
1318     if (lastDataspace != mBufferInfo.mDataspace ||
1319         mBufferInfo.mTimeSinceDataspaceUpdate == std::chrono::steady_clock::time_point::min()) {
1320         mFlinger->mHdrLayerInfoChanged = true;
1321         const auto currentTime = std::chrono::steady_clock::now();
1322         if (mBufferInfo.mTimeSinceDataspaceUpdate > std::chrono::steady_clock::time_point::min()) {
1323             mFlinger->mLayerEvents
1324                     .emplace_back(mOwnerUid, getSequence(), lastDataspace,
1325                                   std::chrono::duration_cast<std::chrono::milliseconds>(
1326                                           currentTime - mBufferInfo.mTimeSinceDataspaceUpdate));
1327         }
1328         mBufferInfo.mTimeSinceDataspaceUpdate = currentTime;
1329     }
1330     if (mBufferInfo.mDesiredHdrSdrRatio != mDrawingState.desiredHdrSdrRatio) {
1331         mBufferInfo.mDesiredHdrSdrRatio = mDrawingState.desiredHdrSdrRatio;
1332         mFlinger->mHdrLayerInfoChanged = true;
1333     }
1334     mBufferInfo.mCrop = computeBufferCrop(mDrawingState);
1335     mBufferInfo.mTransformToDisplayInverse = mDrawingState.transformToDisplayInverse;
1336 }
1337 
computeBufferCrop(const State & s)1338 Rect Layer::computeBufferCrop(const State& s) {
1339     if (s.buffer && !s.bufferCrop.isEmpty()) {
1340         Rect bufferCrop;
1341         s.buffer->getBounds().intersect(s.bufferCrop, &bufferCrop);
1342         return bufferCrop;
1343     } else if (s.buffer) {
1344         return s.buffer->getBounds();
1345     } else {
1346         return s.bufferCrop;
1347     }
1348 }
1349 
decrementPendingBufferCount()1350 void Layer::decrementPendingBufferCount() {
1351     int32_t pendingBuffers = --mPendingBuffers;
1352     tracePendingBufferCount(pendingBuffers);
1353 }
1354 
tracePendingBufferCount(int32_t pendingBuffers)1355 void Layer::tracePendingBufferCount(int32_t pendingBuffers) {
1356     SFTRACE_INT(mBlastTransactionName.c_str(), pendingBuffers);
1357 }
1358 
getCompositionEngineLayerFE(const frontend::LayerHierarchy::TraversalPath & path)1359 sp<LayerFE> Layer::getCompositionEngineLayerFE(
1360         const frontend::LayerHierarchy::TraversalPath& path) {
1361     for (auto& [p, layerFE] : mLayerFEs) {
1362         if (p == path) {
1363             return layerFE;
1364         }
1365     }
1366     auto layerFE = mFlinger->getFactory().createLayerFE(mName, this);
1367     mLayerFEs.emplace_back(path, layerFE);
1368     return layerFE;
1369 }
1370 
onCompositionPresented(const DisplayDevice * display,const std::shared_ptr<FenceTime> & glDoneFence,const std::shared_ptr<FenceTime> & presentFence,const CompositorTiming & compositorTiming,gui::GameMode gameMode)1371 void Layer::onCompositionPresented(const DisplayDevice* display,
1372                                    const std::shared_ptr<FenceTime>& glDoneFence,
1373                                    const std::shared_ptr<FenceTime>& presentFence,
1374                                    const CompositorTiming& compositorTiming,
1375                                    gui::GameMode gameMode) {
1376     // mFrameLatencyNeeded is true when a new frame was latched for the
1377     // composition.
1378     if (!mBufferInfo.mFrameLatencyNeeded) return;
1379 
1380     for (const auto& handle : mDrawingState.callbackHandles) {
1381         handle->gpuCompositionDoneFence = glDoneFence;
1382         handle->compositorTiming = compositorTiming;
1383     }
1384 
1385     // Update mDeprecatedFrameTracker.
1386     nsecs_t desiredPresentTime = mBufferInfo.mDesiredPresentTime;
1387     mDeprecatedFrameTracker.setDesiredPresentTime(desiredPresentTime);
1388 
1389     const int32_t layerId = getSequence();
1390     mFlinger->mTimeStats->setDesiredTime(layerId, mCurrentFrameNumber, desiredPresentTime);
1391 
1392     const auto outputLayer = findOutputLayerForDisplay(display);
1393     if (outputLayer && outputLayer->requiresClientComposition()) {
1394         nsecs_t clientCompositionTimestamp = outputLayer->getState().clientCompositionTimestamp;
1395         mFlinger->mFrameTracer->traceTimestamp(layerId, getCurrentBufferId(), mCurrentFrameNumber,
1396                                                clientCompositionTimestamp,
1397                                                FrameTracer::FrameEvent::FALLBACK_COMPOSITION);
1398         // Update the SurfaceFrames in the drawing state
1399         if (mDrawingState.bufferSurfaceFrameTX) {
1400             mDrawingState.bufferSurfaceFrameTX->setGpuComposition();
1401         }
1402         for (auto& [token, surfaceFrame] : mDrawingState.bufferlessSurfaceFramesTX) {
1403             surfaceFrame->setGpuComposition();
1404         }
1405     }
1406 
1407     // The SurfaceFrame's AcquireFence is the same as this.
1408     std::shared_ptr<FenceTime> frameReadyFence = mBufferInfo.mFenceTime;
1409     if (frameReadyFence->isValid()) {
1410         mDeprecatedFrameTracker.setFrameReadyFence(std::move(frameReadyFence));
1411     } else {
1412         // There was no fence for this frame, so assume that it was ready
1413         // to be presented at the desired present time.
1414         mDeprecatedFrameTracker.setFrameReadyTime(desiredPresentTime);
1415     }
1416     if (display) {
1417         const auto activeMode = display->refreshRateSelector().getActiveMode();
1418         const Fps refreshRate = activeMode.fps;
1419         const std::optional<Fps> renderRate =
1420                 mFlinger->mScheduler->getFrameRateOverride(getOwnerUid());
1421 
1422         const auto vote = frameRateToSetFrameRateVotePayload(getFrameRateForLayerTree());
1423 
1424         if (presentFence->isValid()) {
1425             mFlinger->mTimeStats->setPresentFence(layerId, mCurrentFrameNumber, presentFence,
1426                                                   refreshRate, renderRate, vote, gameMode);
1427             mFlinger->mFrameTracer->traceFence(layerId, getCurrentBufferId(), mCurrentFrameNumber,
1428                                                presentFence,
1429                                                FrameTracer::FrameEvent::PRESENT_FENCE);
1430             mDeprecatedFrameTracker.setActualPresentFence(std::shared_ptr<FenceTime>(presentFence));
1431         } else if (const auto displayId = PhysicalDisplayId::tryCast(display->getId());
1432                    displayId && mFlinger->getHwComposer().isConnected(*displayId)) {
1433             // The HWC doesn't support present fences, so use the present timestamp instead.
1434             const nsecs_t presentTimestamp =
1435                     mFlinger->getHwComposer().getPresentTimestamp(*displayId);
1436 
1437             const nsecs_t now = systemTime(CLOCK_MONOTONIC);
1438             const nsecs_t vsyncPeriod =
1439                     mFlinger->getHwComposer()
1440                             .getDisplayVsyncPeriod(*displayId)
1441                             .value_opt()
1442                             .value_or(activeMode.modePtr->getVsyncRate().getPeriodNsecs());
1443 
1444             const nsecs_t actualPresentTime = now - ((now - presentTimestamp) % vsyncPeriod);
1445 
1446             mFlinger->mTimeStats->setPresentTime(layerId, mCurrentFrameNumber, actualPresentTime,
1447                                                  refreshRate, renderRate, vote, gameMode);
1448             mFlinger->mFrameTracer->traceTimestamp(layerId, getCurrentBufferId(),
1449                                                    mCurrentFrameNumber, actualPresentTime,
1450                                                    FrameTracer::FrameEvent::PRESENT_FENCE);
1451             mDeprecatedFrameTracker.setActualPresentTime(actualPresentTime);
1452         }
1453     }
1454 
1455     mFrameStatsHistorySize++;
1456     mDeprecatedFrameTracker.advanceFrame();
1457     mBufferInfo.mFrameLatencyNeeded = false;
1458 }
1459 
latchBufferImpl(bool & recomputeVisibleRegions,nsecs_t latchTime,bool bgColorOnly)1460 bool Layer::latchBufferImpl(bool& recomputeVisibleRegions, nsecs_t latchTime, bool bgColorOnly) {
1461     SFTRACE_FORMAT_INSTANT("latchBuffer %s - %" PRIu64, getDebugName(),
1462                            getDrawingState().frameNumber);
1463 
1464     bool refreshRequired = latchSidebandStream(recomputeVisibleRegions);
1465 
1466     if (refreshRequired) {
1467         return refreshRequired;
1468     }
1469 
1470     // If the head buffer's acquire fence hasn't signaled yet, return and
1471     // try again later
1472     if (!fenceHasSignaled()) {
1473         SFTRACE_NAME("!fenceHasSignaled()");
1474         mFlinger->onLayerUpdate();
1475         return false;
1476     }
1477     updateTexImage(latchTime, bgColorOnly);
1478 
1479     // Capture the old state of the layer for comparisons later
1480     BufferInfo oldBufferInfo = mBufferInfo;
1481     mPreviousFrameNumber = mCurrentFrameNumber;
1482     mCurrentFrameNumber = mDrawingState.frameNumber;
1483     gatherBufferInfo();
1484 
1485     if (mBufferInfo.mBuffer) {
1486         // We latched a buffer that will be presented soon. Clear the previously presented layer
1487         // stack list.
1488         mPreviouslyPresentedLayerStacks.clear();
1489     }
1490 
1491     if (mDrawingState.buffer == nullptr) {
1492         const bool bufferReleased = oldBufferInfo.mBuffer != nullptr;
1493         recomputeVisibleRegions = bufferReleased;
1494         return bufferReleased;
1495     }
1496 
1497     if (oldBufferInfo.mBuffer == nullptr) {
1498         // the first time we receive a buffer, we need to trigger a
1499         // geometry invalidation.
1500         recomputeVisibleRegions = true;
1501     }
1502 
1503     if ((mBufferInfo.mCrop != oldBufferInfo.mCrop) ||
1504         (mBufferInfo.mTransform != oldBufferInfo.mTransform) ||
1505         (mBufferInfo.mTransformToDisplayInverse != oldBufferInfo.mTransformToDisplayInverse)) {
1506         recomputeVisibleRegions = true;
1507     }
1508 
1509     if (oldBufferInfo.mBuffer != nullptr) {
1510         uint32_t bufWidth = mBufferInfo.mBuffer->getWidth();
1511         uint32_t bufHeight = mBufferInfo.mBuffer->getHeight();
1512         if (bufWidth != oldBufferInfo.mBuffer->getWidth() ||
1513             bufHeight != oldBufferInfo.mBuffer->getHeight()) {
1514             recomputeVisibleRegions = true;
1515         }
1516     }
1517     return true;
1518 }
1519 
getTransformToDisplayInverse() const1520 bool Layer::getTransformToDisplayInverse() const {
1521     return mBufferInfo.mTransformToDisplayInverse;
1522 }
1523 
translateDataspace(ui::Dataspace dataspace)1524 ui::Dataspace Layer::translateDataspace(ui::Dataspace dataspace) {
1525     ui::Dataspace updatedDataspace = dataspace;
1526     // translate legacy dataspaces to modern dataspaces
1527     switch (dataspace) {
1528         // Treat unknown dataspaces as V0_sRGB
1529         case ui::Dataspace::UNKNOWN:
1530         case ui::Dataspace::SRGB:
1531             updatedDataspace = ui::Dataspace::V0_SRGB;
1532             break;
1533         case ui::Dataspace::SRGB_LINEAR:
1534             updatedDataspace = ui::Dataspace::V0_SRGB_LINEAR;
1535             break;
1536         case ui::Dataspace::JFIF:
1537             updatedDataspace = ui::Dataspace::V0_JFIF;
1538             break;
1539         case ui::Dataspace::BT601_625:
1540             updatedDataspace = ui::Dataspace::V0_BT601_625;
1541             break;
1542         case ui::Dataspace::BT601_525:
1543             updatedDataspace = ui::Dataspace::V0_BT601_525;
1544             break;
1545         case ui::Dataspace::BT709:
1546             updatedDataspace = ui::Dataspace::V0_BT709;
1547             break;
1548         default:
1549             break;
1550     }
1551 
1552     return updatedDataspace;
1553 }
1554 
getBuffer() const1555 sp<GraphicBuffer> Layer::getBuffer() const {
1556     return mBufferInfo.mBuffer ? mBufferInfo.mBuffer->getBuffer() : nullptr;
1557 }
1558 
setTrustedPresentationInfo(TrustedPresentationThresholds const & thresholds,TrustedPresentationListener const & listener)1559 bool Layer::setTrustedPresentationInfo(TrustedPresentationThresholds const& thresholds,
1560                                        TrustedPresentationListener const& listener) {
1561     bool hadTrustedPresentationListener = hasTrustedPresentationListener();
1562     mTrustedPresentationListener = listener;
1563     mTrustedPresentationThresholds = thresholds;
1564     bool haveTrustedPresentationListener = hasTrustedPresentationListener();
1565     if (!hadTrustedPresentationListener && haveTrustedPresentationListener) {
1566         mFlinger->mNumTrustedPresentationListeners++;
1567     } else if (hadTrustedPresentationListener && !haveTrustedPresentationListener) {
1568         mFlinger->mNumTrustedPresentationListeners--;
1569     }
1570 
1571     // Reset trusted presentation states to ensure we start the time again.
1572     mEnteredTrustedPresentationStateTime = -1;
1573     mLastReportedTrustedPresentationState = false;
1574     mLastComputedTrustedPresentationState = false;
1575 
1576     // If there's a new trusted presentation listener, the code needs to go through the composite
1577     // path to ensure it recomutes the current state and invokes the TrustedPresentationListener if
1578     // we're already in the requested state.
1579     return haveTrustedPresentationListener;
1580 }
1581 
setBufferReleaseChannel(const std::shared_ptr<gui::BufferReleaseChannel::ProducerEndpoint> & channel)1582 void Layer::setBufferReleaseChannel(
1583         const std::shared_ptr<gui::BufferReleaseChannel::ProducerEndpoint>& channel) {
1584     mBufferReleaseChannel = channel;
1585 }
1586 
updateLastLatchTime(nsecs_t latchTime)1587 void Layer::updateLastLatchTime(nsecs_t latchTime) {
1588     mLastLatchTime = latchTime;
1589 }
1590 
setIsSmallDirty(frontend::LayerSnapshot * snapshot)1591 void Layer::setIsSmallDirty(frontend::LayerSnapshot* snapshot) {
1592     if (!mFlinger->mScheduler->supportSmallDirtyDetection(mOwnerAppId)) {
1593         snapshot->isSmallDirty = false;
1594         return;
1595     }
1596 
1597     if (mWindowType != WindowInfo::Type::APPLICATION &&
1598         mWindowType != WindowInfo::Type::BASE_APPLICATION) {
1599         snapshot->isSmallDirty = false;
1600         return;
1601     }
1602 
1603     Rect bounds = snapshot->surfaceDamage.getBounds();
1604     if (!bounds.isValid()) {
1605         snapshot->isSmallDirty = false;
1606         return;
1607     }
1608 
1609     // Transform to screen space.
1610     bounds = snapshot->localTransform.transform(bounds);
1611 
1612     // If the damage region is a small dirty, this could give the hint for the layer history that
1613     // it could suppress the heuristic rate when calculating.
1614     snapshot->isSmallDirty =
1615             mFlinger->mScheduler->isSmallDirtyArea(mOwnerAppId,
1616                                                    bounds.getWidth() * bounds.getHeight());
1617 }
1618 
1619 } // namespace android
1620 
1621 #if defined(__gl_h_)
1622 #error "don't include gl/gl.h in this file"
1623 #endif
1624 
1625 #if defined(__gl2_h_)
1626 #error "don't include gl2/gl2.h in this file"
1627 #endif
1628 
1629 // TODO(b/129481165): remove the #pragma below and fix conversion issues
1630 #pragma clang diagnostic pop // ignored "-Wconversion"
1631