• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 //#define LOG_NDEBUG 0
18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
19 
20 #include <sys/types.h>
21 #include <errno.h>
22 #include <dlfcn.h>
23 
24 #include <algorithm>
25 #include <cinttypes>
26 #include <cmath>
27 #include <cstdint>
28 #include <functional>
29 #include <mutex>
30 #include <optional>
31 #include <unordered_map>
32 
33 #include <cutils/properties.h>
34 #include <log/log.h>
35 
36 #include <binder/IPCThreadState.h>
37 #include <binder/IServiceManager.h>
38 #include <binder/PermissionCache.h>
39 
40 #include <compositionengine/CompositionEngine.h>
41 #include <compositionengine/Display.h>
42 #include <compositionengine/DisplayColorProfile.h>
43 #include <compositionengine/Layer.h>
44 #include <compositionengine/OutputLayer.h>
45 #include <compositionengine/RenderSurface.h>
46 #include <compositionengine/impl/LayerCompositionState.h>
47 #include <compositionengine/impl/OutputCompositionState.h>
48 #include <compositionengine/impl/OutputLayerCompositionState.h>
49 #include <dvr/vr_flinger.h>
50 #include <gui/BufferQueue.h>
51 #include <gui/GuiConfig.h>
52 #include <gui/IDisplayEventConnection.h>
53 #include <gui/IProducerListener.h>
54 #include <gui/LayerDebugInfo.h>
55 #include <gui/Surface.h>
56 #include <input/IInputFlinger.h>
57 #include <renderengine/RenderEngine.h>
58 #include <ui/ColorSpace.h>
59 #include <ui/DebugUtils.h>
60 #include <ui/DisplayInfo.h>
61 #include <ui/DisplayStatInfo.h>
62 #include <ui/GraphicBufferAllocator.h>
63 #include <ui/PixelFormat.h>
64 #include <ui/UiConfig.h>
65 #include <utils/StopWatch.h>
66 #include <utils/String16.h>
67 #include <utils/String8.h>
68 #include <utils/Timers.h>
69 #include <utils/Trace.h>
70 #include <utils/misc.h>
71 
72 #include <private/android_filesystem_config.h>
73 #include <private/gui/SyncFeatures.h>
74 
75 #include "BufferLayer.h"
76 #include "BufferQueueLayer.h"
77 #include "BufferStateLayer.h"
78 #include "Client.h"
79 #include "ColorLayer.h"
80 #include "Colorizer.h"
81 #include "ContainerLayer.h"
82 #include "DisplayDevice.h"
83 #include "Layer.h"
84 #include "LayerVector.h"
85 #include "MonitoredProducer.h"
86 #include "NativeWindowSurface.h"
87 #include "RefreshRateOverlay.h"
88 #include "StartPropertySetThread.h"
89 #include "SurfaceFlinger.h"
90 #include "SurfaceInterceptor.h"
91 
92 #include "DisplayHardware/ComposerHal.h"
93 #include "DisplayHardware/DisplayIdentification.h"
94 #include "DisplayHardware/FramebufferSurface.h"
95 #include "DisplayHardware/HWComposer.h"
96 #include "DisplayHardware/VirtualDisplaySurface.h"
97 #include "Effects/Daltonizer.h"
98 #include "RegionSamplingThread.h"
99 #include "Scheduler/DispSync.h"
100 #include "Scheduler/DispSyncSource.h"
101 #include "Scheduler/EventControlThread.h"
102 #include "Scheduler/EventThread.h"
103 #include "Scheduler/InjectVSyncSource.h"
104 #include "Scheduler/MessageQueue.h"
105 #include "Scheduler/PhaseOffsets.h"
106 #include "Scheduler/Scheduler.h"
107 #include "TimeStats/TimeStats.h"
108 
109 #include <cutils/compiler.h>
110 
111 #include "android-base/stringprintf.h"
112 
113 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
114 #include <android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h>
115 #include <android/hardware/configstore/1.1/types.h>
116 #include <android/hardware/power/1.0/IPower.h>
117 #include <configstore/Utils.h>
118 
119 #include <layerproto/LayerProtoParser.h>
120 #include "SurfaceFlingerProperties.h"
121 
122 namespace android {
123 
124 using namespace android::hardware::configstore;
125 using namespace android::hardware::configstore::V1_0;
126 using namespace android::sysprop;
127 
128 using android::hardware::power::V1_0::PowerHint;
129 using base::StringAppendF;
130 using ui::ColorMode;
131 using ui::Dataspace;
132 using ui::DisplayPrimaries;
133 using ui::Hdr;
134 using ui::RenderIntent;
135 
136 namespace {
137 
138 #pragma clang diagnostic push
139 #pragma clang diagnostic error "-Wswitch-enum"
140 
isWideColorMode(const ColorMode colorMode)141 bool isWideColorMode(const ColorMode colorMode) {
142     switch (colorMode) {
143         case ColorMode::DISPLAY_P3:
144         case ColorMode::ADOBE_RGB:
145         case ColorMode::DCI_P3:
146         case ColorMode::BT2020:
147         case ColorMode::DISPLAY_BT2020:
148         case ColorMode::BT2100_PQ:
149         case ColorMode::BT2100_HLG:
150             return true;
151         case ColorMode::NATIVE:
152         case ColorMode::STANDARD_BT601_625:
153         case ColorMode::STANDARD_BT601_625_UNADJUSTED:
154         case ColorMode::STANDARD_BT601_525:
155         case ColorMode::STANDARD_BT601_525_UNADJUSTED:
156         case ColorMode::STANDARD_BT709:
157         case ColorMode::SRGB:
158             return false;
159     }
160     return false;
161 }
162 
isHdrColorMode(const ColorMode colorMode)163 bool isHdrColorMode(const ColorMode colorMode) {
164     switch (colorMode) {
165         case ColorMode::BT2100_PQ:
166         case ColorMode::BT2100_HLG:
167             return true;
168         case ColorMode::DISPLAY_P3:
169         case ColorMode::ADOBE_RGB:
170         case ColorMode::DCI_P3:
171         case ColorMode::BT2020:
172         case ColorMode::DISPLAY_BT2020:
173         case ColorMode::NATIVE:
174         case ColorMode::STANDARD_BT601_625:
175         case ColorMode::STANDARD_BT601_625_UNADJUSTED:
176         case ColorMode::STANDARD_BT601_525:
177         case ColorMode::STANDARD_BT601_525_UNADJUSTED:
178         case ColorMode::STANDARD_BT709:
179         case ColorMode::SRGB:
180             return false;
181     }
182     return false;
183 }
184 
fromSurfaceComposerRotation(ISurfaceComposer::Rotation rotation)185 ui::Transform::orientation_flags fromSurfaceComposerRotation(ISurfaceComposer::Rotation rotation) {
186     switch (rotation) {
187         case ISurfaceComposer::eRotateNone:
188             return ui::Transform::ROT_0;
189         case ISurfaceComposer::eRotate90:
190             return ui::Transform::ROT_90;
191         case ISurfaceComposer::eRotate180:
192             return ui::Transform::ROT_180;
193         case ISurfaceComposer::eRotate270:
194             return ui::Transform::ROT_270;
195     }
196     ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
197     return ui::Transform::ROT_0;
198 }
199 
200 #pragma clang diagnostic pop
201 
202 class ConditionalLock {
203 public:
ConditionalLock(Mutex & mutex,bool lock)204     ConditionalLock(Mutex& mutex, bool lock) : mMutex(mutex), mLocked(lock) {
205         if (lock) {
206             mMutex.lock();
207         }
208     }
~ConditionalLock()209     ~ConditionalLock() { if (mLocked) mMutex.unlock(); }
210 private:
211     Mutex& mMutex;
212     bool mLocked;
213 };
214 
215 // Currently we only support V0_SRGB and DISPLAY_P3 as composition preference.
validateCompositionDataspace(Dataspace dataspace)216 bool validateCompositionDataspace(Dataspace dataspace) {
217     return dataspace == Dataspace::V0_SRGB || dataspace == Dataspace::DISPLAY_P3;
218 }
219 
220 }  // namespace anonymous
221 
222 // ---------------------------------------------------------------------------
223 
224 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
225 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
226 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
227 const String16 sDump("android.permission.DUMP");
228 
229 // ---------------------------------------------------------------------------
230 int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
231 bool SurfaceFlinger::useHwcForRgbToYuv;
232 uint64_t SurfaceFlinger::maxVirtualDisplaySize;
233 bool SurfaceFlinger::hasSyncFramework;
234 bool SurfaceFlinger::useVrFlinger;
235 int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
236 bool SurfaceFlinger::hasWideColorDisplay;
237 int SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientationDefault;
238 bool SurfaceFlinger::useColorManagement;
239 bool SurfaceFlinger::useContextPriority;
240 Dataspace SurfaceFlinger::defaultCompositionDataspace = Dataspace::V0_SRGB;
241 ui::PixelFormat SurfaceFlinger::defaultCompositionPixelFormat = ui::PixelFormat::RGBA_8888;
242 Dataspace SurfaceFlinger::wideColorGamutCompositionDataspace = Dataspace::V0_SRGB;
243 ui::PixelFormat SurfaceFlinger::wideColorGamutCompositionPixelFormat = ui::PixelFormat::RGBA_8888;
244 
getHwcServiceName()245 std::string getHwcServiceName() {
246     char value[PROPERTY_VALUE_MAX] = {};
247     property_get("debug.sf.hwc_service_name", value, "default");
248     ALOGI("Using HWComposer service: '%s'", value);
249     return std::string(value);
250 }
251 
useTrebleTestingOverride()252 bool useTrebleTestingOverride() {
253     char value[PROPERTY_VALUE_MAX] = {};
254     property_get("debug.sf.treble_testing_override", value, "false");
255     ALOGI("Treble testing override: '%s'", value);
256     return std::string(value) == "true";
257 }
258 
decodeDisplayColorSetting(DisplayColorSetting displayColorSetting)259 std::string decodeDisplayColorSetting(DisplayColorSetting displayColorSetting) {
260     switch(displayColorSetting) {
261         case DisplayColorSetting::MANAGED:
262             return std::string("Managed");
263         case DisplayColorSetting::UNMANAGED:
264             return std::string("Unmanaged");
265         case DisplayColorSetting::ENHANCED:
266             return std::string("Enhanced");
267         default:
268             return std::string("Unknown ") +
269                 std::to_string(static_cast<int>(displayColorSetting));
270     }
271 }
272 
SurfaceFlingerBE()273 SurfaceFlingerBE::SurfaceFlingerBE() : mHwcServiceName(getHwcServiceName()) {}
274 
SurfaceFlinger(Factory & factory,SkipInitializationTag)275 SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
276       : mFactory(factory),
277         mPhaseOffsets(mFactory.createPhaseOffsets()),
278         mInterceptor(mFactory.createSurfaceInterceptor(this)),
279         mTimeStats(mFactory.createTimeStats()),
280         mEventQueue(mFactory.createMessageQueue()),
281         mCompositionEngine(mFactory.createCompositionEngine()) {}
282 
SurfaceFlinger(Factory & factory)283 SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization) {
284     ALOGI("SurfaceFlinger is starting");
285 
286     hasSyncFramework = running_without_sync_framework(true);
287 
288     dispSyncPresentTimeOffset = present_time_offset_from_vsync_ns(0);
289 
290     useHwcForRgbToYuv = force_hwc_copy_for_virtual_displays(false);
291 
292     maxVirtualDisplaySize = max_virtual_display_dimension(0);
293 
294     // Vr flinger is only enabled on Daydream ready devices.
295     useVrFlinger = use_vr_flinger(false);
296 
297     maxFrameBufferAcquiredBuffers = max_frame_buffer_acquired_buffers(2);
298 
299     hasWideColorDisplay = has_wide_color_display(false);
300 
301     useColorManagement = use_color_management(false);
302 
303     mDefaultCompositionDataspace =
304             static_cast<ui::Dataspace>(default_composition_dataspace(Dataspace::V0_SRGB));
305     mWideColorGamutCompositionDataspace = static_cast<ui::Dataspace>(wcg_composition_dataspace(
306             hasWideColorDisplay ? Dataspace::DISPLAY_P3 : Dataspace::V0_SRGB));
307     defaultCompositionDataspace = mDefaultCompositionDataspace;
308     wideColorGamutCompositionDataspace = mWideColorGamutCompositionDataspace;
309     defaultCompositionPixelFormat = static_cast<ui::PixelFormat>(
310             default_composition_pixel_format(ui::PixelFormat::RGBA_8888));
311     wideColorGamutCompositionPixelFormat =
312             static_cast<ui::PixelFormat>(wcg_composition_pixel_format(ui::PixelFormat::RGBA_8888));
313 
314     useContextPriority = use_context_priority(true);
315 
316     auto tmpPrimaryDisplayOrientation = primary_display_orientation(
317             SurfaceFlingerProperties::primary_display_orientation_values::ORIENTATION_0);
318     switch (tmpPrimaryDisplayOrientation) {
319         case SurfaceFlingerProperties::primary_display_orientation_values::ORIENTATION_90:
320             SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientation90;
321             break;
322         case SurfaceFlingerProperties::primary_display_orientation_values::ORIENTATION_180:
323             SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientation180;
324             break;
325         case SurfaceFlingerProperties::primary_display_orientation_values::ORIENTATION_270:
326             SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientation270;
327             break;
328         default:
329             SurfaceFlinger::primaryDisplayOrientation = DisplayState::eOrientationDefault;
330             break;
331     }
332     ALOGV("Primary Display Orientation is set to %2d.", SurfaceFlinger::primaryDisplayOrientation);
333 
334     mInternalDisplayPrimaries = sysprop::getDisplayNativePrimaries();
335 
336     // debugging stuff...
337     char value[PROPERTY_VALUE_MAX];
338 
339     property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
340     mGpuToCpuSupported = !atoi(value);
341 
342     property_get("debug.sf.showupdates", value, "0");
343     mDebugRegion = atoi(value);
344 
345     ALOGI_IF(mDebugRegion, "showupdates enabled");
346 
347     // DDMS debugging deprecated (b/120782499)
348     property_get("debug.sf.ddms", value, "0");
349     int debugDdms = atoi(value);
350     ALOGI_IF(debugDdms, "DDMS debugging not supported");
351 
352     property_get("debug.sf.disable_backpressure", value, "0");
353     mPropagateBackpressure = !atoi(value);
354     ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation");
355 
356     property_get("debug.sf.enable_gl_backpressure", value, "0");
357     mPropagateBackpressureClientComposition = atoi(value);
358     ALOGI_IF(mPropagateBackpressureClientComposition,
359              "Enabling backpressure propagation for Client Composition");
360 
361     property_get("debug.sf.enable_hwc_vds", value, "0");
362     mUseHwcVirtualDisplays = atoi(value);
363     ALOGI_IF(mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
364 
365     property_get("ro.sf.disable_triple_buffer", value, "0");
366     mLayerTripleBufferingDisabled = atoi(value);
367     ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
368 
369     const size_t defaultListSize = MAX_LAYERS;
370     auto listSize = property_get_int32("debug.sf.max_igbp_list_size", int32_t(defaultListSize));
371     mMaxGraphicBufferProducerListSize = (listSize > 0) ? size_t(listSize) : defaultListSize;
372 
373     mUseSmart90ForVideo = use_smart_90_for_video(false);
374     property_get("debug.sf.use_smart_90_for_video", value, "0");
375 
376     int int_value = atoi(value);
377     if (int_value) {
378         mUseSmart90ForVideo = true;
379     }
380 
381     property_get("debug.sf.luma_sampling", value, "1");
382     mLumaSampling = atoi(value);
383 
384     const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();
385     mVsyncModulator.setPhaseOffsets(early, gl, late);
386 
387     // We should be reading 'persist.sys.sf.color_saturation' here
388     // but since /data may be encrypted, we need to wait until after vold
389     // comes online to attempt to read the property. The property is
390     // instead read after the boot animation
391 
392     if (useTrebleTestingOverride()) {
393         // Without the override SurfaceFlinger cannot connect to HIDL
394         // services that are not listed in the manifests.  Considered
395         // deriving the setting from the set service name, but it
396         // would be brittle if the name that's not 'default' is used
397         // for production purposes later on.
398         setenv("TREBLE_TESTING_OVERRIDE", "true", true);
399     }
400 }
401 
onFirstRef()402 void SurfaceFlinger::onFirstRef()
403 {
404     mEventQueue->init(this);
405 }
406 
407 SurfaceFlinger::~SurfaceFlinger() = default;
408 
binderDied(const wp<IBinder> &)409 void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
410 {
411     // the window manager died on us. prepare its eulogy.
412 
413     // restore initial conditions (default device unblank, etc)
414     initializeDisplays();
415 
416     // restart the boot-animation
417     startBootAnim();
418 }
419 
initClient(const sp<Client> & client)420 static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
421     status_t err = client->initCheck();
422     if (err == NO_ERROR) {
423         return client;
424     }
425     return nullptr;
426 }
427 
createConnection()428 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
429     return initClient(new Client(this));
430 }
431 
createDisplay(const String8 & displayName,bool secure)432 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
433         bool secure)
434 {
435     class DisplayToken : public BBinder {
436         sp<SurfaceFlinger> flinger;
437         virtual ~DisplayToken() {
438              // no more references, this display must be terminated
439              Mutex::Autolock _l(flinger->mStateLock);
440              flinger->mCurrentState.displays.removeItem(this);
441              flinger->setTransactionFlags(eDisplayTransactionNeeded);
442          }
443      public:
444         explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
445             : flinger(flinger) {
446         }
447     };
448 
449     sp<BBinder> token = new DisplayToken(this);
450 
451     Mutex::Autolock _l(mStateLock);
452     // Display ID is assigned when virtual display is allocated by HWC.
453     DisplayDeviceState state;
454     state.isSecure = secure;
455     state.displayName = displayName;
456     mCurrentState.displays.add(token, state);
457     mInterceptor->saveDisplayCreation(state);
458     return token;
459 }
460 
destroyDisplay(const sp<IBinder> & displayToken)461 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& displayToken) {
462     Mutex::Autolock _l(mStateLock);
463 
464     ssize_t index = mCurrentState.displays.indexOfKey(displayToken);
465     if (index < 0) {
466         ALOGE("destroyDisplay: Invalid display token %p", displayToken.get());
467         return;
468     }
469 
470     const DisplayDeviceState& state = mCurrentState.displays.valueAt(index);
471     if (!state.isVirtual()) {
472         ALOGE("destroyDisplay called for non-virtual display");
473         return;
474     }
475     mInterceptor->saveDisplayDeletion(state.sequenceId);
476     mCurrentState.displays.removeItemsAt(index);
477     setTransactionFlags(eDisplayTransactionNeeded);
478 }
479 
getPhysicalDisplayIds() const480 std::vector<PhysicalDisplayId> SurfaceFlinger::getPhysicalDisplayIds() const {
481     Mutex::Autolock lock(mStateLock);
482 
483     const auto internalDisplayId = getInternalDisplayIdLocked();
484     if (!internalDisplayId) {
485         return {};
486     }
487 
488     std::vector<PhysicalDisplayId> displayIds;
489     displayIds.reserve(mPhysicalDisplayTokens.size());
490     displayIds.push_back(internalDisplayId->value);
491 
492     for (const auto& [id, token] : mPhysicalDisplayTokens) {
493         if (id != *internalDisplayId) {
494             displayIds.push_back(id.value);
495         }
496     }
497 
498     return displayIds;
499 }
500 
getPhysicalDisplayToken(PhysicalDisplayId displayId) const501 sp<IBinder> SurfaceFlinger::getPhysicalDisplayToken(PhysicalDisplayId displayId) const {
502     Mutex::Autolock lock(mStateLock);
503     return getPhysicalDisplayTokenLocked(DisplayId{displayId});
504 }
505 
getColorManagement(bool * outGetColorManagement) const506 status_t SurfaceFlinger::getColorManagement(bool* outGetColorManagement) const {
507     if (!outGetColorManagement) {
508         return BAD_VALUE;
509     }
510     *outGetColorManagement = useColorManagement;
511     return NO_ERROR;
512 }
513 
getHwComposer() const514 HWComposer& SurfaceFlinger::getHwComposer() const {
515     return mCompositionEngine->getHwComposer();
516 }
517 
getRenderEngine() const518 renderengine::RenderEngine& SurfaceFlinger::getRenderEngine() const {
519     return mCompositionEngine->getRenderEngine();
520 }
521 
getCompositionEngine() const522 compositionengine::CompositionEngine& SurfaceFlinger::getCompositionEngine() const {
523     return *mCompositionEngine.get();
524 }
525 
bootFinished()526 void SurfaceFlinger::bootFinished()
527 {
528     if (mStartPropertySetThread->join() != NO_ERROR) {
529         ALOGE("Join StartPropertySetThread failed!");
530     }
531     const nsecs_t now = systemTime();
532     const nsecs_t duration = now - mBootTime;
533     ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
534 
535     // wait patiently for the window manager death
536     const String16 name("window");
537     sp<IBinder> window(defaultServiceManager()->getService(name));
538     if (window != 0) {
539         window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
540     }
541     sp<IBinder> input(defaultServiceManager()->getService(
542             String16("inputflinger")));
543     if (input == nullptr) {
544         ALOGE("Failed to link to input service");
545     } else {
546         mInputFlinger = interface_cast<IInputFlinger>(input);
547     }
548 
549     if (mVrFlinger) {
550       mVrFlinger->OnBootFinished();
551     }
552 
553     // stop boot animation
554     // formerly we would just kill the process, but we now ask it to exit so it
555     // can choose where to stop the animation.
556     property_set("service.bootanim.exit", "1");
557 
558     const int LOGTAG_SF_STOP_BOOTANIM = 60110;
559     LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
560                    ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
561 
562     postMessageAsync(new LambdaMessage([this]() NO_THREAD_SAFETY_ANALYSIS {
563         readPersistentProperties();
564         mBootStage = BootStage::FINISHED;
565 
566         // set the refresh rate according to the policy
567         const auto& performanceRefreshRate =
568                 mRefreshRateConfigs.getRefreshRate(RefreshRateType::PERFORMANCE);
569 
570         if (performanceRefreshRate && isDisplayConfigAllowed(performanceRefreshRate->configId)) {
571             setRefreshRateTo(RefreshRateType::PERFORMANCE, Scheduler::ConfigEvent::None);
572         } else {
573             setRefreshRateTo(RefreshRateType::DEFAULT, Scheduler::ConfigEvent::None);
574         }
575     }));
576 }
577 
getNewTexture()578 uint32_t SurfaceFlinger::getNewTexture() {
579     {
580         std::lock_guard lock(mTexturePoolMutex);
581         if (!mTexturePool.empty()) {
582             uint32_t name = mTexturePool.back();
583             mTexturePool.pop_back();
584             ATRACE_INT("TexturePoolSize", mTexturePool.size());
585             return name;
586         }
587 
588         // The pool was too small, so increase it for the future
589         ++mTexturePoolSize;
590     }
591 
592     // The pool was empty, so we need to get a new texture name directly using a
593     // blocking call to the main thread
594     uint32_t name = 0;
595     postMessageSync(new LambdaMessage([&]() { getRenderEngine().genTextures(1, &name); }));
596     return name;
597 }
598 
deleteTextureAsync(uint32_t texture)599 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
600     std::lock_guard lock(mTexturePoolMutex);
601     // We don't change the pool size, so the fix-up logic in postComposition will decide whether
602     // to actually delete this or not based on mTexturePoolSize
603     mTexturePool.push_back(texture);
604     ATRACE_INT("TexturePoolSize", mTexturePool.size());
605 }
606 
607 // Do not call property_set on main thread which will be blocked by init
608 // Use StartPropertySetThread instead.
init()609 void SurfaceFlinger::init() {
610     ALOGI(  "SurfaceFlinger's main thread ready to run. "
611             "Initializing graphics H/W...");
612 
613     ALOGI("Phase offset NS: %" PRId64 "", mPhaseOffsets->getCurrentAppOffset());
614 
615     Mutex::Autolock _l(mStateLock);
616     // start the EventThread
617     mScheduler =
618             getFactory().createScheduler([this](bool enabled) { setPrimaryVsyncEnabled(enabled); },
619                                          mRefreshRateConfigs);
620     auto resyncCallback =
621             mScheduler->makeResyncCallback(std::bind(&SurfaceFlinger::getVsyncPeriod, this));
622 
623     mAppConnectionHandle =
624             mScheduler->createConnection("app", mPhaseOffsets->getCurrentAppOffset(),
625                                          resyncCallback,
626                                          impl::EventThread::InterceptVSyncsCallback());
627     mSfConnectionHandle = mScheduler->createConnection("sf", mPhaseOffsets->getCurrentSfOffset(),
628                                                        resyncCallback, [this](nsecs_t timestamp) {
629                                                            mInterceptor->saveVSyncEvent(timestamp);
630                                                        });
631 
632     mEventQueue->setEventConnection(mScheduler->getEventConnection(mSfConnectionHandle));
633     mVsyncModulator.setSchedulerAndHandles(mScheduler.get(), mAppConnectionHandle.get(),
634                                            mSfConnectionHandle.get());
635 
636     mRegionSamplingThread =
637             new RegionSamplingThread(*this, *mScheduler,
638                                      RegionSamplingThread::EnvironmentTimingTunables());
639 
640     // Get a RenderEngine for the given display / config (can't fail)
641     int32_t renderEngineFeature = 0;
642     renderEngineFeature |= (useColorManagement ?
643                             renderengine::RenderEngine::USE_COLOR_MANAGEMENT : 0);
644     renderEngineFeature |= (useContextPriority ?
645                             renderengine::RenderEngine::USE_HIGH_PRIORITY_CONTEXT : 0);
646     renderEngineFeature |=
647             (enable_protected_contents(false) ? renderengine::RenderEngine::ENABLE_PROTECTED_CONTEXT
648                                               : 0);
649 
650     // TODO(b/77156734): We need to stop casting and use HAL types when possible.
651     // Sending maxFrameBufferAcquiredBuffers as the cache size is tightly tuned to single-display.
652     mCompositionEngine->setRenderEngine(
653             renderengine::RenderEngine::create(static_cast<int32_t>(defaultCompositionPixelFormat),
654                                                renderEngineFeature, maxFrameBufferAcquiredBuffers));
655 
656     LOG_ALWAYS_FATAL_IF(mVrFlingerRequestsDisplay,
657             "Starting with vr flinger active is not currently supported.");
658     mCompositionEngine->setHwComposer(getFactory().createHWComposer(getBE().mHwcServiceName));
659     mCompositionEngine->getHwComposer().registerCallback(this, getBE().mComposerSequenceId);
660     // Process any initial hotplug and resulting display changes.
661     processDisplayHotplugEventsLocked();
662     const auto display = getDefaultDisplayDeviceLocked();
663     LOG_ALWAYS_FATAL_IF(!display, "Missing internal display after registering composer callback.");
664     LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(*display->getId()),
665                         "Internal display is disconnected.");
666 
667     if (useVrFlinger) {
668         auto vrFlingerRequestDisplayCallback = [this](bool requestDisplay) {
669             // This callback is called from the vr flinger dispatch thread. We
670             // need to call signalTransaction(), which requires holding
671             // mStateLock when we're not on the main thread. Acquiring
672             // mStateLock from the vr flinger dispatch thread might trigger a
673             // deadlock in surface flinger (see b/66916578), so post a message
674             // to be handled on the main thread instead.
675             postMessageAsync(new LambdaMessage([=] {
676                 ALOGI("VR request display mode: requestDisplay=%d", requestDisplay);
677                 mVrFlingerRequestsDisplay = requestDisplay;
678                 signalTransaction();
679             }));
680         };
681         mVrFlinger = dvr::VrFlinger::Create(getHwComposer().getComposer(),
682                                             getHwComposer()
683                                                     .fromPhysicalDisplayId(*display->getId())
684                                                     .value_or(0),
685                                             vrFlingerRequestDisplayCallback);
686         if (!mVrFlinger) {
687             ALOGE("Failed to start vrflinger");
688         }
689     }
690 
691     // initialize our drawing state
692     mDrawingState = mCurrentState;
693 
694     // set initial conditions (e.g. unblank default device)
695     initializeDisplays();
696 
697     getRenderEngine().primeCache();
698 
699     // Inform native graphics APIs whether the present timestamp is supported:
700 
701     const bool presentFenceReliable =
702             !getHwComposer().hasCapability(HWC2::Capability::PresentFenceIsNotReliable);
703     mStartPropertySetThread = getFactory().createStartPropertySetThread(presentFenceReliable);
704 
705     if (mStartPropertySetThread->Start() != NO_ERROR) {
706         ALOGE("Run StartPropertySetThread failed!");
707     }
708 
709     mScheduler->setChangeRefreshRateCallback(
710             [this](RefreshRateType type, Scheduler::ConfigEvent event) {
711                 Mutex::Autolock lock(mStateLock);
712                 setRefreshRateTo(type, event);
713             });
714     mScheduler->setGetVsyncPeriodCallback([this] {
715         Mutex::Autolock lock(mStateLock);
716         return getVsyncPeriod();
717     });
718 
719     mRefreshRateConfigs.populate(getHwComposer().getConfigs(*display->getId()));
720     mRefreshRateStats.setConfigMode(getHwComposer().getActiveConfigIndex(*display->getId()));
721 
722     ALOGV("Done initializing");
723 }
724 
readPersistentProperties()725 void SurfaceFlinger::readPersistentProperties() {
726     Mutex::Autolock _l(mStateLock);
727 
728     char value[PROPERTY_VALUE_MAX];
729 
730     property_get("persist.sys.sf.color_saturation", value, "1.0");
731     mGlobalSaturationFactor = atof(value);
732     updateColorMatrixLocked();
733     ALOGV("Saturation is set to %.2f", mGlobalSaturationFactor);
734 
735     property_get("persist.sys.sf.native_mode", value, "0");
736     mDisplayColorSetting = static_cast<DisplayColorSetting>(atoi(value));
737 
738     property_get("persist.sys.sf.color_mode", value, "0");
739     mForceColorMode = static_cast<ColorMode>(atoi(value));
740 }
741 
startBootAnim()742 void SurfaceFlinger::startBootAnim() {
743     // Start boot animation service by setting a property mailbox
744     // if property setting thread is already running, Start() will be just a NOP
745     mStartPropertySetThread->Start();
746     // Wait until property was set
747     if (mStartPropertySetThread->join() != NO_ERROR) {
748         ALOGE("Join StartPropertySetThread failed!");
749     }
750 }
751 
getMaxTextureSize() const752 size_t SurfaceFlinger::getMaxTextureSize() const {
753     return getRenderEngine().getMaxTextureSize();
754 }
755 
getMaxViewportDims() const756 size_t SurfaceFlinger::getMaxViewportDims() const {
757     return getRenderEngine().getMaxViewportDims();
758 }
759 
760 // ----------------------------------------------------------------------------
761 
authenticateSurfaceTexture(const sp<IGraphicBufferProducer> & bufferProducer) const762 bool SurfaceFlinger::authenticateSurfaceTexture(
763         const sp<IGraphicBufferProducer>& bufferProducer) const {
764     Mutex::Autolock _l(mStateLock);
765     return authenticateSurfaceTextureLocked(bufferProducer);
766 }
767 
authenticateSurfaceTextureLocked(const sp<IGraphicBufferProducer> & bufferProducer) const768 bool SurfaceFlinger::authenticateSurfaceTextureLocked(
769         const sp<IGraphicBufferProducer>& bufferProducer) const {
770     sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
771     return mGraphicBufferProducerList.count(surfaceTextureBinder.get()) > 0;
772 }
773 
getSupportedFrameTimestamps(std::vector<FrameEvent> * outSupported) const774 status_t SurfaceFlinger::getSupportedFrameTimestamps(
775         std::vector<FrameEvent>* outSupported) const {
776     *outSupported = {
777         FrameEvent::REQUESTED_PRESENT,
778         FrameEvent::ACQUIRE,
779         FrameEvent::LATCH,
780         FrameEvent::FIRST_REFRESH_START,
781         FrameEvent::LAST_REFRESH_START,
782         FrameEvent::GPU_COMPOSITION_DONE,
783         FrameEvent::DEQUEUE_READY,
784         FrameEvent::RELEASE,
785     };
786     ConditionalLock _l(mStateLock,
787             std::this_thread::get_id() != mMainThreadId);
788     if (!getHwComposer().hasCapability(
789             HWC2::Capability::PresentFenceIsNotReliable)) {
790         outSupported->push_back(FrameEvent::DISPLAY_PRESENT);
791     }
792     return NO_ERROR;
793 }
794 
getDisplayConfigs(const sp<IBinder> & displayToken,Vector<DisplayInfo> * configs)795 status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& displayToken,
796                                            Vector<DisplayInfo>* configs) {
797     if (!displayToken || !configs) {
798         return BAD_VALUE;
799     }
800 
801     Mutex::Autolock lock(mStateLock);
802 
803     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
804     if (!displayId) {
805         return NAME_NOT_FOUND;
806     }
807 
808     // TODO: Not sure if display density should handled by SF any longer
809     class Density {
810         static float getDensityFromProperty(char const* propName) {
811             char property[PROPERTY_VALUE_MAX];
812             float density = 0.0f;
813             if (property_get(propName, property, nullptr) > 0) {
814                 density = strtof(property, nullptr);
815             }
816             return density;
817         }
818     public:
819         static float getEmuDensity() {
820             return getDensityFromProperty("qemu.sf.lcd_density"); }
821         static float getBuildDensity()  {
822             return getDensityFromProperty("ro.sf.lcd_density"); }
823     };
824 
825     configs->clear();
826 
827     for (const auto& hwConfig : getHwComposer().getConfigs(*displayId)) {
828         DisplayInfo info = DisplayInfo();
829 
830         float xdpi = hwConfig->getDpiX();
831         float ydpi = hwConfig->getDpiY();
832 
833         info.w = hwConfig->getWidth();
834         info.h = hwConfig->getHeight();
835         // Default display viewport to display width and height
836         info.viewportW = info.w;
837         info.viewportH = info.h;
838 
839         if (displayId == getInternalDisplayIdLocked()) {
840             // The density of the device is provided by a build property
841             float density = Density::getBuildDensity() / 160.0f;
842             if (density == 0) {
843                 // the build doesn't provide a density -- this is wrong!
844                 // use xdpi instead
845                 ALOGE("ro.sf.lcd_density must be defined as a build property");
846                 density = xdpi / 160.0f;
847             }
848             if (Density::getEmuDensity()) {
849                 // if "qemu.sf.lcd_density" is specified, it overrides everything
850                 xdpi = ydpi = density = Density::getEmuDensity();
851                 density /= 160.0f;
852             }
853             info.density = density;
854 
855             // TODO: this needs to go away (currently needed only by webkit)
856             const auto display = getDefaultDisplayDeviceLocked();
857             info.orientation = display ? display->getOrientation() : 0;
858 
859             // This is for screenrecord
860             const Rect viewport = display->getViewport();
861             if (viewport.isValid()) {
862                 info.viewportW = uint32_t(viewport.getWidth());
863                 info.viewportH = uint32_t(viewport.getHeight());
864             }
865         } else {
866             // TODO: where should this value come from?
867             static const int TV_DENSITY = 213;
868             info.density = TV_DENSITY / 160.0f;
869             info.orientation = 0;
870         }
871 
872         info.xdpi = xdpi;
873         info.ydpi = ydpi;
874         info.fps = 1e9 / hwConfig->getVsyncPeriod();
875         const auto refreshRateType = mRefreshRateConfigs.getRefreshRateType(hwConfig->getId());
876         const auto offset = mPhaseOffsets->getOffsetsForRefreshRate(refreshRateType);
877         info.appVsyncOffset = offset.late.app;
878 
879         // This is how far in advance a buffer must be queued for
880         // presentation at a given time.  If you want a buffer to appear
881         // on the screen at time N, you must submit the buffer before
882         // (N - presentationDeadline).
883         //
884         // Normally it's one full refresh period (to give SF a chance to
885         // latch the buffer), but this can be reduced by configuring a
886         // DispSync offset.  Any additional delays introduced by the hardware
887         // composer or panel must be accounted for here.
888         //
889         // We add an additional 1ms to allow for processing time and
890         // differences between the ideal and actual refresh rate.
891         info.presentationDeadline = hwConfig->getVsyncPeriod() - offset.late.sf + 1000000;
892 
893         // All non-virtual displays are currently considered secure.
894         info.secure = true;
895 
896         if (displayId == getInternalDisplayIdLocked() &&
897             primaryDisplayOrientation & DisplayState::eOrientationSwapMask) {
898             std::swap(info.w, info.h);
899         }
900 
901         configs->push_back(info);
902     }
903 
904     return NO_ERROR;
905 }
906 
getDisplayStats(const sp<IBinder> &,DisplayStatInfo * stats)907 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>&, DisplayStatInfo* stats) {
908     if (!stats) {
909         return BAD_VALUE;
910     }
911 
912     mScheduler->getDisplayStatInfo(stats);
913     return NO_ERROR;
914 }
915 
getActiveConfig(const sp<IBinder> & displayToken)916 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& displayToken) {
917     const auto display = getDisplayDevice(displayToken);
918     if (!display) {
919         ALOGE("getActiveConfig: Invalid display token %p", displayToken.get());
920         return BAD_VALUE;
921     }
922 
923     return display->getActiveConfig();
924 }
925 
setDesiredActiveConfig(const ActiveConfigInfo & info)926 void SurfaceFlinger::setDesiredActiveConfig(const ActiveConfigInfo& info) {
927     ATRACE_CALL();
928 
929     // Don't check against the current mode yet. Worst case we set the desired
930     // config twice. However event generation config might have changed so we need to update it
931     // accordingly
932     std::lock_guard<std::mutex> lock(mActiveConfigLock);
933     const Scheduler::ConfigEvent prevConfig = mDesiredActiveConfig.event;
934     mDesiredActiveConfig = info;
935     mDesiredActiveConfig.event = mDesiredActiveConfig.event | prevConfig;
936 
937     if (!mDesiredActiveConfigChanged) {
938         // This will trigger HWC refresh without resetting the idle timer.
939         repaintEverythingForHWC();
940         // Start receiving vsync samples now, so that we can detect a period
941         // switch.
942         mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
943         mPhaseOffsets->setRefreshRateType(info.type);
944         const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();
945         mVsyncModulator.onRefreshRateChangeInitiated();
946         mVsyncModulator.setPhaseOffsets(early, gl, late);
947     }
948     mDesiredActiveConfigChanged = true;
949     ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged);
950 
951     if (mRefreshRateOverlay) {
952         mRefreshRateOverlay->changeRefreshRate(mDesiredActiveConfig.type);
953     }
954 }
955 
setActiveConfig(const sp<IBinder> & displayToken,int mode)956 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& displayToken, int mode) {
957     ATRACE_CALL();
958 
959     std::vector<int32_t> allowedConfig;
960     allowedConfig.push_back(mode);
961 
962     return setAllowedDisplayConfigs(displayToken, allowedConfig);
963 }
964 
setActiveConfigInternal()965 void SurfaceFlinger::setActiveConfigInternal() {
966     ATRACE_CALL();
967 
968     const auto display = getDefaultDisplayDeviceLocked();
969     if (!display) {
970         return;
971     }
972 
973     std::lock_guard<std::mutex> lock(mActiveConfigLock);
974     mRefreshRateStats.setConfigMode(mUpcomingActiveConfig.configId);
975 
976     display->setActiveConfig(mUpcomingActiveConfig.configId);
977 
978     mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
979     mPhaseOffsets->setRefreshRateType(mUpcomingActiveConfig.type);
980     const auto [early, gl, late] = mPhaseOffsets->getCurrentOffsets();
981     mVsyncModulator.setPhaseOffsets(early, gl, late);
982     ATRACE_INT("ActiveConfigMode", mUpcomingActiveConfig.configId);
983 
984     if (mUpcomingActiveConfig.event != Scheduler::ConfigEvent::None) {
985         mScheduler->onConfigChanged(mAppConnectionHandle, display->getId()->value,
986                                     mUpcomingActiveConfig.configId);
987     }
988 }
989 
performSetActiveConfig()990 bool SurfaceFlinger::performSetActiveConfig() {
991     ATRACE_CALL();
992     if (mCheckPendingFence) {
993         if (previousFrameMissed()) {
994             // fence has not signaled yet. wait for the next invalidate
995             mEventQueue->invalidate();
996             return true;
997         }
998 
999         // We received the present fence from the HWC, so we assume it successfully updated
1000         // the config, hence we update SF.
1001         mCheckPendingFence = false;
1002         setActiveConfigInternal();
1003     }
1004 
1005     // Store the local variable to release the lock.
1006     ActiveConfigInfo desiredActiveConfig;
1007     {
1008         std::lock_guard<std::mutex> lock(mActiveConfigLock);
1009         if (!mDesiredActiveConfigChanged) {
1010             return false;
1011         }
1012         desiredActiveConfig = mDesiredActiveConfig;
1013     }
1014 
1015     const auto display = getDefaultDisplayDeviceLocked();
1016     if (!display || display->getActiveConfig() == desiredActiveConfig.configId) {
1017         // display is not valid or we are already in the requested mode
1018         // on both cases there is nothing left to do
1019         std::lock_guard<std::mutex> lock(mActiveConfigLock);
1020         mDesiredActiveConfig.event = Scheduler::ConfigEvent::None;
1021         mDesiredActiveConfigChanged = false;
1022         ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged);
1023         return false;
1024     }
1025 
1026     // Desired active config was set, it is different than the config currently in use, however
1027     // allowed configs might have change by the time we process the refresh.
1028     // Make sure the desired config is still allowed
1029     if (!isDisplayConfigAllowed(desiredActiveConfig.configId)) {
1030         std::lock_guard<std::mutex> lock(mActiveConfigLock);
1031         mDesiredActiveConfig.event = Scheduler::ConfigEvent::None;
1032         mDesiredActiveConfig.configId = display->getActiveConfig();
1033         mDesiredActiveConfigChanged = false;
1034         ATRACE_INT("DesiredActiveConfigChanged", mDesiredActiveConfigChanged);
1035         return false;
1036     }
1037     mUpcomingActiveConfig = desiredActiveConfig;
1038     const auto displayId = display->getId();
1039     LOG_ALWAYS_FATAL_IF(!displayId);
1040 
1041     ATRACE_INT("ActiveConfigModeHWC", mUpcomingActiveConfig.configId);
1042     getHwComposer().setActiveConfig(*displayId, mUpcomingActiveConfig.configId);
1043 
1044     // we need to submit an empty frame to HWC to start the process
1045     mCheckPendingFence = true;
1046     mEventQueue->invalidate();
1047     return false;
1048 }
1049 
getDisplayColorModes(const sp<IBinder> & displayToken,Vector<ColorMode> * outColorModes)1050 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& displayToken,
1051                                               Vector<ColorMode>* outColorModes) {
1052     if (!displayToken || !outColorModes) {
1053         return BAD_VALUE;
1054     }
1055 
1056     std::vector<ColorMode> modes;
1057     bool isInternalDisplay = false;
1058     {
1059         ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
1060 
1061         const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1062         if (!displayId) {
1063             return NAME_NOT_FOUND;
1064         }
1065 
1066         modes = getHwComposer().getColorModes(*displayId);
1067         isInternalDisplay = displayId == getInternalDisplayIdLocked();
1068     }
1069     outColorModes->clear();
1070 
1071     // If it's built-in display and the configuration claims it's not wide color capable,
1072     // filter out all wide color modes. The typical reason why this happens is that the
1073     // hardware is not good enough to support GPU composition of wide color, and thus the
1074     // OEMs choose to disable this capability.
1075     if (isInternalDisplay && !hasWideColorDisplay) {
1076         std::remove_copy_if(modes.cbegin(), modes.cend(), std::back_inserter(*outColorModes),
1077                             isWideColorMode);
1078     } else {
1079         std::copy(modes.cbegin(), modes.cend(), std::back_inserter(*outColorModes));
1080     }
1081 
1082     return NO_ERROR;
1083 }
1084 
getDisplayNativePrimaries(const sp<IBinder> & displayToken,ui::DisplayPrimaries & primaries)1085 status_t SurfaceFlinger::getDisplayNativePrimaries(const sp<IBinder>& displayToken,
1086                                                    ui::DisplayPrimaries &primaries) {
1087     if (!displayToken) {
1088         return BAD_VALUE;
1089     }
1090 
1091     // Currently we only support this API for a single internal display.
1092     if (getInternalDisplayToken() != displayToken) {
1093         return BAD_VALUE;
1094     }
1095 
1096     memcpy(&primaries, &mInternalDisplayPrimaries, sizeof(ui::DisplayPrimaries));
1097     return NO_ERROR;
1098 }
1099 
getActiveColorMode(const sp<IBinder> & displayToken)1100 ColorMode SurfaceFlinger::getActiveColorMode(const sp<IBinder>& displayToken) {
1101     if (const auto display = getDisplayDevice(displayToken)) {
1102         return display->getCompositionDisplay()->getState().colorMode;
1103     }
1104     return static_cast<ColorMode>(BAD_VALUE);
1105 }
1106 
setActiveColorMode(const sp<IBinder> & displayToken,ColorMode mode)1107 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& displayToken, ColorMode mode) {
1108     postMessageSync(new LambdaMessage([&] {
1109         Vector<ColorMode> modes;
1110         getDisplayColorModes(displayToken, &modes);
1111         bool exists = std::find(std::begin(modes), std::end(modes), mode) != std::end(modes);
1112         if (mode < ColorMode::NATIVE || !exists) {
1113             ALOGE("Attempt to set invalid active color mode %s (%d) for display token %p",
1114                   decodeColorMode(mode).c_str(), mode, displayToken.get());
1115             return;
1116         }
1117         const auto display = getDisplayDevice(displayToken);
1118         if (!display) {
1119             ALOGE("Attempt to set active color mode %s (%d) for invalid display token %p",
1120                   decodeColorMode(mode).c_str(), mode, displayToken.get());
1121         } else if (display->isVirtual()) {
1122             ALOGW("Attempt to set active color mode %s (%d) for virtual display",
1123                   decodeColorMode(mode).c_str(), mode);
1124         } else {
1125             display->getCompositionDisplay()->setColorMode(mode, Dataspace::UNKNOWN,
1126                                                            RenderIntent::COLORIMETRIC);
1127         }
1128     }));
1129 
1130     return NO_ERROR;
1131 }
1132 
clearAnimationFrameStats()1133 status_t SurfaceFlinger::clearAnimationFrameStats() {
1134     Mutex::Autolock _l(mStateLock);
1135     mAnimFrameTracker.clearStats();
1136     return NO_ERROR;
1137 }
1138 
getAnimationFrameStats(FrameStats * outStats) const1139 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
1140     Mutex::Autolock _l(mStateLock);
1141     mAnimFrameTracker.getStats(outStats);
1142     return NO_ERROR;
1143 }
1144 
getHdrCapabilities(const sp<IBinder> & displayToken,HdrCapabilities * outCapabilities) const1145 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& displayToken,
1146                                             HdrCapabilities* outCapabilities) const {
1147     Mutex::Autolock _l(mStateLock);
1148 
1149     const auto display = getDisplayDeviceLocked(displayToken);
1150     if (!display) {
1151         ALOGE("getHdrCapabilities: Invalid display token %p", displayToken.get());
1152         return BAD_VALUE;
1153     }
1154 
1155     // At this point the DisplayDeivce should already be set up,
1156     // meaning the luminance information is already queried from
1157     // hardware composer and stored properly.
1158     const HdrCapabilities& capabilities = display->getHdrCapabilities();
1159     *outCapabilities = HdrCapabilities(capabilities.getSupportedHdrTypes(),
1160                                        capabilities.getDesiredMaxLuminance(),
1161                                        capabilities.getDesiredMaxAverageLuminance(),
1162                                        capabilities.getDesiredMinLuminance());
1163 
1164     return NO_ERROR;
1165 }
1166 
getDisplayedContentSamplingAttributes(const sp<IBinder> & displayToken,ui::PixelFormat * outFormat,ui::Dataspace * outDataspace,uint8_t * outComponentMask) const1167 status_t SurfaceFlinger::getDisplayedContentSamplingAttributes(const sp<IBinder>& displayToken,
1168                                                                ui::PixelFormat* outFormat,
1169                                                                ui::Dataspace* outDataspace,
1170                                                                uint8_t* outComponentMask) const {
1171     if (!outFormat || !outDataspace || !outComponentMask) {
1172         return BAD_VALUE;
1173     }
1174     const auto display = getDisplayDevice(displayToken);
1175     if (!display || !display->getId()) {
1176         ALOGE("getDisplayedContentSamplingAttributes: Bad display token: %p", display.get());
1177         return BAD_VALUE;
1178     }
1179     return getHwComposer().getDisplayedContentSamplingAttributes(*display->getId(), outFormat,
1180                                                                  outDataspace, outComponentMask);
1181 }
1182 
setDisplayContentSamplingEnabled(const sp<IBinder> & displayToken,bool enable,uint8_t componentMask,uint64_t maxFrames) const1183 status_t SurfaceFlinger::setDisplayContentSamplingEnabled(const sp<IBinder>& displayToken,
1184                                                           bool enable, uint8_t componentMask,
1185                                                           uint64_t maxFrames) const {
1186     const auto display = getDisplayDevice(displayToken);
1187     if (!display || !display->getId()) {
1188         ALOGE("setDisplayContentSamplingEnabled: Bad display token: %p", display.get());
1189         return BAD_VALUE;
1190     }
1191 
1192     return getHwComposer().setDisplayContentSamplingEnabled(*display->getId(), enable,
1193                                                             componentMask, maxFrames);
1194 }
1195 
getDisplayedContentSample(const sp<IBinder> & displayToken,uint64_t maxFrames,uint64_t timestamp,DisplayedFrameStats * outStats) const1196 status_t SurfaceFlinger::getDisplayedContentSample(const sp<IBinder>& displayToken,
1197                                                    uint64_t maxFrames, uint64_t timestamp,
1198                                                    DisplayedFrameStats* outStats) const {
1199     const auto display = getDisplayDevice(displayToken);
1200     if (!display || !display->getId()) {
1201         ALOGE("getDisplayContentSample: Bad display token: %p", displayToken.get());
1202         return BAD_VALUE;
1203     }
1204 
1205     return getHwComposer().getDisplayedContentSample(*display->getId(), maxFrames, timestamp,
1206                                                      outStats);
1207 }
1208 
getProtectedContentSupport(bool * outSupported) const1209 status_t SurfaceFlinger::getProtectedContentSupport(bool* outSupported) const {
1210     if (!outSupported) {
1211         return BAD_VALUE;
1212     }
1213     *outSupported = getRenderEngine().supportsProtectedContent();
1214     return NO_ERROR;
1215 }
1216 
isWideColorDisplay(const sp<IBinder> & displayToken,bool * outIsWideColorDisplay) const1217 status_t SurfaceFlinger::isWideColorDisplay(const sp<IBinder>& displayToken,
1218                                             bool* outIsWideColorDisplay) const {
1219     if (!displayToken || !outIsWideColorDisplay) {
1220         return BAD_VALUE;
1221     }
1222     Mutex::Autolock _l(mStateLock);
1223     const auto display = getDisplayDeviceLocked(displayToken);
1224     if (!display) {
1225         return BAD_VALUE;
1226     }
1227 
1228     // Use hasWideColorDisplay to override built-in display.
1229     const auto displayId = display->getId();
1230     if (displayId && displayId == getInternalDisplayIdLocked()) {
1231         *outIsWideColorDisplay = hasWideColorDisplay;
1232         return NO_ERROR;
1233     }
1234     *outIsWideColorDisplay = display->hasWideColorGamut();
1235     return NO_ERROR;
1236 }
1237 
enableVSyncInjections(bool enable)1238 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
1239     postMessageSync(new LambdaMessage([&] {
1240         Mutex::Autolock _l(mStateLock);
1241 
1242         if (mInjectVSyncs == enable) {
1243             return;
1244         }
1245 
1246         auto resyncCallback =
1247                 mScheduler->makeResyncCallback(std::bind(&SurfaceFlinger::getVsyncPeriod, this));
1248 
1249         // TODO(b/128863962): Part of the Injector should be refactored, so that it
1250         // can be passed to Scheduler.
1251         if (enable) {
1252             ALOGV("VSync Injections enabled");
1253             if (mVSyncInjector.get() == nullptr) {
1254                 mVSyncInjector = std::make_unique<InjectVSyncSource>();
1255                 mInjectorEventThread = std::make_unique<
1256                         impl::EventThread>(mVSyncInjector.get(),
1257                                            impl::EventThread::InterceptVSyncsCallback(),
1258                                            "injEventThread");
1259             }
1260             mEventQueue->setEventThread(mInjectorEventThread.get(), std::move(resyncCallback));
1261         } else {
1262             ALOGV("VSync Injections disabled");
1263             mEventQueue->setEventThread(mScheduler->getEventThread(mSfConnectionHandle),
1264                                         std::move(resyncCallback));
1265         }
1266 
1267         mInjectVSyncs = enable;
1268     }));
1269 
1270     return NO_ERROR;
1271 }
1272 
injectVSync(nsecs_t when)1273 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
1274     Mutex::Autolock _l(mStateLock);
1275 
1276     if (!mInjectVSyncs) {
1277         ALOGE("VSync Injections not enabled");
1278         return BAD_VALUE;
1279     }
1280     if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
1281         ALOGV("Injecting VSync inside SurfaceFlinger");
1282         mVSyncInjector->onInjectSyncEvent(when);
1283     }
1284     return NO_ERROR;
1285 }
1286 
getLayerDebugInfo(std::vector<LayerDebugInfo> * outLayers)1287 status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers)
1288         NO_THREAD_SAFETY_ANALYSIS {
1289     outLayers->clear();
1290     postMessageSync(new LambdaMessage([&]() {
1291             mDrawingState.traverseInZOrder([&](Layer* layer) {
1292             outLayers->push_back(layer->getLayerDebugInfo());
1293         });
1294 
1295     }));
1296     return NO_ERROR;
1297 }
1298 
getCompositionPreference(Dataspace * outDataspace,ui::PixelFormat * outPixelFormat,Dataspace * outWideColorGamutDataspace,ui::PixelFormat * outWideColorGamutPixelFormat) const1299 status_t SurfaceFlinger::getCompositionPreference(
1300         Dataspace* outDataspace, ui::PixelFormat* outPixelFormat,
1301         Dataspace* outWideColorGamutDataspace,
1302         ui::PixelFormat* outWideColorGamutPixelFormat) const {
1303     *outDataspace = mDefaultCompositionDataspace;
1304     *outPixelFormat = defaultCompositionPixelFormat;
1305     *outWideColorGamutDataspace = mWideColorGamutCompositionDataspace;
1306     *outWideColorGamutPixelFormat = wideColorGamutCompositionPixelFormat;
1307     return NO_ERROR;
1308 }
1309 
addRegionSamplingListener(const Rect & samplingArea,const sp<IBinder> & stopLayerHandle,const sp<IRegionSamplingListener> & listener)1310 status_t SurfaceFlinger::addRegionSamplingListener(const Rect& samplingArea,
1311                                                    const sp<IBinder>& stopLayerHandle,
1312                                                    const sp<IRegionSamplingListener>& listener) {
1313     if (!listener || samplingArea == Rect::INVALID_RECT) {
1314         return BAD_VALUE;
1315     }
1316     mRegionSamplingThread->addListener(samplingArea, stopLayerHandle, listener);
1317     return NO_ERROR;
1318 }
1319 
removeRegionSamplingListener(const sp<IRegionSamplingListener> & listener)1320 status_t SurfaceFlinger::removeRegionSamplingListener(const sp<IRegionSamplingListener>& listener) {
1321     if (!listener) {
1322         return BAD_VALUE;
1323     }
1324     mRegionSamplingThread->removeListener(listener);
1325     return NO_ERROR;
1326 }
1327 
getDisplayBrightnessSupport(const sp<IBinder> & displayToken,bool * outSupport) const1328 status_t SurfaceFlinger::getDisplayBrightnessSupport(const sp<IBinder>& displayToken,
1329                                                      bool* outSupport) const {
1330     if (!displayToken || !outSupport) {
1331         return BAD_VALUE;
1332     }
1333     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1334     if (!displayId) {
1335         return NAME_NOT_FOUND;
1336     }
1337     *outSupport =
1338             getHwComposer().hasDisplayCapability(displayId, HWC2::DisplayCapability::Brightness);
1339     return NO_ERROR;
1340 }
1341 
setDisplayBrightness(const sp<IBinder> & displayToken,float brightness) const1342 status_t SurfaceFlinger::setDisplayBrightness(const sp<IBinder>& displayToken,
1343                                               float brightness) const {
1344     if (!displayToken) {
1345         return BAD_VALUE;
1346     }
1347     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1348     if (!displayId) {
1349         return NAME_NOT_FOUND;
1350     }
1351     return getHwComposer().setDisplayBrightness(*displayId, brightness);
1352 }
1353 
notifyPowerHint(int32_t hintId)1354 status_t SurfaceFlinger::notifyPowerHint(int32_t hintId) {
1355     PowerHint powerHint = static_cast<PowerHint>(hintId);
1356 
1357     if (powerHint == PowerHint::INTERACTION) {
1358         mScheduler->notifyTouchEvent();
1359     }
1360 
1361     return NO_ERROR;
1362 }
1363 
1364 // ----------------------------------------------------------------------------
1365 
createDisplayEventConnection(ISurfaceComposer::VsyncSource vsyncSource)1366 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
1367         ISurfaceComposer::VsyncSource vsyncSource) {
1368     auto resyncCallback = mScheduler->makeResyncCallback([this] {
1369         Mutex::Autolock lock(mStateLock);
1370         return getVsyncPeriod();
1371     });
1372 
1373     const auto& handle =
1374             vsyncSource == eVsyncSourceSurfaceFlinger ? mSfConnectionHandle : mAppConnectionHandle;
1375 
1376     return mScheduler->createDisplayEventConnection(handle, std::move(resyncCallback));
1377 }
1378 
1379 // ----------------------------------------------------------------------------
1380 
waitForEvent()1381 void SurfaceFlinger::waitForEvent() {
1382     mEventQueue->waitMessage();
1383 }
1384 
signalTransaction()1385 void SurfaceFlinger::signalTransaction() {
1386     mScheduler->resetIdleTimer();
1387     mEventQueue->invalidate();
1388 }
1389 
signalLayerUpdate()1390 void SurfaceFlinger::signalLayerUpdate() {
1391     mScheduler->resetIdleTimer();
1392     mEventQueue->invalidate();
1393 }
1394 
signalRefresh()1395 void SurfaceFlinger::signalRefresh() {
1396     mRefreshPending = true;
1397     mEventQueue->refresh();
1398 }
1399 
postMessageAsync(const sp<MessageBase> & msg,nsecs_t reltime,uint32_t)1400 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
1401         nsecs_t reltime, uint32_t /* flags */) {
1402     return mEventQueue->postMessage(msg, reltime);
1403 }
1404 
postMessageSync(const sp<MessageBase> & msg,nsecs_t reltime,uint32_t)1405 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
1406         nsecs_t reltime, uint32_t /* flags */) {
1407     status_t res = mEventQueue->postMessage(msg, reltime);
1408     if (res == NO_ERROR) {
1409         msg->wait();
1410     }
1411     return res;
1412 }
1413 
run()1414 void SurfaceFlinger::run() {
1415     do {
1416         waitForEvent();
1417     } while (true);
1418 }
1419 
getVsyncPeriod() const1420 nsecs_t SurfaceFlinger::getVsyncPeriod() const {
1421     const auto displayId = getInternalDisplayIdLocked();
1422     if (!displayId || !getHwComposer().isConnected(*displayId)) {
1423         return 0;
1424     }
1425 
1426     const auto config = getHwComposer().getActiveConfig(*displayId);
1427     return config ? config->getVsyncPeriod() : 0;
1428 }
1429 
onVsyncReceived(int32_t sequenceId,hwc2_display_t hwcDisplayId,int64_t timestamp)1430 void SurfaceFlinger::onVsyncReceived(int32_t sequenceId, hwc2_display_t hwcDisplayId,
1431                                      int64_t timestamp) {
1432     ATRACE_NAME("SF onVsync");
1433 
1434     Mutex::Autolock lock(mStateLock);
1435     // Ignore any vsyncs from a previous hardware composer.
1436     if (sequenceId != getBE().mComposerSequenceId) {
1437         return;
1438     }
1439 
1440     if (!getHwComposer().onVsync(hwcDisplayId, timestamp)) {
1441         return;
1442     }
1443 
1444     if (hwcDisplayId != getHwComposer().getInternalHwcDisplayId()) {
1445         // For now, we don't do anything with external display vsyncs.
1446         return;
1447     }
1448 
1449     bool periodChanged = false;
1450     mScheduler->addResyncSample(timestamp, &periodChanged);
1451     if (periodChanged) {
1452         mVsyncModulator.onRefreshRateChangeDetected();
1453     }
1454 }
1455 
getCompositorTiming(CompositorTiming * compositorTiming)1456 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1457     std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1458     *compositorTiming = getBE().mCompositorTiming;
1459 }
1460 
isDisplayConfigAllowed(int32_t configId)1461 bool SurfaceFlinger::isDisplayConfigAllowed(int32_t configId) {
1462     return mAllowedDisplayConfigs.empty() || mAllowedDisplayConfigs.count(configId);
1463 }
1464 
setRefreshRateTo(RefreshRateType refreshRate,Scheduler::ConfigEvent event)1465 void SurfaceFlinger::setRefreshRateTo(RefreshRateType refreshRate, Scheduler::ConfigEvent event) {
1466     const auto display = getDefaultDisplayDeviceLocked();
1467     if (!display || mBootStage != BootStage::FINISHED) {
1468         return;
1469     }
1470     ATRACE_CALL();
1471 
1472     // Don't do any updating if the current fps is the same as the new one.
1473     const auto& refreshRateConfig = mRefreshRateConfigs.getRefreshRate(refreshRate);
1474     if (!refreshRateConfig) {
1475         ALOGV("Skipping refresh rate change request for unsupported rate.");
1476         return;
1477     }
1478 
1479     const int desiredConfigId = refreshRateConfig->configId;
1480 
1481     if (!isDisplayConfigAllowed(desiredConfigId)) {
1482         ALOGV("Skipping config %d as it is not part of allowed configs", desiredConfigId);
1483         return;
1484     }
1485 
1486     setDesiredActiveConfig({refreshRate, desiredConfigId, event});
1487 }
1488 
onHotplugReceived(int32_t sequenceId,hwc2_display_t hwcDisplayId,HWC2::Connection connection)1489 void SurfaceFlinger::onHotplugReceived(int32_t sequenceId, hwc2_display_t hwcDisplayId,
1490                                        HWC2::Connection connection) {
1491     ALOGV("%s(%d, %" PRIu64 ", %s)", __FUNCTION__, sequenceId, hwcDisplayId,
1492           connection == HWC2::Connection::Connected ? "connected" : "disconnected");
1493 
1494     // Ignore events that do not have the right sequenceId.
1495     if (sequenceId != getBE().mComposerSequenceId) {
1496         return;
1497     }
1498 
1499     // Only lock if we're not on the main thread. This function is normally
1500     // called on a hwbinder thread, but for the primary display it's called on
1501     // the main thread with the state lock already held, so don't attempt to
1502     // acquire it here.
1503     ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
1504 
1505     mPendingHotplugEvents.emplace_back(HotplugEvent{hwcDisplayId, connection});
1506 
1507     if (std::this_thread::get_id() == mMainThreadId) {
1508         // Process all pending hot plug events immediately if we are on the main thread.
1509         processDisplayHotplugEventsLocked();
1510     }
1511 
1512     setTransactionFlags(eDisplayTransactionNeeded);
1513 }
1514 
onRefreshReceived(int sequenceId,hwc2_display_t)1515 void SurfaceFlinger::onRefreshReceived(int sequenceId, hwc2_display_t /*hwcDisplayId*/) {
1516     Mutex::Autolock lock(mStateLock);
1517     if (sequenceId != getBE().mComposerSequenceId) {
1518         return;
1519     }
1520     repaintEverythingForHWC();
1521 }
1522 
setPrimaryVsyncEnabled(bool enabled)1523 void SurfaceFlinger::setPrimaryVsyncEnabled(bool enabled) {
1524     ATRACE_CALL();
1525     Mutex::Autolock lock(mStateLock);
1526     if (const auto displayId = getInternalDisplayIdLocked()) {
1527         getHwComposer().setVsyncEnabled(*displayId,
1528                                         enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable);
1529     }
1530 }
1531 
1532 // Note: it is assumed the caller holds |mStateLock| when this is called
resetDisplayState()1533 void SurfaceFlinger::resetDisplayState() {
1534     mScheduler->disableHardwareVsync(true);
1535     // Clear the drawing state so that the logic inside of
1536     // handleTransactionLocked will fire. It will determine the delta between
1537     // mCurrentState and mDrawingState and re-apply all changes when we make the
1538     // transition.
1539     mDrawingState.displays.clear();
1540     mDisplays.clear();
1541 }
1542 
updateVrFlinger()1543 void SurfaceFlinger::updateVrFlinger() {
1544     ATRACE_CALL();
1545     if (!mVrFlinger)
1546         return;
1547     bool vrFlingerRequestsDisplay = mVrFlingerRequestsDisplay;
1548     if (vrFlingerRequestsDisplay == getHwComposer().isUsingVrComposer()) {
1549         return;
1550     }
1551 
1552     if (vrFlingerRequestsDisplay && !getHwComposer().getComposer()->isRemote()) {
1553         ALOGE("Vr flinger is only supported for remote hardware composer"
1554               " service connections. Ignoring request to transition to vr"
1555               " flinger.");
1556         mVrFlingerRequestsDisplay = false;
1557         return;
1558     }
1559 
1560     Mutex::Autolock _l(mStateLock);
1561 
1562     sp<DisplayDevice> display = getDefaultDisplayDeviceLocked();
1563     LOG_ALWAYS_FATAL_IF(!display);
1564 
1565     const int currentDisplayPowerMode = display->getPowerMode();
1566 
1567     // Clear out all the output layers from the composition engine for all
1568     // displays before destroying the hardware composer interface. This ensures
1569     // any HWC layers are destroyed through that interface before it becomes
1570     // invalid.
1571     for (const auto& [token, displayDevice] : mDisplays) {
1572         displayDevice->getCompositionDisplay()->setOutputLayersOrderedByZ(
1573                 compositionengine::Output::OutputLayers());
1574     }
1575 
1576     // This DisplayDevice will no longer be relevant once resetDisplayState() is
1577     // called below. Clear the reference now so we don't accidentally use it
1578     // later.
1579     display.clear();
1580 
1581     if (!vrFlingerRequestsDisplay) {
1582         mVrFlinger->SeizeDisplayOwnership();
1583     }
1584 
1585     resetDisplayState();
1586     // Delete the current instance before creating the new one
1587     mCompositionEngine->setHwComposer(std::unique_ptr<HWComposer>());
1588     mCompositionEngine->setHwComposer(getFactory().createHWComposer(
1589             vrFlingerRequestsDisplay ? "vr" : getBE().mHwcServiceName));
1590     getHwComposer().registerCallback(this, ++getBE().mComposerSequenceId);
1591 
1592     LOG_ALWAYS_FATAL_IF(!getHwComposer().getComposer()->isRemote(),
1593                         "Switched to non-remote hardware composer");
1594 
1595     if (vrFlingerRequestsDisplay) {
1596         mVrFlinger->GrantDisplayOwnership();
1597     }
1598 
1599     mVisibleRegionsDirty = true;
1600     invalidateHwcGeometry();
1601 
1602     // Re-enable default display.
1603     display = getDefaultDisplayDeviceLocked();
1604     LOG_ALWAYS_FATAL_IF(!display);
1605     setPowerModeInternal(display, currentDisplayPowerMode);
1606 
1607     // Reset the timing values to account for the period of the swapped in HWC
1608     const nsecs_t vsyncPeriod = getVsyncPeriod();
1609     mAnimFrameTracker.setDisplayRefreshPeriod(vsyncPeriod);
1610 
1611     // The present fences returned from vr_hwc are not an accurate
1612     // representation of vsync times.
1613     mScheduler->setIgnorePresentFences(getHwComposer().isUsingVrComposer() || !hasSyncFramework);
1614 
1615     // Use phase of 0 since phase is not known.
1616     // Use latency of 0, which will snap to the ideal latency.
1617     DisplayStatInfo stats{0 /* vsyncTime */, vsyncPeriod};
1618     setCompositorTimingSnapped(stats, 0);
1619 
1620     mScheduler->resyncToHardwareVsync(false, vsyncPeriod);
1621 
1622     mRepaintEverything = true;
1623     setTransactionFlags(eDisplayTransactionNeeded);
1624 }
1625 
previousFrameMissed()1626 bool SurfaceFlinger::previousFrameMissed() NO_THREAD_SAFETY_ANALYSIS {
1627     // We are storing the last 2 present fences. If sf's phase offset is to be
1628     // woken up before the actual vsync but targeting the next vsync, we need to check
1629     // fence N-2
1630     const sp<Fence>& fence =
1631             mVsyncModulator.getOffsets().sf < mPhaseOffsets->getOffsetThresholdForNextVsync()
1632             ? mPreviousPresentFences[0]
1633             : mPreviousPresentFences[1];
1634 
1635     return fence != Fence::NO_FENCE && (fence->getStatus() == Fence::Status::Unsignaled);
1636 }
1637 
onMessageReceived(int32_t what)1638 void SurfaceFlinger::onMessageReceived(int32_t what) NO_THREAD_SAFETY_ANALYSIS {
1639     ATRACE_CALL();
1640     switch (what) {
1641         case MessageQueue::INVALIDATE: {
1642             bool frameMissed = previousFrameMissed();
1643             bool hwcFrameMissed = mHadDeviceComposition && frameMissed;
1644             bool gpuFrameMissed = mHadClientComposition && frameMissed;
1645             ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));
1646             ATRACE_INT("HwcFrameMissed", static_cast<int>(hwcFrameMissed));
1647             ATRACE_INT("GpuFrameMissed", static_cast<int>(gpuFrameMissed));
1648             if (frameMissed) {
1649                 mFrameMissedCount++;
1650                 mTimeStats->incrementMissedFrames();
1651             }
1652 
1653             if (hwcFrameMissed) {
1654                 mHwcFrameMissedCount++;
1655             }
1656 
1657             if (gpuFrameMissed) {
1658                 mGpuFrameMissedCount++;
1659             }
1660 
1661             if (mUseSmart90ForVideo) {
1662                 // This call is made each time SF wakes up and creates a new frame. It is part
1663                 // of video detection feature.
1664                 mScheduler->updateFpsBasedOnContent();
1665             }
1666 
1667             if (performSetActiveConfig()) {
1668                 break;
1669             }
1670 
1671             if (frameMissed && mPropagateBackpressure) {
1672                 if ((hwcFrameMissed && !gpuFrameMissed) ||
1673                     mPropagateBackpressureClientComposition) {
1674                     signalLayerUpdate();
1675                     break;
1676                 }
1677             }
1678 
1679             // Now that we're going to make it to the handleMessageTransaction()
1680             // call below it's safe to call updateVrFlinger(), which will
1681             // potentially trigger a display handoff.
1682             updateVrFlinger();
1683 
1684             bool refreshNeeded = handleMessageTransaction();
1685             refreshNeeded |= handleMessageInvalidate();
1686 
1687             updateCursorAsync();
1688             updateInputFlinger();
1689 
1690             refreshNeeded |= mRepaintEverything;
1691             if (refreshNeeded && CC_LIKELY(mBootStage != BootStage::BOOTLOADER)) {
1692                 // Signal a refresh if a transaction modified the window state,
1693                 // a new buffer was latched, or if HWC has requested a full
1694                 // repaint
1695                 signalRefresh();
1696             }
1697             break;
1698         }
1699         case MessageQueue::REFRESH: {
1700             handleMessageRefresh();
1701             break;
1702         }
1703     }
1704 }
1705 
handleMessageTransaction()1706 bool SurfaceFlinger::handleMessageTransaction() {
1707     ATRACE_CALL();
1708     uint32_t transactionFlags = peekTransactionFlags();
1709 
1710     bool flushedATransaction = flushTransactionQueues();
1711 
1712     bool runHandleTransaction = transactionFlags &&
1713             ((transactionFlags != eTransactionFlushNeeded) || flushedATransaction);
1714 
1715     if (runHandleTransaction) {
1716         handleTransaction(eTransactionMask);
1717     } else {
1718         getTransactionFlags(eTransactionFlushNeeded);
1719     }
1720 
1721     if (transactionFlushNeeded()) {
1722         setTransactionFlags(eTransactionFlushNeeded);
1723     }
1724 
1725     return runHandleTransaction;
1726 }
1727 
handleMessageRefresh()1728 void SurfaceFlinger::handleMessageRefresh() {
1729     ATRACE_CALL();
1730 
1731     mRefreshPending = false;
1732 
1733     const bool repaintEverything = mRepaintEverything.exchange(false);
1734     preComposition();
1735     rebuildLayerStacks();
1736     calculateWorkingSet();
1737     for (const auto& [token, display] : mDisplays) {
1738         beginFrame(display);
1739         prepareFrame(display);
1740         doDebugFlashRegions(display, repaintEverything);
1741         doComposition(display, repaintEverything);
1742     }
1743 
1744     logLayerStats();
1745 
1746     postFrame();
1747     postComposition();
1748 
1749     mHadClientComposition = false;
1750     mHadDeviceComposition = false;
1751     for (const auto& [token, displayDevice] : mDisplays) {
1752         auto display = displayDevice->getCompositionDisplay();
1753         const auto displayId = display->getId();
1754         mHadClientComposition =
1755                 mHadClientComposition || getHwComposer().hasClientComposition(displayId);
1756         mHadDeviceComposition =
1757                 mHadDeviceComposition || getHwComposer().hasDeviceComposition(displayId);
1758     }
1759 
1760     mVsyncModulator.onRefreshed(mHadClientComposition);
1761 
1762     mLayersWithQueuedFrames.clear();
1763 }
1764 
1765 
handleMessageInvalidate()1766 bool SurfaceFlinger::handleMessageInvalidate() {
1767     ATRACE_CALL();
1768     bool refreshNeeded = handlePageFlip();
1769 
1770     if (mVisibleRegionsDirty) {
1771         computeLayerBounds();
1772         if (mTracingEnabled) {
1773             mTracing.notify("visibleRegionsDirty");
1774         }
1775     }
1776 
1777     for (auto& layer : mLayersPendingRefresh) {
1778         Region visibleReg;
1779         visibleReg.set(layer->getScreenBounds());
1780         invalidateLayerStack(layer, visibleReg);
1781     }
1782     mLayersPendingRefresh.clear();
1783     return refreshNeeded;
1784 }
1785 
calculateWorkingSet()1786 void SurfaceFlinger::calculateWorkingSet() {
1787     ATRACE_CALL();
1788     ALOGV(__FUNCTION__);
1789 
1790     // build the h/w work list
1791     if (CC_UNLIKELY(mGeometryInvalid)) {
1792         mGeometryInvalid = false;
1793         for (const auto& [token, displayDevice] : mDisplays) {
1794             auto display = displayDevice->getCompositionDisplay();
1795 
1796             uint32_t zOrder = 0;
1797 
1798             for (auto& layer : display->getOutputLayersOrderedByZ()) {
1799                 auto& compositionState = layer->editState();
1800                 compositionState.forceClientComposition = false;
1801                 if (!compositionState.hwc || mDebugDisableHWC || mDebugRegion) {
1802                     compositionState.forceClientComposition = true;
1803                 }
1804 
1805                 // The output Z order is set here based on a simple counter.
1806                 compositionState.z = zOrder++;
1807 
1808                 // Update the display independent composition state. This goes
1809                 // to the general composition layer state structure.
1810                 // TODO: Do this once per compositionengine::CompositionLayer.
1811                 layer->getLayerFE().latchCompositionState(layer->getLayer().editState().frontEnd,
1812                                                           true);
1813 
1814                 // Recalculate the geometry state of the output layer.
1815                 layer->updateCompositionState(true);
1816 
1817                 // Write the updated geometry state to the HWC
1818                 layer->writeStateToHWC(true);
1819             }
1820         }
1821     }
1822 
1823     // Set the per-frame data
1824     for (const auto& [token, displayDevice] : mDisplays) {
1825         auto display = displayDevice->getCompositionDisplay();
1826         const auto displayId = display->getId();
1827         if (!displayId) {
1828             continue;
1829         }
1830         auto* profile = display->getDisplayColorProfile();
1831 
1832         if (mDrawingState.colorMatrixChanged) {
1833             display->setColorTransform(mDrawingState.colorMatrix);
1834         }
1835         Dataspace targetDataspace = Dataspace::UNKNOWN;
1836         if (useColorManagement) {
1837             ColorMode colorMode;
1838             RenderIntent renderIntent;
1839             pickColorMode(displayDevice, &colorMode, &targetDataspace, &renderIntent);
1840             display->setColorMode(colorMode, targetDataspace, renderIntent);
1841         }
1842         for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1843             if (layer->isHdrY410()) {
1844                 layer->forceClientComposition(displayDevice);
1845             } else if ((layer->getDataSpace() == Dataspace::BT2020_PQ ||
1846                         layer->getDataSpace() == Dataspace::BT2020_ITU_PQ) &&
1847                        !profile->hasHDR10Support()) {
1848                 layer->forceClientComposition(displayDevice);
1849             } else if ((layer->getDataSpace() == Dataspace::BT2020_HLG ||
1850                         layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) &&
1851                        !profile->hasHLGSupport()) {
1852                 layer->forceClientComposition(displayDevice);
1853             }
1854 
1855             if (layer->getRoundedCornerState().radius > 0.0f) {
1856                 layer->forceClientComposition(displayDevice);
1857             }
1858 
1859             if (layer->getForceClientComposition(displayDevice)) {
1860                 ALOGV("[%s] Requesting Client composition", layer->getName().string());
1861                 layer->setCompositionType(displayDevice,
1862                                           Hwc2::IComposerClient::Composition::CLIENT);
1863                 continue;
1864             }
1865 
1866             const auto& displayState = display->getState();
1867             layer->setPerFrameData(displayDevice, displayState.transform, displayState.viewport,
1868                                    displayDevice->getSupportedPerFrameMetadata(),
1869                                    isHdrColorMode(displayState.colorMode) ? Dataspace::UNKNOWN
1870                                                                           : targetDataspace);
1871         }
1872     }
1873 
1874     mDrawingState.colorMatrixChanged = false;
1875 
1876     for (const auto& [token, displayDevice] : mDisplays) {
1877         auto display = displayDevice->getCompositionDisplay();
1878         for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1879             auto& layerState = layer->getCompositionLayer()->editState().frontEnd;
1880             layerState.compositionType = static_cast<Hwc2::IComposerClient::Composition>(
1881                     layer->getCompositionType(displayDevice));
1882         }
1883     }
1884 }
1885 
doDebugFlashRegions(const sp<DisplayDevice> & displayDevice,bool repaintEverything)1886 void SurfaceFlinger::doDebugFlashRegions(const sp<DisplayDevice>& displayDevice,
1887                                          bool repaintEverything) {
1888     auto display = displayDevice->getCompositionDisplay();
1889     const auto& displayState = display->getState();
1890 
1891     // is debugging enabled
1892     if (CC_LIKELY(!mDebugRegion))
1893         return;
1894 
1895     if (displayState.isEnabled) {
1896         // transform the dirty region into this screen's coordinate space
1897         const Region dirtyRegion = display->getDirtyRegion(repaintEverything);
1898         if (!dirtyRegion.isEmpty()) {
1899             base::unique_fd readyFence;
1900             // redraw the whole screen
1901             doComposeSurfaces(displayDevice, dirtyRegion, &readyFence);
1902 
1903             display->getRenderSurface()->queueBuffer(std::move(readyFence));
1904         }
1905     }
1906 
1907     postFramebuffer(displayDevice);
1908 
1909     if (mDebugRegion > 1) {
1910         usleep(mDebugRegion * 1000);
1911     }
1912 
1913     prepareFrame(displayDevice);
1914 }
1915 
logLayerStats()1916 void SurfaceFlinger::logLayerStats() {
1917     ATRACE_CALL();
1918     if (CC_UNLIKELY(mLayerStats.isEnabled())) {
1919         for (const auto& [token, display] : mDisplays) {
1920             if (display->isPrimary()) {
1921                 mLayerStats.logLayerStats(dumpVisibleLayersProtoInfo(display));
1922                 return;
1923             }
1924         }
1925 
1926         ALOGE("logLayerStats: no primary display");
1927     }
1928 }
1929 
preComposition()1930 void SurfaceFlinger::preComposition()
1931 {
1932     ATRACE_CALL();
1933     ALOGV("preComposition");
1934 
1935     mRefreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1936 
1937     bool needExtraInvalidate = false;
1938     mDrawingState.traverseInZOrder([&](Layer* layer) {
1939         if (layer->onPreComposition(mRefreshStartTime)) {
1940             needExtraInvalidate = true;
1941         }
1942     });
1943 
1944     if (needExtraInvalidate) {
1945         signalLayerUpdate();
1946     }
1947 }
1948 
updateCompositorTiming(const DisplayStatInfo & stats,nsecs_t compositeTime,std::shared_ptr<FenceTime> & presentFenceTime)1949 void SurfaceFlinger::updateCompositorTiming(const DisplayStatInfo& stats, nsecs_t compositeTime,
1950                                             std::shared_ptr<FenceTime>& presentFenceTime) {
1951     // Update queue of past composite+present times and determine the
1952     // most recently known composite to present latency.
1953     getBE().mCompositePresentTimes.push({compositeTime, presentFenceTime});
1954     nsecs_t compositeToPresentLatency = -1;
1955     while (!getBE().mCompositePresentTimes.empty()) {
1956         SurfaceFlingerBE::CompositePresentTime& cpt = getBE().mCompositePresentTimes.front();
1957         // Cached values should have been updated before calling this method,
1958         // which helps avoid duplicate syscalls.
1959         nsecs_t displayTime = cpt.display->getCachedSignalTime();
1960         if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1961             break;
1962         }
1963         compositeToPresentLatency = displayTime - cpt.composite;
1964         getBE().mCompositePresentTimes.pop();
1965     }
1966 
1967     // Don't let mCompositePresentTimes grow unbounded, just in case.
1968     while (getBE().mCompositePresentTimes.size() > 16) {
1969         getBE().mCompositePresentTimes.pop();
1970     }
1971 
1972     setCompositorTimingSnapped(stats, compositeToPresentLatency);
1973 }
1974 
setCompositorTimingSnapped(const DisplayStatInfo & stats,nsecs_t compositeToPresentLatency)1975 void SurfaceFlinger::setCompositorTimingSnapped(const DisplayStatInfo& stats,
1976                                                 nsecs_t compositeToPresentLatency) {
1977     // Integer division and modulo round toward 0 not -inf, so we need to
1978     // treat negative and positive offsets differently.
1979     nsecs_t idealLatency = (mPhaseOffsets->getCurrentSfOffset() > 0)
1980             ? (stats.vsyncPeriod - (mPhaseOffsets->getCurrentSfOffset() % stats.vsyncPeriod))
1981             : ((-mPhaseOffsets->getCurrentSfOffset()) % stats.vsyncPeriod);
1982 
1983     // Just in case mPhaseOffsets->getCurrentSfOffset() == -vsyncInterval.
1984     if (idealLatency <= 0) {
1985         idealLatency = stats.vsyncPeriod;
1986     }
1987 
1988     // Snap the latency to a value that removes scheduling jitter from the
1989     // composition and present times, which often have >1ms of jitter.
1990     // Reducing jitter is important if an app attempts to extrapolate
1991     // something (such as user input) to an accurate diasplay time.
1992     // Snapping also allows an app to precisely calculate mPhaseOffsets->getCurrentSfOffset()
1993     // with (presentLatency % interval).
1994     nsecs_t bias = stats.vsyncPeriod / 2;
1995     int64_t extraVsyncs = (compositeToPresentLatency - idealLatency + bias) / stats.vsyncPeriod;
1996     nsecs_t snappedCompositeToPresentLatency =
1997             (extraVsyncs > 0) ? idealLatency + (extraVsyncs * stats.vsyncPeriod) : idealLatency;
1998 
1999     std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
2000     getBE().mCompositorTiming.deadline = stats.vsyncTime - idealLatency;
2001     getBE().mCompositorTiming.interval = stats.vsyncPeriod;
2002     getBE().mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
2003 }
2004 
postComposition()2005 void SurfaceFlinger::postComposition()
2006 {
2007     ATRACE_CALL();
2008     ALOGV("postComposition");
2009 
2010     // Release any buffers which were replaced this frame
2011     nsecs_t dequeueReadyTime = systemTime();
2012     for (auto& layer : mLayersWithQueuedFrames) {
2013         layer->releasePendingBuffer(dequeueReadyTime);
2014     }
2015 
2016     // |mStateLock| not needed as we are on the main thread
2017     const auto displayDevice = getDefaultDisplayDeviceLocked();
2018 
2019     getBE().mGlCompositionDoneTimeline.updateSignalTimes();
2020     std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
2021     if (displayDevice && getHwComposer().hasClientComposition(displayDevice->getId())) {
2022         glCompositionDoneFenceTime =
2023                 std::make_shared<FenceTime>(displayDevice->getCompositionDisplay()
2024                                                     ->getRenderSurface()
2025                                                     ->getClientTargetAcquireFence());
2026         getBE().mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
2027     } else {
2028         glCompositionDoneFenceTime = FenceTime::NO_FENCE;
2029     }
2030 
2031     getBE().mDisplayTimeline.updateSignalTimes();
2032     mPreviousPresentFences[1] = mPreviousPresentFences[0];
2033     mPreviousPresentFences[0] = displayDevice
2034             ? getHwComposer().getPresentFence(*displayDevice->getId())
2035             : Fence::NO_FENCE;
2036     auto presentFenceTime = std::make_shared<FenceTime>(mPreviousPresentFences[0]);
2037     getBE().mDisplayTimeline.push(presentFenceTime);
2038 
2039     DisplayStatInfo stats;
2040     mScheduler->getDisplayStatInfo(&stats);
2041 
2042     // We use the mRefreshStartTime which might be sampled a little later than
2043     // when we started doing work for this frame, but that should be okay
2044     // since updateCompositorTiming has snapping logic.
2045     updateCompositorTiming(stats, mRefreshStartTime, presentFenceTime);
2046     CompositorTiming compositorTiming;
2047     {
2048         std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
2049         compositorTiming = getBE().mCompositorTiming;
2050     }
2051 
2052     mDrawingState.traverseInZOrder([&](Layer* layer) {
2053         bool frameLatched =
2054                 layer->onPostComposition(displayDevice->getId(), glCompositionDoneFenceTime,
2055                                          presentFenceTime, compositorTiming);
2056         if (frameLatched) {
2057             recordBufferingStats(layer->getName().string(),
2058                     layer->getOccupancyHistory(false));
2059         }
2060     });
2061 
2062     if (presentFenceTime->isValid()) {
2063         mScheduler->addPresentFence(presentFenceTime);
2064     }
2065 
2066     if (!hasSyncFramework) {
2067         if (displayDevice && getHwComposer().isConnected(*displayDevice->getId()) &&
2068             displayDevice->isPoweredOn()) {
2069             mScheduler->enableHardwareVsync();
2070         }
2071     }
2072 
2073     if (mAnimCompositionPending) {
2074         mAnimCompositionPending = false;
2075 
2076         if (presentFenceTime->isValid()) {
2077             mAnimFrameTracker.setActualPresentFence(
2078                     std::move(presentFenceTime));
2079         } else if (displayDevice && getHwComposer().isConnected(*displayDevice->getId())) {
2080             // The HWC doesn't support present fences, so use the refresh
2081             // timestamp instead.
2082             const nsecs_t presentTime =
2083                     getHwComposer().getRefreshTimestamp(*displayDevice->getId());
2084             mAnimFrameTracker.setActualPresentTime(presentTime);
2085         }
2086         mAnimFrameTracker.advanceFrame();
2087     }
2088 
2089     mTimeStats->incrementTotalFrames();
2090     if (mHadClientComposition) {
2091         mTimeStats->incrementClientCompositionFrames();
2092     }
2093 
2094     mTimeStats->setPresentFenceGlobal(presentFenceTime);
2095 
2096     if (displayDevice && getHwComposer().isConnected(*displayDevice->getId()) &&
2097         !displayDevice->isPoweredOn()) {
2098         return;
2099     }
2100 
2101     nsecs_t currentTime = systemTime();
2102     if (mHasPoweredOff) {
2103         mHasPoweredOff = false;
2104     } else {
2105         nsecs_t elapsedTime = currentTime - getBE().mLastSwapTime;
2106         size_t numPeriods = static_cast<size_t>(elapsedTime / stats.vsyncPeriod);
2107         if (numPeriods < SurfaceFlingerBE::NUM_BUCKETS - 1) {
2108             getBE().mFrameBuckets[numPeriods] += elapsedTime;
2109         } else {
2110             getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] += elapsedTime;
2111         }
2112         getBE().mTotalTime += elapsedTime;
2113     }
2114     getBE().mLastSwapTime = currentTime;
2115 
2116     {
2117         std::lock_guard lock(mTexturePoolMutex);
2118         if (mTexturePool.size() < mTexturePoolSize) {
2119             const size_t refillCount = mTexturePoolSize - mTexturePool.size();
2120             const size_t offset = mTexturePool.size();
2121             mTexturePool.resize(mTexturePoolSize);
2122             getRenderEngine().genTextures(refillCount, mTexturePool.data() + offset);
2123             ATRACE_INT("TexturePoolSize", mTexturePool.size());
2124         } else if (mTexturePool.size() > mTexturePoolSize) {
2125             const size_t deleteCount = mTexturePool.size() - mTexturePoolSize;
2126             const size_t offset = mTexturePoolSize;
2127             getRenderEngine().deleteTextures(deleteCount, mTexturePool.data() + offset);
2128             mTexturePool.resize(mTexturePoolSize);
2129             ATRACE_INT("TexturePoolSize", mTexturePool.size());
2130         }
2131     }
2132 
2133     mTransactionCompletedThread.addPresentFence(mPreviousPresentFences[0]);
2134 
2135     // Lock the mStateLock in case SurfaceFlinger is in the middle of applying a transaction.
2136     // If we do not lock here, a callback could be sent without all of its SurfaceControls and
2137     // metrics.
2138     {
2139         Mutex::Autolock _l(mStateLock);
2140         mTransactionCompletedThread.sendCallbacks();
2141     }
2142 
2143     if (mLumaSampling && mRegionSamplingThread) {
2144         mRegionSamplingThread->notifyNewContent();
2145     }
2146 
2147     // Even though ATRACE_INT64 already checks if tracing is enabled, it doesn't prevent the
2148     // side-effect of getTotalSize(), so we check that again here
2149     if (ATRACE_ENABLED()) {
2150         ATRACE_INT64("Total Buffer Size", GraphicBufferAllocator::get().getTotalSize());
2151     }
2152 }
2153 
computeLayerBounds()2154 void SurfaceFlinger::computeLayerBounds() {
2155     for (const auto& pair : mDisplays) {
2156         const auto& displayDevice = pair.second;
2157         const auto display = displayDevice->getCompositionDisplay();
2158         for (const auto& layer : mDrawingState.layersSortedByZ) {
2159             // only consider the layers on the given layer stack
2160             if (!display->belongsInOutput(layer->getLayerStack(), layer->getPrimaryDisplayOnly())) {
2161                 continue;
2162             }
2163 
2164             layer->computeBounds(displayDevice->getViewport().toFloatRect(), ui::Transform());
2165         }
2166     }
2167 }
2168 
rebuildLayerStacks()2169 void SurfaceFlinger::rebuildLayerStacks() {
2170     ATRACE_CALL();
2171     ALOGV("rebuildLayerStacks");
2172 
2173     // rebuild the visible layer list per screen
2174     if (CC_UNLIKELY(mVisibleRegionsDirty)) {
2175         ATRACE_NAME("rebuildLayerStacks VR Dirty");
2176         mVisibleRegionsDirty = false;
2177         invalidateHwcGeometry();
2178 
2179         for (const auto& pair : mDisplays) {
2180             const auto& displayDevice = pair.second;
2181             auto display = displayDevice->getCompositionDisplay();
2182             const auto& displayState = display->getState();
2183             Region opaqueRegion;
2184             Region dirtyRegion;
2185             compositionengine::Output::OutputLayers layersSortedByZ;
2186             Vector<sp<Layer>> deprecated_layersSortedByZ;
2187             Vector<sp<Layer>> layersNeedingFences;
2188             const ui::Transform& tr = displayState.transform;
2189             const Rect bounds = displayState.bounds;
2190             if (displayState.isEnabled) {
2191                 computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion);
2192 
2193                 mDrawingState.traverseInZOrder([&](Layer* layer) {
2194                     auto compositionLayer = layer->getCompositionLayer();
2195                     if (compositionLayer == nullptr) {
2196                         return;
2197                     }
2198 
2199                     const auto displayId = displayDevice->getId();
2200                     sp<compositionengine::LayerFE> layerFE = compositionLayer->getLayerFE();
2201                     LOG_ALWAYS_FATAL_IF(layerFE.get() == nullptr);
2202 
2203                     bool needsOutputLayer = false;
2204 
2205                     if (display->belongsInOutput(layer->getLayerStack(),
2206                                                  layer->getPrimaryDisplayOnly())) {
2207                         Region drawRegion(tr.transform(
2208                                 layer->visibleNonTransparentRegion));
2209                         drawRegion.andSelf(bounds);
2210                         if (!drawRegion.isEmpty()) {
2211                             needsOutputLayer = true;
2212                         }
2213                     }
2214 
2215                     if (needsOutputLayer) {
2216                         layersSortedByZ.emplace_back(
2217                                 display->getOrCreateOutputLayer(displayId, compositionLayer,
2218                                                                 layerFE));
2219                         deprecated_layersSortedByZ.add(layer);
2220 
2221                         auto& outputLayerState = layersSortedByZ.back()->editState();
2222                         outputLayerState.visibleRegion =
2223                                 tr.transform(layer->visibleRegion.intersect(displayState.viewport));
2224                     } else if (displayId) {
2225                         // For layers that are being removed from a HWC display,
2226                         // and that have queued frames, add them to a a list of
2227                         // released layers so we can properly set a fence.
2228                         bool hasExistingOutputLayer =
2229                                 display->getOutputLayerForLayer(compositionLayer.get()) != nullptr;
2230                         bool hasQueuedFrames = std::find(mLayersWithQueuedFrames.cbegin(),
2231                                                          mLayersWithQueuedFrames.cend(),
2232                                                          layer) != mLayersWithQueuedFrames.cend();
2233 
2234                         if (hasExistingOutputLayer && hasQueuedFrames) {
2235                             layersNeedingFences.add(layer);
2236                         }
2237                     }
2238                 });
2239             }
2240 
2241             display->setOutputLayersOrderedByZ(std::move(layersSortedByZ));
2242 
2243             displayDevice->setVisibleLayersSortedByZ(deprecated_layersSortedByZ);
2244             displayDevice->setLayersNeedingFences(layersNeedingFences);
2245 
2246             Region undefinedRegion{bounds};
2247             undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
2248 
2249             display->editState().undefinedRegion = undefinedRegion;
2250             display->editState().dirtyRegion.orSelf(dirtyRegion);
2251         }
2252     }
2253 }
2254 
2255 // Returns a data space that fits all visible layers.  The returned data space
2256 // can only be one of
2257 //  - Dataspace::SRGB (use legacy dataspace and let HWC saturate when colors are enhanced)
2258 //  - Dataspace::DISPLAY_P3
2259 //  - Dataspace::DISPLAY_BT2020
2260 // The returned HDR data space is one of
2261 //  - Dataspace::UNKNOWN
2262 //  - Dataspace::BT2020_HLG
2263 //  - Dataspace::BT2020_PQ
getBestDataspace(const sp<DisplayDevice> & display,Dataspace * outHdrDataSpace,bool * outIsHdrClientComposition) const2264 Dataspace SurfaceFlinger::getBestDataspace(const sp<DisplayDevice>& display,
2265                                            Dataspace* outHdrDataSpace,
2266                                            bool* outIsHdrClientComposition) const {
2267     Dataspace bestDataSpace = Dataspace::V0_SRGB;
2268     *outHdrDataSpace = Dataspace::UNKNOWN;
2269 
2270     for (const auto& layer : display->getVisibleLayersSortedByZ()) {
2271         switch (layer->getDataSpace()) {
2272             case Dataspace::V0_SCRGB:
2273             case Dataspace::V0_SCRGB_LINEAR:
2274             case Dataspace::BT2020:
2275             case Dataspace::BT2020_ITU:
2276             case Dataspace::BT2020_LINEAR:
2277             case Dataspace::DISPLAY_BT2020:
2278                 bestDataSpace = Dataspace::DISPLAY_BT2020;
2279                 break;
2280             case Dataspace::DISPLAY_P3:
2281                 bestDataSpace = Dataspace::DISPLAY_P3;
2282                 break;
2283             case Dataspace::BT2020_PQ:
2284             case Dataspace::BT2020_ITU_PQ:
2285                 bestDataSpace = Dataspace::DISPLAY_P3;
2286                 *outHdrDataSpace = Dataspace::BT2020_PQ;
2287                 *outIsHdrClientComposition = layer->getForceClientComposition(display);
2288                 break;
2289             case Dataspace::BT2020_HLG:
2290             case Dataspace::BT2020_ITU_HLG:
2291                 bestDataSpace = Dataspace::DISPLAY_P3;
2292                 // When there's mixed PQ content and HLG content, we set the HDR
2293                 // data space to be BT2020_PQ and convert HLG to PQ.
2294                 if (*outHdrDataSpace == Dataspace::UNKNOWN) {
2295                     *outHdrDataSpace = Dataspace::BT2020_HLG;
2296                 }
2297                 break;
2298             default:
2299                 break;
2300         }
2301     }
2302 
2303     return bestDataSpace;
2304 }
2305 
2306 // Pick the ColorMode / Dataspace for the display device.
pickColorMode(const sp<DisplayDevice> & display,ColorMode * outMode,Dataspace * outDataSpace,RenderIntent * outRenderIntent) const2307 void SurfaceFlinger::pickColorMode(const sp<DisplayDevice>& display, ColorMode* outMode,
2308                                    Dataspace* outDataSpace, RenderIntent* outRenderIntent) const {
2309     if (mDisplayColorSetting == DisplayColorSetting::UNMANAGED) {
2310         *outMode = ColorMode::NATIVE;
2311         *outDataSpace = Dataspace::UNKNOWN;
2312         *outRenderIntent = RenderIntent::COLORIMETRIC;
2313         return;
2314     }
2315 
2316     Dataspace hdrDataSpace;
2317     bool isHdrClientComposition = false;
2318     Dataspace bestDataSpace = getBestDataspace(display, &hdrDataSpace, &isHdrClientComposition);
2319 
2320     auto* profile = display->getCompositionDisplay()->getDisplayColorProfile();
2321 
2322     switch (mForceColorMode) {
2323         case ColorMode::SRGB:
2324             bestDataSpace = Dataspace::V0_SRGB;
2325             break;
2326         case ColorMode::DISPLAY_P3:
2327             bestDataSpace = Dataspace::DISPLAY_P3;
2328             break;
2329         default:
2330             break;
2331     }
2332 
2333     // respect hdrDataSpace only when there is no legacy HDR support
2334     const bool isHdr = hdrDataSpace != Dataspace::UNKNOWN &&
2335             !profile->hasLegacyHdrSupport(hdrDataSpace) && !isHdrClientComposition;
2336     if (isHdr) {
2337         bestDataSpace = hdrDataSpace;
2338     }
2339 
2340     RenderIntent intent;
2341     switch (mDisplayColorSetting) {
2342         case DisplayColorSetting::MANAGED:
2343         case DisplayColorSetting::UNMANAGED:
2344             intent = isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
2345             break;
2346         case DisplayColorSetting::ENHANCED:
2347             intent = isHdr ? RenderIntent::TONE_MAP_ENHANCE : RenderIntent::ENHANCE;
2348             break;
2349         default: // vendor display color setting
2350             intent = static_cast<RenderIntent>(mDisplayColorSetting);
2351             break;
2352     }
2353 
2354     profile->getBestColorMode(bestDataSpace, intent, outDataSpace, outMode, outRenderIntent);
2355 }
2356 
beginFrame(const sp<DisplayDevice> & displayDevice)2357 void SurfaceFlinger::beginFrame(const sp<DisplayDevice>& displayDevice) {
2358     auto display = displayDevice->getCompositionDisplay();
2359     const auto& displayState = display->getState();
2360 
2361     bool dirty = !display->getDirtyRegion(false).isEmpty();
2362     bool empty = displayDevice->getVisibleLayersSortedByZ().size() == 0;
2363     bool wasEmpty = !displayState.lastCompositionHadVisibleLayers;
2364 
2365     // If nothing has changed (!dirty), don't recompose.
2366     // If something changed, but we don't currently have any visible layers,
2367     //   and didn't when we last did a composition, then skip it this time.
2368     // The second rule does two things:
2369     // - When all layers are removed from a display, we'll emit one black
2370     //   frame, then nothing more until we get new layers.
2371     // - When a display is created with a private layer stack, we won't
2372     //   emit any black frames until a layer is added to the layer stack.
2373     bool mustRecompose = dirty && !(empty && wasEmpty);
2374 
2375     const char flagPrefix[] = {'-', '+'};
2376     static_cast<void>(flagPrefix);
2377     ALOGV_IF(displayDevice->isVirtual(), "%s: %s composition for %s (%cdirty %cempty %cwasEmpty)",
2378              __FUNCTION__, mustRecompose ? "doing" : "skipping",
2379              displayDevice->getDebugName().c_str(), flagPrefix[dirty], flagPrefix[empty],
2380              flagPrefix[wasEmpty]);
2381 
2382     display->getRenderSurface()->beginFrame(mustRecompose);
2383 
2384     if (mustRecompose) {
2385         display->editState().lastCompositionHadVisibleLayers = !empty;
2386     }
2387 }
2388 
prepareFrame(const sp<DisplayDevice> & displayDevice)2389 void SurfaceFlinger::prepareFrame(const sp<DisplayDevice>& displayDevice) {
2390     auto display = displayDevice->getCompositionDisplay();
2391     const auto& displayState = display->getState();
2392 
2393     if (!displayState.isEnabled) {
2394         return;
2395     }
2396 
2397     status_t result = display->getRenderSurface()->prepareFrame();
2398     ALOGE_IF(result != NO_ERROR, "prepareFrame failed for %s: %d (%s)",
2399              displayDevice->getDebugName().c_str(), result, strerror(-result));
2400 }
2401 
doComposition(const sp<DisplayDevice> & displayDevice,bool repaintEverything)2402 void SurfaceFlinger::doComposition(const sp<DisplayDevice>& displayDevice, bool repaintEverything) {
2403     ATRACE_CALL();
2404     ALOGV("doComposition");
2405 
2406     auto display = displayDevice->getCompositionDisplay();
2407     const auto& displayState = display->getState();
2408 
2409     if (displayState.isEnabled) {
2410         // transform the dirty region into this screen's coordinate space
2411         const Region dirtyRegion = display->getDirtyRegion(repaintEverything);
2412 
2413         // repaint the framebuffer (if needed)
2414         doDisplayComposition(displayDevice, dirtyRegion);
2415 
2416         display->editState().dirtyRegion.clear();
2417         display->getRenderSurface()->flip();
2418     }
2419     postFramebuffer(displayDevice);
2420 }
2421 
postFrame()2422 void SurfaceFlinger::postFrame()
2423 {
2424     // |mStateLock| not needed as we are on the main thread
2425     const auto display = getDefaultDisplayDeviceLocked();
2426     if (display && getHwComposer().isConnected(*display->getId())) {
2427         uint32_t flipCount = display->getPageFlipCount();
2428         if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
2429             logFrameStats();
2430         }
2431     }
2432 }
2433 
postFramebuffer(const sp<DisplayDevice> & displayDevice)2434 void SurfaceFlinger::postFramebuffer(const sp<DisplayDevice>& displayDevice) {
2435     ATRACE_CALL();
2436     ALOGV("postFramebuffer");
2437 
2438     auto display = displayDevice->getCompositionDisplay();
2439     const auto& displayState = display->getState();
2440     const auto displayId = display->getId();
2441 
2442     if (displayState.isEnabled) {
2443         if (displayId) {
2444             getHwComposer().presentAndGetReleaseFences(*displayId);
2445         }
2446         display->getRenderSurface()->onPresentDisplayCompleted();
2447         for (auto& layer : display->getOutputLayersOrderedByZ()) {
2448             sp<Fence> releaseFence = Fence::NO_FENCE;
2449             bool usedClientComposition = true;
2450 
2451             // The layer buffer from the previous frame (if any) is released
2452             // by HWC only when the release fence from this frame (if any) is
2453             // signaled.  Always get the release fence from HWC first.
2454             if (layer->getState().hwc) {
2455                 const auto& hwcState = *layer->getState().hwc;
2456                 releaseFence =
2457                         getHwComposer().getLayerReleaseFence(*displayId, hwcState.hwcLayer.get());
2458                 usedClientComposition =
2459                         hwcState.hwcCompositionType == Hwc2::IComposerClient::Composition::CLIENT;
2460             }
2461 
2462             // If the layer was client composited in the previous frame, we
2463             // need to merge with the previous client target acquire fence.
2464             // Since we do not track that, always merge with the current
2465             // client target acquire fence when it is available, even though
2466             // this is suboptimal.
2467             if (usedClientComposition) {
2468                 releaseFence =
2469                         Fence::merge("LayerRelease", releaseFence,
2470                                      display->getRenderSurface()->getClientTargetAcquireFence());
2471             }
2472 
2473             layer->getLayerFE().onLayerDisplayed(releaseFence);
2474         }
2475 
2476         // We've got a list of layers needing fences, that are disjoint with
2477         // display->getVisibleLayersSortedByZ.  The best we can do is to
2478         // supply them with the present fence.
2479         if (!displayDevice->getLayersNeedingFences().isEmpty()) {
2480             sp<Fence> presentFence =
2481                     displayId ? getHwComposer().getPresentFence(*displayId) : Fence::NO_FENCE;
2482             for (auto& layer : displayDevice->getLayersNeedingFences()) {
2483                 layer->getCompositionLayer()->getLayerFE()->onLayerDisplayed(presentFence);
2484             }
2485         }
2486 
2487         if (displayId) {
2488             getHwComposer().clearReleaseFences(*displayId);
2489         }
2490     }
2491 }
2492 
handleTransaction(uint32_t transactionFlags)2493 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
2494 {
2495     ATRACE_CALL();
2496 
2497     // here we keep a copy of the drawing state (that is the state that's
2498     // going to be overwritten by handleTransactionLocked()) outside of
2499     // mStateLock so that the side-effects of the State assignment
2500     // don't happen with mStateLock held (which can cause deadlocks).
2501     State drawingState(mDrawingState);
2502 
2503     Mutex::Autolock _l(mStateLock);
2504     mDebugInTransaction = systemTime();
2505 
2506     // Here we're guaranteed that some transaction flags are set
2507     // so we can call handleTransactionLocked() unconditionally.
2508     // We call getTransactionFlags(), which will also clear the flags,
2509     // with mStateLock held to guarantee that mCurrentState won't change
2510     // until the transaction is committed.
2511 
2512     mVsyncModulator.onTransactionHandled();
2513     transactionFlags = getTransactionFlags(eTransactionMask);
2514     handleTransactionLocked(transactionFlags);
2515 
2516     mDebugInTransaction = 0;
2517     invalidateHwcGeometry();
2518     // here the transaction has been committed
2519 }
2520 
processDisplayHotplugEventsLocked()2521 void SurfaceFlinger::processDisplayHotplugEventsLocked() {
2522     for (const auto& event : mPendingHotplugEvents) {
2523         const std::optional<DisplayIdentificationInfo> info =
2524                 getHwComposer().onHotplug(event.hwcDisplayId, event.connection);
2525 
2526         if (!info) {
2527             continue;
2528         }
2529 
2530         if (event.connection == HWC2::Connection::Connected) {
2531             if (!mPhysicalDisplayTokens.count(info->id)) {
2532                 ALOGV("Creating display %s", to_string(info->id).c_str());
2533                 mPhysicalDisplayTokens[info->id] = new BBinder();
2534                 DisplayDeviceState state;
2535                 state.displayId = info->id;
2536                 state.isSecure = true; // All physical displays are currently considered secure.
2537                 state.displayName = info->name;
2538                 mCurrentState.displays.add(mPhysicalDisplayTokens[info->id], state);
2539                 mInterceptor->saveDisplayCreation(state);
2540             }
2541         } else {
2542             ALOGV("Removing display %s", to_string(info->id).c_str());
2543 
2544             ssize_t index = mCurrentState.displays.indexOfKey(mPhysicalDisplayTokens[info->id]);
2545             if (index >= 0) {
2546                 const DisplayDeviceState& state = mCurrentState.displays.valueAt(index);
2547                 mInterceptor->saveDisplayDeletion(state.sequenceId);
2548                 mCurrentState.displays.removeItemsAt(index);
2549             }
2550             mPhysicalDisplayTokens.erase(info->id);
2551         }
2552 
2553         processDisplayChangesLocked();
2554     }
2555 
2556     mPendingHotplugEvents.clear();
2557 }
2558 
dispatchDisplayHotplugEvent(PhysicalDisplayId displayId,bool connected)2559 void SurfaceFlinger::dispatchDisplayHotplugEvent(PhysicalDisplayId displayId, bool connected) {
2560     mScheduler->hotplugReceived(mAppConnectionHandle, displayId, connected);
2561     mScheduler->hotplugReceived(mSfConnectionHandle, displayId, connected);
2562 }
2563 
setupNewDisplayDeviceInternal(const wp<IBinder> & displayToken,const std::optional<DisplayId> & displayId,const DisplayDeviceState & state,const sp<compositionengine::DisplaySurface> & dispSurface,const sp<IGraphicBufferProducer> & producer)2564 sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
2565         const wp<IBinder>& displayToken, const std::optional<DisplayId>& displayId,
2566         const DisplayDeviceState& state, const sp<compositionengine::DisplaySurface>& dispSurface,
2567         const sp<IGraphicBufferProducer>& producer) {
2568     DisplayDeviceCreationArgs creationArgs(this, displayToken, displayId);
2569     creationArgs.sequenceId = state.sequenceId;
2570     creationArgs.isVirtual = state.isVirtual();
2571     creationArgs.isSecure = state.isSecure;
2572     creationArgs.displaySurface = dispSurface;
2573     creationArgs.hasWideColorGamut = false;
2574     creationArgs.supportedPerFrameMetadata = 0;
2575 
2576     const bool isInternalDisplay = displayId && displayId == getInternalDisplayIdLocked();
2577     creationArgs.isPrimary = isInternalDisplay;
2578 
2579     if (useColorManagement && displayId) {
2580         std::vector<ColorMode> modes = getHwComposer().getColorModes(*displayId);
2581         for (ColorMode colorMode : modes) {
2582             if (isWideColorMode(colorMode)) {
2583                 creationArgs.hasWideColorGamut = true;
2584             }
2585 
2586             std::vector<RenderIntent> renderIntents =
2587                     getHwComposer().getRenderIntents(*displayId, colorMode);
2588             creationArgs.hwcColorModes.emplace(colorMode, renderIntents);
2589         }
2590     }
2591 
2592     if (displayId) {
2593         getHwComposer().getHdrCapabilities(*displayId, &creationArgs.hdrCapabilities);
2594         creationArgs.supportedPerFrameMetadata =
2595                 getHwComposer().getSupportedPerFrameMetadata(*displayId);
2596     }
2597 
2598     auto nativeWindowSurface = getFactory().createNativeWindowSurface(producer);
2599     auto nativeWindow = nativeWindowSurface->getNativeWindow();
2600     creationArgs.nativeWindow = nativeWindow;
2601 
2602     // Make sure that composition can never be stalled by a virtual display
2603     // consumer that isn't processing buffers fast enough. We have to do this
2604     // here, in case the display is composed entirely by HWC.
2605     if (state.isVirtual()) {
2606         nativeWindow->setSwapInterval(nativeWindow.get(), 0);
2607     }
2608 
2609     creationArgs.displayInstallOrientation =
2610             isInternalDisplay ? primaryDisplayOrientation : DisplayState::eOrientationDefault;
2611 
2612     // virtual displays are always considered enabled
2613     creationArgs.initialPowerMode = state.isVirtual() ? HWC_POWER_MODE_NORMAL : HWC_POWER_MODE_OFF;
2614 
2615     sp<DisplayDevice> display = getFactory().createDisplayDevice(std::move(creationArgs));
2616 
2617     if (maxFrameBufferAcquiredBuffers >= 3) {
2618         nativeWindowSurface->preallocateBuffers();
2619     }
2620 
2621     ColorMode defaultColorMode = ColorMode::NATIVE;
2622     Dataspace defaultDataSpace = Dataspace::UNKNOWN;
2623     if (display->hasWideColorGamut()) {
2624         defaultColorMode = ColorMode::SRGB;
2625         defaultDataSpace = Dataspace::V0_SRGB;
2626     }
2627     display->getCompositionDisplay()->setColorMode(defaultColorMode, defaultDataSpace,
2628                                                    RenderIntent::COLORIMETRIC);
2629     if (!state.isVirtual()) {
2630         LOG_ALWAYS_FATAL_IF(!displayId);
2631         display->setActiveConfig(getHwComposer().getActiveConfigIndex(*displayId));
2632     }
2633 
2634     display->setLayerStack(state.layerStack);
2635     display->setProjection(state.orientation, state.viewport, state.frame);
2636     display->setDisplayName(state.displayName);
2637 
2638     return display;
2639 }
2640 
processDisplayChangesLocked()2641 void SurfaceFlinger::processDisplayChangesLocked() {
2642     // here we take advantage of Vector's copy-on-write semantics to
2643     // improve performance by skipping the transaction entirely when
2644     // know that the lists are identical
2645     const KeyedVector<wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
2646     const KeyedVector<wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
2647     if (!curr.isIdenticalTo(draw)) {
2648         mVisibleRegionsDirty = true;
2649         const size_t cc = curr.size();
2650         size_t dc = draw.size();
2651 
2652         // find the displays that were removed
2653         // (ie: in drawing state but not in current state)
2654         // also handle displays that changed
2655         // (ie: displays that are in both lists)
2656         for (size_t i = 0; i < dc;) {
2657             const ssize_t j = curr.indexOfKey(draw.keyAt(i));
2658             if (j < 0) {
2659                 // in drawing state but not in current state
2660                 if (const auto display = getDisplayDeviceLocked(draw.keyAt(i))) {
2661                     // Save display ID before disconnecting.
2662                     const auto displayId = display->getId();
2663                     display->disconnect();
2664 
2665                     if (!display->isVirtual()) {
2666                         LOG_ALWAYS_FATAL_IF(!displayId);
2667                         dispatchDisplayHotplugEvent(displayId->value, false);
2668                     }
2669                 }
2670 
2671                 mDisplays.erase(draw.keyAt(i));
2672             } else {
2673                 // this display is in both lists. see if something changed.
2674                 const DisplayDeviceState& state(curr[j]);
2675                 const wp<IBinder>& displayToken = curr.keyAt(j);
2676                 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
2677                 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
2678                 if (state_binder != draw_binder) {
2679                     // changing the surface is like destroying and
2680                     // recreating the DisplayDevice, so we just remove it
2681                     // from the drawing state, so that it get re-added
2682                     // below.
2683                     if (const auto display = getDisplayDeviceLocked(displayToken)) {
2684                         display->disconnect();
2685                     }
2686                     mDisplays.erase(displayToken);
2687                     mDrawingState.displays.removeItemsAt(i);
2688                     dc--;
2689                     // at this point we must loop to the next item
2690                     continue;
2691                 }
2692 
2693                 if (const auto display = getDisplayDeviceLocked(displayToken)) {
2694                     if (state.layerStack != draw[i].layerStack) {
2695                         display->setLayerStack(state.layerStack);
2696                     }
2697                     if ((state.orientation != draw[i].orientation) ||
2698                         (state.viewport != draw[i].viewport) || (state.frame != draw[i].frame)) {
2699                         display->setProjection(state.orientation, state.viewport, state.frame);
2700                     }
2701                     if (state.width != draw[i].width || state.height != draw[i].height) {
2702                         display->setDisplaySize(state.width, state.height);
2703                     }
2704                 }
2705             }
2706             ++i;
2707         }
2708 
2709         // find displays that were added
2710         // (ie: in current state but not in drawing state)
2711         for (size_t i = 0; i < cc; i++) {
2712             if (draw.indexOfKey(curr.keyAt(i)) < 0) {
2713                 const DisplayDeviceState& state(curr[i]);
2714 
2715                 sp<compositionengine::DisplaySurface> dispSurface;
2716                 sp<IGraphicBufferProducer> producer;
2717                 sp<IGraphicBufferProducer> bqProducer;
2718                 sp<IGraphicBufferConsumer> bqConsumer;
2719                 getFactory().createBufferQueue(&bqProducer, &bqConsumer, false);
2720 
2721                 std::optional<DisplayId> displayId;
2722                 if (state.isVirtual()) {
2723                     // Virtual displays without a surface are dormant:
2724                     // they have external state (layer stack, projection,
2725                     // etc.) but no internal state (i.e. a DisplayDevice).
2726                     if (state.surface != nullptr) {
2727                         // Allow VR composer to use virtual displays.
2728                         if (mUseHwcVirtualDisplays || getHwComposer().isUsingVrComposer()) {
2729                             int width = 0;
2730                             int status = state.surface->query(NATIVE_WINDOW_WIDTH, &width);
2731                             ALOGE_IF(status != NO_ERROR, "Unable to query width (%d)", status);
2732                             int height = 0;
2733                             status = state.surface->query(NATIVE_WINDOW_HEIGHT, &height);
2734                             ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status);
2735                             int intFormat = 0;
2736                             status = state.surface->query(NATIVE_WINDOW_FORMAT, &intFormat);
2737                             ALOGE_IF(status != NO_ERROR, "Unable to query format (%d)", status);
2738                             auto format = static_cast<ui::PixelFormat>(intFormat);
2739 
2740                             displayId =
2741                                     getHwComposer().allocateVirtualDisplay(width, height, &format);
2742                         }
2743 
2744                         // TODO: Plumb requested format back up to consumer
2745 
2746                         sp<VirtualDisplaySurface> vds =
2747                                 new VirtualDisplaySurface(getHwComposer(), displayId, state.surface,
2748                                                           bqProducer, bqConsumer,
2749                                                           state.displayName);
2750 
2751                         dispSurface = vds;
2752                         producer = vds;
2753                     }
2754                 } else {
2755                     ALOGE_IF(state.surface != nullptr,
2756                              "adding a supported display, but rendering "
2757                              "surface is provided (%p), ignoring it",
2758                              state.surface.get());
2759 
2760                     displayId = state.displayId;
2761                     LOG_ALWAYS_FATAL_IF(!displayId);
2762                     dispSurface = new FramebufferSurface(getHwComposer(), *displayId, bqConsumer);
2763                     producer = bqProducer;
2764                 }
2765 
2766                 const wp<IBinder>& displayToken = curr.keyAt(i);
2767                 if (dispSurface != nullptr) {
2768                     mDisplays.emplace(displayToken,
2769                                       setupNewDisplayDeviceInternal(displayToken, displayId, state,
2770                                                                     dispSurface, producer));
2771                     if (!state.isVirtual()) {
2772                         LOG_ALWAYS_FATAL_IF(!displayId);
2773                         dispatchDisplayHotplugEvent(displayId->value, true);
2774                     }
2775                 }
2776             }
2777         }
2778     }
2779 
2780     mDrawingState.displays = mCurrentState.displays;
2781 }
2782 
handleTransactionLocked(uint32_t transactionFlags)2783 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
2784 {
2785     // Notify all layers of available frames
2786     mCurrentState.traverseInZOrder([](Layer* layer) {
2787         layer->notifyAvailableFrames();
2788     });
2789 
2790     /*
2791      * Traversal of the children
2792      * (perform the transaction for each of them if needed)
2793      */
2794 
2795     if ((transactionFlags & eTraversalNeeded) || mTraversalNeededMainThread) {
2796         mCurrentState.traverseInZOrder([&](Layer* layer) {
2797             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
2798             if (!trFlags) return;
2799 
2800             const uint32_t flags = layer->doTransaction(0);
2801             if (flags & Layer::eVisibleRegion)
2802                 mVisibleRegionsDirty = true;
2803 
2804             if (flags & Layer::eInputInfoChanged) {
2805                 mInputInfoChanged = true;
2806             }
2807         });
2808         mTraversalNeededMainThread = false;
2809     }
2810 
2811     /*
2812      * Perform display own transactions if needed
2813      */
2814 
2815     if (transactionFlags & eDisplayTransactionNeeded) {
2816         processDisplayChangesLocked();
2817         processDisplayHotplugEventsLocked();
2818     }
2819 
2820     if (transactionFlags & (eDisplayLayerStackChanged|eDisplayTransactionNeeded)) {
2821         // The transform hint might have changed for some layers
2822         // (either because a display has changed, or because a layer
2823         // as changed).
2824         //
2825         // Walk through all the layers in currentLayers,
2826         // and update their transform hint.
2827         //
2828         // If a layer is visible only on a single display, then that
2829         // display is used to calculate the hint, otherwise we use the
2830         // default display.
2831         //
2832         // NOTE: we do this here, rather than in rebuildLayerStacks() so that
2833         // the hint is set before we acquire a buffer from the surface texture.
2834         //
2835         // NOTE: layer transactions have taken place already, so we use their
2836         // drawing state. However, SurfaceFlinger's own transaction has not
2837         // happened yet, so we must use the current state layer list
2838         // (soon to become the drawing state list).
2839         //
2840         sp<const DisplayDevice> hintDisplay;
2841         uint32_t currentlayerStack = 0;
2842         bool first = true;
2843         mCurrentState.traverseInZOrder([&](Layer* layer) {
2844             // NOTE: we rely on the fact that layers are sorted by
2845             // layerStack first (so we don't have to traverse the list
2846             // of displays for every layer).
2847             uint32_t layerStack = layer->getLayerStack();
2848             if (first || currentlayerStack != layerStack) {
2849                 currentlayerStack = layerStack;
2850                 // figure out if this layerstack is mirrored
2851                 // (more than one display) if so, pick the default display,
2852                 // if not, pick the only display it's on.
2853                 hintDisplay = nullptr;
2854                 for (const auto& [token, display] : mDisplays) {
2855                     if (display->getCompositionDisplay()
2856                                 ->belongsInOutput(layer->getLayerStack(),
2857                                                   layer->getPrimaryDisplayOnly())) {
2858                         if (hintDisplay) {
2859                             hintDisplay = nullptr;
2860                             break;
2861                         } else {
2862                             hintDisplay = display;
2863                         }
2864                     }
2865                 }
2866             }
2867 
2868             if (!hintDisplay) {
2869                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
2870                 // redraw after transform hint changes. See bug 8508397.
2871 
2872                 // could be null when this layer is using a layerStack
2873                 // that is not visible on any display. Also can occur at
2874                 // screen off/on times.
2875                 hintDisplay = getDefaultDisplayDeviceLocked();
2876             }
2877 
2878             // could be null if there is no display available at all to get
2879             // the transform hint from.
2880             if (hintDisplay) {
2881                 layer->updateTransformHint(hintDisplay);
2882             }
2883 
2884             first = false;
2885         });
2886     }
2887 
2888 
2889     /*
2890      * Perform our own transaction if needed
2891      */
2892 
2893     if (mLayersAdded) {
2894         mLayersAdded = false;
2895         // Layers have been added.
2896         mVisibleRegionsDirty = true;
2897     }
2898 
2899     // some layers might have been removed, so
2900     // we need to update the regions they're exposing.
2901     if (mLayersRemoved) {
2902         mLayersRemoved = false;
2903         mVisibleRegionsDirty = true;
2904         mDrawingState.traverseInZOrder([&](Layer* layer) {
2905             if (mLayersPendingRemoval.indexOf(layer) >= 0) {
2906                 // this layer is not visible anymore
2907                 Region visibleReg;
2908                 visibleReg.set(layer->getScreenBounds());
2909                 invalidateLayerStack(layer, visibleReg);
2910             }
2911         });
2912     }
2913 
2914     commitInputWindowCommands();
2915     commitTransaction();
2916 }
2917 
updateInputFlinger()2918 void SurfaceFlinger::updateInputFlinger() {
2919     ATRACE_CALL();
2920     if (!mInputFlinger) {
2921         return;
2922     }
2923 
2924     if (mVisibleRegionsDirty || mInputInfoChanged) {
2925         mInputInfoChanged = false;
2926         updateInputWindowInfo();
2927     } else if (mInputWindowCommands.syncInputWindows) {
2928         // If the caller requested to sync input windows, but there are no
2929         // changes to input windows, notify immediately.
2930         setInputWindowsFinished();
2931     }
2932 
2933     executeInputWindowCommands();
2934 }
2935 
updateInputWindowInfo()2936 void SurfaceFlinger::updateInputWindowInfo() {
2937     std::vector<InputWindowInfo> inputHandles;
2938 
2939     mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
2940         if (layer->hasInput()) {
2941             // When calculating the screen bounds we ignore the transparent region since it may
2942             // result in an unwanted offset.
2943             inputHandles.push_back(layer->fillInputInfo());
2944         }
2945     });
2946 
2947     mInputFlinger->setInputWindows(inputHandles,
2948                                    mInputWindowCommands.syncInputWindows ? mSetInputWindowsListener
2949                                                                          : nullptr);
2950 }
2951 
commitInputWindowCommands()2952 void SurfaceFlinger::commitInputWindowCommands() {
2953     mInputWindowCommands = mPendingInputWindowCommands;
2954     mPendingInputWindowCommands.clear();
2955 }
2956 
executeInputWindowCommands()2957 void SurfaceFlinger::executeInputWindowCommands() {
2958     for (const auto& transferTouchFocusCommand : mInputWindowCommands.transferTouchFocusCommands) {
2959         if (transferTouchFocusCommand.fromToken != nullptr &&
2960             transferTouchFocusCommand.toToken != nullptr &&
2961             transferTouchFocusCommand.fromToken != transferTouchFocusCommand.toToken) {
2962             mInputFlinger->transferTouchFocus(transferTouchFocusCommand.fromToken,
2963                                               transferTouchFocusCommand.toToken);
2964         }
2965     }
2966 
2967     mInputWindowCommands.clear();
2968 }
2969 
updateCursorAsync()2970 void SurfaceFlinger::updateCursorAsync()
2971 {
2972     for (const auto& [token, display] : mDisplays) {
2973         if (!display->getId()) {
2974             continue;
2975         }
2976 
2977         for (auto& layer : display->getVisibleLayersSortedByZ()) {
2978             layer->updateCursorPosition(display);
2979         }
2980     }
2981 }
2982 
latchAndReleaseBuffer(const sp<Layer> & layer)2983 void SurfaceFlinger::latchAndReleaseBuffer(const sp<Layer>& layer) {
2984     if (layer->hasReadyFrame()) {
2985         bool ignored = false;
2986         layer->latchBuffer(ignored, systemTime());
2987     }
2988     layer->releasePendingBuffer(systemTime());
2989 }
2990 
commitTransaction()2991 void SurfaceFlinger::commitTransaction()
2992 {
2993     if (!mLayersPendingRemoval.isEmpty()) {
2994         // Notify removed layers now that they can't be drawn from
2995         for (const auto& l : mLayersPendingRemoval) {
2996             recordBufferingStats(l->getName().string(),
2997                     l->getOccupancyHistory(true));
2998 
2999             // Ensure any buffers set to display on any children are released.
3000             if (l->isRemovedFromCurrentState()) {
3001                 latchAndReleaseBuffer(l);
3002             }
3003 
3004             // If the layer has been removed and has no parent, then it will not be reachable
3005             // when traversing layers on screen. Add the layer to the offscreenLayers set to
3006             // ensure we can copy its current to drawing state.
3007             if (!l->getParent()) {
3008                 mOffscreenLayers.emplace(l.get());
3009             }
3010         }
3011         mLayersPendingRemoval.clear();
3012     }
3013 
3014     // If this transaction is part of a window animation then the next frame
3015     // we composite should be considered an animation as well.
3016     mAnimCompositionPending = mAnimTransactionPending;
3017 
3018     withTracingLock([&]() {
3019         mDrawingState = mCurrentState;
3020         // clear the "changed" flags in current state
3021         mCurrentState.colorMatrixChanged = false;
3022 
3023         mDrawingState.traverseInZOrder([&](Layer* layer) {
3024             layer->commitChildList();
3025 
3026             // If the layer can be reached when traversing mDrawingState, then the layer is no
3027             // longer offscreen. Remove the layer from the offscreenLayer set.
3028             if (mOffscreenLayers.count(layer)) {
3029                 mOffscreenLayers.erase(layer);
3030             }
3031         });
3032 
3033         commitOffscreenLayers();
3034     });
3035 
3036     mTransactionPending = false;
3037     mAnimTransactionPending = false;
3038     mTransactionCV.broadcast();
3039 }
3040 
withTracingLock(std::function<void ()> lockedOperation)3041 void SurfaceFlinger::withTracingLock(std::function<void()> lockedOperation) {
3042     if (mTracingEnabledChanged) {
3043         mTracingEnabled = mTracing.isEnabled();
3044         mTracingEnabledChanged = false;
3045     }
3046 
3047     // Synchronize with Tracing thread
3048     std::unique_lock<std::mutex> lock;
3049     if (mTracingEnabled) {
3050         lock = std::unique_lock<std::mutex>(mDrawingStateLock);
3051     }
3052 
3053     lockedOperation();
3054 
3055     // Synchronize with Tracing thread
3056     if (mTracingEnabled) {
3057         lock.unlock();
3058     }
3059 }
3060 
commitOffscreenLayers()3061 void SurfaceFlinger::commitOffscreenLayers() {
3062     for (Layer* offscreenLayer : mOffscreenLayers) {
3063         offscreenLayer->traverseInZOrder(LayerVector::StateSet::Drawing, [](Layer* layer) {
3064             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
3065             if (!trFlags) return;
3066 
3067             layer->doTransaction(0);
3068             layer->commitChildList();
3069         });
3070     }
3071 }
3072 
computeVisibleRegions(const sp<const DisplayDevice> & displayDevice,Region & outDirtyRegion,Region & outOpaqueRegion)3073 void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
3074                                            Region& outDirtyRegion, Region& outOpaqueRegion) {
3075     ATRACE_CALL();
3076     ALOGV("computeVisibleRegions");
3077 
3078     auto display = displayDevice->getCompositionDisplay();
3079 
3080     Region aboveOpaqueLayers;
3081     Region aboveCoveredLayers;
3082     Region dirty;
3083 
3084     outDirtyRegion.clear();
3085 
3086     mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
3087         // start with the whole surface at its current location
3088         const Layer::State& s(layer->getDrawingState());
3089 
3090         // only consider the layers on the given layer stack
3091         if (!display->belongsInOutput(layer->getLayerStack(), layer->getPrimaryDisplayOnly())) {
3092             return;
3093         }
3094 
3095         /*
3096          * opaqueRegion: area of a surface that is fully opaque.
3097          */
3098         Region opaqueRegion;
3099 
3100         /*
3101          * visibleRegion: area of a surface that is visible on screen
3102          * and not fully transparent. This is essentially the layer's
3103          * footprint minus the opaque regions above it.
3104          * Areas covered by a translucent surface are considered visible.
3105          */
3106         Region visibleRegion;
3107 
3108         /*
3109          * coveredRegion: area of a surface that is covered by all
3110          * visible regions above it (which includes the translucent areas).
3111          */
3112         Region coveredRegion;
3113 
3114         /*
3115          * transparentRegion: area of a surface that is hinted to be completely
3116          * transparent. This is only used to tell when the layer has no visible
3117          * non-transparent regions and can be removed from the layer list. It
3118          * does not affect the visibleRegion of this layer or any layers
3119          * beneath it. The hint may not be correct if apps don't respect the
3120          * SurfaceView restrictions (which, sadly, some don't).
3121          */
3122         Region transparentRegion;
3123 
3124 
3125         // handle hidden surfaces by setting the visible region to empty
3126         if (CC_LIKELY(layer->isVisible())) {
3127             const bool translucent = !layer->isOpaque(s);
3128             Rect bounds(layer->getScreenBounds());
3129 
3130             visibleRegion.set(bounds);
3131             ui::Transform tr = layer->getTransform();
3132             if (!visibleRegion.isEmpty()) {
3133                 // Remove the transparent area from the visible region
3134                 if (translucent) {
3135                     if (tr.preserveRects()) {
3136                         // transform the transparent region
3137                         transparentRegion = tr.transform(layer->getActiveTransparentRegion(s));
3138                     } else {
3139                         // transformation too complex, can't do the
3140                         // transparent region optimization.
3141                         transparentRegion.clear();
3142                     }
3143                 }
3144 
3145                 // compute the opaque region
3146                 const int32_t layerOrientation = tr.getOrientation();
3147                 if (layer->getAlpha() == 1.0f && !translucent &&
3148                         layer->getRoundedCornerState().radius == 0.0f &&
3149                         ((layerOrientation & ui::Transform::ROT_INVALID) == false)) {
3150                     // the opaque region is the layer's footprint
3151                     opaqueRegion = visibleRegion;
3152                 }
3153             }
3154         }
3155 
3156         if (visibleRegion.isEmpty()) {
3157             layer->clearVisibilityRegions();
3158             return;
3159         }
3160 
3161         // Clip the covered region to the visible region
3162         coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
3163 
3164         // Update aboveCoveredLayers for next (lower) layer
3165         aboveCoveredLayers.orSelf(visibleRegion);
3166 
3167         // subtract the opaque region covered by the layers above us
3168         visibleRegion.subtractSelf(aboveOpaqueLayers);
3169 
3170         // compute this layer's dirty region
3171         if (layer->contentDirty) {
3172             // we need to invalidate the whole region
3173             dirty = visibleRegion;
3174             // as well, as the old visible region
3175             dirty.orSelf(layer->visibleRegion);
3176             layer->contentDirty = false;
3177         } else {
3178             /* compute the exposed region:
3179              *   the exposed region consists of two components:
3180              *   1) what's VISIBLE now and was COVERED before
3181              *   2) what's EXPOSED now less what was EXPOSED before
3182              *
3183              * note that (1) is conservative, we start with the whole
3184              * visible region but only keep what used to be covered by
3185              * something -- which mean it may have been exposed.
3186              *
3187              * (2) handles areas that were not covered by anything but got
3188              * exposed because of a resize.
3189              */
3190             const Region newExposed = visibleRegion - coveredRegion;
3191             const Region oldVisibleRegion = layer->visibleRegion;
3192             const Region oldCoveredRegion = layer->coveredRegion;
3193             const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
3194             dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
3195         }
3196         dirty.subtractSelf(aboveOpaqueLayers);
3197 
3198         // accumulate to the screen dirty region
3199         outDirtyRegion.orSelf(dirty);
3200 
3201         // Update aboveOpaqueLayers for next (lower) layer
3202         aboveOpaqueLayers.orSelf(opaqueRegion);
3203 
3204         // Store the visible region in screen space
3205         layer->setVisibleRegion(visibleRegion);
3206         layer->setCoveredRegion(coveredRegion);
3207         layer->setVisibleNonTransparentRegion(
3208                 visibleRegion.subtract(transparentRegion));
3209     });
3210 
3211     outOpaqueRegion = aboveOpaqueLayers;
3212 }
3213 
invalidateLayerStack(const sp<const Layer> & layer,const Region & dirty)3214 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
3215     for (const auto& [token, displayDevice] : mDisplays) {
3216         auto display = displayDevice->getCompositionDisplay();
3217         if (display->belongsInOutput(layer->getLayerStack(), layer->getPrimaryDisplayOnly())) {
3218             display->editState().dirtyRegion.orSelf(dirty);
3219         }
3220     }
3221 }
3222 
handlePageFlip()3223 bool SurfaceFlinger::handlePageFlip()
3224 {
3225     ATRACE_CALL();
3226     ALOGV("handlePageFlip");
3227 
3228     nsecs_t latchTime = systemTime();
3229 
3230     bool visibleRegions = false;
3231     bool frameQueued = false;
3232     bool newDataLatched = false;
3233 
3234     // Store the set of layers that need updates. This set must not change as
3235     // buffers are being latched, as this could result in a deadlock.
3236     // Example: Two producers share the same command stream and:
3237     // 1.) Layer 0 is latched
3238     // 2.) Layer 0 gets a new frame
3239     // 2.) Layer 1 gets a new frame
3240     // 3.) Layer 1 is latched.
3241     // Display is now waiting on Layer 1's frame, which is behind layer 0's
3242     // second frame. But layer 0's second frame could be waiting on display.
3243     mDrawingState.traverseInZOrder([&](Layer* layer) {
3244         if (layer->hasReadyFrame()) {
3245             frameQueued = true;
3246             nsecs_t expectedPresentTime;
3247             expectedPresentTime = mScheduler->expectedPresentTime();
3248             if (layer->shouldPresentNow(expectedPresentTime)) {
3249                 mLayersWithQueuedFrames.push_back(layer);
3250             } else {
3251                 ATRACE_NAME("!layer->shouldPresentNow()");
3252                 layer->useEmptyDamage();
3253             }
3254         } else {
3255             layer->useEmptyDamage();
3256         }
3257     });
3258 
3259     if (!mLayersWithQueuedFrames.empty()) {
3260         // mStateLock is needed for latchBuffer as LayerRejecter::reject()
3261         // writes to Layer current state. See also b/119481871
3262         Mutex::Autolock lock(mStateLock);
3263 
3264         for (auto& layer : mLayersWithQueuedFrames) {
3265             if (layer->latchBuffer(visibleRegions, latchTime)) {
3266                 mLayersPendingRefresh.push_back(layer);
3267             }
3268             layer->useSurfaceDamage();
3269             if (layer->isBufferLatched()) {
3270                 newDataLatched = true;
3271             }
3272         }
3273     }
3274 
3275     mVisibleRegionsDirty |= visibleRegions;
3276 
3277     // If we will need to wake up at some time in the future to deal with a
3278     // queued frame that shouldn't be displayed during this vsync period, wake
3279     // up during the next vsync period to check again.
3280     if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {
3281         signalLayerUpdate();
3282     }
3283 
3284     // enter boot animation on first buffer latch
3285     if (CC_UNLIKELY(mBootStage == BootStage::BOOTLOADER && newDataLatched)) {
3286         ALOGI("Enter boot animation");
3287         mBootStage = BootStage::BOOTANIMATION;
3288     }
3289 
3290     // Only continue with the refresh if there is actually new work to do
3291     return !mLayersWithQueuedFrames.empty() && newDataLatched;
3292 }
3293 
invalidateHwcGeometry()3294 void SurfaceFlinger::invalidateHwcGeometry()
3295 {
3296     mGeometryInvalid = true;
3297 }
3298 
doDisplayComposition(const sp<DisplayDevice> & displayDevice,const Region & inDirtyRegion)3299 void SurfaceFlinger::doDisplayComposition(const sp<DisplayDevice>& displayDevice,
3300                                           const Region& inDirtyRegion) {
3301     auto display = displayDevice->getCompositionDisplay();
3302     // We only need to actually compose the display if:
3303     // 1) It is being handled by hardware composer, which may need this to
3304     //    keep its virtual display state machine in sync, or
3305     // 2) There is work to be done (the dirty region isn't empty)
3306     if (!displayDevice->getId() && inDirtyRegion.isEmpty()) {
3307         ALOGV("Skipping display composition");
3308         return;
3309     }
3310 
3311     ALOGV("doDisplayComposition");
3312     base::unique_fd readyFence;
3313     if (!doComposeSurfaces(displayDevice, Region::INVALID_REGION, &readyFence)) return;
3314 
3315     // swap buffers (presentation)
3316     display->getRenderSurface()->queueBuffer(std::move(readyFence));
3317 }
3318 
doComposeSurfaces(const sp<DisplayDevice> & displayDevice,const Region & debugRegion,base::unique_fd * readyFence)3319 bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& displayDevice,
3320                                        const Region& debugRegion, base::unique_fd* readyFence) {
3321     ATRACE_CALL();
3322     ALOGV("doComposeSurfaces");
3323 
3324     auto display = displayDevice->getCompositionDisplay();
3325     const auto& displayState = display->getState();
3326     const auto displayId = display->getId();
3327     auto& renderEngine = getRenderEngine();
3328     const bool supportProtectedContent = renderEngine.supportsProtectedContent();
3329 
3330     const Region bounds(displayState.bounds);
3331     const DisplayRenderArea renderArea(displayDevice);
3332     const bool hasClientComposition = getHwComposer().hasClientComposition(displayId);
3333     ATRACE_INT("hasClientComposition", hasClientComposition);
3334 
3335     bool applyColorMatrix = false;
3336 
3337     renderengine::DisplaySettings clientCompositionDisplay;
3338     std::vector<renderengine::LayerSettings> clientCompositionLayers;
3339     sp<GraphicBuffer> buf;
3340     base::unique_fd fd;
3341 
3342     if (hasClientComposition) {
3343         ALOGV("hasClientComposition");
3344 
3345         if (displayDevice->isPrimary() && supportProtectedContent) {
3346             bool needsProtected = false;
3347             for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
3348                 // If the layer is a protected layer, mark protected context is needed.
3349                 if (layer->isProtected()) {
3350                     needsProtected = true;
3351                     break;
3352                 }
3353             }
3354             if (needsProtected != renderEngine.isProtected()) {
3355                 renderEngine.useProtectedContext(needsProtected);
3356             }
3357             if (needsProtected != display->getRenderSurface()->isProtected() &&
3358                 needsProtected == renderEngine.isProtected()) {
3359                 display->getRenderSurface()->setProtected(needsProtected);
3360             }
3361         }
3362 
3363         buf = display->getRenderSurface()->dequeueBuffer(&fd);
3364 
3365         if (buf == nullptr) {
3366             ALOGW("Dequeuing buffer for display [%s] failed, bailing out of "
3367                   "client composition for this frame",
3368                   displayDevice->getDisplayName().c_str());
3369             return false;
3370         }
3371 
3372         clientCompositionDisplay.physicalDisplay = displayState.scissor;
3373         clientCompositionDisplay.clip = displayState.scissor;
3374         const ui::Transform& displayTransform = displayState.transform;
3375         clientCompositionDisplay.globalTransform = displayTransform.asMatrix4();
3376         clientCompositionDisplay.orientation = displayState.orientation;
3377 
3378         const auto* profile = display->getDisplayColorProfile();
3379         Dataspace outputDataspace = Dataspace::UNKNOWN;
3380         if (profile->hasWideColorGamut()) {
3381             outputDataspace = displayState.dataspace;
3382         }
3383         clientCompositionDisplay.outputDataspace = outputDataspace;
3384         clientCompositionDisplay.maxLuminance =
3385                 profile->getHdrCapabilities().getDesiredMaxLuminance();
3386 
3387         const bool hasDeviceComposition = getHwComposer().hasDeviceComposition(displayId);
3388         const bool skipClientColorTransform =
3389                 getHwComposer()
3390                         .hasDisplayCapability(displayId,
3391                                               HWC2::DisplayCapability::SkipClientColorTransform);
3392 
3393         // Compute the global color transform matrix.
3394         applyColorMatrix = !hasDeviceComposition && !skipClientColorTransform;
3395         if (applyColorMatrix) {
3396             clientCompositionDisplay.colorTransform = displayState.colorTransformMat;
3397         }
3398     }
3399 
3400     /*
3401      * and then, render the layers targeted at the framebuffer
3402      */
3403 
3404     ALOGV("Rendering client layers");
3405     bool firstLayer = true;
3406     Region clearRegion = Region::INVALID_REGION;
3407     for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
3408         const Region viewportRegion(displayState.viewport);
3409         const Region clip(viewportRegion.intersect(layer->visibleRegion));
3410         ALOGV("Layer: %s", layer->getName().string());
3411         ALOGV("  Composition type: %s", toString(layer->getCompositionType(displayDevice)).c_str());
3412         if (!clip.isEmpty()) {
3413             switch (layer->getCompositionType(displayDevice)) {
3414                 case Hwc2::IComposerClient::Composition::CURSOR:
3415                 case Hwc2::IComposerClient::Composition::DEVICE:
3416                 case Hwc2::IComposerClient::Composition::SIDEBAND:
3417                 case Hwc2::IComposerClient::Composition::SOLID_COLOR: {
3418                     LOG_ALWAYS_FATAL_IF(!displayId);
3419                     const Layer::State& state(layer->getDrawingState());
3420                     if (layer->getClearClientTarget(displayDevice) && !firstLayer &&
3421                         layer->isOpaque(state) && (layer->getAlpha() == 1.0f) &&
3422                         layer->getRoundedCornerState().radius == 0.0f && hasClientComposition) {
3423                         // never clear the very first layer since we're
3424                         // guaranteed the FB is already cleared
3425                         renderengine::LayerSettings layerSettings;
3426                         Region dummyRegion;
3427                         bool prepared =
3428                                 layer->prepareClientLayer(renderArea, clip, dummyRegion,
3429                                                           supportProtectedContent, layerSettings);
3430 
3431                         if (prepared) {
3432                             layerSettings.source.buffer.buffer = nullptr;
3433                             layerSettings.source.solidColor = half3(0.0, 0.0, 0.0);
3434                             layerSettings.alpha = half(0.0);
3435                             layerSettings.disableBlending = true;
3436                             clientCompositionLayers.push_back(layerSettings);
3437                         }
3438                     }
3439                     break;
3440                 }
3441                 case Hwc2::IComposerClient::Composition::CLIENT: {
3442                     renderengine::LayerSettings layerSettings;
3443                     bool prepared =
3444                             layer->prepareClientLayer(renderArea, clip, clearRegion,
3445                                                       supportProtectedContent, layerSettings);
3446                     if (prepared) {
3447                         clientCompositionLayers.push_back(layerSettings);
3448                     }
3449                     break;
3450                 }
3451                 default:
3452                     break;
3453             }
3454         } else {
3455             ALOGV("  Skipping for empty clip");
3456         }
3457         firstLayer = false;
3458     }
3459 
3460     // Perform some cleanup steps if we used client composition.
3461     if (hasClientComposition) {
3462         clientCompositionDisplay.clearRegion = clearRegion;
3463 
3464         // We boost GPU frequency here because there will be color spaces conversion
3465         // and it's expensive. We boost the GPU frequency so that GPU composition can
3466         // finish in time. We must reset GPU frequency afterwards, because high frequency
3467         // consumes extra battery.
3468         const bool expensiveRenderingExpected =
3469                 clientCompositionDisplay.outputDataspace == Dataspace::DISPLAY_P3;
3470         if (expensiveRenderingExpected && displayId) {
3471             mPowerAdvisor.setExpensiveRenderingExpected(*displayId, true);
3472         }
3473         if (!debugRegion.isEmpty()) {
3474             Region::const_iterator it = debugRegion.begin();
3475             Region::const_iterator end = debugRegion.end();
3476             while (it != end) {
3477                 const Rect& rect = *it++;
3478                 renderengine::LayerSettings layerSettings;
3479                 layerSettings.source.buffer.buffer = nullptr;
3480                 layerSettings.source.solidColor = half3(1.0, 0.0, 1.0);
3481                 layerSettings.geometry.boundaries = rect.toFloatRect();
3482                 layerSettings.alpha = half(1.0);
3483                 clientCompositionLayers.push_back(layerSettings);
3484             }
3485         }
3486         renderEngine.drawLayers(clientCompositionDisplay, clientCompositionLayers,
3487                                 buf->getNativeBuffer(), /*useFramebufferCache=*/true, std::move(fd),
3488                                 readyFence);
3489     } else if (displayId) {
3490         mPowerAdvisor.setExpensiveRenderingExpected(*displayId, false);
3491     }
3492     return true;
3493 }
3494 
drawWormhole(const Region & region) const3495 void SurfaceFlinger::drawWormhole(const Region& region) const {
3496     auto& engine(getRenderEngine());
3497     engine.fillRegionWithColor(region, 0, 0, 0, 0);
3498 }
3499 
addClientLayer(const sp<Client> & client,const sp<IBinder> & handle,const sp<IGraphicBufferProducer> & gbc,const sp<Layer> & lbc,const sp<IBinder> & parentHandle,const sp<Layer> & parentLayer,bool addToCurrentState)3500 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,
3501                                         const sp<IGraphicBufferProducer>& gbc, const sp<Layer>& lbc,
3502                                         const sp<IBinder>& parentHandle,
3503                                         const sp<Layer>& parentLayer, bool addToCurrentState) {
3504     // add this layer to the current state list
3505     {
3506         Mutex::Autolock _l(mStateLock);
3507         sp<Layer> parent;
3508         if (parentHandle != nullptr) {
3509             parent = fromHandle(parentHandle);
3510             if (parent == nullptr) {
3511                 return NAME_NOT_FOUND;
3512             }
3513         } else {
3514             parent = parentLayer;
3515         }
3516 
3517         if (mNumLayers >= MAX_LAYERS) {
3518             ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers,
3519                   MAX_LAYERS);
3520             return NO_MEMORY;
3521         }
3522 
3523         mLayersByLocalBinderToken.emplace(handle->localBinder(), lbc);
3524 
3525         if (parent == nullptr && addToCurrentState) {
3526             mCurrentState.layersSortedByZ.add(lbc);
3527         } else if (parent == nullptr) {
3528             lbc->onRemovedFromCurrentState();
3529         } else if (parent->isRemovedFromCurrentState()) {
3530             parent->addChild(lbc);
3531             lbc->onRemovedFromCurrentState();
3532         } else {
3533             parent->addChild(lbc);
3534         }
3535 
3536         if (gbc != nullptr) {
3537             mGraphicBufferProducerList.insert(IInterface::asBinder(gbc).get());
3538             LOG_ALWAYS_FATAL_IF(mGraphicBufferProducerList.size() >
3539                                         mMaxGraphicBufferProducerListSize,
3540                                 "Suspected IGBP leak: %zu IGBPs (%zu max), %zu Layers",
3541                                 mGraphicBufferProducerList.size(),
3542                                 mMaxGraphicBufferProducerListSize, mNumLayers);
3543         }
3544         mLayersAdded = true;
3545     }
3546 
3547     // attach this layer to the client
3548     client->attachLayer(handle, lbc);
3549 
3550     return NO_ERROR;
3551 }
3552 
peekTransactionFlags()3553 uint32_t SurfaceFlinger::peekTransactionFlags() {
3554     return mTransactionFlags;
3555 }
3556 
getTransactionFlags(uint32_t flags)3557 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
3558     return mTransactionFlags.fetch_and(~flags) & flags;
3559 }
3560 
setTransactionFlags(uint32_t flags)3561 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
3562     return setTransactionFlags(flags, Scheduler::TransactionStart::NORMAL);
3563 }
3564 
setTransactionFlags(uint32_t flags,Scheduler::TransactionStart transactionStart)3565 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags,
3566                                              Scheduler::TransactionStart transactionStart) {
3567     uint32_t old = mTransactionFlags.fetch_or(flags);
3568     mVsyncModulator.setTransactionStart(transactionStart);
3569     if ((old & flags)==0) { // wake the server up
3570         signalTransaction();
3571     }
3572     return old;
3573 }
3574 
flushTransactionQueues()3575 bool SurfaceFlinger::flushTransactionQueues() {
3576     // to prevent onHandleDestroyed from being called while the lock is held,
3577     // we must keep a copy of the transactions (specifically the composer
3578     // states) around outside the scope of the lock
3579     std::vector<const TransactionState> transactions;
3580     bool flushedATransaction = false;
3581     {
3582         Mutex::Autolock _l(mStateLock);
3583 
3584         auto it = mTransactionQueues.begin();
3585         while (it != mTransactionQueues.end()) {
3586             auto& [applyToken, transactionQueue] = *it;
3587 
3588             while (!transactionQueue.empty()) {
3589                 const auto& transaction = transactionQueue.front();
3590                 if (!transactionIsReadyToBeApplied(transaction.desiredPresentTime,
3591                                                    transaction.states)) {
3592                     setTransactionFlags(eTransactionFlushNeeded);
3593                     break;
3594                 }
3595                 transactions.push_back(transaction);
3596                 applyTransactionState(transaction.states, transaction.displays, transaction.flags,
3597                                       mPendingInputWindowCommands, transaction.desiredPresentTime,
3598                                       transaction.buffer, transaction.callback,
3599                                       transaction.postTime, transaction.privileged,
3600                                       /*isMainThread*/ true);
3601                 transactionQueue.pop();
3602                 flushedATransaction = true;
3603             }
3604 
3605             if (transactionQueue.empty()) {
3606                 it = mTransactionQueues.erase(it);
3607                 mTransactionCV.broadcast();
3608             } else {
3609                 it = std::next(it, 1);
3610             }
3611         }
3612     }
3613     return flushedATransaction;
3614 }
3615 
transactionFlushNeeded()3616 bool SurfaceFlinger::transactionFlushNeeded() {
3617     return !mTransactionQueues.empty();
3618 }
3619 
containsAnyInvalidClientState(const Vector<ComposerState> & states)3620 bool SurfaceFlinger::containsAnyInvalidClientState(const Vector<ComposerState>& states) {
3621     for (const ComposerState& state : states) {
3622         // Here we need to check that the interface we're given is indeed
3623         // one of our own. A malicious client could give us a nullptr
3624         // IInterface, or one of its own or even one of our own but a
3625         // different type. All these situations would cause us to crash.
3626         if (state.client == nullptr) {
3627             return true;
3628         }
3629 
3630         sp<IBinder> binder = IInterface::asBinder(state.client);
3631         if (binder == nullptr) {
3632             return true;
3633         }
3634 
3635         if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) == nullptr) {
3636             return true;
3637         }
3638     }
3639     return false;
3640 }
3641 
transactionIsReadyToBeApplied(int64_t desiredPresentTime,const Vector<ComposerState> & states)3642 bool SurfaceFlinger::transactionIsReadyToBeApplied(int64_t desiredPresentTime,
3643                                                    const Vector<ComposerState>& states) {
3644     nsecs_t expectedPresentTime = mScheduler->expectedPresentTime();
3645     // Do not present if the desiredPresentTime has not passed unless it is more than one second
3646     // in the future. We ignore timestamps more than 1 second in the future for stability reasons.
3647     if (desiredPresentTime >= 0 && desiredPresentTime >= expectedPresentTime &&
3648         desiredPresentTime < expectedPresentTime + s2ns(1)) {
3649         return false;
3650     }
3651 
3652     for (const ComposerState& state : states) {
3653         const layer_state_t& s = state.state;
3654         if (!(s.what & layer_state_t::eAcquireFenceChanged)) {
3655             continue;
3656         }
3657         if (s.acquireFence && s.acquireFence->getStatus() == Fence::Status::Unsignaled) {
3658             return false;
3659         }
3660     }
3661     return true;
3662 }
3663 
setTransactionState(const Vector<ComposerState> & states,const Vector<DisplayState> & displays,uint32_t flags,const sp<IBinder> & applyToken,const InputWindowCommands & inputWindowCommands,int64_t desiredPresentTime,const client_cache_t & uncacheBuffer,const std::vector<ListenerCallbacks> & listenerCallbacks)3664 void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& states,
3665                                          const Vector<DisplayState>& displays, uint32_t flags,
3666                                          const sp<IBinder>& applyToken,
3667                                          const InputWindowCommands& inputWindowCommands,
3668                                          int64_t desiredPresentTime,
3669                                          const client_cache_t& uncacheBuffer,
3670                                          const std::vector<ListenerCallbacks>& listenerCallbacks) {
3671     ATRACE_CALL();
3672 
3673     const int64_t postTime = systemTime();
3674 
3675     bool privileged = callingThreadHasUnscopedSurfaceFlingerAccess();
3676 
3677     Mutex::Autolock _l(mStateLock);
3678 
3679     if (containsAnyInvalidClientState(states)) {
3680         return;
3681     }
3682 
3683     // If its TransactionQueue already has a pending TransactionState or if it is pending
3684     auto itr = mTransactionQueues.find(applyToken);
3685     // if this is an animation frame, wait until prior animation frame has
3686     // been applied by SF
3687     if (flags & eAnimation) {
3688         while (itr != mTransactionQueues.end()) {
3689             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3690             if (CC_UNLIKELY(err != NO_ERROR)) {
3691                 ALOGW_IF(err == TIMED_OUT,
3692                          "setTransactionState timed out "
3693                          "waiting for animation frame to apply");
3694                 break;
3695             }
3696             itr = mTransactionQueues.find(applyToken);
3697         }
3698     }
3699     if (itr != mTransactionQueues.end() ||
3700         !transactionIsReadyToBeApplied(desiredPresentTime, states)) {
3701         mTransactionQueues[applyToken].emplace(states, displays, flags, desiredPresentTime,
3702                                                uncacheBuffer, listenerCallbacks, postTime,
3703                                                privileged);
3704         setTransactionFlags(eTransactionFlushNeeded);
3705         return;
3706     }
3707 
3708     applyTransactionState(states, displays, flags, inputWindowCommands, desiredPresentTime,
3709                           uncacheBuffer, listenerCallbacks, postTime, privileged);
3710 }
3711 
applyTransactionState(const Vector<ComposerState> & states,const Vector<DisplayState> & displays,uint32_t flags,const InputWindowCommands & inputWindowCommands,const int64_t desiredPresentTime,const client_cache_t & uncacheBuffer,const std::vector<ListenerCallbacks> & listenerCallbacks,const int64_t postTime,bool privileged,bool isMainThread)3712 void SurfaceFlinger::applyTransactionState(const Vector<ComposerState>& states,
3713                                            const Vector<DisplayState>& displays, uint32_t flags,
3714                                            const InputWindowCommands& inputWindowCommands,
3715                                            const int64_t desiredPresentTime,
3716                                            const client_cache_t& uncacheBuffer,
3717                                            const std::vector<ListenerCallbacks>& listenerCallbacks,
3718                                            const int64_t postTime, bool privileged,
3719                                            bool isMainThread) {
3720     uint32_t transactionFlags = 0;
3721 
3722     if (flags & eAnimation) {
3723         // For window updates that are part of an animation we must wait for
3724         // previous animation "frames" to be handled.
3725         while (!isMainThread && mAnimTransactionPending) {
3726             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3727             if (CC_UNLIKELY(err != NO_ERROR)) {
3728                 // just in case something goes wrong in SF, return to the
3729                 // caller after a few seconds.
3730                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
3731                         "waiting for previous animation frame");
3732                 mAnimTransactionPending = false;
3733                 break;
3734             }
3735         }
3736     }
3737 
3738     for (const DisplayState& display : displays) {
3739         transactionFlags |= setDisplayStateLocked(display);
3740     }
3741 
3742     // In case the client has sent a Transaction that should receive callbacks but without any
3743     // SurfaceControls that should be included in the callback, send the listener and callbackIds
3744     // to the callback thread so it can send an empty callback
3745     if (!listenerCallbacks.empty()) {
3746         mTransactionCompletedThread.run();
3747     }
3748     for (const auto& [listener, callbackIds] : listenerCallbacks) {
3749         mTransactionCompletedThread.addCallback(listener, callbackIds);
3750     }
3751 
3752     uint32_t clientStateFlags = 0;
3753     for (const ComposerState& state : states) {
3754         clientStateFlags |= setClientStateLocked(state, desiredPresentTime, listenerCallbacks,
3755                                                  postTime, privileged);
3756     }
3757 
3758     // If the state doesn't require a traversal and there are callbacks, send them now
3759     if (!(clientStateFlags & eTraversalNeeded) && !listenerCallbacks.empty()) {
3760         mTransactionCompletedThread.sendCallbacks();
3761     }
3762     transactionFlags |= clientStateFlags;
3763 
3764     transactionFlags |= addInputWindowCommands(inputWindowCommands);
3765 
3766     if (uncacheBuffer.isValid()) {
3767         ClientCache::getInstance().erase(uncacheBuffer);
3768     }
3769 
3770     // If a synchronous transaction is explicitly requested without any changes, force a transaction
3771     // anyway. This can be used as a flush mechanism for previous async transactions.
3772     // Empty animation transaction can be used to simulate back-pressure, so also force a
3773     // transaction for empty animation transactions.
3774     if (transactionFlags == 0 &&
3775             ((flags & eSynchronous) || (flags & eAnimation))) {
3776         transactionFlags = eTransactionNeeded;
3777     }
3778 
3779     // If we are on the main thread, we are about to preform a traversal. Clear the traversal bit
3780     // so we don't have to wake up again next frame to preform an uneeded traversal.
3781     if (isMainThread && (transactionFlags & eTraversalNeeded)) {
3782         transactionFlags = transactionFlags & (~eTraversalNeeded);
3783         mTraversalNeededMainThread = true;
3784     }
3785 
3786     if (transactionFlags) {
3787         if (mInterceptor->isEnabled()) {
3788             mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags);
3789         }
3790 
3791         // this triggers the transaction
3792         const auto start = (flags & eEarlyWakeup) ? Scheduler::TransactionStart::EARLY
3793                                                   : Scheduler::TransactionStart::NORMAL;
3794         setTransactionFlags(transactionFlags, start);
3795 
3796         // if this is a synchronous transaction, wait for it to take effect
3797         // before returning.
3798         if (flags & eSynchronous) {
3799             mTransactionPending = true;
3800         }
3801         if (flags & eAnimation) {
3802             mAnimTransactionPending = true;
3803         }
3804         if (mPendingInputWindowCommands.syncInputWindows) {
3805             mPendingSyncInputWindows = true;
3806         }
3807 
3808         // applyTransactionState can be called by either the main SF thread or by
3809         // another process through setTransactionState.  While a given process may wish
3810         // to wait on synchronous transactions, the main SF thread should never
3811         // be blocked.  Therefore, we only wait if isMainThread is false.
3812         while (!isMainThread && (mTransactionPending || mPendingSyncInputWindows)) {
3813             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3814             if (CC_UNLIKELY(err != NO_ERROR)) {
3815                 // just in case something goes wrong in SF, return to the
3816                 // called after a few seconds.
3817                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
3818                 mTransactionPending = false;
3819                 mPendingSyncInputWindows = false;
3820                 break;
3821             }
3822         }
3823     }
3824 }
3825 
setDisplayStateLocked(const DisplayState & s)3826 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s) {
3827     const ssize_t index = mCurrentState.displays.indexOfKey(s.token);
3828     if (index < 0) return 0;
3829 
3830     uint32_t flags = 0;
3831     DisplayDeviceState& state = mCurrentState.displays.editValueAt(index);
3832 
3833     const uint32_t what = s.what;
3834     if (what & DisplayState::eSurfaceChanged) {
3835         if (IInterface::asBinder(state.surface) != IInterface::asBinder(s.surface)) {
3836             state.surface = s.surface;
3837             flags |= eDisplayTransactionNeeded;
3838         }
3839     }
3840     if (what & DisplayState::eLayerStackChanged) {
3841         if (state.layerStack != s.layerStack) {
3842             state.layerStack = s.layerStack;
3843             flags |= eDisplayTransactionNeeded;
3844         }
3845     }
3846     if (what & DisplayState::eDisplayProjectionChanged) {
3847         if (state.orientation != s.orientation) {
3848             state.orientation = s.orientation;
3849             flags |= eDisplayTransactionNeeded;
3850         }
3851         if (state.frame != s.frame) {
3852             state.frame = s.frame;
3853             flags |= eDisplayTransactionNeeded;
3854         }
3855         if (state.viewport != s.viewport) {
3856             state.viewport = s.viewport;
3857             flags |= eDisplayTransactionNeeded;
3858         }
3859     }
3860     if (what & DisplayState::eDisplaySizeChanged) {
3861         if (state.width != s.width) {
3862             state.width = s.width;
3863             flags |= eDisplayTransactionNeeded;
3864         }
3865         if (state.height != s.height) {
3866             state.height = s.height;
3867             flags |= eDisplayTransactionNeeded;
3868         }
3869     }
3870 
3871     return flags;
3872 }
3873 
callingThreadHasUnscopedSurfaceFlingerAccess()3874 bool SurfaceFlinger::callingThreadHasUnscopedSurfaceFlingerAccess() {
3875     IPCThreadState* ipc = IPCThreadState::self();
3876     const int pid = ipc->getCallingPid();
3877     const int uid = ipc->getCallingUid();
3878     if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3879         !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3880         return false;
3881     }
3882     return true;
3883 }
3884 
setClientStateLocked(const ComposerState & composerState,int64_t desiredPresentTime,const std::vector<ListenerCallbacks> & listenerCallbacks,int64_t postTime,bool privileged)3885 uint32_t SurfaceFlinger::setClientStateLocked(
3886         const ComposerState& composerState, int64_t desiredPresentTime,
3887         const std::vector<ListenerCallbacks>& listenerCallbacks, int64_t postTime,
3888         bool privileged) {
3889     const layer_state_t& s = composerState.state;
3890     sp<Client> client(static_cast<Client*>(composerState.client.get()));
3891 
3892     sp<Layer> layer(client->getLayerUser(s.surface));
3893     if (layer == nullptr) {
3894         return 0;
3895     }
3896 
3897     uint32_t flags = 0;
3898 
3899     const uint64_t what = s.what;
3900     bool geometryAppliesWithResize =
3901             what & layer_state_t::eGeometryAppliesWithResize;
3902 
3903     // If we are deferring transaction, make sure to push the pending state, as otherwise the
3904     // pending state will also be deferred.
3905     if (what & layer_state_t::eDeferTransaction_legacy) {
3906         layer->pushPendingState();
3907     }
3908 
3909     if (what & layer_state_t::ePositionChanged) {
3910         if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
3911             flags |= eTraversalNeeded;
3912         }
3913     }
3914     if (what & layer_state_t::eLayerChanged) {
3915         // NOTE: index needs to be calculated before we update the state
3916         const auto& p = layer->getParent();
3917         if (p == nullptr) {
3918             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3919             if (layer->setLayer(s.z) && idx >= 0) {
3920                 mCurrentState.layersSortedByZ.removeAt(idx);
3921                 mCurrentState.layersSortedByZ.add(layer);
3922                 // we need traversal (state changed)
3923                 // AND transaction (list changed)
3924                 flags |= eTransactionNeeded|eTraversalNeeded;
3925             }
3926         } else {
3927             if (p->setChildLayer(layer, s.z)) {
3928                 flags |= eTransactionNeeded|eTraversalNeeded;
3929             }
3930         }
3931     }
3932     if (what & layer_state_t::eRelativeLayerChanged) {
3933         // NOTE: index needs to be calculated before we update the state
3934         const auto& p = layer->getParent();
3935         if (p == nullptr) {
3936             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3937             if (layer->setRelativeLayer(s.relativeLayerHandle, s.z) && idx >= 0) {
3938                 mCurrentState.layersSortedByZ.removeAt(idx);
3939                 mCurrentState.layersSortedByZ.add(layer);
3940                 // we need traversal (state changed)
3941                 // AND transaction (list changed)
3942                 flags |= eTransactionNeeded|eTraversalNeeded;
3943             }
3944         } else {
3945             if (p->setChildRelativeLayer(layer, s.relativeLayerHandle, s.z)) {
3946                 flags |= eTransactionNeeded|eTraversalNeeded;
3947             }
3948         }
3949     }
3950     if (what & layer_state_t::eSizeChanged) {
3951         if (layer->setSize(s.w, s.h)) {
3952             flags |= eTraversalNeeded;
3953         }
3954     }
3955     if (what & layer_state_t::eAlphaChanged) {
3956         if (layer->setAlpha(s.alpha))
3957             flags |= eTraversalNeeded;
3958     }
3959     if (what & layer_state_t::eColorChanged) {
3960         if (layer->setColor(s.color))
3961             flags |= eTraversalNeeded;
3962     }
3963     if (what & layer_state_t::eColorTransformChanged) {
3964         if (layer->setColorTransform(s.colorTransform)) {
3965             flags |= eTraversalNeeded;
3966         }
3967     }
3968     if (what & layer_state_t::eBackgroundColorChanged) {
3969         if (layer->setBackgroundColor(s.color, s.bgColorAlpha, s.bgColorDataspace)) {
3970             flags |= eTraversalNeeded;
3971         }
3972     }
3973     if (what & layer_state_t::eMatrixChanged) {
3974         // TODO: b/109894387
3975         //
3976         // SurfaceFlinger's renderer is not prepared to handle cropping in the face of arbitrary
3977         // rotation. To see the problem observe that if we have a square parent, and a child
3978         // of the same size, then we rotate the child 45 degrees around it's center, the child
3979         // must now be cropped to a non rectangular 8 sided region.
3980         //
3981         // Of course we can fix this in the future. For now, we are lucky, SurfaceControl is
3982         // private API, and the WindowManager only uses rotation in one case, which is on a top
3983         // level layer in which cropping is not an issue.
3984         //
3985         // However given that abuse of rotation matrices could lead to surfaces extending outside
3986         // of cropped areas, we need to prevent non-root clients without permission ACCESS_SURFACE_FLINGER
3987         // (a.k.a. everyone except WindowManager and tests) from setting non rectangle preserving
3988         // transformations.
3989         if (layer->setMatrix(s.matrix, privileged))
3990             flags |= eTraversalNeeded;
3991     }
3992     if (what & layer_state_t::eTransparentRegionChanged) {
3993         if (layer->setTransparentRegionHint(s.transparentRegion))
3994             flags |= eTraversalNeeded;
3995     }
3996     if (what & layer_state_t::eFlagsChanged) {
3997         if (layer->setFlags(s.flags, s.mask))
3998             flags |= eTraversalNeeded;
3999     }
4000     if (what & layer_state_t::eCropChanged_legacy) {
4001         if (layer->setCrop_legacy(s.crop_legacy, !geometryAppliesWithResize))
4002             flags |= eTraversalNeeded;
4003     }
4004     if (what & layer_state_t::eCornerRadiusChanged) {
4005         if (layer->setCornerRadius(s.cornerRadius))
4006             flags |= eTraversalNeeded;
4007     }
4008     if (what & layer_state_t::eLayerStackChanged) {
4009         ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
4010         // We only allow setting layer stacks for top level layers,
4011         // everything else inherits layer stack from its parent.
4012         if (layer->hasParent()) {
4013             ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
4014                     layer->getName().string());
4015         } else if (idx < 0) {
4016             ALOGE("Attempt to set layer stack on layer without parent (%s) that "
4017                     "that also does not appear in the top level layer list. Something"
4018                     " has gone wrong.", layer->getName().string());
4019         } else if (layer->setLayerStack(s.layerStack)) {
4020             mCurrentState.layersSortedByZ.removeAt(idx);
4021             mCurrentState.layersSortedByZ.add(layer);
4022             // we need traversal (state changed)
4023             // AND transaction (list changed)
4024             flags |= eTransactionNeeded|eTraversalNeeded|eDisplayLayerStackChanged;
4025         }
4026     }
4027     if (what & layer_state_t::eDeferTransaction_legacy) {
4028         if (s.barrierHandle_legacy != nullptr) {
4029             layer->deferTransactionUntil_legacy(s.barrierHandle_legacy, s.frameNumber_legacy);
4030         } else if (s.barrierGbp_legacy != nullptr) {
4031             const sp<IGraphicBufferProducer>& gbp = s.barrierGbp_legacy;
4032             if (authenticateSurfaceTextureLocked(gbp)) {
4033                 const auto& otherLayer =
4034                     (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
4035                 layer->deferTransactionUntil_legacy(otherLayer, s.frameNumber_legacy);
4036             } else {
4037                 ALOGE("Attempt to defer transaction to to an"
4038                         " unrecognized GraphicBufferProducer");
4039             }
4040         }
4041         // We don't trigger a traversal here because if no other state is
4042         // changed, we don't want this to cause any more work
4043     }
4044     if (what & layer_state_t::eReparent) {
4045         bool hadParent = layer->hasParent();
4046         if (layer->reparent(s.parentHandleForChild)) {
4047             if (!hadParent) {
4048                 mCurrentState.layersSortedByZ.remove(layer);
4049             }
4050             flags |= eTransactionNeeded|eTraversalNeeded;
4051         }
4052     }
4053     if (what & layer_state_t::eReparentChildren) {
4054         if (layer->reparentChildren(s.reparentHandle)) {
4055             flags |= eTransactionNeeded|eTraversalNeeded;
4056         }
4057     }
4058     if (what & layer_state_t::eDetachChildren) {
4059         layer->detachChildren();
4060     }
4061     if (what & layer_state_t::eOverrideScalingModeChanged) {
4062         layer->setOverrideScalingMode(s.overrideScalingMode);
4063         // We don't trigger a traversal here because if no other state is
4064         // changed, we don't want this to cause any more work
4065     }
4066     if (what & layer_state_t::eTransformChanged) {
4067         if (layer->setTransform(s.transform)) flags |= eTraversalNeeded;
4068     }
4069     if (what & layer_state_t::eTransformToDisplayInverseChanged) {
4070         if (layer->setTransformToDisplayInverse(s.transformToDisplayInverse))
4071             flags |= eTraversalNeeded;
4072     }
4073     if (what & layer_state_t::eCropChanged) {
4074         if (layer->setCrop(s.crop)) flags |= eTraversalNeeded;
4075     }
4076     if (what & layer_state_t::eFrameChanged) {
4077         if (layer->setFrame(s.frame)) flags |= eTraversalNeeded;
4078     }
4079     if (what & layer_state_t::eAcquireFenceChanged) {
4080         if (layer->setAcquireFence(s.acquireFence)) flags |= eTraversalNeeded;
4081     }
4082     if (what & layer_state_t::eDataspaceChanged) {
4083         if (layer->setDataspace(s.dataspace)) flags |= eTraversalNeeded;
4084     }
4085     if (what & layer_state_t::eHdrMetadataChanged) {
4086         if (layer->setHdrMetadata(s.hdrMetadata)) flags |= eTraversalNeeded;
4087     }
4088     if (what & layer_state_t::eSurfaceDamageRegionChanged) {
4089         if (layer->setSurfaceDamageRegion(s.surfaceDamageRegion)) flags |= eTraversalNeeded;
4090     }
4091     if (what & layer_state_t::eApiChanged) {
4092         if (layer->setApi(s.api)) flags |= eTraversalNeeded;
4093     }
4094     if (what & layer_state_t::eSidebandStreamChanged) {
4095         if (layer->setSidebandStream(s.sidebandStream)) flags |= eTraversalNeeded;
4096     }
4097     if (what & layer_state_t::eInputInfoChanged) {
4098         if (privileged) {
4099             layer->setInputInfo(s.inputInfo);
4100             flags |= eTraversalNeeded;
4101         } else {
4102             ALOGE("Attempt to update InputWindowInfo without permission ACCESS_SURFACE_FLINGER");
4103         }
4104     }
4105     if (what & layer_state_t::eMetadataChanged) {
4106         if (layer->setMetadata(s.metadata)) flags |= eTraversalNeeded;
4107     }
4108     if (what & layer_state_t::eColorSpaceAgnosticChanged) {
4109         if (layer->setColorSpaceAgnostic(s.colorSpaceAgnostic)) {
4110             flags |= eTraversalNeeded;
4111         }
4112     }
4113     std::vector<sp<CallbackHandle>> callbackHandles;
4114     if ((what & layer_state_t::eHasListenerCallbacksChanged) && (!listenerCallbacks.empty())) {
4115         for (const auto& [listener, callbackIds] : listenerCallbacks) {
4116             callbackHandles.emplace_back(new CallbackHandle(listener, callbackIds, s.surface));
4117         }
4118     }
4119     bool bufferChanged = what & layer_state_t::eBufferChanged;
4120     bool cacheIdChanged = what & layer_state_t::eCachedBufferChanged;
4121     sp<GraphicBuffer> buffer;
4122     if (bufferChanged && cacheIdChanged) {
4123         ClientCache::getInstance().add(s.cachedBuffer, s.buffer);
4124         buffer = s.buffer;
4125     } else if (cacheIdChanged) {
4126         buffer = ClientCache::getInstance().get(s.cachedBuffer);
4127     } else if (bufferChanged) {
4128         buffer = s.buffer;
4129     }
4130     if (buffer) {
4131         if (layer->setBuffer(buffer, postTime, desiredPresentTime, s.cachedBuffer)) {
4132             flags |= eTraversalNeeded;
4133         }
4134     }
4135     if (layer->setTransactionCompletedListeners(callbackHandles)) flags |= eTraversalNeeded;
4136     // Do not put anything that updates layer state or modifies flags after
4137     // setTransactionCompletedListener
4138     return flags;
4139 }
4140 
addInputWindowCommands(const InputWindowCommands & inputWindowCommands)4141 uint32_t SurfaceFlinger::addInputWindowCommands(const InputWindowCommands& inputWindowCommands) {
4142     uint32_t flags = 0;
4143     if (!inputWindowCommands.transferTouchFocusCommands.empty()) {
4144         flags |= eTraversalNeeded;
4145     }
4146 
4147     if (inputWindowCommands.syncInputWindows) {
4148         flags |= eTraversalNeeded;
4149     }
4150 
4151     mPendingInputWindowCommands.merge(inputWindowCommands);
4152     return flags;
4153 }
4154 
createLayer(const String8 & name,const sp<Client> & client,uint32_t w,uint32_t h,PixelFormat format,uint32_t flags,LayerMetadata metadata,sp<IBinder> * handle,sp<IGraphicBufferProducer> * gbp,const sp<IBinder> & parentHandle,const sp<Layer> & parentLayer)4155 status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& client, uint32_t w,
4156                                      uint32_t h, PixelFormat format, uint32_t flags,
4157                                      LayerMetadata metadata, sp<IBinder>* handle,
4158                                      sp<IGraphicBufferProducer>* gbp,
4159                                      const sp<IBinder>& parentHandle,
4160                                      const sp<Layer>& parentLayer) {
4161     if (int32_t(w|h) < 0) {
4162         ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
4163                 int(w), int(h));
4164         return BAD_VALUE;
4165     }
4166 
4167     ALOG_ASSERT(parentLayer == nullptr || parentHandle == nullptr,
4168             "Expected only one of parentLayer or parentHandle to be non-null. "
4169             "Programmer error?");
4170 
4171     status_t result = NO_ERROR;
4172 
4173     sp<Layer> layer;
4174 
4175     String8 uniqueName = getUniqueLayerName(name);
4176 
4177     bool primaryDisplayOnly = false;
4178 
4179     // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java
4180     // TODO b/64227542
4181     if (metadata.has(METADATA_WINDOW_TYPE)) {
4182         int32_t windowType = metadata.getInt32(METADATA_WINDOW_TYPE, 0);
4183         if (windowType == 441731) {
4184             metadata.setInt32(METADATA_WINDOW_TYPE, InputWindowInfo::TYPE_NAVIGATION_BAR_PANEL);
4185             primaryDisplayOnly = true;
4186         }
4187     }
4188 
4189     switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
4190         case ISurfaceComposerClient::eFXSurfaceBufferQueue:
4191             result = createBufferQueueLayer(client, uniqueName, w, h, flags, std::move(metadata),
4192                                             format, handle, gbp, &layer);
4193 
4194             break;
4195         case ISurfaceComposerClient::eFXSurfaceBufferState:
4196             result = createBufferStateLayer(client, uniqueName, w, h, flags, std::move(metadata),
4197                                             handle, &layer);
4198             break;
4199         case ISurfaceComposerClient::eFXSurfaceColor:
4200             // check if buffer size is set for color layer.
4201             if (w > 0 || h > 0) {
4202                 ALOGE("createLayer() failed, w or h cannot be set for color layer (w=%d, h=%d)",
4203                       int(w), int(h));
4204                 return BAD_VALUE;
4205             }
4206 
4207             result = createColorLayer(client, uniqueName, w, h, flags, std::move(metadata), handle,
4208                                       &layer);
4209             break;
4210         case ISurfaceComposerClient::eFXSurfaceContainer:
4211             // check if buffer size is set for container layer.
4212             if (w > 0 || h > 0) {
4213                 ALOGE("createLayer() failed, w or h cannot be set for container layer (w=%d, h=%d)",
4214                       int(w), int(h));
4215                 return BAD_VALUE;
4216             }
4217             result = createContainerLayer(client, uniqueName, w, h, flags, std::move(metadata),
4218                                           handle, &layer);
4219             break;
4220         default:
4221             result = BAD_VALUE;
4222             break;
4223     }
4224 
4225     if (result != NO_ERROR) {
4226         return result;
4227     }
4228 
4229     if (primaryDisplayOnly) {
4230         layer->setPrimaryDisplayOnly();
4231     }
4232 
4233     bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess();
4234     result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer,
4235                             addToCurrentState);
4236     if (result != NO_ERROR) {
4237         return result;
4238     }
4239     mInterceptor->saveSurfaceCreation(layer);
4240 
4241     setTransactionFlags(eTransactionNeeded);
4242     return result;
4243 }
4244 
getUniqueLayerName(const String8 & name)4245 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
4246 {
4247     bool matchFound = true;
4248     uint32_t dupeCounter = 0;
4249 
4250     // Tack on our counter whether there is a hit or not, so everyone gets a tag
4251     String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
4252 
4253     // Grab the state lock since we're accessing mCurrentState
4254     Mutex::Autolock lock(mStateLock);
4255 
4256     // Loop over layers until we're sure there is no matching name
4257     while (matchFound) {
4258         matchFound = false;
4259         mCurrentState.traverseInZOrder([&](Layer* layer) {
4260             if (layer->getName() == uniqueName) {
4261                 matchFound = true;
4262                 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
4263             }
4264         });
4265     }
4266 
4267     ALOGV_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(),
4268              uniqueName.c_str());
4269 
4270     return uniqueName;
4271 }
4272 
createBufferQueueLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,LayerMetadata metadata,PixelFormat & format,sp<IBinder> * handle,sp<IGraphicBufferProducer> * gbp,sp<Layer> * outLayer)4273 status_t SurfaceFlinger::createBufferQueueLayer(const sp<Client>& client, const String8& name,
4274                                                 uint32_t w, uint32_t h, uint32_t flags,
4275                                                 LayerMetadata metadata, PixelFormat& format,
4276                                                 sp<IBinder>* handle,
4277                                                 sp<IGraphicBufferProducer>* gbp,
4278                                                 sp<Layer>* outLayer) {
4279     // initialize the surfaces
4280     switch (format) {
4281     case PIXEL_FORMAT_TRANSPARENT:
4282     case PIXEL_FORMAT_TRANSLUCENT:
4283         format = PIXEL_FORMAT_RGBA_8888;
4284         break;
4285     case PIXEL_FORMAT_OPAQUE:
4286         format = PIXEL_FORMAT_RGBX_8888;
4287         break;
4288     }
4289 
4290     sp<BufferQueueLayer> layer = getFactory().createBufferQueueLayer(
4291             LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
4292     status_t err = layer->setDefaultBufferProperties(w, h, format);
4293     if (err == NO_ERROR) {
4294         *handle = layer->getHandle();
4295         *gbp = layer->getProducer();
4296         *outLayer = layer;
4297     }
4298 
4299     ALOGE_IF(err, "createBufferQueueLayer() failed (%s)", strerror(-err));
4300     return err;
4301 }
4302 
createBufferStateLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,LayerMetadata metadata,sp<IBinder> * handle,sp<Layer> * outLayer)4303 status_t SurfaceFlinger::createBufferStateLayer(const sp<Client>& client, const String8& name,
4304                                                 uint32_t w, uint32_t h, uint32_t flags,
4305                                                 LayerMetadata metadata, sp<IBinder>* handle,
4306                                                 sp<Layer>* outLayer) {
4307     sp<BufferStateLayer> layer = getFactory().createBufferStateLayer(
4308             LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
4309     *handle = layer->getHandle();
4310     *outLayer = layer;
4311 
4312     return NO_ERROR;
4313 }
4314 
createColorLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,LayerMetadata metadata,sp<IBinder> * handle,sp<Layer> * outLayer)4315 status_t SurfaceFlinger::createColorLayer(const sp<Client>& client, const String8& name, uint32_t w,
4316                                           uint32_t h, uint32_t flags, LayerMetadata metadata,
4317                                           sp<IBinder>* handle, sp<Layer>* outLayer) {
4318     *outLayer = getFactory().createColorLayer(
4319             LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
4320     *handle = (*outLayer)->getHandle();
4321     return NO_ERROR;
4322 }
4323 
createContainerLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,LayerMetadata metadata,sp<IBinder> * handle,sp<Layer> * outLayer)4324 status_t SurfaceFlinger::createContainerLayer(const sp<Client>& client, const String8& name,
4325                                               uint32_t w, uint32_t h, uint32_t flags,
4326                                               LayerMetadata metadata, sp<IBinder>* handle,
4327                                               sp<Layer>* outLayer) {
4328     *outLayer = getFactory().createContainerLayer(
4329             LayerCreationArgs(this, client, name, w, h, flags, std::move(metadata)));
4330     *handle = (*outLayer)->getHandle();
4331     return NO_ERROR;
4332 }
4333 
4334 
markLayerPendingRemovalLocked(const sp<Layer> & layer)4335 void SurfaceFlinger::markLayerPendingRemovalLocked(const sp<Layer>& layer) {
4336     mLayersPendingRemoval.add(layer);
4337     mLayersRemoved = true;
4338     setTransactionFlags(eTransactionNeeded);
4339 }
4340 
onHandleDestroyed(sp<Layer> & layer)4341 void SurfaceFlinger::onHandleDestroyed(sp<Layer>& layer)
4342 {
4343     Mutex::Autolock lock(mStateLock);
4344     // If a layer has a parent, we allow it to out-live it's handle
4345     // with the idea that the parent holds a reference and will eventually
4346     // be cleaned up. However no one cleans up the top-level so we do so
4347     // here.
4348     if (layer->getParent() == nullptr) {
4349         mCurrentState.layersSortedByZ.remove(layer);
4350     }
4351     markLayerPendingRemovalLocked(layer);
4352 
4353     auto it = mLayersByLocalBinderToken.begin();
4354     while (it != mLayersByLocalBinderToken.end()) {
4355         if (it->second == layer) {
4356             it = mLayersByLocalBinderToken.erase(it);
4357         } else {
4358             it++;
4359         }
4360     }
4361 
4362     layer.clear();
4363 }
4364 
4365 // ---------------------------------------------------------------------------
4366 
onInitializeDisplays()4367 void SurfaceFlinger::onInitializeDisplays() {
4368     const auto display = getDefaultDisplayDeviceLocked();
4369     if (!display) return;
4370 
4371     const sp<IBinder> token = display->getDisplayToken().promote();
4372     LOG_ALWAYS_FATAL_IF(token == nullptr);
4373 
4374     // reset screen orientation and use primary layer stack
4375     Vector<ComposerState> state;
4376     Vector<DisplayState> displays;
4377     DisplayState d;
4378     d.what = DisplayState::eDisplayProjectionChanged |
4379              DisplayState::eLayerStackChanged;
4380     d.token = token;
4381     d.layerStack = 0;
4382     d.orientation = DisplayState::eOrientationDefault;
4383     d.frame.makeInvalid();
4384     d.viewport.makeInvalid();
4385     d.width = 0;
4386     d.height = 0;
4387     displays.add(d);
4388     setTransactionState(state, displays, 0, nullptr, mPendingInputWindowCommands, -1, {}, {});
4389 
4390     setPowerModeInternal(display, HWC_POWER_MODE_NORMAL);
4391 
4392     const nsecs_t vsyncPeriod = getVsyncPeriod();
4393     mAnimFrameTracker.setDisplayRefreshPeriod(vsyncPeriod);
4394 
4395     // Use phase of 0 since phase is not known.
4396     // Use latency of 0, which will snap to the ideal latency.
4397     DisplayStatInfo stats{0 /* vsyncTime */, vsyncPeriod};
4398     setCompositorTimingSnapped(stats, 0);
4399 }
4400 
initializeDisplays()4401 void SurfaceFlinger::initializeDisplays() {
4402     // Async since we may be called from the main thread.
4403     postMessageAsync(
4404             new LambdaMessage([this]() NO_THREAD_SAFETY_ANALYSIS { onInitializeDisplays(); }));
4405 }
4406 
setPowerModeInternal(const sp<DisplayDevice> & display,int mode)4407 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, int mode) {
4408     if (display->isVirtual()) {
4409         ALOGE("%s: Invalid operation on virtual display", __FUNCTION__);
4410         return;
4411     }
4412 
4413     const auto displayId = display->getId();
4414     LOG_ALWAYS_FATAL_IF(!displayId);
4415 
4416     ALOGD("Setting power mode %d on display %s", mode, to_string(*displayId).c_str());
4417 
4418     int currentMode = display->getPowerMode();
4419     if (mode == currentMode) {
4420         return;
4421     }
4422 
4423     display->setPowerMode(mode);
4424 
4425     if (mInterceptor->isEnabled()) {
4426         mInterceptor->savePowerModeUpdate(display->getSequenceId(), mode);
4427     }
4428 
4429     if (currentMode == HWC_POWER_MODE_OFF) {
4430         // Turn on the display
4431         getHwComposer().setPowerMode(*displayId, mode);
4432         if (display->isPrimary() && mode != HWC_POWER_MODE_DOZE_SUSPEND) {
4433             mScheduler->onScreenAcquired(mAppConnectionHandle);
4434             mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
4435         }
4436 
4437         mVisibleRegionsDirty = true;
4438         mHasPoweredOff = true;
4439         repaintEverything();
4440 
4441         struct sched_param param = {0};
4442         param.sched_priority = 1;
4443         if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
4444             ALOGW("Couldn't set SCHED_FIFO on display on");
4445         }
4446     } else if (mode == HWC_POWER_MODE_OFF) {
4447         // Turn off the display
4448         struct sched_param param = {0};
4449         if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
4450             ALOGW("Couldn't set SCHED_OTHER on display off");
4451         }
4452 
4453         if (display->isPrimary() && currentMode != HWC_POWER_MODE_DOZE_SUSPEND) {
4454             mScheduler->disableHardwareVsync(true);
4455             mScheduler->onScreenReleased(mAppConnectionHandle);
4456         }
4457 
4458         getHwComposer().setPowerMode(*displayId, mode);
4459         mVisibleRegionsDirty = true;
4460         // from this point on, SF will stop drawing on this display
4461     } else if (mode == HWC_POWER_MODE_DOZE ||
4462                mode == HWC_POWER_MODE_NORMAL) {
4463         // Update display while dozing
4464         getHwComposer().setPowerMode(*displayId, mode);
4465         if (display->isPrimary() && currentMode == HWC_POWER_MODE_DOZE_SUSPEND) {
4466             mScheduler->onScreenAcquired(mAppConnectionHandle);
4467             mScheduler->resyncToHardwareVsync(true, getVsyncPeriod());
4468         }
4469     } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
4470         // Leave display going to doze
4471         if (display->isPrimary()) {
4472             mScheduler->disableHardwareVsync(true);
4473             mScheduler->onScreenReleased(mAppConnectionHandle);
4474         }
4475         getHwComposer().setPowerMode(*displayId, mode);
4476     } else {
4477         ALOGE("Attempting to set unknown power mode: %d\n", mode);
4478         getHwComposer().setPowerMode(*displayId, mode);
4479     }
4480 
4481     if (display->isPrimary()) {
4482         mTimeStats->setPowerMode(mode);
4483         mRefreshRateStats.setPowerMode(mode);
4484     }
4485 
4486     ALOGD("Finished setting power mode %d on display %s", mode, to_string(*displayId).c_str());
4487 }
4488 
setPowerMode(const sp<IBinder> & displayToken,int mode)4489 void SurfaceFlinger::setPowerMode(const sp<IBinder>& displayToken, int mode) {
4490     postMessageSync(new LambdaMessage([&]() NO_THREAD_SAFETY_ANALYSIS {
4491         const auto display = getDisplayDevice(displayToken);
4492         if (!display) {
4493             ALOGE("Attempt to set power mode %d for invalid display token %p", mode,
4494                   displayToken.get());
4495         } else if (display->isVirtual()) {
4496             ALOGW("Attempt to set power mode %d for virtual display", mode);
4497         } else {
4498             setPowerModeInternal(display, mode);
4499         }
4500     }));
4501 }
4502 
4503 // ---------------------------------------------------------------------------
4504 
doDump(int fd,const DumpArgs & args,bool asProto)4505 status_t SurfaceFlinger::doDump(int fd, const DumpArgs& args,
4506                                 bool asProto) NO_THREAD_SAFETY_ANALYSIS {
4507     std::string result;
4508 
4509     IPCThreadState* ipc = IPCThreadState::self();
4510     const int pid = ipc->getCallingPid();
4511     const int uid = ipc->getCallingUid();
4512 
4513     if ((uid != AID_SHELL) &&
4514             !PermissionCache::checkPermission(sDump, pid, uid)) {
4515         StringAppendF(&result, "Permission Denial: can't dump SurfaceFlinger from pid=%d, uid=%d\n",
4516                       pid, uid);
4517     } else {
4518         // Try to get the main lock, but give up after one second
4519         // (this would indicate SF is stuck, but we want to be able to
4520         // print something in dumpsys).
4521         status_t err = mStateLock.timedLock(s2ns(1));
4522         bool locked = (err == NO_ERROR);
4523         if (!locked) {
4524             StringAppendF(&result,
4525                           "SurfaceFlinger appears to be unresponsive (%s [%d]), dumping anyways "
4526                           "(no locks held)\n",
4527                           strerror(-err), err);
4528         }
4529 
4530         using namespace std::string_literals;
4531 
4532         static const std::unordered_map<std::string, Dumper> dumpers = {
4533                 {"--clear-layer-stats"s, dumper([this](std::string&) { mLayerStats.clear(); })},
4534                 {"--disable-layer-stats"s, dumper([this](std::string&) { mLayerStats.disable(); })},
4535                 {"--display-id"s, dumper(&SurfaceFlinger::dumpDisplayIdentificationData)},
4536                 {"--dispsync"s, dumper([this](std::string& s) {
4537                          mScheduler->dumpPrimaryDispSync(s);
4538                  })},
4539                 {"--dump-layer-stats"s, dumper([this](std::string& s) { mLayerStats.dump(s); })},
4540                 {"--enable-layer-stats"s, dumper([this](std::string&) { mLayerStats.enable(); })},
4541                 {"--frame-events"s, dumper(&SurfaceFlinger::dumpFrameEventsLocked)},
4542                 {"--latency"s, argsDumper(&SurfaceFlinger::dumpStatsLocked)},
4543                 {"--latency-clear"s, argsDumper(&SurfaceFlinger::clearStatsLocked)},
4544                 {"--list"s, dumper(&SurfaceFlinger::listLayersLocked)},
4545                 {"--static-screen"s, dumper(&SurfaceFlinger::dumpStaticScreenStats)},
4546                 {"--timestats"s, protoDumper(&SurfaceFlinger::dumpTimeStats)},
4547                 {"--vsync"s, dumper(&SurfaceFlinger::dumpVSync)},
4548                 {"--wide-color"s, dumper(&SurfaceFlinger::dumpWideColorInfo)},
4549         };
4550 
4551         const auto flag = args.empty() ? ""s : std::string(String8(args[0]));
4552 
4553         if (const auto it = dumpers.find(flag); it != dumpers.end()) {
4554             (it->second)(args, asProto, result);
4555         } else {
4556             if (asProto) {
4557                 LayersProto layersProto = dumpProtoInfo(LayerVector::StateSet::Current);
4558                 result.append(layersProto.SerializeAsString().c_str(), layersProto.ByteSize());
4559             } else {
4560                 dumpAllLocked(args, result);
4561             }
4562         }
4563 
4564         if (locked) {
4565             mStateLock.unlock();
4566         }
4567     }
4568     write(fd, result.c_str(), result.size());
4569     return NO_ERROR;
4570 }
4571 
dumpCritical(int fd,const DumpArgs &,bool asProto)4572 status_t SurfaceFlinger::dumpCritical(int fd, const DumpArgs&, bool asProto) {
4573     if (asProto && mTracing.isEnabled()) {
4574         mTracing.writeToFileAsync();
4575     }
4576 
4577     return doDump(fd, DumpArgs(), asProto);
4578 }
4579 
listLayersLocked(std::string & result) const4580 void SurfaceFlinger::listLayersLocked(std::string& result) const {
4581     mCurrentState.traverseInZOrder(
4582             [&](Layer* layer) { StringAppendF(&result, "%s\n", layer->getName().string()); });
4583 }
4584 
dumpStatsLocked(const DumpArgs & args,std::string & result) const4585 void SurfaceFlinger::dumpStatsLocked(const DumpArgs& args, std::string& result) const {
4586     StringAppendF(&result, "%" PRId64 "\n", getVsyncPeriod());
4587 
4588     if (args.size() > 1) {
4589         const auto name = String8(args[1]);
4590         mCurrentState.traverseInZOrder([&](Layer* layer) {
4591             if (name == layer->getName()) {
4592                 layer->dumpFrameStats(result);
4593             }
4594         });
4595     } else {
4596         mAnimFrameTracker.dumpStats(result);
4597     }
4598 }
4599 
clearStatsLocked(const DumpArgs & args,std::string &)4600 void SurfaceFlinger::clearStatsLocked(const DumpArgs& args, std::string&) {
4601     mCurrentState.traverseInZOrder([&](Layer* layer) {
4602         if (args.size() < 2 || String8(args[1]) == layer->getName()) {
4603             layer->clearFrameStats();
4604         }
4605     });
4606 
4607     mAnimFrameTracker.clearStats();
4608 }
4609 
dumpTimeStats(const DumpArgs & args,bool asProto,std::string & result) const4610 void SurfaceFlinger::dumpTimeStats(const DumpArgs& args, bool asProto, std::string& result) const {
4611     mTimeStats->parseArgs(asProto, args, result);
4612 }
4613 
4614 // This should only be called from the main thread.  Otherwise it would need
4615 // the lock and should use mCurrentState rather than mDrawingState.
logFrameStats()4616 void SurfaceFlinger::logFrameStats() {
4617     mDrawingState.traverseInZOrder([&](Layer* layer) {
4618         layer->logFrameStats();
4619     });
4620 
4621     mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
4622 }
4623 
appendSfConfigString(std::string & result) const4624 void SurfaceFlinger::appendSfConfigString(std::string& result) const {
4625     result.append(" [sf");
4626 
4627     if (isLayerTripleBufferingDisabled())
4628         result.append(" DISABLE_TRIPLE_BUFFERING");
4629 
4630     StringAppendF(&result, " PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
4631     StringAppendF(&result, " FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
4632     StringAppendF(&result, " MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
4633     StringAppendF(&result, " RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
4634     StringAppendF(&result, " NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
4635                   maxFrameBufferAcquiredBuffers);
4636     result.append("]");
4637 }
4638 
dumpVSync(std::string & result) const4639 void SurfaceFlinger::dumpVSync(std::string& result) const {
4640     mPhaseOffsets->dump(result);
4641     StringAppendF(&result,
4642                   "    present offset: %9" PRId64 " ns\t     VSYNC period: %9" PRId64 " ns\n\n",
4643                   dispSyncPresentTimeOffset, getVsyncPeriod());
4644 
4645     StringAppendF(&result, "Scheduler enabled.");
4646     StringAppendF(&result, "+  Smart 90 for video detection: %s\n\n",
4647                   mUseSmart90ForVideo ? "on" : "off");
4648     mScheduler->dump(mAppConnectionHandle, result);
4649 }
4650 
dumpStaticScreenStats(std::string & result) const4651 void SurfaceFlinger::dumpStaticScreenStats(std::string& result) const {
4652     result.append("Static screen stats:\n");
4653     for (size_t b = 0; b < SurfaceFlingerBE::NUM_BUCKETS - 1; ++b) {
4654         float bucketTimeSec = getBE().mFrameBuckets[b] / 1e9;
4655         float percent = 100.0f *
4656                 static_cast<float>(getBE().mFrameBuckets[b]) / getBE().mTotalTime;
4657         StringAppendF(&result, "  < %zd frames: %.3f s (%.1f%%)\n", b + 1, bucketTimeSec, percent);
4658     }
4659     float bucketTimeSec = getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] / 1e9;
4660     float percent = 100.0f *
4661             static_cast<float>(getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1]) / getBE().mTotalTime;
4662     StringAppendF(&result, "  %zd+ frames: %.3f s (%.1f%%)\n", SurfaceFlingerBE::NUM_BUCKETS - 1,
4663                   bucketTimeSec, percent);
4664 }
4665 
recordBufferingStats(const char * layerName,std::vector<OccupancyTracker::Segment> && history)4666 void SurfaceFlinger::recordBufferingStats(const char* layerName,
4667         std::vector<OccupancyTracker::Segment>&& history) {
4668     Mutex::Autolock lock(getBE().mBufferingStatsMutex);
4669     auto& stats = getBE().mBufferingStats[layerName];
4670     for (const auto& segment : history) {
4671         if (!segment.usedThirdBuffer) {
4672             stats.twoBufferTime += segment.totalTime;
4673         }
4674         if (segment.occupancyAverage < 1.0f) {
4675             stats.doubleBufferedTime += segment.totalTime;
4676         } else if (segment.occupancyAverage < 2.0f) {
4677             stats.tripleBufferedTime += segment.totalTime;
4678         }
4679         ++stats.numSegments;
4680         stats.totalTime += segment.totalTime;
4681     }
4682 }
4683 
dumpFrameEventsLocked(std::string & result)4684 void SurfaceFlinger::dumpFrameEventsLocked(std::string& result) {
4685     result.append("Layer frame timestamps:\n");
4686 
4687     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
4688     const size_t count = currentLayers.size();
4689     for (size_t i=0 ; i<count ; i++) {
4690         currentLayers[i]->dumpFrameEvents(result);
4691     }
4692 }
4693 
dumpBufferingStats(std::string & result) const4694 void SurfaceFlinger::dumpBufferingStats(std::string& result) const {
4695     result.append("Buffering stats:\n");
4696     result.append("  [Layer name] <Active time> <Two buffer> "
4697             "<Double buffered> <Triple buffered>\n");
4698     Mutex::Autolock lock(getBE().mBufferingStatsMutex);
4699     typedef std::tuple<std::string, float, float, float> BufferTuple;
4700     std::map<float, BufferTuple, std::greater<float>> sorted;
4701     for (const auto& statsPair : getBE().mBufferingStats) {
4702         const char* name = statsPair.first.c_str();
4703         const SurfaceFlingerBE::BufferingStats& stats = statsPair.second;
4704         if (stats.numSegments == 0) {
4705             continue;
4706         }
4707         float activeTime = ns2ms(stats.totalTime) / 1000.0f;
4708         float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
4709                 stats.totalTime;
4710         float doubleBufferRatio = static_cast<float>(
4711                 stats.doubleBufferedTime) / stats.totalTime;
4712         float tripleBufferRatio = static_cast<float>(
4713                 stats.tripleBufferedTime) / stats.totalTime;
4714         sorted.insert({activeTime, {name, twoBufferRatio,
4715                 doubleBufferRatio, tripleBufferRatio}});
4716     }
4717     for (const auto& sortedPair : sorted) {
4718         float activeTime = sortedPair.first;
4719         const BufferTuple& values = sortedPair.second;
4720         StringAppendF(&result, "  [%s] %.2f %.3f %.3f %.3f\n", std::get<0>(values).c_str(),
4721                       activeTime, std::get<1>(values), std::get<2>(values), std::get<3>(values));
4722     }
4723     result.append("\n");
4724 }
4725 
dumpDisplayIdentificationData(std::string & result) const4726 void SurfaceFlinger::dumpDisplayIdentificationData(std::string& result) const {
4727     for (const auto& [token, display] : mDisplays) {
4728         const auto displayId = display->getId();
4729         if (!displayId) {
4730             continue;
4731         }
4732         const auto hwcDisplayId = getHwComposer().fromPhysicalDisplayId(*displayId);
4733         if (!hwcDisplayId) {
4734             continue;
4735         }
4736 
4737         StringAppendF(&result,
4738                       "Display %s (HWC display %" PRIu64 "): ", to_string(*displayId).c_str(),
4739                       *hwcDisplayId);
4740         uint8_t port;
4741         DisplayIdentificationData data;
4742         if (!getHwComposer().getDisplayIdentificationData(*hwcDisplayId, &port, &data)) {
4743             result.append("no identification data\n");
4744             continue;
4745         }
4746 
4747         if (!isEdid(data)) {
4748             result.append("unknown identification data: ");
4749             for (uint8_t byte : data) {
4750                 StringAppendF(&result, "%x ", byte);
4751             }
4752             result.append("\n");
4753             continue;
4754         }
4755 
4756         const auto edid = parseEdid(data);
4757         if (!edid) {
4758             result.append("invalid EDID: ");
4759             for (uint8_t byte : data) {
4760                 StringAppendF(&result, "%x ", byte);
4761             }
4762             result.append("\n");
4763             continue;
4764         }
4765 
4766         StringAppendF(&result, "port=%u pnpId=%s displayName=\"", port, edid->pnpId.data());
4767         result.append(edid->displayName.data(), edid->displayName.length());
4768         result.append("\"\n");
4769     }
4770 }
4771 
dumpWideColorInfo(std::string & result) const4772 void SurfaceFlinger::dumpWideColorInfo(std::string& result) const {
4773     StringAppendF(&result, "Device has wide color built-in display: %d\n", hasWideColorDisplay);
4774     StringAppendF(&result, "Device uses color management: %d\n", useColorManagement);
4775     StringAppendF(&result, "DisplayColorSetting: %s\n",
4776                   decodeDisplayColorSetting(mDisplayColorSetting).c_str());
4777 
4778     // TODO: print out if wide-color mode is active or not
4779 
4780     for (const auto& [token, display] : mDisplays) {
4781         const auto displayId = display->getId();
4782         if (!displayId) {
4783             continue;
4784         }
4785 
4786         StringAppendF(&result, "Display %s color modes:\n", to_string(*displayId).c_str());
4787         std::vector<ColorMode> modes = getHwComposer().getColorModes(*displayId);
4788         for (auto&& mode : modes) {
4789             StringAppendF(&result, "    %s (%d)\n", decodeColorMode(mode).c_str(), mode);
4790         }
4791 
4792         ColorMode currentMode = display->getCompositionDisplay()->getState().colorMode;
4793         StringAppendF(&result, "    Current color mode: %s (%d)\n",
4794                       decodeColorMode(currentMode).c_str(), currentMode);
4795     }
4796     result.append("\n");
4797 }
4798 
dumpProtoInfo(LayerVector::StateSet stateSet,uint32_t traceFlags) const4799 LayersProto SurfaceFlinger::dumpProtoInfo(LayerVector::StateSet stateSet,
4800                                           uint32_t traceFlags) const {
4801     LayersProto layersProto;
4802     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
4803     const State& state = useDrawing ? mDrawingState : mCurrentState;
4804     state.traverseInZOrder([&](Layer* layer) {
4805         LayerProto* layerProto = layersProto.add_layers();
4806         layer->writeToProto(layerProto, stateSet, traceFlags);
4807     });
4808 
4809     return layersProto;
4810 }
4811 
dumpVisibleLayersProtoInfo(const sp<DisplayDevice> & displayDevice) const4812 LayersProto SurfaceFlinger::dumpVisibleLayersProtoInfo(
4813         const sp<DisplayDevice>& displayDevice) const {
4814     LayersProto layersProto;
4815 
4816     SizeProto* resolution = layersProto.mutable_resolution();
4817     resolution->set_w(displayDevice->getWidth());
4818     resolution->set_h(displayDevice->getHeight());
4819 
4820     auto display = displayDevice->getCompositionDisplay();
4821     const auto& displayState = display->getState();
4822 
4823     layersProto.set_color_mode(decodeColorMode(displayState.colorMode));
4824     layersProto.set_color_transform(decodeColorTransform(displayState.colorTransform));
4825     layersProto.set_global_transform(displayState.orientation);
4826 
4827     const auto displayId = displayDevice->getId();
4828     LOG_ALWAYS_FATAL_IF(!displayId);
4829     mDrawingState.traverseInZOrder([&](Layer* layer) {
4830         if (!layer->visibleRegion.isEmpty() && !display->getOutputLayersOrderedByZ().empty()) {
4831             LayerProto* layerProto = layersProto.add_layers();
4832             layer->writeToProto(layerProto, displayDevice);
4833         }
4834     });
4835 
4836     return layersProto;
4837 }
4838 
dumpAllLocked(const DumpArgs & args,std::string & result) const4839 void SurfaceFlinger::dumpAllLocked(const DumpArgs& args, std::string& result) const {
4840     const bool colorize = !args.empty() && args[0] == String16("--color");
4841     Colorizer colorizer(colorize);
4842 
4843     // figure out if we're stuck somewhere
4844     const nsecs_t now = systemTime();
4845     const nsecs_t inTransaction(mDebugInTransaction);
4846     nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
4847 
4848     /*
4849      * Dump library configuration.
4850      */
4851 
4852     colorizer.bold(result);
4853     result.append("Build configuration:");
4854     colorizer.reset(result);
4855     appendSfConfigString(result);
4856     appendUiConfigString(result);
4857     appendGuiConfigString(result);
4858     result.append("\n");
4859 
4860     result.append("\nDisplay identification data:\n");
4861     dumpDisplayIdentificationData(result);
4862 
4863     result.append("\nWide-Color information:\n");
4864     dumpWideColorInfo(result);
4865 
4866     colorizer.bold(result);
4867     result.append("Sync configuration: ");
4868     colorizer.reset(result);
4869     result.append(SyncFeatures::getInstance().toString());
4870     result.append("\n\n");
4871 
4872     colorizer.bold(result);
4873     result.append("VSYNC configuration:\n");
4874     colorizer.reset(result);
4875     dumpVSync(result);
4876     result.append("\n");
4877 
4878     dumpStaticScreenStats(result);
4879     result.append("\n");
4880 
4881     StringAppendF(&result, "Total missed frame count: %u\n", mFrameMissedCount.load());
4882     StringAppendF(&result, "HWC missed frame count: %u\n", mHwcFrameMissedCount.load());
4883     StringAppendF(&result, "GPU missed frame count: %u\n\n", mGpuFrameMissedCount.load());
4884 
4885     dumpBufferingStats(result);
4886 
4887     /*
4888      * Dump the visible layer list
4889      */
4890     colorizer.bold(result);
4891     StringAppendF(&result, "Visible layers (count = %zu)\n", mNumLayers);
4892     StringAppendF(&result, "GraphicBufferProducers: %zu, max %zu\n",
4893                   mGraphicBufferProducerList.size(), mMaxGraphicBufferProducerListSize);
4894     colorizer.reset(result);
4895 
4896     {
4897         LayersProto layersProto = dumpProtoInfo(LayerVector::StateSet::Current);
4898         auto layerTree = LayerProtoParser::generateLayerTree(layersProto);
4899         result.append(LayerProtoParser::layerTreeToString(layerTree));
4900         result.append("\n");
4901     }
4902 
4903     {
4904         StringAppendF(&result, "Composition layers\n");
4905         mDrawingState.traverseInZOrder([&](Layer* layer) {
4906             auto compositionLayer = layer->getCompositionLayer();
4907             if (compositionLayer) compositionLayer->dump(result);
4908         });
4909     }
4910 
4911     /*
4912      * Dump Display state
4913      */
4914 
4915     colorizer.bold(result);
4916     StringAppendF(&result, "Displays (%zu entries)\n", mDisplays.size());
4917     colorizer.reset(result);
4918     for (const auto& [token, display] : mDisplays) {
4919         display->dump(result);
4920     }
4921     result.append("\n");
4922 
4923     /*
4924      * Dump SurfaceFlinger global state
4925      */
4926 
4927     colorizer.bold(result);
4928     result.append("SurfaceFlinger global state:\n");
4929     colorizer.reset(result);
4930 
4931     getRenderEngine().dump(result);
4932 
4933     if (const auto display = getDefaultDisplayDeviceLocked()) {
4934         display->getCompositionDisplay()->getState().undefinedRegion.dump(result,
4935                                                                           "undefinedRegion");
4936         StringAppendF(&result, "  orientation=%d, isPoweredOn=%d\n", display->getOrientation(),
4937                       display->isPoweredOn());
4938     }
4939     StringAppendF(&result,
4940                   "  transaction-flags         : %08x\n"
4941                   "  gpu_to_cpu_unsupported    : %d\n",
4942                   mTransactionFlags.load(), !mGpuToCpuSupported);
4943 
4944     if (const auto displayId = getInternalDisplayIdLocked();
4945         displayId && getHwComposer().isConnected(*displayId)) {
4946         const auto activeConfig = getHwComposer().getActiveConfig(*displayId);
4947         StringAppendF(&result,
4948                       "  refresh-rate              : %f fps\n"
4949                       "  x-dpi                     : %f\n"
4950                       "  y-dpi                     : %f\n",
4951                       1e9 / activeConfig->getVsyncPeriod(), activeConfig->getDpiX(),
4952                       activeConfig->getDpiY());
4953     }
4954 
4955     StringAppendF(&result, "  transaction time: %f us\n", inTransactionDuration / 1000.0);
4956 
4957     /*
4958      * Tracing state
4959      */
4960     mTracing.dump(result);
4961     result.append("\n");
4962 
4963     /*
4964      * HWC layer minidump
4965      */
4966     for (const auto& [token, display] : mDisplays) {
4967         const auto displayId = display->getId();
4968         if (!displayId) {
4969             continue;
4970         }
4971 
4972         StringAppendF(&result, "Display %s HWC layers:\n", to_string(*displayId).c_str());
4973         Layer::miniDumpHeader(result);
4974         const sp<DisplayDevice> displayDevice = display;
4975         mCurrentState.traverseInZOrder(
4976                 [&](Layer* layer) { layer->miniDump(result, displayDevice); });
4977         result.append("\n");
4978     }
4979 
4980     /*
4981      * Dump HWComposer state
4982      */
4983     colorizer.bold(result);
4984     result.append("h/w composer state:\n");
4985     colorizer.reset(result);
4986     bool hwcDisabled = mDebugDisableHWC || mDebugRegion;
4987     StringAppendF(&result, "  h/w composer %s\n", hwcDisabled ? "disabled" : "enabled");
4988     getHwComposer().dump(result);
4989 
4990     /*
4991      * Dump gralloc state
4992      */
4993     const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
4994     alloc.dump(result);
4995 
4996     /*
4997      * Dump VrFlinger state if in use.
4998      */
4999     if (mVrFlingerRequestsDisplay && mVrFlinger) {
5000         result.append("VrFlinger state:\n");
5001         result.append(mVrFlinger->Dump());
5002         result.append("\n");
5003     }
5004 
5005     /**
5006      * Scheduler dump state.
5007      */
5008     result.append("\nScheduler state:\n");
5009     result.append(mScheduler->doDump() + "\n");
5010     StringAppendF(&result, "+  Smart video mode: %s\n\n", mUseSmart90ForVideo ? "on" : "off");
5011     result.append(mRefreshRateStats.doDump() + "\n");
5012 
5013     result.append(mTimeStats->miniDump());
5014     result.append("\n");
5015 }
5016 
getLayerSortedByZForHwcDisplay(DisplayId displayId)5017 const Vector<sp<Layer>>& SurfaceFlinger::getLayerSortedByZForHwcDisplay(DisplayId displayId) {
5018     // Note: mStateLock is held here
5019     for (const auto& [token, display] : mDisplays) {
5020         if (display->getId() == displayId) {
5021             return getDisplayDeviceLocked(token)->getVisibleLayersSortedByZ();
5022         }
5023     }
5024 
5025     ALOGE("%s: Invalid display %s", __FUNCTION__, to_string(displayId).c_str());
5026     static const Vector<sp<Layer>> empty;
5027     return empty;
5028 }
5029 
updateColorMatrixLocked()5030 void SurfaceFlinger::updateColorMatrixLocked() {
5031     mat4 colorMatrix;
5032     if (mGlobalSaturationFactor != 1.0f) {
5033         // Rec.709 luma coefficients
5034         float3 luminance{0.213f, 0.715f, 0.072f};
5035         luminance *= 1.0f - mGlobalSaturationFactor;
5036         mat4 saturationMatrix = mat4(
5037             vec4{luminance.r + mGlobalSaturationFactor, luminance.r, luminance.r, 0.0f},
5038             vec4{luminance.g, luminance.g + mGlobalSaturationFactor, luminance.g, 0.0f},
5039             vec4{luminance.b, luminance.b, luminance.b + mGlobalSaturationFactor, 0.0f},
5040             vec4{0.0f, 0.0f, 0.0f, 1.0f}
5041         );
5042         colorMatrix = mClientColorMatrix * saturationMatrix * mDaltonizer();
5043     } else {
5044         colorMatrix = mClientColorMatrix * mDaltonizer();
5045     }
5046 
5047     if (mCurrentState.colorMatrix != colorMatrix) {
5048         mCurrentState.colorMatrix = colorMatrix;
5049         mCurrentState.colorMatrixChanged = true;
5050         setTransactionFlags(eTransactionNeeded);
5051     }
5052 }
5053 
CheckTransactCodeCredentials(uint32_t code)5054 status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
5055 #pragma clang diagnostic push
5056 #pragma clang diagnostic error "-Wswitch-enum"
5057     switch (static_cast<ISurfaceComposerTag>(code)) {
5058         // These methods should at minimum make sure that the client requested
5059         // access to SF.
5060         case BOOT_FINISHED:
5061         case CLEAR_ANIMATION_FRAME_STATS:
5062         case CREATE_DISPLAY:
5063         case DESTROY_DISPLAY:
5064         case ENABLE_VSYNC_INJECTIONS:
5065         case GET_ANIMATION_FRAME_STATS:
5066         case GET_HDR_CAPABILITIES:
5067         case SET_ACTIVE_CONFIG:
5068         case SET_ALLOWED_DISPLAY_CONFIGS:
5069         case GET_ALLOWED_DISPLAY_CONFIGS:
5070         case SET_ACTIVE_COLOR_MODE:
5071         case INJECT_VSYNC:
5072         case SET_POWER_MODE:
5073         case GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES:
5074         case SET_DISPLAY_CONTENT_SAMPLING_ENABLED:
5075         case GET_DISPLAYED_CONTENT_SAMPLE:
5076         case NOTIFY_POWER_HINT: {
5077             if (!callingThreadHasUnscopedSurfaceFlingerAccess()) {
5078                 IPCThreadState* ipc = IPCThreadState::self();
5079                 ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d",
5080                         ipc->getCallingPid(), ipc->getCallingUid());
5081                 return PERMISSION_DENIED;
5082             }
5083             return OK;
5084         }
5085         case GET_LAYER_DEBUG_INFO: {
5086             IPCThreadState* ipc = IPCThreadState::self();
5087             const int pid = ipc->getCallingPid();
5088             const int uid = ipc->getCallingUid();
5089             if ((uid != AID_SHELL) && !PermissionCache::checkPermission(sDump, pid, uid)) {
5090                 ALOGE("Layer debug info permission denied for pid=%d, uid=%d", pid, uid);
5091                 return PERMISSION_DENIED;
5092             }
5093             return OK;
5094         }
5095         // Used by apps to hook Choreographer to SurfaceFlinger.
5096         case CREATE_DISPLAY_EVENT_CONNECTION:
5097         // The following calls are currently used by clients that do not
5098         // request necessary permissions. However, they do not expose any secret
5099         // information, so it is OK to pass them.
5100         case AUTHENTICATE_SURFACE:
5101         case GET_ACTIVE_COLOR_MODE:
5102         case GET_ACTIVE_CONFIG:
5103         case GET_PHYSICAL_DISPLAY_IDS:
5104         case GET_PHYSICAL_DISPLAY_TOKEN:
5105         case GET_DISPLAY_COLOR_MODES:
5106         case GET_DISPLAY_NATIVE_PRIMARIES:
5107         case GET_DISPLAY_CONFIGS:
5108         case GET_DISPLAY_STATS:
5109         case GET_SUPPORTED_FRAME_TIMESTAMPS:
5110         // Calling setTransactionState is safe, because you need to have been
5111         // granted a reference to Client* and Handle* to do anything with it.
5112         case SET_TRANSACTION_STATE:
5113         case CREATE_CONNECTION:
5114         case GET_COLOR_MANAGEMENT:
5115         case GET_COMPOSITION_PREFERENCE:
5116         case GET_PROTECTED_CONTENT_SUPPORT:
5117         case IS_WIDE_COLOR_DISPLAY:
5118         case GET_DISPLAY_BRIGHTNESS_SUPPORT:
5119         case SET_DISPLAY_BRIGHTNESS: {
5120             return OK;
5121         }
5122         case CAPTURE_LAYERS:
5123         case CAPTURE_SCREEN:
5124         case ADD_REGION_SAMPLING_LISTENER:
5125         case REMOVE_REGION_SAMPLING_LISTENER: {
5126             // codes that require permission check
5127             IPCThreadState* ipc = IPCThreadState::self();
5128             const int pid = ipc->getCallingPid();
5129             const int uid = ipc->getCallingUid();
5130             if ((uid != AID_GRAPHICS) &&
5131                 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
5132                 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
5133                 return PERMISSION_DENIED;
5134             }
5135             return OK;
5136         }
5137         // The following codes are deprecated and should never be allowed to access SF.
5138         case CONNECT_DISPLAY_UNUSED:
5139         case CREATE_GRAPHIC_BUFFER_ALLOC_UNUSED: {
5140             ALOGE("Attempting to access SurfaceFlinger with unused code: %u", code);
5141             return PERMISSION_DENIED;
5142         }
5143         case CAPTURE_SCREEN_BY_ID: {
5144             IPCThreadState* ipc = IPCThreadState::self();
5145             const int uid = ipc->getCallingUid();
5146             if (uid == AID_ROOT || uid == AID_GRAPHICS || uid == AID_SYSTEM || uid == AID_SHELL) {
5147                 return OK;
5148             }
5149             return PERMISSION_DENIED;
5150         }
5151     }
5152 
5153     // These codes are used for the IBinder protocol to either interrogate the recipient
5154     // side of the transaction for its canonical interface descriptor or to dump its state.
5155     // We let them pass by default.
5156     if (code == IBinder::INTERFACE_TRANSACTION || code == IBinder::DUMP_TRANSACTION ||
5157         code == IBinder::PING_TRANSACTION || code == IBinder::SHELL_COMMAND_TRANSACTION ||
5158         code == IBinder::SYSPROPS_TRANSACTION) {
5159         return OK;
5160     }
5161     // Numbers from 1000 to 1034 are currently used for backdoors. The code
5162     // in onTransact verifies that the user is root, and has access to use SF.
5163     if (code >= 1000 && code <= 1035) {
5164         ALOGV("Accessing SurfaceFlinger through backdoor code: %u", code);
5165         return OK;
5166     }
5167     ALOGE("Permission Denial: SurfaceFlinger did not recognize request code: %u", code);
5168     return PERMISSION_DENIED;
5169 #pragma clang diagnostic pop
5170 }
5171 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)5172 status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
5173                                     uint32_t flags) {
5174     status_t credentialCheck = CheckTransactCodeCredentials(code);
5175     if (credentialCheck != OK) {
5176         return credentialCheck;
5177     }
5178 
5179     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
5180     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
5181         CHECK_INTERFACE(ISurfaceComposer, data, reply);
5182         IPCThreadState* ipc = IPCThreadState::self();
5183         const int uid = ipc->getCallingUid();
5184         if (CC_UNLIKELY(uid != AID_SYSTEM
5185                 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
5186             const int pid = ipc->getCallingPid();
5187             ALOGE("Permission Denial: "
5188                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
5189             return PERMISSION_DENIED;
5190         }
5191         int n;
5192         switch (code) {
5193             case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
5194             case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
5195                 return NO_ERROR;
5196             case 1002:  // SHOW_UPDATES
5197                 n = data.readInt32();
5198                 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
5199                 invalidateHwcGeometry();
5200                 repaintEverything();
5201                 return NO_ERROR;
5202             case 1004:{ // repaint everything
5203                 repaintEverything();
5204                 return NO_ERROR;
5205             }
5206             case 1005:{ // force transaction
5207                 Mutex::Autolock _l(mStateLock);
5208                 setTransactionFlags(
5209                         eTransactionNeeded|
5210                         eDisplayTransactionNeeded|
5211                         eTraversalNeeded);
5212                 return NO_ERROR;
5213             }
5214             case 1006:{ // send empty update
5215                 signalRefresh();
5216                 return NO_ERROR;
5217             }
5218             case 1008:  // toggle use of hw composer
5219                 n = data.readInt32();
5220                 mDebugDisableHWC = n != 0;
5221                 invalidateHwcGeometry();
5222                 repaintEverything();
5223                 return NO_ERROR;
5224             case 1009:  // toggle use of transform hint
5225                 n = data.readInt32();
5226                 mDebugDisableTransformHint = n != 0;
5227                 invalidateHwcGeometry();
5228                 repaintEverything();
5229                 return NO_ERROR;
5230             case 1010:  // interrogate.
5231                 reply->writeInt32(0);
5232                 reply->writeInt32(0);
5233                 reply->writeInt32(mDebugRegion);
5234                 reply->writeInt32(0);
5235                 reply->writeInt32(mDebugDisableHWC);
5236                 return NO_ERROR;
5237             case 1013: {
5238                 const auto display = getDefaultDisplayDevice();
5239                 if (!display) {
5240                     return NAME_NOT_FOUND;
5241                 }
5242 
5243                 reply->writeInt32(display->getPageFlipCount());
5244                 return NO_ERROR;
5245             }
5246             case 1014: {
5247                 Mutex::Autolock _l(mStateLock);
5248                 // daltonize
5249                 n = data.readInt32();
5250                 switch (n % 10) {
5251                     case 1:
5252                         mDaltonizer.setType(ColorBlindnessType::Protanomaly);
5253                         break;
5254                     case 2:
5255                         mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
5256                         break;
5257                     case 3:
5258                         mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
5259                         break;
5260                     default:
5261                         mDaltonizer.setType(ColorBlindnessType::None);
5262                         break;
5263                 }
5264                 if (n >= 10) {
5265                     mDaltonizer.setMode(ColorBlindnessMode::Correction);
5266                 } else {
5267                     mDaltonizer.setMode(ColorBlindnessMode::Simulation);
5268                 }
5269 
5270                 updateColorMatrixLocked();
5271                 return NO_ERROR;
5272             }
5273             case 1015: {
5274                 Mutex::Autolock _l(mStateLock);
5275                 // apply a color matrix
5276                 n = data.readInt32();
5277                 if (n) {
5278                     // color matrix is sent as a column-major mat4 matrix
5279                     for (size_t i = 0 ; i < 4; i++) {
5280                         for (size_t j = 0; j < 4; j++) {
5281                             mClientColorMatrix[i][j] = data.readFloat();
5282                         }
5283                     }
5284                 } else {
5285                     mClientColorMatrix = mat4();
5286                 }
5287 
5288                 // Check that supplied matrix's last row is {0,0,0,1} so we can avoid
5289                 // the division by w in the fragment shader
5290                 float4 lastRow(transpose(mClientColorMatrix)[3]);
5291                 if (any(greaterThan(abs(lastRow - float4{0, 0, 0, 1}), float4{1e-4f}))) {
5292                     ALOGE("The color transform's last row must be (0, 0, 0, 1)");
5293                 }
5294 
5295                 updateColorMatrixLocked();
5296                 return NO_ERROR;
5297             }
5298             // This is an experimental interface
5299             // Needs to be shifted to proper binder interface when we productize
5300             case 1016: {
5301                 n = data.readInt32();
5302                 // TODO(b/113612090): Evaluate if this can be removed.
5303                 mScheduler->setRefreshSkipCount(n);
5304                 return NO_ERROR;
5305             }
5306             case 1017: {
5307                 n = data.readInt32();
5308                 mForceFullDamage = n != 0;
5309                 return NO_ERROR;
5310             }
5311             case 1018: { // Modify Choreographer's phase offset
5312                 n = data.readInt32();
5313                 mScheduler->setPhaseOffset(mAppConnectionHandle, static_cast<nsecs_t>(n));
5314                 return NO_ERROR;
5315             }
5316             case 1019: { // Modify SurfaceFlinger's phase offset
5317                 n = data.readInt32();
5318                 mScheduler->setPhaseOffset(mSfConnectionHandle, static_cast<nsecs_t>(n));
5319                 return NO_ERROR;
5320             }
5321             case 1020: { // Layer updates interceptor
5322                 n = data.readInt32();
5323                 if (n) {
5324                     ALOGV("Interceptor enabled");
5325                     mInterceptor->enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
5326                 }
5327                 else{
5328                     ALOGV("Interceptor disabled");
5329                     mInterceptor->disable();
5330                 }
5331                 return NO_ERROR;
5332             }
5333             case 1021: { // Disable HWC virtual displays
5334                 n = data.readInt32();
5335                 mUseHwcVirtualDisplays = !n;
5336                 return NO_ERROR;
5337             }
5338             case 1022: { // Set saturation boost
5339                 Mutex::Autolock _l(mStateLock);
5340                 mGlobalSaturationFactor = std::max(0.0f, std::min(data.readFloat(), 2.0f));
5341 
5342                 updateColorMatrixLocked();
5343                 return NO_ERROR;
5344             }
5345             case 1023: { // Set native mode
5346                 mDisplayColorSetting = static_cast<DisplayColorSetting>(data.readInt32());
5347                 invalidateHwcGeometry();
5348                 repaintEverything();
5349                 return NO_ERROR;
5350             }
5351             // Deprecate, use 1030 to check whether the device is color managed.
5352             case 1024: {
5353                 return NAME_NOT_FOUND;
5354             }
5355             case 1025: { // Set layer tracing
5356                 n = data.readInt32();
5357                 if (n) {
5358                     ALOGD("LayerTracing enabled");
5359                     Mutex::Autolock lock(mStateLock);
5360                     mTracingEnabledChanged = true;
5361                     mTracing.enable();
5362                     reply->writeInt32(NO_ERROR);
5363                 } else {
5364                     ALOGD("LayerTracing disabled");
5365                     bool writeFile = false;
5366                     {
5367                         Mutex::Autolock lock(mStateLock);
5368                         mTracingEnabledChanged = true;
5369                         writeFile = mTracing.disable();
5370                     }
5371 
5372                     if (writeFile) {
5373                         reply->writeInt32(mTracing.writeToFile());
5374                     } else {
5375                         reply->writeInt32(NO_ERROR);
5376                     }
5377                 }
5378                 return NO_ERROR;
5379             }
5380             case 1026: { // Get layer tracing status
5381                 reply->writeBool(mTracing.isEnabled());
5382                 return NO_ERROR;
5383             }
5384             // Is a DisplayColorSetting supported?
5385             case 1027: {
5386                 const auto display = getDefaultDisplayDevice();
5387                 if (!display) {
5388                     return NAME_NOT_FOUND;
5389                 }
5390 
5391                 DisplayColorSetting setting = static_cast<DisplayColorSetting>(data.readInt32());
5392                 switch (setting) {
5393                     case DisplayColorSetting::MANAGED:
5394                         reply->writeBool(useColorManagement);
5395                         break;
5396                     case DisplayColorSetting::UNMANAGED:
5397                         reply->writeBool(true);
5398                         break;
5399                     case DisplayColorSetting::ENHANCED:
5400                         reply->writeBool(display->hasRenderIntent(RenderIntent::ENHANCE));
5401                         break;
5402                     default: // vendor display color setting
5403                         reply->writeBool(
5404                                 display->hasRenderIntent(static_cast<RenderIntent>(setting)));
5405                         break;
5406                 }
5407                 return NO_ERROR;
5408             }
5409             // Is VrFlinger active?
5410             case 1028: {
5411                 Mutex::Autolock _l(mStateLock);
5412                 reply->writeBool(getHwComposer().isUsingVrComposer());
5413                 return NO_ERROR;
5414             }
5415             // Set buffer size for SF tracing (value in KB)
5416             case 1029: {
5417                 n = data.readInt32();
5418                 if (n <= 0 || n > MAX_TRACING_MEMORY) {
5419                     ALOGW("Invalid buffer size: %d KB", n);
5420                     reply->writeInt32(BAD_VALUE);
5421                     return BAD_VALUE;
5422                 }
5423 
5424                 ALOGD("Updating trace buffer to %d KB", n);
5425                 mTracing.setBufferSize(n * 1024);
5426                 reply->writeInt32(NO_ERROR);
5427                 return NO_ERROR;
5428             }
5429             // Is device color managed?
5430             case 1030: {
5431                 reply->writeBool(useColorManagement);
5432                 return NO_ERROR;
5433             }
5434             // Override default composition data space
5435             // adb shell service call SurfaceFlinger 1031 i32 1 DATASPACE_NUMBER DATASPACE_NUMBER \
5436             // && adb shell stop zygote && adb shell start zygote
5437             // to restore: adb shell service call SurfaceFlinger 1031 i32 0 && \
5438             // adb shell stop zygote && adb shell start zygote
5439             case 1031: {
5440                 Mutex::Autolock _l(mStateLock);
5441                 n = data.readInt32();
5442                 if (n) {
5443                     n = data.readInt32();
5444                     if (n) {
5445                         Dataspace dataspace = static_cast<Dataspace>(n);
5446                         if (!validateCompositionDataspace(dataspace)) {
5447                             return BAD_VALUE;
5448                         }
5449                         mDefaultCompositionDataspace = dataspace;
5450                     }
5451                     n = data.readInt32();
5452                     if (n) {
5453                         Dataspace dataspace = static_cast<Dataspace>(n);
5454                         if (!validateCompositionDataspace(dataspace)) {
5455                             return BAD_VALUE;
5456                         }
5457                         mWideColorGamutCompositionDataspace = dataspace;
5458                     }
5459                 } else {
5460                     // restore composition data space.
5461                     mDefaultCompositionDataspace = defaultCompositionDataspace;
5462                     mWideColorGamutCompositionDataspace = wideColorGamutCompositionDataspace;
5463                 }
5464                 return NO_ERROR;
5465             }
5466             // Set trace flags
5467             case 1033: {
5468                 n = data.readUint32();
5469                 ALOGD("Updating trace flags to 0x%x", n);
5470                 mTracing.setTraceFlags(n);
5471                 reply->writeInt32(NO_ERROR);
5472                 return NO_ERROR;
5473             }
5474             case 1034: {
5475                 // TODO(b/129297325): expose this via developer menu option
5476                 n = data.readInt32();
5477                 if (n && !mRefreshRateOverlay) {
5478                     RefreshRateType type;
5479                     {
5480                         std::lock_guard<std::mutex> lock(mActiveConfigLock);
5481                         type = mDesiredActiveConfig.type;
5482                     }
5483                     mRefreshRateOverlay = std::make_unique<RefreshRateOverlay>(*this);
5484                     mRefreshRateOverlay->changeRefreshRate(type);
5485                 } else if (!n) {
5486                     mRefreshRateOverlay.reset();
5487                 }
5488                 return NO_ERROR;
5489             }
5490             case 1035: {
5491                 n = data.readInt32();
5492                 mDebugDisplayConfigSetByBackdoor = false;
5493                 if (n >= 0) {
5494                     const auto displayToken = getInternalDisplayToken();
5495                     status_t result = setAllowedDisplayConfigs(displayToken, {n});
5496                     if (result != NO_ERROR) {
5497                         return result;
5498                     }
5499                     mDebugDisplayConfigSetByBackdoor = true;
5500                 }
5501                 return NO_ERROR;
5502             }
5503         }
5504     }
5505     return err;
5506 }
5507 
repaintEverything()5508 void SurfaceFlinger::repaintEverything() {
5509     mRepaintEverything = true;
5510     signalTransaction();
5511 }
5512 
repaintEverythingForHWC()5513 void SurfaceFlinger::repaintEverythingForHWC() {
5514     mRepaintEverything = true;
5515     mEventQueue->invalidate();
5516 }
5517 
5518 // A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
5519 class WindowDisconnector {
5520 public:
WindowDisconnector(ANativeWindow * window,int api)5521     WindowDisconnector(ANativeWindow* window, int api) : mWindow(window), mApi(api) {}
~WindowDisconnector()5522     ~WindowDisconnector() {
5523         native_window_api_disconnect(mWindow, mApi);
5524     }
5525 
5526 private:
5527     ANativeWindow* mWindow;
5528     const int mApi;
5529 };
5530 
captureScreen(const sp<IBinder> & displayToken,sp<GraphicBuffer> * outBuffer,bool & outCapturedSecureLayers,const Dataspace reqDataspace,const ui::PixelFormat reqPixelFormat,Rect sourceCrop,uint32_t reqWidth,uint32_t reqHeight,bool useIdentityTransform,ISurfaceComposer::Rotation rotation,bool captureSecureLayers)5531 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& displayToken,
5532                                        sp<GraphicBuffer>* outBuffer, bool& outCapturedSecureLayers,
5533                                        const Dataspace reqDataspace,
5534                                        const ui::PixelFormat reqPixelFormat, Rect sourceCrop,
5535                                        uint32_t reqWidth, uint32_t reqHeight,
5536                                        bool useIdentityTransform,
5537                                        ISurfaceComposer::Rotation rotation,
5538                                        bool captureSecureLayers) {
5539     ATRACE_CALL();
5540 
5541     if (!displayToken) return BAD_VALUE;
5542 
5543     auto renderAreaRotation = fromSurfaceComposerRotation(rotation);
5544 
5545     sp<DisplayDevice> display;
5546     {
5547         Mutex::Autolock _l(mStateLock);
5548 
5549         display = getDisplayDeviceLocked(displayToken);
5550         if (!display) return BAD_VALUE;
5551 
5552         // set the requested width/height to the logical display viewport size
5553         // by default
5554         if (reqWidth == 0 || reqHeight == 0) {
5555             reqWidth = uint32_t(display->getViewport().width());
5556             reqHeight = uint32_t(display->getViewport().height());
5557         }
5558     }
5559 
5560     DisplayRenderArea renderArea(display, sourceCrop, reqWidth, reqHeight, reqDataspace,
5561                                  renderAreaRotation, captureSecureLayers);
5562 
5563     auto traverseLayers = std::bind(&SurfaceFlinger::traverseLayersInDisplay, this, display,
5564                                     std::placeholders::_1);
5565     return captureScreenCommon(renderArea, traverseLayers, outBuffer, reqPixelFormat,
5566                                useIdentityTransform, outCapturedSecureLayers);
5567 }
5568 
pickDataspaceFromColorMode(const ColorMode colorMode)5569 static Dataspace pickDataspaceFromColorMode(const ColorMode colorMode) {
5570     switch (colorMode) {
5571         case ColorMode::DISPLAY_P3:
5572         case ColorMode::BT2100_PQ:
5573         case ColorMode::BT2100_HLG:
5574         case ColorMode::DISPLAY_BT2020:
5575             return Dataspace::DISPLAY_P3;
5576         default:
5577             return Dataspace::V0_SRGB;
5578     }
5579 }
5580 
getDisplayByIdOrLayerStack(uint64_t displayOrLayerStack)5581 const sp<DisplayDevice> SurfaceFlinger::getDisplayByIdOrLayerStack(uint64_t displayOrLayerStack) {
5582     const sp<IBinder> displayToken = getPhysicalDisplayTokenLocked(DisplayId{displayOrLayerStack});
5583     if (displayToken) {
5584         return getDisplayDeviceLocked(displayToken);
5585     }
5586     // Couldn't find display by displayId. Try to get display by layerStack since virtual displays
5587     // may not have a displayId.
5588     for (const auto& [token, display] : mDisplays) {
5589         if (display->getLayerStack() == displayOrLayerStack) {
5590             return display;
5591         }
5592     }
5593     return nullptr;
5594 }
5595 
captureScreen(uint64_t displayOrLayerStack,Dataspace * outDataspace,sp<GraphicBuffer> * outBuffer)5596 status_t SurfaceFlinger::captureScreen(uint64_t displayOrLayerStack, Dataspace* outDataspace,
5597                                        sp<GraphicBuffer>* outBuffer) {
5598     sp<DisplayDevice> display;
5599     uint32_t width;
5600     uint32_t height;
5601     ui::Transform::orientation_flags captureOrientation;
5602     {
5603         Mutex::Autolock _l(mStateLock);
5604         display = getDisplayByIdOrLayerStack(displayOrLayerStack);
5605         if (!display) {
5606             return BAD_VALUE;
5607         }
5608 
5609         width = uint32_t(display->getViewport().width());
5610         height = uint32_t(display->getViewport().height());
5611 
5612         captureOrientation = fromSurfaceComposerRotation(
5613                 static_cast<ISurfaceComposer::Rotation>(display->getOrientation()));
5614         if (captureOrientation == ui::Transform::orientation_flags::ROT_90) {
5615             captureOrientation = ui::Transform::orientation_flags::ROT_270;
5616         } else if (captureOrientation == ui::Transform::orientation_flags::ROT_270) {
5617             captureOrientation = ui::Transform::orientation_flags::ROT_90;
5618         }
5619         *outDataspace =
5620                 pickDataspaceFromColorMode(display->getCompositionDisplay()->getState().colorMode);
5621     }
5622 
5623     DisplayRenderArea renderArea(display, Rect(), width, height, *outDataspace, captureOrientation,
5624                                  false /* captureSecureLayers */);
5625 
5626     auto traverseLayers = std::bind(&SurfaceFlinger::traverseLayersInDisplay, this, display,
5627                                     std::placeholders::_1);
5628     bool ignored = false;
5629     return captureScreenCommon(renderArea, traverseLayers, outBuffer, ui::PixelFormat::RGBA_8888,
5630                                false /* useIdentityTransform */,
5631                                ignored /* outCapturedSecureLayers */);
5632 }
5633 
captureLayers(const sp<IBinder> & layerHandleBinder,sp<GraphicBuffer> * outBuffer,const Dataspace reqDataspace,const ui::PixelFormat reqPixelFormat,const Rect & sourceCrop,const std::unordered_set<sp<IBinder>,ISurfaceComposer::SpHash<IBinder>> & excludeHandles,float frameScale,bool childrenOnly)5634 status_t SurfaceFlinger::captureLayers(
5635         const sp<IBinder>& layerHandleBinder, sp<GraphicBuffer>* outBuffer,
5636         const Dataspace reqDataspace, const ui::PixelFormat reqPixelFormat, const Rect& sourceCrop,
5637         const std::unordered_set<sp<IBinder>, ISurfaceComposer::SpHash<IBinder>>& excludeHandles,
5638         float frameScale, bool childrenOnly) {
5639     ATRACE_CALL();
5640 
5641     class LayerRenderArea : public RenderArea {
5642     public:
5643         LayerRenderArea(SurfaceFlinger* flinger, const sp<Layer>& layer, const Rect crop,
5644                         int32_t reqWidth, int32_t reqHeight, Dataspace reqDataSpace,
5645                         bool childrenOnly)
5646               : RenderArea(reqWidth, reqHeight, CaptureFill::CLEAR, reqDataSpace),
5647                 mLayer(layer),
5648                 mCrop(crop),
5649                 mNeedsFiltering(false),
5650                 mFlinger(flinger),
5651                 mChildrenOnly(childrenOnly) {}
5652         const ui::Transform& getTransform() const override { return mTransform; }
5653         Rect getBounds() const override {
5654             const Layer::State& layerState(mLayer->getDrawingState());
5655             return mLayer->getBufferSize(layerState);
5656         }
5657         int getHeight() const override {
5658             return mLayer->getBufferSize(mLayer->getDrawingState()).getHeight();
5659         }
5660         int getWidth() const override {
5661             return mLayer->getBufferSize(mLayer->getDrawingState()).getWidth();
5662         }
5663         bool isSecure() const override { return false; }
5664         bool needsFiltering() const override { return mNeedsFiltering; }
5665         const sp<const DisplayDevice> getDisplayDevice() const override { return nullptr; }
5666         Rect getSourceCrop() const override {
5667             if (mCrop.isEmpty()) {
5668                 return getBounds();
5669             } else {
5670                 return mCrop;
5671             }
5672         }
5673         class ReparentForDrawing {
5674         public:
5675             const sp<Layer>& oldParent;
5676             const sp<Layer>& newParent;
5677 
5678             ReparentForDrawing(const sp<Layer>& oldParent, const sp<Layer>& newParent,
5679                                const Rect& drawingBounds)
5680                   : oldParent(oldParent), newParent(newParent) {
5681                 // Compute and cache the bounds for the new parent layer.
5682                 newParent->computeBounds(drawingBounds.toFloatRect(), ui::Transform());
5683                 oldParent->setChildrenDrawingParent(newParent);
5684             }
5685             ~ReparentForDrawing() { oldParent->setChildrenDrawingParent(oldParent); }
5686         };
5687 
5688         void render(std::function<void()> drawLayers) override {
5689             const Rect sourceCrop = getSourceCrop();
5690             // no need to check rotation because there is none
5691             mNeedsFiltering = sourceCrop.width() != getReqWidth() ||
5692                 sourceCrop.height() != getReqHeight();
5693 
5694             if (!mChildrenOnly) {
5695                 mTransform = mLayer->getTransform().inverse();
5696                 drawLayers();
5697             } else {
5698                 Rect bounds = getBounds();
5699                 screenshotParentLayer = mFlinger->getFactory().createContainerLayer(
5700                         LayerCreationArgs(mFlinger, nullptr, String8("Screenshot Parent"),
5701                                           bounds.getWidth(), bounds.getHeight(), 0,
5702                                           LayerMetadata()));
5703 
5704                 ReparentForDrawing reparent(mLayer, screenshotParentLayer, sourceCrop);
5705                 drawLayers();
5706             }
5707         }
5708 
5709     private:
5710         const sp<Layer> mLayer;
5711         const Rect mCrop;
5712 
5713         // In the "childrenOnly" case we reparent the children to a screenshot
5714         // layer which has no properties set and which does not draw.
5715         sp<ContainerLayer> screenshotParentLayer;
5716         ui::Transform mTransform;
5717         bool mNeedsFiltering;
5718 
5719         SurfaceFlinger* mFlinger;
5720         const bool mChildrenOnly;
5721     };
5722 
5723     int reqWidth = 0;
5724     int reqHeight = 0;
5725     sp<Layer> parent;
5726     Rect crop(sourceCrop);
5727     std::unordered_set<sp<Layer>, ISurfaceComposer::SpHash<Layer>> excludeLayers;
5728 
5729     {
5730         Mutex::Autolock _l(mStateLock);
5731 
5732         parent = fromHandle(layerHandleBinder);
5733         if (parent == nullptr || parent->isRemovedFromCurrentState()) {
5734             ALOGE("captureLayers called with an invalid or removed parent");
5735             return NAME_NOT_FOUND;
5736         }
5737 
5738         const int uid = IPCThreadState::self()->getCallingUid();
5739         const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM;
5740         if (!forSystem && parent->getCurrentState().flags & layer_state_t::eLayerSecure) {
5741             ALOGW("Attempting to capture secure layer: PERMISSION_DENIED");
5742             return PERMISSION_DENIED;
5743         }
5744 
5745         if (sourceCrop.width() <= 0) {
5746             crop.left = 0;
5747             crop.right = parent->getBufferSize(parent->getCurrentState()).getWidth();
5748         }
5749 
5750         if (sourceCrop.height() <= 0) {
5751             crop.top = 0;
5752             crop.bottom = parent->getBufferSize(parent->getCurrentState()).getHeight();
5753         }
5754         reqWidth = crop.width() * frameScale;
5755         reqHeight = crop.height() * frameScale;
5756 
5757         for (const auto& handle : excludeHandles) {
5758             sp<Layer> excludeLayer = fromHandle(handle);
5759             if (excludeLayer != nullptr) {
5760                 excludeLayers.emplace(excludeLayer);
5761             } else {
5762                 ALOGW("Invalid layer handle passed as excludeLayer to captureLayers");
5763                 return NAME_NOT_FOUND;
5764             }
5765         }
5766     } // mStateLock
5767 
5768     // really small crop or frameScale
5769     if (reqWidth <= 0) {
5770         reqWidth = 1;
5771     }
5772     if (reqHeight <= 0) {
5773         reqHeight = 1;
5774     }
5775 
5776     LayerRenderArea renderArea(this, parent, crop, reqWidth, reqHeight, reqDataspace, childrenOnly);
5777     auto traverseLayers = [parent, childrenOnly,
5778                            &excludeLayers](const LayerVector::Visitor& visitor) {
5779         parent->traverseChildrenInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
5780             if (!layer->isVisible()) {
5781                 return;
5782             } else if (childrenOnly && layer == parent.get()) {
5783                 return;
5784             }
5785 
5786             sp<Layer> p = layer;
5787             while (p != nullptr) {
5788                 if (excludeLayers.count(p) != 0) {
5789                     return;
5790                 }
5791                 p = p->getParent();
5792             }
5793 
5794             visitor(layer);
5795         });
5796     };
5797 
5798     bool outCapturedSecureLayers = false;
5799     return captureScreenCommon(renderArea, traverseLayers, outBuffer, reqPixelFormat, false,
5800                                outCapturedSecureLayers);
5801 }
5802 
captureScreenCommon(RenderArea & renderArea,TraverseLayersFunction traverseLayers,sp<GraphicBuffer> * outBuffer,const ui::PixelFormat reqPixelFormat,bool useIdentityTransform,bool & outCapturedSecureLayers)5803 status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea,
5804                                              TraverseLayersFunction traverseLayers,
5805                                              sp<GraphicBuffer>* outBuffer,
5806                                              const ui::PixelFormat reqPixelFormat,
5807                                              bool useIdentityTransform,
5808                                              bool& outCapturedSecureLayers) {
5809     ATRACE_CALL();
5810 
5811     // TODO(b/116112787) Make buffer usage a parameter.
5812     const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
5813             GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
5814     *outBuffer =
5815             getFactory().createGraphicBuffer(renderArea.getReqWidth(), renderArea.getReqHeight(),
5816                                              static_cast<android_pixel_format>(reqPixelFormat), 1,
5817                                              usage, "screenshot");
5818 
5819     return captureScreenCommon(renderArea, traverseLayers, *outBuffer, useIdentityTransform,
5820                                outCapturedSecureLayers);
5821 }
5822 
captureScreenCommon(RenderArea & renderArea,TraverseLayersFunction traverseLayers,const sp<GraphicBuffer> & buffer,bool useIdentityTransform,bool & outCapturedSecureLayers)5823 status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea,
5824                                              TraverseLayersFunction traverseLayers,
5825                                              const sp<GraphicBuffer>& buffer,
5826                                              bool useIdentityTransform,
5827                                              bool& outCapturedSecureLayers) {
5828     // This mutex protects syncFd and captureResult for communication of the return values from the
5829     // main thread back to this Binder thread
5830     std::mutex captureMutex;
5831     std::condition_variable captureCondition;
5832     std::unique_lock<std::mutex> captureLock(captureMutex);
5833     int syncFd = -1;
5834     std::optional<status_t> captureResult;
5835 
5836     const int uid = IPCThreadState::self()->getCallingUid();
5837     const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM;
5838 
5839     sp<LambdaMessage> message = new LambdaMessage([&] {
5840         // If there is a refresh pending, bug out early and tell the binder thread to try again
5841         // after the refresh.
5842         if (mRefreshPending) {
5843             ATRACE_NAME("Skipping screenshot for now");
5844             std::unique_lock<std::mutex> captureLock(captureMutex);
5845             captureResult = std::make_optional<status_t>(EAGAIN);
5846             captureCondition.notify_one();
5847             return;
5848         }
5849 
5850         status_t result = NO_ERROR;
5851         int fd = -1;
5852         {
5853             Mutex::Autolock _l(mStateLock);
5854             renderArea.render([&] {
5855                 result = captureScreenImplLocked(renderArea, traverseLayers, buffer.get(),
5856                                                  useIdentityTransform, forSystem, &fd,
5857                                                  outCapturedSecureLayers);
5858             });
5859         }
5860 
5861         {
5862             std::unique_lock<std::mutex> captureLock(captureMutex);
5863             syncFd = fd;
5864             captureResult = std::make_optional<status_t>(result);
5865             captureCondition.notify_one();
5866         }
5867     });
5868 
5869     status_t result = postMessageAsync(message);
5870     if (result == NO_ERROR) {
5871         captureCondition.wait(captureLock, [&] { return captureResult; });
5872         while (*captureResult == EAGAIN) {
5873             captureResult.reset();
5874             result = postMessageAsync(message);
5875             if (result != NO_ERROR) {
5876                 return result;
5877             }
5878             captureCondition.wait(captureLock, [&] { return captureResult; });
5879         }
5880         result = *captureResult;
5881     }
5882 
5883     if (result == NO_ERROR) {
5884         sync_wait(syncFd, -1);
5885         close(syncFd);
5886     }
5887 
5888     return result;
5889 }
5890 
renderScreenImplLocked(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,ANativeWindowBuffer * buffer,bool useIdentityTransform,int * outSyncFd)5891 void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
5892                                             TraverseLayersFunction traverseLayers,
5893                                             ANativeWindowBuffer* buffer, bool useIdentityTransform,
5894                                             int* outSyncFd) {
5895     ATRACE_CALL();
5896 
5897     const auto reqWidth = renderArea.getReqWidth();
5898     const auto reqHeight = renderArea.getReqHeight();
5899     const auto rotation = renderArea.getRotationFlags();
5900     const auto transform = renderArea.getTransform();
5901     const auto sourceCrop = renderArea.getSourceCrop();
5902 
5903     renderengine::DisplaySettings clientCompositionDisplay;
5904     std::vector<renderengine::LayerSettings> clientCompositionLayers;
5905 
5906     // assume that bounds are never offset, and that they are the same as the
5907     // buffer bounds.
5908     clientCompositionDisplay.physicalDisplay = Rect(reqWidth, reqHeight);
5909     clientCompositionDisplay.clip = sourceCrop;
5910     clientCompositionDisplay.globalTransform = transform.asMatrix4();
5911 
5912     // Now take into account the rotation flag. We append a transform that
5913     // rotates the layer stack about the origin, then translate by buffer
5914     // boundaries to be in the right quadrant.
5915     mat4 rotMatrix;
5916     int displacementX = 0;
5917     int displacementY = 0;
5918     float rot90InRadians = 2.0f * static_cast<float>(M_PI) / 4.0f;
5919     switch (rotation) {
5920         case ui::Transform::ROT_90:
5921             rotMatrix = mat4::rotate(rot90InRadians, vec3(0, 0, 1));
5922             displacementX = renderArea.getBounds().getHeight();
5923             break;
5924         case ui::Transform::ROT_180:
5925             rotMatrix = mat4::rotate(rot90InRadians * 2.0f, vec3(0, 0, 1));
5926             displacementY = renderArea.getBounds().getWidth();
5927             displacementX = renderArea.getBounds().getHeight();
5928             break;
5929         case ui::Transform::ROT_270:
5930             rotMatrix = mat4::rotate(rot90InRadians * 3.0f, vec3(0, 0, 1));
5931             displacementY = renderArea.getBounds().getWidth();
5932             break;
5933         default:
5934             break;
5935     }
5936 
5937     // We need to transform the clipping window into the right spot.
5938     // First, rotate the clipping rectangle by the rotation hint to get the
5939     // right orientation
5940     const vec4 clipTL = vec4(sourceCrop.left, sourceCrop.top, 0, 1);
5941     const vec4 clipBR = vec4(sourceCrop.right, sourceCrop.bottom, 0, 1);
5942     const vec4 rotClipTL = rotMatrix * clipTL;
5943     const vec4 rotClipBR = rotMatrix * clipBR;
5944     const int newClipLeft = std::min(rotClipTL[0], rotClipBR[0]);
5945     const int newClipTop = std::min(rotClipTL[1], rotClipBR[1]);
5946     const int newClipRight = std::max(rotClipTL[0], rotClipBR[0]);
5947     const int newClipBottom = std::max(rotClipTL[1], rotClipBR[1]);
5948 
5949     // Now reposition the clipping rectangle with the displacement vector
5950     // computed above.
5951     const mat4 displacementMat = mat4::translate(vec4(displacementX, displacementY, 0, 1));
5952     clientCompositionDisplay.clip =
5953             Rect(newClipLeft + displacementX, newClipTop + displacementY,
5954                  newClipRight + displacementX, newClipBottom + displacementY);
5955 
5956     mat4 clipTransform = displacementMat * rotMatrix;
5957     clientCompositionDisplay.globalTransform =
5958             clipTransform * clientCompositionDisplay.globalTransform;
5959 
5960     clientCompositionDisplay.outputDataspace = renderArea.getReqDataSpace();
5961     clientCompositionDisplay.maxLuminance = DisplayDevice::sDefaultMaxLumiance;
5962 
5963     const float alpha = RenderArea::getCaptureFillValue(renderArea.getCaptureFill());
5964 
5965     renderengine::LayerSettings fillLayer;
5966     fillLayer.source.buffer.buffer = nullptr;
5967     fillLayer.source.solidColor = half3(0.0, 0.0, 0.0);
5968     fillLayer.geometry.boundaries = FloatRect(0.0, 0.0, 1.0, 1.0);
5969     fillLayer.alpha = half(alpha);
5970     clientCompositionLayers.push_back(fillLayer);
5971 
5972     Region clearRegion = Region::INVALID_REGION;
5973     traverseLayers([&](Layer* layer) {
5974         renderengine::LayerSettings layerSettings;
5975         bool prepared = layer->prepareClientLayer(renderArea, useIdentityTransform, clearRegion,
5976                                                   false, layerSettings);
5977         if (prepared) {
5978             clientCompositionLayers.push_back(layerSettings);
5979         }
5980     });
5981 
5982     clientCompositionDisplay.clearRegion = clearRegion;
5983     // Use an empty fence for the buffer fence, since we just created the buffer so
5984     // there is no need for synchronization with the GPU.
5985     base::unique_fd bufferFence;
5986     base::unique_fd drawFence;
5987     getRenderEngine().useProtectedContext(false);
5988     getRenderEngine().drawLayers(clientCompositionDisplay, clientCompositionLayers, buffer,
5989                                  /*useFramebufferCache=*/false, std::move(bufferFence), &drawFence);
5990 
5991     *outSyncFd = drawFence.release();
5992 }
5993 
captureScreenImplLocked(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,ANativeWindowBuffer * buffer,bool useIdentityTransform,bool forSystem,int * outSyncFd,bool & outCapturedSecureLayers)5994 status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea,
5995                                                  TraverseLayersFunction traverseLayers,
5996                                                  ANativeWindowBuffer* buffer,
5997                                                  bool useIdentityTransform, bool forSystem,
5998                                                  int* outSyncFd, bool& outCapturedSecureLayers) {
5999     ATRACE_CALL();
6000 
6001     traverseLayers([&](Layer* layer) {
6002         outCapturedSecureLayers =
6003                 outCapturedSecureLayers || (layer->isVisible() && layer->isSecure());
6004     });
6005 
6006     // We allow the system server to take screenshots of secure layers for
6007     // use in situations like the Screen-rotation animation and place
6008     // the impetus on WindowManager to not persist them.
6009     if (outCapturedSecureLayers && !forSystem) {
6010         ALOGW("FB is protected: PERMISSION_DENIED");
6011         return PERMISSION_DENIED;
6012     }
6013     renderScreenImplLocked(renderArea, traverseLayers, buffer, useIdentityTransform, outSyncFd);
6014     return NO_ERROR;
6015 }
6016 
setInputWindowsFinished()6017 void SurfaceFlinger::setInputWindowsFinished() {
6018     Mutex::Autolock _l(mStateLock);
6019 
6020     mPendingSyncInputWindows = false;
6021     mTransactionCV.broadcast();
6022 }
6023 
6024 // ---------------------------------------------------------------------------
6025 
traverseInZOrder(const LayerVector::Visitor & visitor) const6026 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
6027     layersSortedByZ.traverseInZOrder(stateSet, visitor);
6028 }
6029 
traverseInReverseZOrder(const LayerVector::Visitor & visitor) const6030 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
6031     layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
6032 }
6033 
traverseLayersInDisplay(const sp<const DisplayDevice> & display,const LayerVector::Visitor & visitor)6034 void SurfaceFlinger::traverseLayersInDisplay(const sp<const DisplayDevice>& display,
6035                                              const LayerVector::Visitor& visitor) {
6036     // We loop through the first level of layers without traversing,
6037     // as we need to determine which layers belong to the requested display.
6038     for (const auto& layer : mDrawingState.layersSortedByZ) {
6039         if (!layer->belongsToDisplay(display->getLayerStack(), false)) {
6040             continue;
6041         }
6042         // relative layers are traversed in Layer::traverseInZOrder
6043         layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
6044             if (!layer->belongsToDisplay(display->getLayerStack(), false)) {
6045                 return;
6046             }
6047             if (!layer->isVisible()) {
6048                 return;
6049             }
6050             visitor(layer);
6051         });
6052     }
6053 }
6054 
setAllowedDisplayConfigsInternal(const sp<DisplayDevice> & display,const std::vector<int32_t> & allowedConfigs)6055 void SurfaceFlinger::setAllowedDisplayConfigsInternal(const sp<DisplayDevice>& display,
6056                                                       const std::vector<int32_t>& allowedConfigs) {
6057     if (!display->isPrimary()) {
6058         return;
6059     }
6060 
6061     ALOGV("Updating allowed configs");
6062     mAllowedDisplayConfigs = DisplayConfigs(allowedConfigs.begin(), allowedConfigs.end());
6063 
6064     // Set the highest allowed config by iterating backwards on available refresh rates
6065     const auto& refreshRates = mRefreshRateConfigs.getRefreshRates();
6066     for (auto iter = refreshRates.crbegin(); iter != refreshRates.crend(); ++iter) {
6067         if (iter->second && isDisplayConfigAllowed(iter->second->configId)) {
6068             ALOGV("switching to config %d", iter->second->configId);
6069             setDesiredActiveConfig(
6070                     {iter->first, iter->second->configId, Scheduler::ConfigEvent::Changed});
6071             break;
6072         }
6073     }
6074 }
6075 
setAllowedDisplayConfigs(const sp<IBinder> & displayToken,const std::vector<int32_t> & allowedConfigs)6076 status_t SurfaceFlinger::setAllowedDisplayConfigs(const sp<IBinder>& displayToken,
6077                                                   const std::vector<int32_t>& allowedConfigs) {
6078     ATRACE_CALL();
6079 
6080     if (!displayToken || allowedConfigs.empty()) {
6081         return BAD_VALUE;
6082     }
6083 
6084     if (mDebugDisplayConfigSetByBackdoor) {
6085         // ignore this request as config is overridden by backdoor
6086         return NO_ERROR;
6087     }
6088 
6089     postMessageSync(new LambdaMessage([&]() NO_THREAD_SAFETY_ANALYSIS {
6090         const auto display = getDisplayDeviceLocked(displayToken);
6091         if (!display) {
6092             ALOGE("Attempt to set allowed display configs for invalid display token %p",
6093                   displayToken.get());
6094         } else if (display->isVirtual()) {
6095             ALOGW("Attempt to set allowed display configs for virtual display");
6096         } else {
6097             setAllowedDisplayConfigsInternal(display, allowedConfigs);
6098         }
6099     }));
6100 
6101     return NO_ERROR;
6102 }
6103 
getAllowedDisplayConfigs(const sp<IBinder> & displayToken,std::vector<int32_t> * outAllowedConfigs)6104 status_t SurfaceFlinger::getAllowedDisplayConfigs(const sp<IBinder>& displayToken,
6105                                                   std::vector<int32_t>* outAllowedConfigs) {
6106     ATRACE_CALL();
6107 
6108     if (!displayToken || !outAllowedConfigs) {
6109         return BAD_VALUE;
6110     }
6111 
6112     Mutex::Autolock lock(mStateLock);
6113 
6114     const auto display = getDisplayDeviceLocked(displayToken);
6115     if (!display) {
6116         return NAME_NOT_FOUND;
6117     }
6118 
6119     if (display->isPrimary()) {
6120         outAllowedConfigs->assign(mAllowedDisplayConfigs.begin(), mAllowedDisplayConfigs.end());
6121     }
6122 
6123     return NO_ERROR;
6124 }
6125 
onSetInputWindowsFinished()6126 void SurfaceFlinger::SetInputWindowsListener::onSetInputWindowsFinished() {
6127     mFlinger->setInputWindowsFinished();
6128 }
6129 
fromHandle(const sp<IBinder> & handle)6130 sp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) {
6131     BBinder *b = handle->localBinder();
6132     if (b == nullptr) {
6133         return nullptr;
6134     }
6135     auto it = mLayersByLocalBinderToken.find(b);
6136     if (it != mLayersByLocalBinderToken.end()) {
6137         return it->second.promote();
6138     }
6139     return nullptr;
6140 }
6141 
6142 } // namespace android
6143 
6144 #if defined(__gl_h_)
6145 #error "don't include gl/gl.h in this file"
6146 #endif
6147 
6148 #if defined(__gl2_h_)
6149 #error "don't include gl2/gl2.h in this file"
6150 #endif
6151