• 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 // TODO(b/129481165): remove the #pragma below and fix conversion issues
18 #pragma clang diagnostic push
19 #pragma clang diagnostic ignored "-Wconversion"
20 #pragma clang diagnostic ignored "-Wextra"
21 
22 //#define LOG_NDEBUG 0
23 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
24 
25 #include "SurfaceFlinger.h"
26 
27 #include <android-base/parseint.h>
28 #include <android-base/properties.h>
29 #include <android-base/stringprintf.h>
30 #include <android-base/strings.h>
31 #include <android/configuration.h>
32 #include <android/gui/IDisplayEventConnection.h>
33 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
34 #include <android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h>
35 #include <android/hardware/configstore/1.1/types.h>
36 #include <android/hardware/power/Boost.h>
37 #include <android/native_window.h>
38 #include <android/os/IInputFlinger.h>
39 #include <binder/IPCThreadState.h>
40 #include <binder/IServiceManager.h>
41 #include <binder/PermissionCache.h>
42 #include <compositionengine/CompositionEngine.h>
43 #include <compositionengine/CompositionRefreshArgs.h>
44 #include <compositionengine/Display.h>
45 #include <compositionengine/DisplayColorProfile.h>
46 #include <compositionengine/DisplayCreationArgs.h>
47 #include <compositionengine/LayerFECompositionState.h>
48 #include <compositionengine/OutputLayer.h>
49 #include <compositionengine/RenderSurface.h>
50 #include <compositionengine/impl/OutputCompositionState.h>
51 #include <compositionengine/impl/OutputLayerCompositionState.h>
52 #include <configstore/Utils.h>
53 #include <cutils/compiler.h>
54 #include <cutils/properties.h>
55 #include <ftl/fake_guard.h>
56 #include <ftl/future.h>
57 #include <ftl/small_map.h>
58 #include <gui/BufferQueue.h>
59 #include <gui/DebugEGLImageTracker.h>
60 #include <gui/IProducerListener.h>
61 #include <gui/LayerDebugInfo.h>
62 #include <gui/LayerMetadata.h>
63 #include <gui/LayerState.h>
64 #include <gui/Surface.h>
65 #include <gui/TraceUtils.h>
66 #include <hidl/ServiceManagement.h>
67 #include <layerproto/LayerProtoParser.h>
68 #include <log/log.h>
69 #include <private/android_filesystem_config.h>
70 #include <private/gui/SyncFeatures.h>
71 #include <processgroup/processgroup.h>
72 #include <renderengine/RenderEngine.h>
73 #include <renderengine/impl/ExternalTexture.h>
74 #include <sys/types.h>
75 #include <ui/ColorSpace.h>
76 #include <ui/DataspaceUtils.h>
77 #include <ui/DebugUtils.h>
78 #include <ui/DisplayId.h>
79 #include <ui/DisplayMode.h>
80 #include <ui/DisplayStatInfo.h>
81 #include <ui/DisplayState.h>
82 #include <ui/DynamicDisplayInfo.h>
83 #include <ui/GraphicBufferAllocator.h>
84 #include <ui/PixelFormat.h>
85 #include <ui/StaticDisplayInfo.h>
86 #include <utils/StopWatch.h>
87 #include <utils/String16.h>
88 #include <utils/String8.h>
89 #include <utils/Timers.h>
90 #include <utils/misc.h>
91 
92 #include <algorithm>
93 #include <cerrno>
94 #include <cinttypes>
95 #include <cmath>
96 #include <cstdint>
97 #include <functional>
98 #include <memory>
99 #include <mutex>
100 #include <optional>
101 #include <type_traits>
102 #include <unordered_map>
103 
104 #include <ui/DisplayIdentification.h>
105 #include "BackgroundExecutor.h"
106 #include "BufferLayer.h"
107 #include "BufferQueueLayer.h"
108 #include "BufferStateLayer.h"
109 #include "Client.h"
110 #include "Colorizer.h"
111 #include "ContainerLayer.h"
112 #include "DisplayDevice.h"
113 #include "DisplayHardware/ComposerHal.h"
114 #include "DisplayHardware/FramebufferSurface.h"
115 #include "DisplayHardware/HWComposer.h"
116 #include "DisplayHardware/Hal.h"
117 #include "DisplayHardware/PowerAdvisor.h"
118 #include "DisplayHardware/VirtualDisplaySurface.h"
119 #include "DisplayRenderArea.h"
120 #include "EffectLayer.h"
121 #include "Effects/Daltonizer.h"
122 #include "FlagManager.h"
123 #include "FpsReporter.h"
124 #include "FrameTimeline/FrameTimeline.h"
125 #include "FrameTracer/FrameTracer.h"
126 #include "HdrLayerInfoReporter.h"
127 #include "Layer.h"
128 #include "LayerProtoHelper.h"
129 #include "LayerRenderArea.h"
130 #include "LayerVector.h"
131 #include "MonitoredProducer.h"
132 #include "MutexUtils.h"
133 #include "NativeWindowSurface.h"
134 #include "RefreshRateOverlay.h"
135 #include "RegionSamplingThread.h"
136 #include "Scheduler/DispSyncSource.h"
137 #include "Scheduler/EventThread.h"
138 #include "Scheduler/LayerHistory.h"
139 #include "Scheduler/Scheduler.h"
140 #include "Scheduler/VsyncConfiguration.h"
141 #include "Scheduler/VsyncController.h"
142 #include "StartPropertySetThread.h"
143 #include "SurfaceFlingerProperties.h"
144 #include "SurfaceInterceptor.h"
145 #include "TimeStats/TimeStats.h"
146 #include "TunnelModeEnabledReporter.h"
147 #include "WindowInfosListenerInvoker.h"
148 
149 #include <aidl/android/hardware/graphics/common/DisplayDecorationSupport.h>
150 #include <aidl/android/hardware/graphics/composer3/DisplayCapability.h>
151 #include <aidl/android/hardware/graphics/composer3/RenderIntent.h>
152 
153 #undef NO_THREAD_SAFETY_ANALYSIS
154 #define NO_THREAD_SAFETY_ANALYSIS \
155     _Pragma("GCC error \"Prefer <ftl/fake_guard.h> or MutexUtils.h helpers.\"")
156 
157 namespace android {
158 
159 using namespace std::string_literals;
160 
161 using namespace hardware::configstore;
162 using namespace hardware::configstore::V1_0;
163 using namespace sysprop;
164 
165 using aidl::android::hardware::graphics::common::DisplayDecorationSupport;
166 using aidl::android::hardware::graphics::composer3::Capability;
167 using aidl::android::hardware::graphics::composer3::DisplayCapability;
168 using CompositionStrategyPredictionState = android::compositionengine::impl::
169         OutputCompositionState::CompositionStrategyPredictionState;
170 
171 using base::StringAppendF;
172 using gui::DisplayInfo;
173 using gui::IDisplayEventConnection;
174 using gui::IWindowInfosListener;
175 using gui::WindowInfo;
176 using ui::ColorMode;
177 using ui::Dataspace;
178 using ui::DisplayPrimaries;
179 using ui::RenderIntent;
180 
181 using KernelIdleTimerController = scheduler::RefreshRateConfigs::KernelIdleTimerController;
182 
183 namespace hal = android::hardware::graphics::composer::hal;
184 
185 namespace {
186 
187 #pragma clang diagnostic push
188 #pragma clang diagnostic error "-Wswitch-enum"
189 
isWideColorMode(const ColorMode colorMode)190 bool isWideColorMode(const ColorMode colorMode) {
191     switch (colorMode) {
192         case ColorMode::DISPLAY_P3:
193         case ColorMode::ADOBE_RGB:
194         case ColorMode::DCI_P3:
195         case ColorMode::BT2020:
196         case ColorMode::DISPLAY_BT2020:
197         case ColorMode::BT2100_PQ:
198         case ColorMode::BT2100_HLG:
199             return true;
200         case ColorMode::NATIVE:
201         case ColorMode::STANDARD_BT601_625:
202         case ColorMode::STANDARD_BT601_625_UNADJUSTED:
203         case ColorMode::STANDARD_BT601_525:
204         case ColorMode::STANDARD_BT601_525_UNADJUSTED:
205         case ColorMode::STANDARD_BT709:
206         case ColorMode::SRGB:
207             return false;
208     }
209     return false;
210 }
211 
212 #pragma clang diagnostic pop
213 
214 // TODO(b/141333600): Consolidate with DisplayMode::Builder::getDefaultDensity.
215 constexpr float FALLBACK_DENSITY = ACONFIGURATION_DENSITY_TV;
216 
getDensityFromProperty(const char * property,bool required)217 float getDensityFromProperty(const char* property, bool required) {
218     char value[PROPERTY_VALUE_MAX];
219     const float density = property_get(property, value, nullptr) > 0 ? std::atof(value) : 0.f;
220     if (!density && required) {
221         ALOGE("%s must be defined as a build property", property);
222         return FALLBACK_DENSITY;
223     }
224     return density;
225 }
226 
227 // Currently we only support V0_SRGB and DISPLAY_P3 as composition preference.
validateCompositionDataspace(Dataspace dataspace)228 bool validateCompositionDataspace(Dataspace dataspace) {
229     return dataspace == Dataspace::V0_SRGB || dataspace == Dataspace::DISPLAY_P3;
230 }
231 
getIdleTimerTimeout(DisplayId displayId)232 std::chrono::milliseconds getIdleTimerTimeout(DisplayId displayId) {
233     const auto displayIdleTimerMsKey = [displayId] {
234         std::stringstream ss;
235         ss << "debug.sf.set_idle_timer_ms_" << displayId.value;
236         return ss.str();
237     }();
238 
239     const int32_t displayIdleTimerMs = base::GetIntProperty(displayIdleTimerMsKey, 0);
240     if (displayIdleTimerMs > 0) {
241         return std::chrono::milliseconds(displayIdleTimerMs);
242     }
243 
244     const int32_t setIdleTimerMs = base::GetIntProperty("debug.sf.set_idle_timer_ms", 0);
245     const int32_t millis = setIdleTimerMs ? setIdleTimerMs : sysprop::set_idle_timer_ms(0);
246     return std::chrono::milliseconds(millis);
247 }
248 
getKernelIdleTimerSyspropConfig(DisplayId displayId)249 bool getKernelIdleTimerSyspropConfig(DisplayId displayId) {
250     const auto displaySupportKernelIdleTimerKey = [displayId] {
251         std::stringstream ss;
252         ss << "debug.sf.support_kernel_idle_timer_" << displayId.value;
253         return ss.str();
254     }();
255 
256     const auto displaySupportKernelIdleTimer =
257             base::GetBoolProperty(displaySupportKernelIdleTimerKey, false);
258     return displaySupportKernelIdleTimer || sysprop::support_kernel_idle_timer(false);
259 }
260 
261 }  // namespace anonymous
262 
263 // ---------------------------------------------------------------------------
264 
265 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
266 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
267 const String16 sRotateSurfaceFlinger("android.permission.ROTATE_SURFACE_FLINGER");
268 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
269 const String16 sControlDisplayBrightness("android.permission.CONTROL_DISPLAY_BRIGHTNESS");
270 const String16 sDump("android.permission.DUMP");
271 const String16 sCaptureBlackoutContent("android.permission.CAPTURE_BLACKOUT_CONTENT");
272 const String16 sInternalSystemWindow("android.permission.INTERNAL_SYSTEM_WINDOW");
273 
274 const char* KERNEL_IDLE_TIMER_PROP = "graphics.display.kernel_idle_timer.enabled";
275 
276 // ---------------------------------------------------------------------------
277 int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
278 bool SurfaceFlinger::useHwcForRgbToYuv;
279 bool SurfaceFlinger::hasSyncFramework;
280 int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
281 uint32_t SurfaceFlinger::maxGraphicsWidth;
282 uint32_t SurfaceFlinger::maxGraphicsHeight;
283 bool SurfaceFlinger::hasWideColorDisplay;
284 bool SurfaceFlinger::useContextPriority;
285 Dataspace SurfaceFlinger::defaultCompositionDataspace = Dataspace::V0_SRGB;
286 ui::PixelFormat SurfaceFlinger::defaultCompositionPixelFormat = ui::PixelFormat::RGBA_8888;
287 Dataspace SurfaceFlinger::wideColorGamutCompositionDataspace = Dataspace::V0_SRGB;
288 ui::PixelFormat SurfaceFlinger::wideColorGamutCompositionPixelFormat = ui::PixelFormat::RGBA_8888;
289 LatchUnsignaledConfig SurfaceFlinger::enableLatchUnsignaledConfig;
290 
decodeDisplayColorSetting(DisplayColorSetting displayColorSetting)291 std::string decodeDisplayColorSetting(DisplayColorSetting displayColorSetting) {
292     switch(displayColorSetting) {
293         case DisplayColorSetting::kManaged:
294             return std::string("Managed");
295         case DisplayColorSetting::kUnmanaged:
296             return std::string("Unmanaged");
297         case DisplayColorSetting::kEnhanced:
298             return std::string("Enhanced");
299         default:
300             return std::string("Unknown ") +
301                 std::to_string(static_cast<int>(displayColorSetting));
302     }
303 }
304 
callingThreadHasRotateSurfaceFlingerAccess()305 bool callingThreadHasRotateSurfaceFlingerAccess() {
306     IPCThreadState* ipc = IPCThreadState::self();
307     const int pid = ipc->getCallingPid();
308     const int uid = ipc->getCallingUid();
309     return uid == AID_GRAPHICS || uid == AID_SYSTEM ||
310             PermissionCache::checkPermission(sRotateSurfaceFlinger, pid, uid);
311 }
312 
callingThreadHasInternalSystemWindowAccess()313 bool callingThreadHasInternalSystemWindowAccess() {
314     IPCThreadState* ipc = IPCThreadState::self();
315     const int pid = ipc->getCallingPid();
316     const int uid = ipc->getCallingUid();
317     return uid == AID_GRAPHICS || uid == AID_SYSTEM ||
318         PermissionCache::checkPermission(sInternalSystemWindow, pid, uid);
319 }
320 
SurfaceFlinger(Factory & factory,SkipInitializationTag)321 SurfaceFlinger::SurfaceFlinger(Factory& factory, SkipInitializationTag)
322       : mFactory(factory),
323         mPid(getpid()),
324         mInterceptor(mFactory.createSurfaceInterceptor()),
325         mTimeStats(std::make_shared<impl::TimeStats>()),
326         mFrameTracer(mFactory.createFrameTracer()),
327         mFrameTimeline(mFactory.createFrameTimeline(mTimeStats, mPid)),
328         mCompositionEngine(mFactory.createCompositionEngine()),
329         mHwcServiceName(base::GetProperty("debug.sf.hwc_service_name"s, "default"s)),
330         mTunnelModeEnabledReporter(new TunnelModeEnabledReporter()),
331         mInternalDisplayDensity(getDensityFromProperty("ro.sf.lcd_density", true)),
332         mEmulatedDisplayDensity(getDensityFromProperty("qemu.sf.lcd_density", false)),
333         mPowerAdvisor(std::make_unique<Hwc2::impl::PowerAdvisor>(*this)),
334         mWindowInfosListenerInvoker(sp<WindowInfosListenerInvoker>::make(*this)) {
335     ALOGI("Using HWComposer service: %s", mHwcServiceName.c_str());
336 }
337 
SurfaceFlinger(Factory & factory)338 SurfaceFlinger::SurfaceFlinger(Factory& factory) : SurfaceFlinger(factory, SkipInitialization) {
339     ALOGI("SurfaceFlinger is starting");
340 
341     hasSyncFramework = running_without_sync_framework(true);
342 
343     dispSyncPresentTimeOffset = present_time_offset_from_vsync_ns(0);
344 
345     useHwcForRgbToYuv = force_hwc_copy_for_virtual_displays(false);
346 
347     maxFrameBufferAcquiredBuffers = max_frame_buffer_acquired_buffers(2);
348 
349     maxGraphicsWidth = std::max(max_graphics_width(0), 0);
350     maxGraphicsHeight = std::max(max_graphics_height(0), 0);
351 
352     hasWideColorDisplay = has_wide_color_display(false);
353     mDefaultCompositionDataspace =
354             static_cast<ui::Dataspace>(default_composition_dataspace(Dataspace::V0_SRGB));
355     mWideColorGamutCompositionDataspace = static_cast<ui::Dataspace>(wcg_composition_dataspace(
356             hasWideColorDisplay ? Dataspace::DISPLAY_P3 : Dataspace::V0_SRGB));
357     defaultCompositionDataspace = mDefaultCompositionDataspace;
358     wideColorGamutCompositionDataspace = mWideColorGamutCompositionDataspace;
359     defaultCompositionPixelFormat = static_cast<ui::PixelFormat>(
360             default_composition_pixel_format(ui::PixelFormat::RGBA_8888));
361     wideColorGamutCompositionPixelFormat =
362             static_cast<ui::PixelFormat>(wcg_composition_pixel_format(ui::PixelFormat::RGBA_8888));
363 
364     mColorSpaceAgnosticDataspace =
365             static_cast<ui::Dataspace>(color_space_agnostic_dataspace(Dataspace::UNKNOWN));
366 
367     mLayerCachingEnabled = [] {
368         const bool enable =
369                 android::sysprop::SurfaceFlingerProperties::enable_layer_caching().value_or(false);
370         return base::GetBoolProperty(std::string("debug.sf.enable_layer_caching"), enable);
371     }();
372 
373     useContextPriority = use_context_priority(true);
374 
375     mInternalDisplayPrimaries = sysprop::getDisplayNativePrimaries();
376 
377     // debugging stuff...
378     char value[PROPERTY_VALUE_MAX];
379 
380     property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
381     mGpuToCpuSupported = !atoi(value);
382 
383     property_get("ro.build.type", value, "user");
384     mIsUserBuild = strcmp(value, "user") == 0;
385 
386     mDebugFlashDelay = base::GetUintProperty("debug.sf.showupdates"s, 0u);
387 
388     // DDMS debugging deprecated (b/120782499)
389     property_get("debug.sf.ddms", value, "0");
390     int debugDdms = atoi(value);
391     ALOGI_IF(debugDdms, "DDMS debugging not supported");
392 
393     property_get("debug.sf.enable_gl_backpressure", value, "0");
394     mPropagateBackpressureClientComposition = atoi(value);
395     ALOGI_IF(mPropagateBackpressureClientComposition,
396              "Enabling backpressure propagation for Client Composition");
397 
398     property_get("ro.surface_flinger.supports_background_blur", value, "0");
399     bool supportsBlurs = atoi(value);
400     mSupportsBlur = supportsBlurs;
401     ALOGI_IF(!mSupportsBlur, "Disabling blur effects, they are not supported.");
402     property_get("ro.sf.blurs_are_expensive", value, "0");
403     mBlursAreExpensive = atoi(value);
404 
405     const size_t defaultListSize = ISurfaceComposer::MAX_LAYERS;
406     auto listSize = property_get_int32("debug.sf.max_igbp_list_size", int32_t(defaultListSize));
407     mMaxGraphicBufferProducerListSize = (listSize > 0) ? size_t(listSize) : defaultListSize;
408     mGraphicBufferProducerListSizeLogThreshold =
409             std::max(static_cast<int>(0.95 *
410                                       static_cast<double>(mMaxGraphicBufferProducerListSize)),
411                      1);
412 
413     property_get("debug.sf.luma_sampling", value, "1");
414     mLumaSampling = atoi(value);
415 
416     property_get("debug.sf.disable_client_composition_cache", value, "0");
417     mDisableClientCompositionCache = atoi(value);
418 
419     property_get("debug.sf.predict_hwc_composition_strategy", value, "1");
420     mPredictCompositionStrategy = atoi(value);
421 
422     property_get("debug.sf.treat_170m_as_sRGB", value, "0");
423     mTreat170mAsSrgb = atoi(value);
424 
425     // We should be reading 'persist.sys.sf.color_saturation' here
426     // but since /data may be encrypted, we need to wait until after vold
427     // comes online to attempt to read the property. The property is
428     // instead read after the boot animation
429 
430     if (base::GetBoolProperty("debug.sf.treble_testing_override"s, false)) {
431         // Without the override SurfaceFlinger cannot connect to HIDL
432         // services that are not listed in the manifests.  Considered
433         // deriving the setting from the set service name, but it
434         // would be brittle if the name that's not 'default' is used
435         // for production purposes later on.
436         ALOGI("Enabling Treble testing override");
437         android::hardware::details::setTrebleTestingOverride(true);
438     }
439 
440     mRefreshRateOverlaySpinner = property_get_bool("sf.debug.show_refresh_rate_overlay_spinner", 0);
441 
442     if (!mIsUserBuild && base::GetBoolProperty("debug.sf.enable_transaction_tracing"s, true)) {
443         mTransactionTracing.emplace();
444     }
445 
446     mIgnoreHdrCameraLayers = ignore_hdr_camera_layers(false);
447 
448     // Power hint session mode, representing which hint(s) to send: early, late, or both)
449     mPowerHintSessionMode =
450             {.late = base::GetBoolProperty("debug.sf.send_late_power_session_hint"s, true),
451              .early = base::GetBoolProperty("debug.sf.send_early_power_session_hint"s, false)};
452 }
453 
getLatchUnsignaledConfig()454 LatchUnsignaledConfig SurfaceFlinger::getLatchUnsignaledConfig() {
455     if (base::GetBoolProperty("debug.sf.latch_unsignaled"s, false)) {
456         return LatchUnsignaledConfig::Always;
457     }
458 
459     if (base::GetBoolProperty("debug.sf.auto_latch_unsignaled"s, true)) {
460         return LatchUnsignaledConfig::AutoSingleLayer;
461     }
462 
463     return LatchUnsignaledConfig::Disabled;
464 }
465 
466 SurfaceFlinger::~SurfaceFlinger() = default;
467 
binderDied(const wp<IBinder> &)468 void SurfaceFlinger::binderDied(const wp<IBinder>&) {
469     // the window manager died on us. prepare its eulogy.
470     mBootFinished = false;
471 
472     // Sever the link to inputflinger since it's gone as well.
473     static_cast<void>(mScheduler->schedule([=] { mInputFlinger = nullptr; }));
474 
475     // restore initial conditions (default device unblank, etc)
476     initializeDisplays();
477 
478     // restart the boot-animation
479     startBootAnim();
480 }
481 
run()482 void SurfaceFlinger::run() {
483     mScheduler->run();
484 }
485 
createConnection()486 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
487     const sp<Client> client = new Client(this);
488     return client->initCheck() == NO_ERROR ? client : nullptr;
489 }
490 
createDisplay(const String8 & displayName,bool secure)491 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName, bool secure) {
492     // onTransact already checks for some permissions, but adding an additional check here.
493     // This is to ensure that only system and graphics can request to create a secure
494     // display. Secure displays can show secure content so we add an additional restriction on it.
495     const int uid = IPCThreadState::self()->getCallingUid();
496     if (secure && uid != AID_GRAPHICS && uid != AID_SYSTEM) {
497         ALOGE("Only privileged processes can create a secure display");
498         return nullptr;
499     }
500 
501     class DisplayToken : public BBinder {
502         sp<SurfaceFlinger> flinger;
503         virtual ~DisplayToken() {
504              // no more references, this display must be terminated
505              Mutex::Autolock _l(flinger->mStateLock);
506              flinger->mCurrentState.displays.removeItem(this);
507              flinger->setTransactionFlags(eDisplayTransactionNeeded);
508          }
509      public:
510         explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
511             : flinger(flinger) {
512         }
513     };
514 
515     sp<BBinder> token = new DisplayToken(this);
516 
517     Mutex::Autolock _l(mStateLock);
518     // Display ID is assigned when virtual display is allocated by HWC.
519     DisplayDeviceState state;
520     state.isSecure = secure;
521     state.displayName = displayName;
522     mCurrentState.displays.add(token, state);
523     mInterceptor->saveDisplayCreation(state);
524     return token;
525 }
526 
destroyDisplay(const sp<IBinder> & displayToken)527 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& displayToken) {
528     Mutex::Autolock lock(mStateLock);
529 
530     const ssize_t index = mCurrentState.displays.indexOfKey(displayToken);
531     if (index < 0) {
532         ALOGE("%s: Invalid display token %p", __func__, displayToken.get());
533         return;
534     }
535 
536     const DisplayDeviceState& state = mCurrentState.displays.valueAt(index);
537     if (state.physical) {
538         ALOGE("%s: Invalid operation on physical display", __func__);
539         return;
540     }
541     mInterceptor->saveDisplayDeletion(state.sequenceId);
542     mCurrentState.displays.removeItemsAt(index);
543     setTransactionFlags(eDisplayTransactionNeeded);
544 }
545 
enableHalVirtualDisplays(bool enable)546 void SurfaceFlinger::enableHalVirtualDisplays(bool enable) {
547     auto& generator = mVirtualDisplayIdGenerators.hal;
548     if (!generator && enable) {
549         ALOGI("Enabling HAL virtual displays");
550         generator.emplace(getHwComposer().getMaxVirtualDisplayCount());
551     } else if (generator && !enable) {
552         ALOGW_IF(generator->inUse(), "Disabling HAL virtual displays while in use");
553         generator.reset();
554     }
555 }
556 
acquireVirtualDisplay(ui::Size resolution,ui::PixelFormat format)557 VirtualDisplayId SurfaceFlinger::acquireVirtualDisplay(ui::Size resolution,
558                                                        ui::PixelFormat format) {
559     if (auto& generator = mVirtualDisplayIdGenerators.hal) {
560         if (const auto id = generator->generateId()) {
561             if (getHwComposer().allocateVirtualDisplay(*id, resolution, &format)) {
562                 return *id;
563             }
564 
565             generator->releaseId(*id);
566         } else {
567             ALOGW("%s: Exhausted HAL virtual displays", __func__);
568         }
569 
570         ALOGW("%s: Falling back to GPU virtual display", __func__);
571     }
572 
573     const auto id = mVirtualDisplayIdGenerators.gpu.generateId();
574     LOG_ALWAYS_FATAL_IF(!id, "Failed to generate ID for GPU virtual display");
575     return *id;
576 }
577 
releaseVirtualDisplay(VirtualDisplayId displayId)578 void SurfaceFlinger::releaseVirtualDisplay(VirtualDisplayId displayId) {
579     if (const auto id = HalVirtualDisplayId::tryCast(displayId)) {
580         if (auto& generator = mVirtualDisplayIdGenerators.hal) {
581             generator->releaseId(*id);
582         }
583         return;
584     }
585 
586     const auto id = GpuVirtualDisplayId::tryCast(displayId);
587     LOG_ALWAYS_FATAL_IF(!id);
588     mVirtualDisplayIdGenerators.gpu.releaseId(*id);
589 }
590 
getPhysicalDisplayIdsLocked() const591 std::vector<PhysicalDisplayId> SurfaceFlinger::getPhysicalDisplayIdsLocked() const {
592     std::vector<PhysicalDisplayId> displayIds;
593     displayIds.reserve(mPhysicalDisplayTokens.size());
594 
595     const auto defaultDisplayId = getDefaultDisplayDeviceLocked()->getPhysicalId();
596     displayIds.push_back(defaultDisplayId);
597 
598     for (const auto& [id, token] : mPhysicalDisplayTokens) {
599         if (id != defaultDisplayId) {
600             displayIds.push_back(id);
601         }
602     }
603 
604     return displayIds;
605 }
606 
getPrimaryPhysicalDisplayId(PhysicalDisplayId * id) const607 status_t SurfaceFlinger::getPrimaryPhysicalDisplayId(PhysicalDisplayId* id) const {
608     Mutex::Autolock lock(mStateLock);
609     *id = getPrimaryDisplayIdLocked();
610     return NO_ERROR;
611 }
612 
getPhysicalDisplayToken(PhysicalDisplayId displayId) const613 sp<IBinder> SurfaceFlinger::getPhysicalDisplayToken(PhysicalDisplayId displayId) const {
614     Mutex::Autolock lock(mStateLock);
615     return getPhysicalDisplayTokenLocked(displayId);
616 }
617 
getColorManagement(bool * outGetColorManagement) const618 status_t SurfaceFlinger::getColorManagement(bool* outGetColorManagement) const {
619     if (!outGetColorManagement) {
620         return BAD_VALUE;
621     }
622     *outGetColorManagement = useColorManagement;
623     return NO_ERROR;
624 }
625 
getHwComposer() const626 HWComposer& SurfaceFlinger::getHwComposer() const {
627     return mCompositionEngine->getHwComposer();
628 }
629 
getRenderEngine() const630 renderengine::RenderEngine& SurfaceFlinger::getRenderEngine() const {
631     return mCompositionEngine->getRenderEngine();
632 }
633 
getCompositionEngine() const634 compositionengine::CompositionEngine& SurfaceFlinger::getCompositionEngine() const {
635     return *mCompositionEngine.get();
636 }
637 
bootFinished()638 void SurfaceFlinger::bootFinished() {
639     if (mBootFinished == true) {
640         ALOGE("Extra call to bootFinished");
641         return;
642     }
643     mBootFinished = true;
644     if (mStartPropertySetThread->join() != NO_ERROR) {
645         ALOGE("Join StartPropertySetThread failed!");
646     }
647 
648     if (mRenderEnginePrimeCacheFuture.valid()) {
649         mRenderEnginePrimeCacheFuture.get();
650     }
651     const nsecs_t now = systemTime();
652     const nsecs_t duration = now - mBootTime;
653     ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
654 
655     mFrameTracer->initialize();
656     mFrameTimeline->onBootFinished();
657     getRenderEngine().setEnableTracing(mFlagManager.use_skia_tracing());
658 
659     // wait patiently for the window manager death
660     const String16 name("window");
661     mWindowManager = defaultServiceManager()->getService(name);
662     if (mWindowManager != 0) {
663         mWindowManager->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
664     }
665 
666     // stop boot animation
667     // formerly we would just kill the process, but we now ask it to exit so it
668     // can choose where to stop the animation.
669     property_set("service.bootanim.exit", "1");
670 
671     const int LOGTAG_SF_STOP_BOOTANIM = 60110;
672     LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
673                    ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
674 
675     sp<IBinder> input(defaultServiceManager()->getService(String16("inputflinger")));
676 
677     static_cast<void>(mScheduler->schedule([=] {
678         if (input == nullptr) {
679             ALOGE("Failed to link to input service");
680         } else {
681             mInputFlinger = interface_cast<os::IInputFlinger>(input);
682         }
683 
684         readPersistentProperties();
685         mPowerAdvisor->onBootFinished();
686         const bool powerHintEnabled = mFlagManager.use_adpf_cpu_hint();
687         mPowerAdvisor->enablePowerHint(powerHintEnabled);
688         const bool powerHintUsed = mPowerAdvisor->usePowerHintSession();
689         ALOGD("Power hint is %s",
690               powerHintUsed ? "supported" : (powerHintEnabled ? "unsupported" : "disabled"));
691         if (powerHintUsed) {
692             std::optional<pid_t> renderEngineTid = getRenderEngine().getRenderEngineTid();
693             std::vector<int32_t> tidList;
694             tidList.emplace_back(gettid());
695             if (renderEngineTid.has_value()) {
696                 tidList.emplace_back(*renderEngineTid);
697             }
698             if (!mPowerAdvisor->startPowerHintSession(tidList)) {
699                 ALOGW("Cannot start power hint session");
700             }
701         }
702 
703         mBootStage = BootStage::FINISHED;
704 
705         if (property_get_bool("sf.debug.show_refresh_rate_overlay", false)) {
706             FTL_FAKE_GUARD(mStateLock, enableRefreshRateOverlay(true));
707         }
708     }));
709 }
710 
getNewTexture()711 uint32_t SurfaceFlinger::getNewTexture() {
712     {
713         std::lock_guard lock(mTexturePoolMutex);
714         if (!mTexturePool.empty()) {
715             uint32_t name = mTexturePool.back();
716             mTexturePool.pop_back();
717             ATRACE_INT("TexturePoolSize", mTexturePool.size());
718             return name;
719         }
720 
721         // The pool was too small, so increase it for the future
722         ++mTexturePoolSize;
723     }
724 
725     // The pool was empty, so we need to get a new texture name directly using a
726     // blocking call to the main thread
727     auto genTextures = [this] {
728                uint32_t name = 0;
729                getRenderEngine().genTextures(1, &name);
730                return name;
731     };
732     if (std::this_thread::get_id() == mMainThreadId) {
733         return genTextures();
734     } else {
735         return mScheduler->schedule(genTextures).get();
736     }
737 }
738 
deleteTextureAsync(uint32_t texture)739 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
740     std::lock_guard lock(mTexturePoolMutex);
741     // We don't change the pool size, so the fix-up logic in postComposition will decide whether
742     // to actually delete this or not based on mTexturePoolSize
743     mTexturePool.push_back(texture);
744     ATRACE_INT("TexturePoolSize", mTexturePool.size());
745 }
746 
747 static std::optional<renderengine::RenderEngine::RenderEngineType>
chooseRenderEngineTypeViaSysProp()748 chooseRenderEngineTypeViaSysProp() {
749     char prop[PROPERTY_VALUE_MAX];
750     property_get(PROPERTY_DEBUG_RENDERENGINE_BACKEND, prop, "");
751 
752     if (strcmp(prop, "gles") == 0) {
753         return renderengine::RenderEngine::RenderEngineType::GLES;
754     } else if (strcmp(prop, "threaded") == 0) {
755         return renderengine::RenderEngine::RenderEngineType::THREADED;
756     } else if (strcmp(prop, "skiagl") == 0) {
757         return renderengine::RenderEngine::RenderEngineType::SKIA_GL;
758     } else if (strcmp(prop, "skiaglthreaded") == 0) {
759         return renderengine::RenderEngine::RenderEngineType::SKIA_GL_THREADED;
760     } else {
761         ALOGE("Unrecognized RenderEngineType %s; ignoring!", prop);
762         return {};
763     }
764 }
765 
766 // Do not call property_set on main thread which will be blocked by init
767 // Use StartPropertySetThread instead.
init()768 void SurfaceFlinger::init() {
769     ALOGI(  "SurfaceFlinger's main thread ready to run. "
770             "Initializing graphics H/W...");
771     Mutex::Autolock _l(mStateLock);
772 
773     // Get a RenderEngine for the given display / config (can't fail)
774     // TODO(b/77156734): We need to stop casting and use HAL types when possible.
775     // Sending maxFrameBufferAcquiredBuffers as the cache size is tightly tuned to single-display.
776     auto builder = renderengine::RenderEngineCreationArgs::Builder()
777                            .setPixelFormat(static_cast<int32_t>(defaultCompositionPixelFormat))
778                            .setImageCacheSize(maxFrameBufferAcquiredBuffers)
779                            .setUseColorManagerment(useColorManagement)
780                            .setEnableProtectedContext(enable_protected_contents(false))
781                            .setPrecacheToneMapperShaderOnly(false)
782                            .setSupportsBackgroundBlur(mSupportsBlur)
783                            .setContextPriority(
784                                    useContextPriority
785                                            ? renderengine::RenderEngine::ContextPriority::REALTIME
786                                            : renderengine::RenderEngine::ContextPriority::MEDIUM);
787     if (auto type = chooseRenderEngineTypeViaSysProp()) {
788         builder.setRenderEngineType(type.value());
789     }
790     mCompositionEngine->setRenderEngine(renderengine::RenderEngine::create(builder.build()));
791     mMaxRenderTargetSize =
792             std::min(getRenderEngine().getMaxTextureSize(), getRenderEngine().getMaxViewportDims());
793 
794     // Set SF main policy after initializing RenderEngine which has its own policy.
795     if (!SetTaskProfiles(0, {"SFMainPolicy"})) {
796         ALOGW("Failed to set main task profile");
797     }
798 
799     mCompositionEngine->setTimeStats(mTimeStats);
800     mCompositionEngine->setHwComposer(getFactory().createHWComposer(mHwcServiceName));
801     mCompositionEngine->getHwComposer().setCallback(*this);
802     ClientCache::getInstance().setRenderEngine(&getRenderEngine());
803 
804     enableLatchUnsignaledConfig = getLatchUnsignaledConfig();
805 
806     if (base::GetBoolProperty("debug.sf.enable_hwc_vds"s, false)) {
807         enableHalVirtualDisplays(true);
808     }
809 
810     // Process any initial hotplug and resulting display changes.
811     processDisplayHotplugEventsLocked();
812     const auto display = getDefaultDisplayDeviceLocked();
813     LOG_ALWAYS_FATAL_IF(!display, "Missing primary display after registering composer callback.");
814     const auto displayId = display->getPhysicalId();
815     LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(displayId),
816                         "Primary display is disconnected.");
817 
818     // initialize our drawing state
819     mDrawingState = mCurrentState;
820 
821     // set initial conditions (e.g. unblank default device)
822     initializeDisplays();
823 
824     mPowerAdvisor->init();
825 
826     char primeShaderCache[PROPERTY_VALUE_MAX];
827     property_get("service.sf.prime_shader_cache", primeShaderCache, "1");
828     if (atoi(primeShaderCache)) {
829         if (setSchedFifo(false) != NO_ERROR) {
830             ALOGW("Can't set SCHED_OTHER for primeCache");
831         }
832 
833         mRenderEnginePrimeCacheFuture = getRenderEngine().primeCache();
834 
835         if (setSchedFifo(true) != NO_ERROR) {
836             ALOGW("Can't set SCHED_OTHER for primeCache");
837         }
838     }
839 
840     onActiveDisplaySizeChanged(display);
841 
842     // Inform native graphics APIs whether the present timestamp is supported:
843 
844     const bool presentFenceReliable =
845             !getHwComposer().hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE);
846     mStartPropertySetThread = getFactory().createStartPropertySetThread(presentFenceReliable);
847 
848     if (mStartPropertySetThread->Start() != NO_ERROR) {
849         ALOGE("Run StartPropertySetThread failed!");
850     }
851 
852     ALOGV("Done initializing");
853 }
854 
readPersistentProperties()855 void SurfaceFlinger::readPersistentProperties() {
856     Mutex::Autolock _l(mStateLock);
857 
858     char value[PROPERTY_VALUE_MAX];
859 
860     property_get("persist.sys.sf.color_saturation", value, "1.0");
861     mGlobalSaturationFactor = atof(value);
862     updateColorMatrixLocked();
863     ALOGV("Saturation is set to %.2f", mGlobalSaturationFactor);
864 
865     property_get("persist.sys.sf.native_mode", value, "0");
866     mDisplayColorSetting = static_cast<DisplayColorSetting>(atoi(value));
867 
868     property_get("persist.sys.sf.color_mode", value, "0");
869     mForceColorMode = static_cast<ColorMode>(atoi(value));
870 }
871 
startBootAnim()872 void SurfaceFlinger::startBootAnim() {
873     // Start boot animation service by setting a property mailbox
874     // if property setting thread is already running, Start() will be just a NOP
875     mStartPropertySetThread->Start();
876     // Wait until property was set
877     if (mStartPropertySetThread->join() != NO_ERROR) {
878         ALOGE("Join StartPropertySetThread failed!");
879     }
880 }
881 
882 // ----------------------------------------------------------------------------
883 
authenticateSurfaceTexture(const sp<IGraphicBufferProducer> & bufferProducer) const884 bool SurfaceFlinger::authenticateSurfaceTexture(
885         const sp<IGraphicBufferProducer>& bufferProducer) const {
886     Mutex::Autolock _l(mStateLock);
887     return authenticateSurfaceTextureLocked(bufferProducer);
888 }
889 
authenticateSurfaceTextureLocked(const sp<IGraphicBufferProducer> &) const890 bool SurfaceFlinger::authenticateSurfaceTextureLocked(
891         const sp<IGraphicBufferProducer>& /* bufferProducer */) const {
892     return false;
893 }
894 
getSupportedFrameTimestamps(std::vector<FrameEvent> * outSupported) const895 status_t SurfaceFlinger::getSupportedFrameTimestamps(
896         std::vector<FrameEvent>* outSupported) const {
897     *outSupported = {
898         FrameEvent::REQUESTED_PRESENT,
899         FrameEvent::ACQUIRE,
900         FrameEvent::LATCH,
901         FrameEvent::FIRST_REFRESH_START,
902         FrameEvent::LAST_REFRESH_START,
903         FrameEvent::GPU_COMPOSITION_DONE,
904         FrameEvent::DEQUEUE_READY,
905         FrameEvent::RELEASE,
906     };
907 
908     ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
909 
910     if (!getHwComposer().hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
911         outSupported->push_back(FrameEvent::DISPLAY_PRESENT);
912     }
913     return NO_ERROR;
914 }
915 
getDisplayState(const sp<IBinder> & displayToken,ui::DisplayState * state)916 status_t SurfaceFlinger::getDisplayState(const sp<IBinder>& displayToken, ui::DisplayState* state) {
917     if (!displayToken || !state) {
918         return BAD_VALUE;
919     }
920 
921     Mutex::Autolock lock(mStateLock);
922 
923     const auto display = getDisplayDeviceLocked(displayToken);
924     if (!display) {
925         return NAME_NOT_FOUND;
926     }
927 
928     state->layerStack = display->getLayerStack();
929     state->orientation = display->getOrientation();
930 
931     const Rect layerStackRect = display->getLayerStackSpaceRect();
932     state->layerStackSpaceRect =
933             layerStackRect.isValid() ? layerStackRect.getSize() : display->getSize();
934 
935     return NO_ERROR;
936 }
937 
getStaticDisplayInfo(const sp<IBinder> & displayToken,ui::StaticDisplayInfo * info)938 status_t SurfaceFlinger::getStaticDisplayInfo(const sp<IBinder>& displayToken,
939                                               ui::StaticDisplayInfo* info) {
940     if (!displayToken || !info) {
941         return BAD_VALUE;
942     }
943 
944     Mutex::Autolock lock(mStateLock);
945 
946     const auto display = getDisplayDeviceLocked(displayToken);
947     if (!display) {
948         return NAME_NOT_FOUND;
949     }
950 
951     if (const auto connectionType = display->getConnectionType())
952         info->connectionType = *connectionType;
953     else {
954         return INVALID_OPERATION;
955     }
956 
957     if (mEmulatedDisplayDensity) {
958         info->density = mEmulatedDisplayDensity;
959     } else {
960         info->density = info->connectionType == ui::DisplayConnectionType::Internal
961                 ? mInternalDisplayDensity
962                 : FALLBACK_DENSITY;
963     }
964     info->density /= ACONFIGURATION_DENSITY_MEDIUM;
965 
966     info->secure = display->isSecure();
967     info->deviceProductInfo = display->getDeviceProductInfo();
968     info->installOrientation = display->getPhysicalOrientation();
969 
970     return NO_ERROR;
971 }
972 
getDynamicDisplayInfo(const sp<IBinder> & displayToken,ui::DynamicDisplayInfo * info)973 status_t SurfaceFlinger::getDynamicDisplayInfo(const sp<IBinder>& displayToken,
974                                                ui::DynamicDisplayInfo* info) {
975     if (!displayToken || !info) {
976         return BAD_VALUE;
977     }
978 
979     Mutex::Autolock lock(mStateLock);
980 
981     const auto display = getDisplayDeviceLocked(displayToken);
982     if (!display) {
983         return NAME_NOT_FOUND;
984     }
985 
986     const auto displayId = PhysicalDisplayId::tryCast(display->getId());
987     if (!displayId) {
988         return INVALID_OPERATION;
989     }
990 
991     info->activeDisplayModeId = display->getActiveMode()->getId().value();
992 
993     const auto& supportedModes = display->getSupportedModes();
994     info->supportedDisplayModes.clear();
995     info->supportedDisplayModes.reserve(supportedModes.size());
996 
997     for (const auto& [id, mode] : supportedModes) {
998         ui::DisplayMode outMode;
999         outMode.id = static_cast<int32_t>(id.value());
1000 
1001         auto [width, height] = mode->getResolution();
1002         auto [xDpi, yDpi] = mode->getDpi();
1003 
1004         if (const auto physicalOrientation = display->getPhysicalOrientation();
1005             physicalOrientation == ui::ROTATION_90 || physicalOrientation == ui::ROTATION_270) {
1006             std::swap(width, height);
1007             std::swap(xDpi, yDpi);
1008         }
1009 
1010         outMode.resolution = ui::Size(width, height);
1011 
1012         outMode.xDpi = xDpi;
1013         outMode.yDpi = yDpi;
1014 
1015         const nsecs_t period = mode->getVsyncPeriod();
1016         outMode.refreshRate = Fps::fromPeriodNsecs(period).getValue();
1017 
1018         const auto vsyncConfigSet =
1019                 mVsyncConfiguration->getConfigsForRefreshRate(Fps::fromValue(outMode.refreshRate));
1020         outMode.appVsyncOffset = vsyncConfigSet.late.appOffset;
1021         outMode.sfVsyncOffset = vsyncConfigSet.late.sfOffset;
1022         outMode.group = mode->getGroup();
1023 
1024         // This is how far in advance a buffer must be queued for
1025         // presentation at a given time.  If you want a buffer to appear
1026         // on the screen at time N, you must submit the buffer before
1027         // (N - presentationDeadline).
1028         //
1029         // Normally it's one full refresh period (to give SF a chance to
1030         // latch the buffer), but this can be reduced by configuring a
1031         // VsyncController offset.  Any additional delays introduced by the hardware
1032         // composer or panel must be accounted for here.
1033         //
1034         // We add an additional 1ms to allow for processing time and
1035         // differences between the ideal and actual refresh rate.
1036         outMode.presentationDeadline = period - outMode.sfVsyncOffset + 1000000;
1037 
1038         info->supportedDisplayModes.push_back(outMode);
1039     }
1040 
1041     info->activeColorMode = display->getCompositionDisplay()->getState().colorMode;
1042     info->supportedColorModes = getDisplayColorModes(*display);
1043     info->hdrCapabilities = display->getHdrCapabilities();
1044 
1045     info->autoLowLatencyModeSupported =
1046             getHwComposer().hasDisplayCapability(*displayId,
1047                                                  DisplayCapability::AUTO_LOW_LATENCY_MODE);
1048     info->gameContentTypeSupported =
1049             getHwComposer().supportsContentType(*displayId, hal::ContentType::GAME);
1050 
1051     info->preferredBootDisplayMode = static_cast<ui::DisplayModeId>(-1);
1052 
1053     if (getHwComposer().hasCapability(Capability::BOOT_DISPLAY_CONFIG)) {
1054         if (const auto hwcId = getHwComposer().getPreferredBootDisplayMode(*displayId)) {
1055             if (const auto modeId = display->translateModeId(*hwcId)) {
1056                 info->preferredBootDisplayMode = modeId->value();
1057             }
1058         }
1059     }
1060 
1061     return NO_ERROR;
1062 }
1063 
getDisplayStats(const sp<IBinder> &,DisplayStatInfo * stats)1064 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>&, DisplayStatInfo* stats) {
1065     if (!stats) {
1066         return BAD_VALUE;
1067     }
1068 
1069     *stats = mScheduler->getDisplayStatInfo(systemTime());
1070     return NO_ERROR;
1071 }
1072 
setDesiredActiveMode(const ActiveModeInfo & info,bool force)1073 void SurfaceFlinger::setDesiredActiveMode(const ActiveModeInfo& info, bool force) {
1074     ATRACE_CALL();
1075 
1076     if (!info.mode) {
1077         ALOGW("requested display mode is null");
1078         return;
1079     }
1080     auto display = getDisplayDeviceLocked(info.mode->getPhysicalDisplayId());
1081     if (!display) {
1082         ALOGW("%s: display is no longer valid", __func__);
1083         return;
1084     }
1085 
1086     if (display->setDesiredActiveMode(info, force)) {
1087         scheduleComposite(FrameHint::kNone);
1088 
1089         // Start receiving vsync samples now, so that we can detect a period
1090         // switch.
1091         mScheduler->resyncToHardwareVsync(true, info.mode->getFps());
1092         // As we called to set period, we will call to onRefreshRateChangeCompleted once
1093         // VsyncController model is locked.
1094         modulateVsync(&VsyncModulator::onRefreshRateChangeInitiated);
1095 
1096         updatePhaseConfiguration(info.mode->getFps());
1097         mScheduler->setModeChangePending(true);
1098     }
1099 }
1100 
setActiveModeFromBackdoor(const sp<IBinder> & displayToken,int modeId)1101 status_t SurfaceFlinger::setActiveModeFromBackdoor(const sp<IBinder>& displayToken, int modeId) {
1102     ATRACE_CALL();
1103 
1104     if (!displayToken) {
1105         return BAD_VALUE;
1106     }
1107 
1108     auto future = mScheduler->schedule([=]() -> status_t {
1109         const auto display = FTL_FAKE_GUARD(mStateLock, getDisplayDeviceLocked(displayToken));
1110         if (!display) {
1111             ALOGE("Attempt to set allowed display modes for invalid display token %p",
1112                   displayToken.get());
1113             return NAME_NOT_FOUND;
1114         }
1115 
1116         if (display->isVirtual()) {
1117             ALOGW("Attempt to set allowed display modes for virtual display");
1118             return INVALID_OPERATION;
1119         }
1120 
1121         const auto mode = display->getMode(DisplayModeId{modeId});
1122         if (!mode) {
1123             ALOGW("Attempt to switch to an unsupported mode %d.", modeId);
1124             return BAD_VALUE;
1125         }
1126 
1127         const auto fps = mode->getFps();
1128         // Keep the old switching type.
1129         const auto allowGroupSwitching =
1130                 display->refreshRateConfigs().getCurrentPolicy().allowGroupSwitching;
1131         const scheduler::RefreshRateConfigs::Policy policy{mode->getId(),
1132                                                            allowGroupSwitching,
1133                                                            {fps, fps}};
1134         constexpr bool kOverridePolicy = false;
1135 
1136         return setDesiredDisplayModeSpecsInternal(display, policy, kOverridePolicy);
1137     });
1138 
1139     return future.get();
1140 }
1141 
updateInternalStateWithChangedMode()1142 void SurfaceFlinger::updateInternalStateWithChangedMode() {
1143     ATRACE_CALL();
1144 
1145     const auto display = getDefaultDisplayDeviceLocked();
1146     if (!display) {
1147         return;
1148     }
1149 
1150     const auto upcomingModeInfo =
1151             FTL_FAKE_GUARD(kMainThreadContext, display->getUpcomingActiveMode());
1152 
1153     if (!upcomingModeInfo.mode) {
1154         // There is no pending mode change. This can happen if the active
1155         // display changed and the mode change happened on a different display.
1156         return;
1157     }
1158 
1159     if (display->getActiveMode()->getResolution() != upcomingModeInfo.mode->getResolution()) {
1160         auto& state = mCurrentState.displays.editValueFor(display->getDisplayToken());
1161         // We need to generate new sequenceId in order to recreate the display (and this
1162         // way the framebuffer).
1163         state.sequenceId = DisplayDeviceState{}.sequenceId;
1164         state.physical->activeMode = upcomingModeInfo.mode;
1165         processDisplayChangesLocked();
1166 
1167         // processDisplayChangesLocked will update all necessary components so we're done here.
1168         return;
1169     }
1170 
1171     // We just created this display so we can call even if we are not on the main thread.
1172     ftl::FakeGuard guard(kMainThreadContext);
1173     display->setActiveMode(upcomingModeInfo.mode->getId());
1174 
1175     const Fps refreshRate = upcomingModeInfo.mode->getFps();
1176     mRefreshRateStats->setRefreshRate(refreshRate);
1177     updatePhaseConfiguration(refreshRate);
1178 
1179     if (upcomingModeInfo.event != DisplayModeEvent::None) {
1180         mScheduler->onPrimaryDisplayModeChanged(mAppConnectionHandle, upcomingModeInfo.mode);
1181     }
1182 }
1183 
clearDesiredActiveModeState(const sp<DisplayDevice> & display)1184 void SurfaceFlinger::clearDesiredActiveModeState(const sp<DisplayDevice>& display) {
1185     display->clearDesiredActiveModeState();
1186     if (isDisplayActiveLocked(display)) {
1187         mScheduler->setModeChangePending(false);
1188     }
1189 }
1190 
desiredActiveModeChangeDone(const sp<DisplayDevice> & display)1191 void SurfaceFlinger::desiredActiveModeChangeDone(const sp<DisplayDevice>& display) {
1192     const auto refreshRate = display->getDesiredActiveMode()->mode->getFps();
1193     clearDesiredActiveModeState(display);
1194     mScheduler->resyncToHardwareVsync(true, refreshRate);
1195     updatePhaseConfiguration(refreshRate);
1196 }
1197 
setActiveModeInHwcIfNeeded()1198 void SurfaceFlinger::setActiveModeInHwcIfNeeded() {
1199     ATRACE_CALL();
1200 
1201     std::optional<PhysicalDisplayId> displayToUpdateImmediately;
1202 
1203     for (const auto& iter : mDisplays) {
1204         const auto& display = iter.second;
1205         if (!display || !display->isInternal()) {
1206             continue;
1207         }
1208 
1209         // Store the local variable to release the lock.
1210         const auto desiredActiveMode = display->getDesiredActiveMode();
1211         if (!desiredActiveMode) {
1212             // No desired active mode pending to be applied
1213             continue;
1214         }
1215 
1216         if (!isDisplayActiveLocked(display)) {
1217             // display is no longer the active display, so abort the mode change
1218             clearDesiredActiveModeState(display);
1219             continue;
1220         }
1221 
1222         const auto desiredMode = display->getMode(desiredActiveMode->mode->getId());
1223         if (!desiredMode) {
1224             ALOGW("Desired display mode is no longer supported. Mode ID = %d",
1225                   desiredActiveMode->mode->getId().value());
1226             clearDesiredActiveModeState(display);
1227             continue;
1228         }
1229 
1230         const auto refreshRate = desiredMode->getFps();
1231         ALOGV("%s changing active mode to %d(%s) for display %s", __func__,
1232               desiredMode->getId().value(), to_string(refreshRate).c_str(),
1233               to_string(display->getId()).c_str());
1234 
1235         if (display->getActiveMode()->getId() == desiredActiveMode->mode->getId()) {
1236             // we are already in the requested mode, there is nothing left to do
1237             desiredActiveModeChangeDone(display);
1238             continue;
1239         }
1240 
1241         // Desired active mode was set, it is different than the mode currently in use, however
1242         // allowed modes might have changed by the time we process the refresh.
1243         // Make sure the desired mode is still allowed
1244         const auto displayModeAllowed =
1245                 display->refreshRateConfigs().isModeAllowed(desiredActiveMode->mode->getId());
1246         if (!displayModeAllowed) {
1247             clearDesiredActiveModeState(display);
1248             continue;
1249         }
1250 
1251         // TODO(b/142753666) use constrains
1252         hal::VsyncPeriodChangeConstraints constraints;
1253         constraints.desiredTimeNanos = systemTime();
1254         constraints.seamlessRequired = false;
1255         hal::VsyncPeriodChangeTimeline outTimeline;
1256 
1257         const auto status = FTL_FAKE_GUARD(kMainThreadContext,
1258                                            display->initiateModeChange(*desiredActiveMode,
1259                                                                        constraints, &outTimeline));
1260 
1261         if (status != NO_ERROR) {
1262             // initiateModeChange may fail if a hotplug event is just about
1263             // to be sent. We just log the error in this case.
1264             ALOGW("initiateModeChange failed: %d", status);
1265             continue;
1266         }
1267         mScheduler->onNewVsyncPeriodChangeTimeline(outTimeline);
1268 
1269         if (outTimeline.refreshRequired) {
1270             scheduleComposite(FrameHint::kNone);
1271             mSetActiveModePending = true;
1272         } else {
1273             // Updating the internal state should be done outside the loop,
1274             // because it can recreate a DisplayDevice and modify mDisplays
1275             // which will invalidate the iterator.
1276             displayToUpdateImmediately = display->getPhysicalId();
1277         }
1278     }
1279 
1280     if (displayToUpdateImmediately) {
1281         updateInternalStateWithChangedMode();
1282 
1283         const auto display = getDisplayDeviceLocked(*displayToUpdateImmediately);
1284         const auto desiredActiveMode = display->getDesiredActiveMode();
1285         if (desiredActiveMode &&
1286             display->getActiveMode()->getId() == desiredActiveMode->mode->getId()) {
1287             desiredActiveModeChangeDone(display);
1288         }
1289     }
1290 }
1291 
disableExpensiveRendering()1292 void SurfaceFlinger::disableExpensiveRendering() {
1293     const char* const whence = __func__;
1294     auto future = mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) {
1295         ATRACE_NAME(whence);
1296         if (mPowerAdvisor->isUsingExpensiveRendering()) {
1297             for (const auto& [_, display] : mDisplays) {
1298                 constexpr bool kDisable = false;
1299                 mPowerAdvisor->setExpensiveRenderingExpected(display->getId(), kDisable);
1300             }
1301         }
1302     });
1303 
1304     future.wait();
1305 }
1306 
getDisplayColorModes(const DisplayDevice & display)1307 std::vector<ColorMode> SurfaceFlinger::getDisplayColorModes(const DisplayDevice& display) {
1308     auto modes = getHwComposer().getColorModes(display.getPhysicalId());
1309 
1310     // If the display is internal and the configuration claims it's not wide color capable,
1311     // filter out all wide color modes. The typical reason why this happens is that the
1312     // hardware is not good enough to support GPU composition of wide color, and thus the
1313     // OEMs choose to disable this capability.
1314     if (display.getConnectionType() == ui::DisplayConnectionType::Internal &&
1315         !hasWideColorDisplay) {
1316         const auto newEnd = std::remove_if(modes.begin(), modes.end(), isWideColorMode);
1317         modes.erase(newEnd, modes.end());
1318     }
1319 
1320     return modes;
1321 }
1322 
getDisplayNativePrimaries(const sp<IBinder> & displayToken,ui::DisplayPrimaries & primaries)1323 status_t SurfaceFlinger::getDisplayNativePrimaries(const sp<IBinder>& displayToken,
1324                                                    ui::DisplayPrimaries& primaries) {
1325     if (!displayToken) {
1326         return BAD_VALUE;
1327     }
1328 
1329     Mutex::Autolock lock(mStateLock);
1330 
1331     const auto display = getDisplayDeviceLocked(displayToken);
1332     if (!display) {
1333         return NAME_NOT_FOUND;
1334     }
1335 
1336     const auto connectionType = display->getConnectionType();
1337     if (connectionType != ui::DisplayConnectionType::Internal) {
1338         return INVALID_OPERATION;
1339     }
1340 
1341     // TODO(b/229846990): For now, assume that all internal displays have the same primaries.
1342     primaries = mInternalDisplayPrimaries;
1343     return NO_ERROR;
1344 }
1345 
setActiveColorMode(const sp<IBinder> & displayToken,ColorMode mode)1346 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& displayToken, ColorMode mode) {
1347     if (!displayToken) {
1348         return BAD_VALUE;
1349     }
1350 
1351     auto future = mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) -> status_t {
1352         const auto display = getDisplayDeviceLocked(displayToken);
1353         if (!display) {
1354             ALOGE("Attempt to set active color mode %s (%d) for invalid display token %p",
1355                   decodeColorMode(mode).c_str(), mode, displayToken.get());
1356             return NAME_NOT_FOUND;
1357         }
1358 
1359         if (display->isVirtual()) {
1360             ALOGW("Attempt to set active color mode %s (%d) for virtual display",
1361                   decodeColorMode(mode).c_str(), mode);
1362             return INVALID_OPERATION;
1363         }
1364 
1365         const auto modes = getDisplayColorModes(*display);
1366         const bool exists = std::find(modes.begin(), modes.end(), mode) != modes.end();
1367 
1368         if (mode < ColorMode::NATIVE || !exists) {
1369             ALOGE("Attempt to set invalid active color mode %s (%d) for display token %p",
1370                   decodeColorMode(mode).c_str(), mode, displayToken.get());
1371             return BAD_VALUE;
1372         }
1373 
1374         display->getCompositionDisplay()->setColorProfile(
1375                 {mode, Dataspace::UNKNOWN, RenderIntent::COLORIMETRIC, Dataspace::UNKNOWN});
1376 
1377         return NO_ERROR;
1378     });
1379 
1380     // TODO(b/195698395): Propagate error.
1381     future.wait();
1382     return NO_ERROR;
1383 }
1384 
getBootDisplayModeSupport(bool * outSupport) const1385 status_t SurfaceFlinger::getBootDisplayModeSupport(bool* outSupport) const {
1386     auto future = mScheduler->schedule(
1387             [this] { return getHwComposer().hasCapability(Capability::BOOT_DISPLAY_CONFIG); });
1388 
1389     *outSupport = future.get();
1390     return NO_ERROR;
1391 }
1392 
setBootDisplayMode(const sp<IBinder> & displayToken,ui::DisplayModeId modeId)1393 status_t SurfaceFlinger::setBootDisplayMode(const sp<IBinder>& displayToken,
1394                                             ui::DisplayModeId modeId) {
1395     const char* const whence = __func__;
1396     auto future = mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) -> status_t {
1397         const auto display = getDisplayDeviceLocked(displayToken);
1398         if (!display) {
1399             ALOGE("%s: Invalid display token %p", whence, displayToken.get());
1400             return NAME_NOT_FOUND;
1401         }
1402 
1403         if (display->isVirtual()) {
1404             ALOGE("%s: Invalid operation on virtual display", whence);
1405             return INVALID_OPERATION;
1406         }
1407 
1408         const auto displayId = display->getPhysicalId();
1409         const auto mode = display->getMode(DisplayModeId{modeId});
1410         if (!mode) {
1411             ALOGE("%s: Invalid mode %d for display %s", whence, modeId,
1412                   to_string(displayId).c_str());
1413             return BAD_VALUE;
1414         }
1415 
1416         return getHwComposer().setBootDisplayMode(displayId, mode->getHwcId());
1417     });
1418     return future.get();
1419 }
1420 
clearBootDisplayMode(const sp<IBinder> & displayToken)1421 status_t SurfaceFlinger::clearBootDisplayMode(const sp<IBinder>& displayToken) {
1422     const char* const whence = __func__;
1423     auto future = mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) -> status_t {
1424         if (const auto displayId = getPhysicalDisplayIdLocked(displayToken)) {
1425             return getHwComposer().clearBootDisplayMode(*displayId);
1426         } else {
1427             ALOGE("%s: Invalid display token %p", whence, displayToken.get());
1428             return BAD_VALUE;
1429         }
1430     });
1431     return future.get();
1432 }
1433 
setAutoLowLatencyMode(const sp<IBinder> & displayToken,bool on)1434 void SurfaceFlinger::setAutoLowLatencyMode(const sp<IBinder>& displayToken, bool on) {
1435     const char* const whence = __func__;
1436     static_cast<void>(mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) {
1437         if (const auto displayId = getPhysicalDisplayIdLocked(displayToken)) {
1438             getHwComposer().setAutoLowLatencyMode(*displayId, on);
1439         } else {
1440             ALOGE("%s: Invalid display token %p", whence, displayToken.get());
1441         }
1442     }));
1443 }
1444 
setGameContentType(const sp<IBinder> & displayToken,bool on)1445 void SurfaceFlinger::setGameContentType(const sp<IBinder>& displayToken, bool on) {
1446     const char* const whence = __func__;
1447     static_cast<void>(mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) {
1448         if (const auto displayId = getPhysicalDisplayIdLocked(displayToken)) {
1449             const auto type = on ? hal::ContentType::GAME : hal::ContentType::NONE;
1450             getHwComposer().setContentType(*displayId, type);
1451         } else {
1452             ALOGE("%s: Invalid display token %p", whence, displayToken.get());
1453         }
1454     }));
1455 }
1456 
clearAnimationFrameStats()1457 status_t SurfaceFlinger::clearAnimationFrameStats() {
1458     Mutex::Autolock _l(mStateLock);
1459     mAnimFrameTracker.clearStats();
1460     return NO_ERROR;
1461 }
1462 
getAnimationFrameStats(FrameStats * outStats) const1463 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
1464     Mutex::Autolock _l(mStateLock);
1465     mAnimFrameTracker.getStats(outStats);
1466     return NO_ERROR;
1467 }
1468 
overrideHdrTypes(const sp<IBinder> & displayToken,const std::vector<ui::Hdr> & hdrTypes)1469 status_t SurfaceFlinger::overrideHdrTypes(const sp<IBinder>& displayToken,
1470                                           const std::vector<ui::Hdr>& hdrTypes) {
1471     Mutex::Autolock lock(mStateLock);
1472 
1473     auto display = getDisplayDeviceLocked(displayToken);
1474     if (!display) {
1475         ALOGE("%s: Invalid display token %p", __func__, displayToken.get());
1476         return NAME_NOT_FOUND;
1477     }
1478 
1479     display->overrideHdrTypes(hdrTypes);
1480     dispatchDisplayHotplugEvent(display->getPhysicalId(), true /* connected */);
1481     return NO_ERROR;
1482 }
1483 
onPullAtom(const int32_t atomId,std::string * pulledData,bool * success)1484 status_t SurfaceFlinger::onPullAtom(const int32_t atomId, std::string* pulledData, bool* success) {
1485     *success = mTimeStats->onPullAtom(atomId, pulledData);
1486     return NO_ERROR;
1487 }
1488 
getDisplayedContentSamplingAttributes(const sp<IBinder> & displayToken,ui::PixelFormat * outFormat,ui::Dataspace * outDataspace,uint8_t * outComponentMask) const1489 status_t SurfaceFlinger::getDisplayedContentSamplingAttributes(const sp<IBinder>& displayToken,
1490                                                                ui::PixelFormat* outFormat,
1491                                                                ui::Dataspace* outDataspace,
1492                                                                uint8_t* outComponentMask) const {
1493     if (!outFormat || !outDataspace || !outComponentMask) {
1494         return BAD_VALUE;
1495     }
1496 
1497     Mutex::Autolock lock(mStateLock);
1498 
1499     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1500     if (!displayId) {
1501         return NAME_NOT_FOUND;
1502     }
1503 
1504     return getHwComposer().getDisplayedContentSamplingAttributes(*displayId, outFormat,
1505                                                                  outDataspace, outComponentMask);
1506 }
1507 
setDisplayContentSamplingEnabled(const sp<IBinder> & displayToken,bool enable,uint8_t componentMask,uint64_t maxFrames)1508 status_t SurfaceFlinger::setDisplayContentSamplingEnabled(const sp<IBinder>& displayToken,
1509                                                           bool enable, uint8_t componentMask,
1510                                                           uint64_t maxFrames) {
1511     const char* const whence = __func__;
1512     auto future = mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) -> status_t {
1513         if (const auto displayId = getPhysicalDisplayIdLocked(displayToken)) {
1514             return getHwComposer().setDisplayContentSamplingEnabled(*displayId, enable,
1515                                                                     componentMask, maxFrames);
1516         } else {
1517             ALOGE("%s: Invalid display token %p", whence, displayToken.get());
1518             return NAME_NOT_FOUND;
1519         }
1520     });
1521 
1522     return future.get();
1523 }
1524 
getDisplayedContentSample(const sp<IBinder> & displayToken,uint64_t maxFrames,uint64_t timestamp,DisplayedFrameStats * outStats) const1525 status_t SurfaceFlinger::getDisplayedContentSample(const sp<IBinder>& displayToken,
1526                                                    uint64_t maxFrames, uint64_t timestamp,
1527                                                    DisplayedFrameStats* outStats) const {
1528     Mutex::Autolock lock(mStateLock);
1529 
1530     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1531     if (!displayId) {
1532         return NAME_NOT_FOUND;
1533     }
1534 
1535     return getHwComposer().getDisplayedContentSample(*displayId, maxFrames, timestamp, outStats);
1536 }
1537 
getProtectedContentSupport(bool * outSupported) const1538 status_t SurfaceFlinger::getProtectedContentSupport(bool* outSupported) const {
1539     if (!outSupported) {
1540         return BAD_VALUE;
1541     }
1542     *outSupported = getRenderEngine().supportsProtectedContent();
1543     return NO_ERROR;
1544 }
1545 
isWideColorDisplay(const sp<IBinder> & displayToken,bool * outIsWideColorDisplay) const1546 status_t SurfaceFlinger::isWideColorDisplay(const sp<IBinder>& displayToken,
1547                                             bool* outIsWideColorDisplay) const {
1548     if (!displayToken || !outIsWideColorDisplay) {
1549         return BAD_VALUE;
1550     }
1551 
1552     Mutex::Autolock lock(mStateLock);
1553     const auto display = getDisplayDeviceLocked(displayToken);
1554     if (!display) {
1555         return NAME_NOT_FOUND;
1556     }
1557 
1558     *outIsWideColorDisplay =
1559             display->isPrimary() ? hasWideColorDisplay : display->hasWideColorGamut();
1560     return NO_ERROR;
1561 }
1562 
enableVSyncInjections(bool enable)1563 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
1564     auto future = mScheduler->schedule([=] {
1565         Mutex::Autolock lock(mStateLock);
1566 
1567         if (const auto handle = mScheduler->enableVSyncInjection(enable)) {
1568             mScheduler->setInjector(enable ? mScheduler->getEventConnection(handle) : nullptr);
1569         }
1570     });
1571 
1572     future.wait();
1573     return NO_ERROR;
1574 }
1575 
injectVSync(nsecs_t when)1576 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
1577     Mutex::Autolock lock(mStateLock);
1578     const DisplayStatInfo stats = mScheduler->getDisplayStatInfo(when);
1579     const auto expectedPresent = calculateExpectedPresentTime(stats);
1580     return mScheduler->injectVSync(when, /*expectedVSyncTime=*/expectedPresent,
1581                                    /*deadlineTimestamp=*/expectedPresent)
1582             ? NO_ERROR
1583             : BAD_VALUE;
1584 }
1585 
getLayerDebugInfo(std::vector<LayerDebugInfo> * outLayers)1586 status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) {
1587     outLayers->clear();
1588     auto future = mScheduler->schedule([=] {
1589         const auto display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked());
1590         mDrawingState.traverseInZOrder([&](Layer* layer) {
1591             outLayers->push_back(layer->getLayerDebugInfo(display.get()));
1592         });
1593     });
1594 
1595     future.wait();
1596     return NO_ERROR;
1597 }
1598 
getCompositionPreference(Dataspace * outDataspace,ui::PixelFormat * outPixelFormat,Dataspace * outWideColorGamutDataspace,ui::PixelFormat * outWideColorGamutPixelFormat) const1599 status_t SurfaceFlinger::getCompositionPreference(
1600         Dataspace* outDataspace, ui::PixelFormat* outPixelFormat,
1601         Dataspace* outWideColorGamutDataspace,
1602         ui::PixelFormat* outWideColorGamutPixelFormat) const {
1603     *outDataspace = mDefaultCompositionDataspace;
1604     *outPixelFormat = defaultCompositionPixelFormat;
1605     *outWideColorGamutDataspace = mWideColorGamutCompositionDataspace;
1606     *outWideColorGamutPixelFormat = wideColorGamutCompositionPixelFormat;
1607     return NO_ERROR;
1608 }
1609 
addRegionSamplingListener(const Rect & samplingArea,const sp<IBinder> & stopLayerHandle,const sp<IRegionSamplingListener> & listener)1610 status_t SurfaceFlinger::addRegionSamplingListener(const Rect& samplingArea,
1611                                                    const sp<IBinder>& stopLayerHandle,
1612                                                    const sp<IRegionSamplingListener>& listener) {
1613     if (!listener || samplingArea == Rect::INVALID_RECT || samplingArea.isEmpty()) {
1614         return BAD_VALUE;
1615     }
1616 
1617     const wp<Layer> stopLayer = fromHandle(stopLayerHandle);
1618     mRegionSamplingThread->addListener(samplingArea, stopLayer, listener);
1619     return NO_ERROR;
1620 }
1621 
removeRegionSamplingListener(const sp<IRegionSamplingListener> & listener)1622 status_t SurfaceFlinger::removeRegionSamplingListener(const sp<IRegionSamplingListener>& listener) {
1623     if (!listener) {
1624         return BAD_VALUE;
1625     }
1626     mRegionSamplingThread->removeListener(listener);
1627     return NO_ERROR;
1628 }
1629 
addFpsListener(int32_t taskId,const sp<gui::IFpsListener> & listener)1630 status_t SurfaceFlinger::addFpsListener(int32_t taskId, const sp<gui::IFpsListener>& listener) {
1631     if (!listener) {
1632         return BAD_VALUE;
1633     }
1634 
1635     mFpsReporter->addListener(listener, taskId);
1636     return NO_ERROR;
1637 }
1638 
removeFpsListener(const sp<gui::IFpsListener> & listener)1639 status_t SurfaceFlinger::removeFpsListener(const sp<gui::IFpsListener>& listener) {
1640     if (!listener) {
1641         return BAD_VALUE;
1642     }
1643     mFpsReporter->removeListener(listener);
1644     return NO_ERROR;
1645 }
1646 
addTunnelModeEnabledListener(const sp<gui::ITunnelModeEnabledListener> & listener)1647 status_t SurfaceFlinger::addTunnelModeEnabledListener(
1648         const sp<gui::ITunnelModeEnabledListener>& listener) {
1649     if (!listener) {
1650         return BAD_VALUE;
1651     }
1652 
1653     mTunnelModeEnabledReporter->addListener(listener);
1654     return NO_ERROR;
1655 }
1656 
removeTunnelModeEnabledListener(const sp<gui::ITunnelModeEnabledListener> & listener)1657 status_t SurfaceFlinger::removeTunnelModeEnabledListener(
1658         const sp<gui::ITunnelModeEnabledListener>& listener) {
1659     if (!listener) {
1660         return BAD_VALUE;
1661     }
1662 
1663     mTunnelModeEnabledReporter->removeListener(listener);
1664     return NO_ERROR;
1665 }
1666 
getDisplayBrightnessSupport(const sp<IBinder> & displayToken,bool * outSupport) const1667 status_t SurfaceFlinger::getDisplayBrightnessSupport(const sp<IBinder>& displayToken,
1668                                                      bool* outSupport) const {
1669     if (!displayToken || !outSupport) {
1670         return BAD_VALUE;
1671     }
1672 
1673     Mutex::Autolock lock(mStateLock);
1674 
1675     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1676     if (!displayId) {
1677         return NAME_NOT_FOUND;
1678     }
1679     *outSupport = getHwComposer().hasDisplayCapability(*displayId, DisplayCapability::BRIGHTNESS);
1680     return NO_ERROR;
1681 }
1682 
hasVisibleHdrLayer(const sp<DisplayDevice> & display)1683 bool SurfaceFlinger::hasVisibleHdrLayer(const sp<DisplayDevice>& display) {
1684     bool hasHdrLayers = false;
1685     mDrawingState.traverse([&,
1686                             compositionDisplay = display->getCompositionDisplay()](Layer* layer) {
1687         hasHdrLayers |= (layer->isVisible() &&
1688                          compositionDisplay->includesLayer(layer->getCompositionEngineLayerFE()) &&
1689                          isHdrDataspace(layer->getDataSpace()));
1690     });
1691     return hasHdrLayers;
1692 }
1693 
setDisplayBrightness(const sp<IBinder> & displayToken,const gui::DisplayBrightness & brightness)1694 status_t SurfaceFlinger::setDisplayBrightness(const sp<IBinder>& displayToken,
1695                                               const gui::DisplayBrightness& brightness) {
1696     if (!displayToken) {
1697         return BAD_VALUE;
1698     }
1699 
1700     const char* const whence = __func__;
1701     return ftl::Future(mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) {
1702                if (const auto display = getDisplayDeviceLocked(displayToken)) {
1703                    const bool supportsDisplayBrightnessCommand =
1704                            getHwComposer().getComposer()->isSupported(
1705                                    Hwc2::Composer::OptionalFeature::DisplayBrightnessCommand);
1706                    // If we support applying display brightness as a command, then we also support
1707                    // dimming SDR layers.
1708                    if (supportsDisplayBrightnessCommand) {
1709                        auto compositionDisplay = display->getCompositionDisplay();
1710                        float currentDimmingRatio =
1711                                compositionDisplay->editState().sdrWhitePointNits /
1712                                compositionDisplay->editState().displayBrightnessNits;
1713                        compositionDisplay->setDisplayBrightness(brightness.sdrWhitePointNits,
1714                                                                 brightness.displayBrightnessNits);
1715                        FTL_FAKE_GUARD(kMainThreadContext,
1716                                       display->stageBrightness(brightness.displayBrightness));
1717 
1718                        if (brightness.sdrWhitePointNits / brightness.displayBrightnessNits !=
1719                            currentDimmingRatio) {
1720                            scheduleComposite(FrameHint::kNone);
1721                        } else {
1722                            scheduleCommit(FrameHint::kNone);
1723                        }
1724                        return ftl::yield<status_t>(OK);
1725                    } else {
1726                        return getHwComposer()
1727                                .setDisplayBrightness(display->getPhysicalId(),
1728                                                      brightness.displayBrightness,
1729                                                      brightness.displayBrightnessNits,
1730                                                      Hwc2::Composer::DisplayBrightnessOptions{
1731                                                              .applyImmediately = true});
1732                    }
1733 
1734                } else {
1735                    ALOGE("%s: Invalid display token %p", whence, displayToken.get());
1736                    return ftl::yield<status_t>(NAME_NOT_FOUND);
1737                }
1738            }))
1739             .then([](ftl::Future<status_t> task) { return task; })
1740             .get();
1741 }
1742 
addHdrLayerInfoListener(const sp<IBinder> & displayToken,const sp<gui::IHdrLayerInfoListener> & listener)1743 status_t SurfaceFlinger::addHdrLayerInfoListener(const sp<IBinder>& displayToken,
1744                                                  const sp<gui::IHdrLayerInfoListener>& listener) {
1745     if (!displayToken) {
1746         return BAD_VALUE;
1747     }
1748 
1749     Mutex::Autolock lock(mStateLock);
1750 
1751     const auto display = getDisplayDeviceLocked(displayToken);
1752     if (!display) {
1753         return NAME_NOT_FOUND;
1754     }
1755     const auto displayId = display->getId();
1756     sp<HdrLayerInfoReporter>& hdrInfoReporter = mHdrLayerInfoListeners[displayId];
1757     if (!hdrInfoReporter) {
1758         hdrInfoReporter = sp<HdrLayerInfoReporter>::make();
1759     }
1760     hdrInfoReporter->addListener(listener);
1761 
1762 
1763     mAddingHDRLayerInfoListener = true;
1764     return OK;
1765 }
1766 
removeHdrLayerInfoListener(const sp<IBinder> & displayToken,const sp<gui::IHdrLayerInfoListener> & listener)1767 status_t SurfaceFlinger::removeHdrLayerInfoListener(
1768         const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
1769     if (!displayToken) {
1770         return BAD_VALUE;
1771     }
1772 
1773     Mutex::Autolock lock(mStateLock);
1774 
1775     const auto display = getDisplayDeviceLocked(displayToken);
1776     if (!display) {
1777         return NAME_NOT_FOUND;
1778     }
1779     const auto displayId = display->getId();
1780     sp<HdrLayerInfoReporter>& hdrInfoReporter = mHdrLayerInfoListeners[displayId];
1781     if (hdrInfoReporter) {
1782         hdrInfoReporter->removeListener(listener);
1783     }
1784     return OK;
1785 }
1786 
notifyPowerBoost(int32_t boostId)1787 status_t SurfaceFlinger::notifyPowerBoost(int32_t boostId) {
1788     using hardware::power::Boost;
1789     Boost powerBoost = static_cast<Boost>(boostId);
1790 
1791     if (powerBoost == Boost::INTERACTION) {
1792         mScheduler->onTouchHint();
1793     }
1794 
1795     return NO_ERROR;
1796 }
1797 
getDisplayDecorationSupport(const sp<IBinder> & displayToken,std::optional<DisplayDecorationSupport> * outSupport) const1798 status_t SurfaceFlinger::getDisplayDecorationSupport(
1799         const sp<IBinder>& displayToken,
1800         std::optional<DisplayDecorationSupport>* outSupport) const {
1801     if (!displayToken || !outSupport) {
1802         return BAD_VALUE;
1803     }
1804 
1805     Mutex::Autolock lock(mStateLock);
1806 
1807     const auto displayId = getPhysicalDisplayIdLocked(displayToken);
1808     if (!displayId) {
1809         return NAME_NOT_FOUND;
1810     }
1811     getHwComposer().getDisplayDecorationSupport(*displayId, outSupport);
1812     return NO_ERROR;
1813 }
1814 
1815 // ----------------------------------------------------------------------------
1816 
createDisplayEventConnection(ISurfaceComposer::VsyncSource vsyncSource,ISurfaceComposer::EventRegistrationFlags eventRegistration)1817 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
1818         ISurfaceComposer::VsyncSource vsyncSource,
1819         ISurfaceComposer::EventRegistrationFlags eventRegistration) {
1820     const auto& handle =
1821             vsyncSource == eVsyncSourceSurfaceFlinger ? mSfConnectionHandle : mAppConnectionHandle;
1822 
1823     return mScheduler->createDisplayEventConnection(handle, eventRegistration);
1824 }
1825 
scheduleCommit(FrameHint hint)1826 void SurfaceFlinger::scheduleCommit(FrameHint hint) {
1827     if (hint == FrameHint::kActive) {
1828         mScheduler->resetIdleTimer();
1829     }
1830     mPowerAdvisor->notifyDisplayUpdateImminent();
1831     mScheduler->scheduleFrame();
1832 }
1833 
scheduleComposite(FrameHint hint)1834 void SurfaceFlinger::scheduleComposite(FrameHint hint) {
1835     mMustComposite = true;
1836     scheduleCommit(hint);
1837 }
1838 
scheduleRepaint()1839 void SurfaceFlinger::scheduleRepaint() {
1840     mGeometryDirty = true;
1841     scheduleComposite(FrameHint::kActive);
1842 }
1843 
scheduleSample()1844 void SurfaceFlinger::scheduleSample() {
1845     static_cast<void>(mScheduler->schedule([this] { sample(); }));
1846 }
1847 
getVsyncPeriodFromHWC() const1848 nsecs_t SurfaceFlinger::getVsyncPeriodFromHWC() const {
1849     if (const auto display = getDefaultDisplayDeviceLocked()) {
1850         return display->getVsyncPeriodFromHWC();
1851     }
1852 
1853     return 0;
1854 }
1855 
onComposerHalVsync(hal::HWDisplayId hwcDisplayId,int64_t timestamp,std::optional<hal::VsyncPeriodNanos> vsyncPeriod)1856 void SurfaceFlinger::onComposerHalVsync(hal::HWDisplayId hwcDisplayId, int64_t timestamp,
1857                                         std::optional<hal::VsyncPeriodNanos> vsyncPeriod) {
1858     const std::string tracePeriod = [vsyncPeriod]() {
1859         if (ATRACE_ENABLED() && vsyncPeriod) {
1860             std::stringstream ss;
1861             ss << "(" << *vsyncPeriod << ")";
1862             return ss.str();
1863         }
1864         return std::string();
1865     }();
1866     ATRACE_FORMAT("onComposerHalVsync%s", tracePeriod.c_str());
1867 
1868     Mutex::Autolock lock(mStateLock);
1869     const auto displayId = getHwComposer().toPhysicalDisplayId(hwcDisplayId);
1870     if (displayId) {
1871         const auto token = getPhysicalDisplayTokenLocked(*displayId);
1872         const auto display = getDisplayDeviceLocked(token);
1873         display->onVsync(timestamp);
1874     }
1875 
1876     if (!getHwComposer().onVsync(hwcDisplayId, timestamp)) {
1877         return;
1878     }
1879 
1880     const bool isActiveDisplay =
1881             displayId && getPhysicalDisplayTokenLocked(*displayId) == mActiveDisplayToken;
1882     if (!isActiveDisplay) {
1883         // For now, we don't do anything with non active display vsyncs.
1884         return;
1885     }
1886 
1887     bool periodFlushed = false;
1888     mScheduler->addResyncSample(timestamp, vsyncPeriod, &periodFlushed);
1889     if (periodFlushed) {
1890         modulateVsync(&VsyncModulator::onRefreshRateChangeCompleted);
1891     }
1892 }
1893 
getCompositorTiming(CompositorTiming * compositorTiming)1894 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1895     std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1896     *compositorTiming = getBE().mCompositorTiming;
1897 }
1898 
onComposerHalHotplug(hal::HWDisplayId hwcDisplayId,hal::Connection connection)1899 void SurfaceFlinger::onComposerHalHotplug(hal::HWDisplayId hwcDisplayId,
1900                                           hal::Connection connection) {
1901     const bool connected = connection == hal::Connection::CONNECTED;
1902     ALOGI("%s HAL display %" PRIu64, connected ? "Connecting" : "Disconnecting", hwcDisplayId);
1903 
1904     // Only lock if we're not on the main thread. This function is normally
1905     // called on a hwbinder thread, but for the primary display it's called on
1906     // the main thread with the state lock already held, so don't attempt to
1907     // acquire it here.
1908     ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
1909 
1910     mPendingHotplugEvents.emplace_back(HotplugEvent{hwcDisplayId, connection});
1911 
1912     if (std::this_thread::get_id() == mMainThreadId) {
1913         // Process all pending hot plug events immediately if we are on the main thread.
1914         processDisplayHotplugEventsLocked();
1915     }
1916 
1917     setTransactionFlags(eDisplayTransactionNeeded);
1918 }
1919 
onComposerHalVsyncPeriodTimingChanged(hal::HWDisplayId,const hal::VsyncPeriodChangeTimeline & timeline)1920 void SurfaceFlinger::onComposerHalVsyncPeriodTimingChanged(
1921         hal::HWDisplayId, const hal::VsyncPeriodChangeTimeline& timeline) {
1922     Mutex::Autolock lock(mStateLock);
1923     mScheduler->onNewVsyncPeriodChangeTimeline(timeline);
1924 
1925     if (timeline.refreshRequired) {
1926         scheduleComposite(FrameHint::kNone);
1927     }
1928 }
1929 
onComposerHalSeamlessPossible(hal::HWDisplayId)1930 void SurfaceFlinger::onComposerHalSeamlessPossible(hal::HWDisplayId) {
1931     // TODO(b/142753666): use constraints when calling to setActiveModeWithConstraints and
1932     // use this callback to know when to retry in case of SEAMLESS_NOT_POSSIBLE.
1933 }
1934 
onComposerHalRefresh(hal::HWDisplayId)1935 void SurfaceFlinger::onComposerHalRefresh(hal::HWDisplayId) {
1936     Mutex::Autolock lock(mStateLock);
1937     scheduleComposite(FrameHint::kNone);
1938 }
1939 
onComposerHalVsyncIdle(hal::HWDisplayId)1940 void SurfaceFlinger::onComposerHalVsyncIdle(hal::HWDisplayId) {
1941     ATRACE_CALL();
1942     mScheduler->forceNextResync();
1943 }
1944 
setVsyncEnabled(bool enabled)1945 void SurfaceFlinger::setVsyncEnabled(bool enabled) {
1946     ATRACE_CALL();
1947 
1948     // On main thread to avoid race conditions with display power state.
1949     static_cast<void>(mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) {
1950         mHWCVsyncPendingState = enabled ? hal::Vsync::ENABLE : hal::Vsync::DISABLE;
1951 
1952         if (const auto display = getDefaultDisplayDeviceLocked();
1953             display && display->isPoweredOn()) {
1954             setHWCVsyncEnabled(display->getPhysicalId(), mHWCVsyncPendingState);
1955         }
1956     }));
1957 }
1958 
previousFrameFence()1959 SurfaceFlinger::FenceWithFenceTime SurfaceFlinger::previousFrameFence() {
1960     const auto now = systemTime();
1961     const auto vsyncPeriod = mScheduler->getDisplayStatInfo(now).vsyncPeriod;
1962     const bool expectedPresentTimeIsTheNextVsync = mExpectedPresentTime - now <= vsyncPeriod;
1963     return expectedPresentTimeIsTheNextVsync ? mPreviousPresentFences[0]
1964                                              : mPreviousPresentFences[1];
1965 }
1966 
previousFramePending(int graceTimeMs)1967 bool SurfaceFlinger::previousFramePending(int graceTimeMs) {
1968     ATRACE_CALL();
1969     const std::shared_ptr<FenceTime>& fence = previousFrameFence().fenceTime;
1970 
1971     if (fence == FenceTime::NO_FENCE) {
1972         return false;
1973     }
1974 
1975     const status_t status = fence->wait(graceTimeMs);
1976     // This is the same as Fence::Status::Unsignaled, but it saves a getStatus() call,
1977     // which calls wait(0) again internally
1978     return status == -ETIME;
1979 }
1980 
previousFramePresentTime()1981 nsecs_t SurfaceFlinger::previousFramePresentTime() {
1982     const std::shared_ptr<FenceTime>& fence = previousFrameFence().fenceTime;
1983 
1984     if (fence == FenceTime::NO_FENCE) {
1985         return Fence::SIGNAL_TIME_INVALID;
1986     }
1987 
1988     return fence->getSignalTime();
1989 }
1990 
calculateExpectedPresentTime(DisplayStatInfo stats) const1991 nsecs_t SurfaceFlinger::calculateExpectedPresentTime(DisplayStatInfo stats) const {
1992     // Inflate the expected present time if we're targetting the next vsync.
1993     return mVsyncModulator->getVsyncConfig().sfOffset > 0 ? stats.vsyncTime
1994                                                           : stats.vsyncTime + stats.vsyncPeriod;
1995 }
1996 
commit(nsecs_t frameTime,int64_t vsyncId,nsecs_t expectedVsyncTime)1997 bool SurfaceFlinger::commit(nsecs_t frameTime, int64_t vsyncId, nsecs_t expectedVsyncTime)
1998         FTL_FAKE_GUARD(kMainThreadContext) {
1999     // calculate the expected present time once and use the cached
2000     // value throughout this frame to make sure all layers are
2001     // seeing this same value.
2002     if (expectedVsyncTime >= frameTime) {
2003         mExpectedPresentTime = expectedVsyncTime;
2004     } else {
2005         const DisplayStatInfo stats = mScheduler->getDisplayStatInfo(frameTime);
2006         mExpectedPresentTime = calculateExpectedPresentTime(stats);
2007     }
2008 
2009     const nsecs_t lastScheduledPresentTime = mScheduledPresentTime;
2010     mScheduledPresentTime = expectedVsyncTime;
2011 
2012     const auto vsyncIn = [&] {
2013         if (!ATRACE_ENABLED()) return 0.f;
2014         return (mExpectedPresentTime - systemTime()) / 1e6f;
2015     }();
2016     ATRACE_FORMAT("%s %" PRId64 " vsyncIn %.2fms%s", __func__, vsyncId, vsyncIn,
2017                   mExpectedPresentTime == expectedVsyncTime ? "" : " (adjusted)");
2018 
2019     // When Backpressure propagation is enabled we want to give a small grace period
2020     // for the present fence to fire instead of just giving up on this frame to handle cases
2021     // where present fence is just about to get signaled.
2022     const int graceTimeForPresentFenceMs =
2023             (mPropagateBackpressureClientComposition || !mHadClientComposition) ? 1 : 0;
2024 
2025     // Pending frames may trigger backpressure propagation.
2026     const TracedOrdinal<bool> framePending = {"PrevFramePending",
2027                                               previousFramePending(graceTimeForPresentFenceMs)};
2028 
2029     // Frame missed counts for metrics tracking.
2030     // A frame is missed if the prior frame is still pending. If no longer pending,
2031     // then we still count the frame as missed if the predicted present time
2032     // was further in the past than when the fence actually fired.
2033 
2034     // Add some slop to correct for drift. This should generally be
2035     // smaller than a typical frame duration, but should not be so small
2036     // that it reports reasonable drift as a missed frame.
2037     const DisplayStatInfo stats = mScheduler->getDisplayStatInfo(systemTime());
2038     const nsecs_t frameMissedSlop = stats.vsyncPeriod / 2;
2039     const nsecs_t previousPresentTime = previousFramePresentTime();
2040     const TracedOrdinal<bool> frameMissed = {"PrevFrameMissed",
2041                                              framePending ||
2042                                                      (previousPresentTime >= 0 &&
2043                                                       (lastScheduledPresentTime <
2044                                                        previousPresentTime - frameMissedSlop))};
2045     const TracedOrdinal<bool> hwcFrameMissed = {"PrevHwcFrameMissed",
2046                                                 mHadDeviceComposition && frameMissed};
2047     const TracedOrdinal<bool> gpuFrameMissed = {"PrevGpuFrameMissed",
2048                                                 mHadClientComposition && frameMissed};
2049 
2050     if (frameMissed) {
2051         mFrameMissedCount++;
2052         mTimeStats->incrementMissedFrames();
2053     }
2054 
2055     if (hwcFrameMissed) {
2056         mHwcFrameMissedCount++;
2057     }
2058 
2059     if (gpuFrameMissed) {
2060         mGpuFrameMissedCount++;
2061     }
2062 
2063     // If we are in the middle of a mode change and the fence hasn't
2064     // fired yet just wait for the next commit.
2065     if (mSetActiveModePending) {
2066         if (framePending) {
2067             mScheduler->scheduleFrame();
2068             return false;
2069         }
2070 
2071         // We received the present fence from the HWC, so we assume it successfully updated
2072         // the mode, hence we update SF.
2073         mSetActiveModePending = false;
2074         {
2075             Mutex::Autolock lock(mStateLock);
2076             updateInternalStateWithChangedMode();
2077         }
2078     }
2079 
2080     if (framePending) {
2081         if ((hwcFrameMissed && !gpuFrameMissed) || mPropagateBackpressureClientComposition) {
2082             scheduleCommit(FrameHint::kNone);
2083             return false;
2084         }
2085     }
2086 
2087     // Save this once per commit + composite to ensure consistency
2088     // TODO (b/240619471): consider removing active display check once AOD is fixed
2089     const auto activeDisplay =
2090             FTL_FAKE_GUARD(mStateLock, getDisplayDeviceLocked(mActiveDisplayToken));
2091     mPowerHintSessionEnabled = mPowerAdvisor->usePowerHintSession() && activeDisplay &&
2092             activeDisplay->getPowerMode() == hal::PowerMode::ON;
2093     if (mPowerHintSessionEnabled) {
2094         const auto& display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get();
2095         // get stable vsync period from display mode
2096         const nsecs_t vsyncPeriod = display->getActiveMode()->getVsyncPeriod();
2097         mPowerAdvisor->setCommitStart(frameTime);
2098         mPowerAdvisor->setExpectedPresentTime(mExpectedPresentTime);
2099         const nsecs_t idealSfWorkDuration =
2100                 mVsyncModulator->getVsyncConfig().sfWorkDuration.count();
2101         // Frame delay is how long we should have minus how long we actually have
2102         mPowerAdvisor->setFrameDelay(idealSfWorkDuration - (mExpectedPresentTime - frameTime));
2103         mPowerAdvisor->setTotalFrameTargetWorkDuration(idealSfWorkDuration);
2104         mPowerAdvisor->setTargetWorkDuration(vsyncPeriod);
2105 
2106         // Send early hint here to make sure there's not another frame pending
2107         if (mPowerHintSessionMode.early) {
2108             // Send a rough prediction for this frame based on last frame's timing info
2109             mPowerAdvisor->sendPredictedWorkDuration();
2110         }
2111     }
2112 
2113     if (mTracingEnabledChanged) {
2114         mLayerTracingEnabled = mLayerTracing.isEnabled();
2115         mTracingEnabledChanged = false;
2116     }
2117 
2118     if (mRefreshRateOverlaySpinner) {
2119         Mutex::Autolock lock(mStateLock);
2120         if (const auto display = getDefaultDisplayDeviceLocked()) {
2121             display->animateRefreshRateOverlay();
2122         }
2123     }
2124 
2125     // Composite if transactions were committed, or if requested by HWC.
2126     bool mustComposite = mMustComposite.exchange(false);
2127     {
2128         mFrameTimeline->setSfWakeUp(vsyncId, frameTime, Fps::fromPeriodNsecs(stats.vsyncPeriod));
2129 
2130         bool needsTraversal = false;
2131         if (clearTransactionFlags(eTransactionFlushNeeded)) {
2132             needsTraversal |= commitCreatedLayers();
2133             needsTraversal |= flushTransactionQueues(vsyncId);
2134         }
2135 
2136         const bool shouldCommit =
2137                 (getTransactionFlags() & ~eTransactionFlushNeeded) || needsTraversal;
2138         if (shouldCommit) {
2139             commitTransactions();
2140         }
2141 
2142         if (transactionFlushNeeded()) {
2143             setTransactionFlags(eTransactionFlushNeeded);
2144         }
2145 
2146         mustComposite |= shouldCommit;
2147         mustComposite |= latchBuffers();
2148 
2149         // This has to be called after latchBuffers because we want to include the layers that have
2150         // been latched in the commit callback
2151         if (!needsTraversal) {
2152             // Invoke empty transaction callbacks early.
2153             mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
2154         } else {
2155             // Invoke OnCommit callbacks.
2156             mTransactionCallbackInvoker.sendCallbacks(true /* onCommitOnly */);
2157         }
2158 
2159         updateLayerGeometry();
2160     }
2161 
2162     // Layers need to get updated (in the previous line) before we can use them for
2163     // choosing the refresh rate.
2164     // Hold mStateLock as chooseRefreshRateForContent promotes wp<Layer> to sp<Layer>
2165     // and may eventually call to ~Layer() if it holds the last reference
2166     {
2167         Mutex::Autolock _l(mStateLock);
2168         mScheduler->chooseRefreshRateForContent();
2169         setActiveModeInHwcIfNeeded();
2170     }
2171 
2172     updateCursorAsync();
2173     updateInputFlinger();
2174 
2175     if (mLayerTracingEnabled && !mLayerTracing.flagIsSet(LayerTracing::TRACE_COMPOSITION)) {
2176         // This will block and tracing should only be enabled for debugging.
2177         mLayerTracing.notify(mVisibleRegionsDirty, frameTime);
2178     }
2179 
2180     persistDisplayBrightness(mustComposite);
2181 
2182     return mustComposite && CC_LIKELY(mBootStage != BootStage::BOOTLOADER);
2183 }
2184 
composite(nsecs_t frameTime,int64_t vsyncId)2185 void SurfaceFlinger::composite(nsecs_t frameTime, int64_t vsyncId)
2186         FTL_FAKE_GUARD(kMainThreadContext) {
2187     ATRACE_FORMAT("%s %" PRId64, __func__, vsyncId);
2188 
2189     compositionengine::CompositionRefreshArgs refreshArgs;
2190     const auto& displays = FTL_FAKE_GUARD(mStateLock, mDisplays);
2191     refreshArgs.outputs.reserve(displays.size());
2192     std::vector<DisplayId> displayIds;
2193     for (const auto& [_, display] : displays) {
2194         refreshArgs.outputs.push_back(display->getCompositionDisplay());
2195         displayIds.push_back(display->getId());
2196     }
2197     mPowerAdvisor->setDisplays(displayIds);
2198     mDrawingState.traverseInZOrder([&refreshArgs](Layer* layer) {
2199         if (auto layerFE = layer->getCompositionEngineLayerFE())
2200             refreshArgs.layers.push_back(layerFE);
2201     });
2202     refreshArgs.layersWithQueuedFrames.reserve(mLayersWithQueuedFrames.size());
2203     for (auto layer : mLayersWithQueuedFrames) {
2204         if (auto layerFE = layer->getCompositionEngineLayerFE())
2205             refreshArgs.layersWithQueuedFrames.push_back(layerFE);
2206     }
2207 
2208     refreshArgs.outputColorSetting = useColorManagement
2209             ? mDisplayColorSetting
2210             : compositionengine::OutputColorSetting::kUnmanaged;
2211     refreshArgs.colorSpaceAgnosticDataspace = mColorSpaceAgnosticDataspace;
2212     refreshArgs.forceOutputColorMode = mForceColorMode;
2213 
2214     refreshArgs.updatingOutputGeometryThisFrame = mVisibleRegionsDirty;
2215     refreshArgs.updatingGeometryThisFrame = mGeometryDirty.exchange(false) || mVisibleRegionsDirty;
2216     refreshArgs.blursAreExpensive = mBlursAreExpensive;
2217     refreshArgs.internalDisplayRotationFlags = DisplayDevice::getPrimaryDisplayRotationFlags();
2218 
2219     if (CC_UNLIKELY(mDrawingState.colorMatrixChanged)) {
2220         refreshArgs.colorTransformMatrix = mDrawingState.colorMatrix;
2221         mDrawingState.colorMatrixChanged = false;
2222     }
2223 
2224     refreshArgs.devOptForceClientComposition = mDebugDisableHWC;
2225 
2226     if (mDebugFlashDelay != 0) {
2227         refreshArgs.devOptForceClientComposition = true;
2228         refreshArgs.devOptFlashDirtyRegionsDelay = std::chrono::milliseconds(mDebugFlashDelay);
2229     }
2230 
2231     const auto expectedPresentTime = mExpectedPresentTime.load();
2232     const auto prevVsyncTime = mScheduler->getPreviousVsyncFrom(expectedPresentTime);
2233     const auto hwcMinWorkDuration = mVsyncConfiguration->getCurrentConfigs().hwcMinWorkDuration;
2234     refreshArgs.earliestPresentTime = prevVsyncTime - hwcMinWorkDuration;
2235     refreshArgs.previousPresentFence = mPreviousPresentFences[0].fenceTime;
2236     refreshArgs.scheduledFrameTime = mScheduler->getScheduledFrameTime();
2237     refreshArgs.expectedPresentTime = expectedPresentTime;
2238 
2239     // Store the present time just before calling to the composition engine so we could notify
2240     // the scheduler.
2241     const auto presentTime = systemTime();
2242 
2243     mCompositionEngine->present(refreshArgs);
2244 
2245     mTimeStats->recordFrameDuration(frameTime, systemTime());
2246 
2247     // Send a power hint hint after presentation is finished
2248     if (mPowerHintSessionEnabled) {
2249         mPowerAdvisor->setSfPresentTiming(mPreviousPresentFences[0].fenceTime->getSignalTime(),
2250                                           systemTime());
2251         if (mPowerHintSessionMode.late) {
2252             mPowerAdvisor->sendActualWorkDuration();
2253         }
2254     }
2255 
2256     if (mScheduler->onPostComposition(presentTime)) {
2257         scheduleComposite(FrameHint::kNone);
2258     }
2259 
2260     postFrame();
2261     postComposition();
2262 
2263     const bool prevFrameHadClientComposition = mHadClientComposition;
2264 
2265     mHadClientComposition = mHadDeviceComposition = mReusedClientComposition = false;
2266     TimeStats::ClientCompositionRecord clientCompositionRecord;
2267     for (const auto& [_, display] : displays) {
2268         const auto& state = display->getCompositionDisplay()->getState();
2269         mHadClientComposition |= state.usesClientComposition && !state.reusedClientComposition;
2270         mHadDeviceComposition |= state.usesDeviceComposition;
2271         mReusedClientComposition |= state.reusedClientComposition;
2272         clientCompositionRecord.predicted |=
2273                 (state.strategyPrediction != CompositionStrategyPredictionState::DISABLED);
2274         clientCompositionRecord.predictionSucceeded |=
2275                 (state.strategyPrediction == CompositionStrategyPredictionState::SUCCESS);
2276     }
2277 
2278     clientCompositionRecord.hadClientComposition = mHadClientComposition;
2279     clientCompositionRecord.reused = mReusedClientComposition;
2280     clientCompositionRecord.changed = prevFrameHadClientComposition != mHadClientComposition;
2281     mTimeStats->pushCompositionStrategyState(clientCompositionRecord);
2282 
2283     // TODO: b/160583065 Enable skip validation when SF caches all client composition layers
2284     const bool usedGpuComposition = mHadClientComposition || mReusedClientComposition;
2285     modulateVsync(&VsyncModulator::onDisplayRefresh, usedGpuComposition);
2286 
2287     mLayersWithQueuedFrames.clear();
2288     if (mLayerTracingEnabled && mLayerTracing.flagIsSet(LayerTracing::TRACE_COMPOSITION)) {
2289         // This will block and should only be used for debugging.
2290         mLayerTracing.notify(mVisibleRegionsDirty, frameTime);
2291     }
2292 
2293     mVisibleRegionsWereDirtyThisFrame = mVisibleRegionsDirty; // Cache value for use in post-comp
2294     mVisibleRegionsDirty = false;
2295 
2296     if (mCompositionEngine->needsAnotherUpdate()) {
2297         scheduleCommit(FrameHint::kNone);
2298     }
2299 
2300     if (mPowerHintSessionEnabled) {
2301         mPowerAdvisor->setCompositeEnd(systemTime());
2302     }
2303 }
2304 
updateLayerGeometry()2305 void SurfaceFlinger::updateLayerGeometry() {
2306     ATRACE_CALL();
2307 
2308     if (mVisibleRegionsDirty) {
2309         computeLayerBounds();
2310     }
2311 
2312     for (auto& layer : mLayersPendingRefresh) {
2313         Region visibleReg;
2314         visibleReg.set(layer->getScreenBounds());
2315         invalidateLayerStack(layer, visibleReg);
2316     }
2317     mLayersPendingRefresh.clear();
2318 }
2319 
updateCompositorTiming(const DisplayStatInfo & stats,nsecs_t compositeTime,std::shared_ptr<FenceTime> & presentFenceTime)2320 void SurfaceFlinger::updateCompositorTiming(const DisplayStatInfo& stats, nsecs_t compositeTime,
2321                                             std::shared_ptr<FenceTime>& presentFenceTime) {
2322     // Update queue of past composite+present times and determine the
2323     // most recently known composite to present latency.
2324     getBE().mCompositePresentTimes.push({compositeTime, presentFenceTime});
2325     nsecs_t compositeToPresentLatency = -1;
2326     while (!getBE().mCompositePresentTimes.empty()) {
2327         SurfaceFlingerBE::CompositePresentTime& cpt = getBE().mCompositePresentTimes.front();
2328         // Cached values should have been updated before calling this method,
2329         // which helps avoid duplicate syscalls.
2330         nsecs_t displayTime = cpt.display->getCachedSignalTime();
2331         if (displayTime == Fence::SIGNAL_TIME_PENDING) {
2332             break;
2333         }
2334         compositeToPresentLatency = displayTime - cpt.composite;
2335         getBE().mCompositePresentTimes.pop();
2336     }
2337 
2338     // Don't let mCompositePresentTimes grow unbounded, just in case.
2339     while (getBE().mCompositePresentTimes.size() > 16) {
2340         getBE().mCompositePresentTimes.pop();
2341     }
2342 
2343     setCompositorTimingSnapped(stats, compositeToPresentLatency);
2344 }
2345 
setCompositorTimingSnapped(const DisplayStatInfo & stats,nsecs_t compositeToPresentLatency)2346 void SurfaceFlinger::setCompositorTimingSnapped(const DisplayStatInfo& stats,
2347                                                 nsecs_t compositeToPresentLatency) {
2348     // Avoid division by 0 by defaulting to 60Hz
2349     const auto vsyncPeriod = stats.vsyncPeriod ?: (60_Hz).getPeriodNsecs();
2350 
2351     // Integer division and modulo round toward 0 not -inf, so we need to
2352     // treat negative and positive offsets differently.
2353     nsecs_t idealLatency = (mVsyncConfiguration->getCurrentConfigs().late.sfOffset > 0)
2354             ? (vsyncPeriod -
2355                (mVsyncConfiguration->getCurrentConfigs().late.sfOffset % vsyncPeriod))
2356             : ((-mVsyncConfiguration->getCurrentConfigs().late.sfOffset) % vsyncPeriod);
2357 
2358     // Just in case mVsyncConfiguration->getCurrentConfigs().late.sf == -vsyncInterval.
2359     if (idealLatency <= 0) {
2360         idealLatency = vsyncPeriod;
2361     }
2362 
2363     // Snap the latency to a value that removes scheduling jitter from the
2364     // composition and present times, which often have >1ms of jitter.
2365     // Reducing jitter is important if an app attempts to extrapolate
2366     // something (such as user input) to an accurate diasplay time.
2367     // Snapping also allows an app to precisely calculate
2368     // mVsyncConfiguration->getCurrentConfigs().late.sf with (presentLatency % interval).
2369     const nsecs_t bias = vsyncPeriod / 2;
2370     const int64_t extraVsyncs = ((compositeToPresentLatency - idealLatency + bias) / vsyncPeriod);
2371     const nsecs_t snappedCompositeToPresentLatency =
2372             (extraVsyncs > 0) ? idealLatency + (extraVsyncs * vsyncPeriod) : idealLatency;
2373 
2374     std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
2375     getBE().mCompositorTiming.deadline = stats.vsyncTime - idealLatency;
2376     getBE().mCompositorTiming.interval = vsyncPeriod;
2377     getBE().mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
2378 }
2379 
isHdrLayer(Layer * layer) const2380 bool SurfaceFlinger::isHdrLayer(Layer* layer) const {
2381     // Treat all layers as non-HDR if:
2382     // 1. They do not have a valid HDR dataspace. Currently we treat those as PQ or HLG. and
2383     // 2. The layer is allowed to be dimmed. WindowManager may disable dimming in order to
2384     // keep animations invoking SDR screenshots of HDR layers seamless. Treat such tagged
2385     // layers as HDR so that DisplayManagerService does not try to change the screen brightness
2386     if (!isHdrDataspace(layer->getDataSpace()) && layer->isDimmingEnabled()) {
2387         return false;
2388     }
2389     if (mIgnoreHdrCameraLayers) {
2390         auto buffer = layer->getBuffer();
2391         if (buffer && (buffer->getUsage() & GRALLOC_USAGE_HW_CAMERA_WRITE) != 0) {
2392             return false;
2393         }
2394     }
2395     return true;
2396 }
2397 
getPhysicalDisplayOrientation(DisplayId displayId,bool isPrimary) const2398 ui::Rotation SurfaceFlinger::getPhysicalDisplayOrientation(DisplayId displayId,
2399                                                            bool isPrimary) const {
2400     const auto id = PhysicalDisplayId::tryCast(displayId);
2401     if (!id) {
2402         return ui::ROTATION_0;
2403     }
2404     if (getHwComposer().getComposer()->isSupported(
2405                 Hwc2::Composer::OptionalFeature::PhysicalDisplayOrientation)) {
2406         switch (getHwComposer().getPhysicalDisplayOrientation(*id)) {
2407             case Hwc2::AidlTransform::ROT_90:
2408                 return ui::ROTATION_90;
2409             case Hwc2::AidlTransform::ROT_180:
2410                 return ui::ROTATION_180;
2411             case Hwc2::AidlTransform::ROT_270:
2412                 return ui::ROTATION_270;
2413             default:
2414                 return ui::ROTATION_0;
2415         }
2416     }
2417 
2418     if (isPrimary) {
2419         using Values = SurfaceFlingerProperties::primary_display_orientation_values;
2420         switch (primary_display_orientation(Values::ORIENTATION_0)) {
2421             case Values::ORIENTATION_90:
2422                 return ui::ROTATION_90;
2423             case Values::ORIENTATION_180:
2424                 return ui::ROTATION_180;
2425             case Values::ORIENTATION_270:
2426                 return ui::ROTATION_270;
2427             default:
2428                 break;
2429         }
2430     }
2431     return ui::ROTATION_0;
2432 }
2433 
postComposition()2434 void SurfaceFlinger::postComposition() {
2435     ATRACE_CALL();
2436     ALOGV("postComposition");
2437 
2438     const auto* display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked()).get();
2439 
2440     std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
2441     if (display && display->getCompositionDisplay()->getState().usesClientComposition) {
2442         glCompositionDoneFenceTime =
2443                 std::make_shared<FenceTime>(display->getCompositionDisplay()
2444                                                     ->getRenderSurface()
2445                                                     ->getClientTargetAcquireFence());
2446     } else {
2447         glCompositionDoneFenceTime = FenceTime::NO_FENCE;
2448     }
2449 
2450     mPreviousPresentFences[1] = mPreviousPresentFences[0];
2451     mPreviousPresentFences[0].fence =
2452             display ? getHwComposer().getPresentFence(display->getPhysicalId()) : Fence::NO_FENCE;
2453     mPreviousPresentFences[0].fenceTime =
2454             std::make_shared<FenceTime>(mPreviousPresentFences[0].fence);
2455 
2456     nsecs_t now = systemTime();
2457 
2458     // Set presentation information before calling Layer::releasePendingBuffer, such that jank
2459     // information from previous' frame classification is already available when sending jank info
2460     // to clients, so they get jank classification as early as possible.
2461     mFrameTimeline->setSfPresent(/* sfPresentTime */ now, mPreviousPresentFences[0].fenceTime,
2462                                  glCompositionDoneFenceTime);
2463 
2464     const DisplayStatInfo stats = mScheduler->getDisplayStatInfo(now);
2465 
2466     // We use the CompositionEngine::getLastFrameRefreshTimestamp() which might
2467     // be sampled a little later than when we started doing work for this frame,
2468     // but that should be okay since updateCompositorTiming has snapping logic.
2469     updateCompositorTiming(stats, mCompositionEngine->getLastFrameRefreshTimestamp(),
2470                            mPreviousPresentFences[0].fenceTime);
2471     CompositorTiming compositorTiming;
2472     {
2473         std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
2474         compositorTiming = getBE().mCompositorTiming;
2475     }
2476 
2477     for (const auto& layer: mLayersWithQueuedFrames) {
2478         layer->onPostComposition(display, glCompositionDoneFenceTime,
2479                                  mPreviousPresentFences[0].fenceTime, compositorTiming);
2480         layer->releasePendingBuffer(/*dequeueReadyTime*/ now);
2481     }
2482 
2483     std::vector<std::pair<std::shared_ptr<compositionengine::Display>, sp<HdrLayerInfoReporter>>>
2484             hdrInfoListeners;
2485     bool haveNewListeners = false;
2486     {
2487         Mutex::Autolock lock(mStateLock);
2488         if (mFpsReporter) {
2489             mFpsReporter->dispatchLayerFps();
2490         }
2491 
2492         if (mTunnelModeEnabledReporter) {
2493             mTunnelModeEnabledReporter->updateTunnelModeStatus();
2494         }
2495         hdrInfoListeners.reserve(mHdrLayerInfoListeners.size());
2496         for (const auto& [displayId, reporter] : mHdrLayerInfoListeners) {
2497             if (reporter && reporter->hasListeners()) {
2498                 if (const auto display = getDisplayDeviceLocked(displayId)) {
2499                     hdrInfoListeners.emplace_back(display->getCompositionDisplay(), reporter);
2500                 }
2501             }
2502         }
2503         haveNewListeners = mAddingHDRLayerInfoListener; // grab this with state lock
2504         mAddingHDRLayerInfoListener = false;
2505     }
2506 
2507     if (haveNewListeners || mSomeDataspaceChanged || mVisibleRegionsWereDirtyThisFrame) {
2508         for (auto& [compositionDisplay, listener] : hdrInfoListeners) {
2509             HdrLayerInfoReporter::HdrLayerInfo info;
2510             int32_t maxArea = 0;
2511             mDrawingState.traverse([&, compositionDisplay = compositionDisplay](Layer* layer) {
2512                 const auto layerFe = layer->getCompositionEngineLayerFE();
2513                 if (layer->isVisible() && compositionDisplay->includesLayer(layerFe)) {
2514                     if (isHdrLayer(layer)) {
2515                         const auto* outputLayer =
2516                             compositionDisplay->getOutputLayerForLayer(layerFe);
2517                         if (outputLayer) {
2518                             info.numberOfHdrLayers++;
2519                             const auto displayFrame = outputLayer->getState().displayFrame;
2520                             const int32_t area = displayFrame.width() * displayFrame.height();
2521                             if (area > maxArea) {
2522                                 maxArea = area;
2523                                 info.maxW = displayFrame.width();
2524                                 info.maxH = displayFrame.height();
2525                             }
2526                         }
2527                     }
2528                 }
2529             });
2530             listener->dispatchHdrLayerInfo(info);
2531         }
2532     }
2533 
2534     mSomeDataspaceChanged = false;
2535     mVisibleRegionsWereDirtyThisFrame = false;
2536 
2537     mTransactionCallbackInvoker.addPresentFence(mPreviousPresentFences[0].fence);
2538     mTransactionCallbackInvoker.sendCallbacks(false /* onCommitOnly */);
2539     mTransactionCallbackInvoker.clearCompletedTransactions();
2540 
2541     if (display && display->isInternal() && display->getPowerMode() == hal::PowerMode::ON &&
2542         mPreviousPresentFences[0].fenceTime->isValid()) {
2543         mScheduler->addPresentFence(mPreviousPresentFences[0].fenceTime);
2544     }
2545 
2546     const bool isDisplayConnected =
2547             display && getHwComposer().isConnected(display->getPhysicalId());
2548 
2549     if (!hasSyncFramework) {
2550         if (isDisplayConnected && display->isPoweredOn()) {
2551             mScheduler->enableHardwareVsync();
2552         }
2553     }
2554 
2555     if (mAnimCompositionPending) {
2556         mAnimCompositionPending = false;
2557 
2558         if (mPreviousPresentFences[0].fenceTime->isValid()) {
2559             mAnimFrameTracker.setActualPresentFence(mPreviousPresentFences[0].fenceTime);
2560         } else if (isDisplayConnected) {
2561             // The HWC doesn't support present fences, so use the refresh
2562             // timestamp instead.
2563             const nsecs_t presentTime = display->getRefreshTimestamp();
2564             mAnimFrameTracker.setActualPresentTime(presentTime);
2565         }
2566         mAnimFrameTracker.advanceFrame();
2567     }
2568 
2569     mTimeStats->incrementTotalFrames();
2570 
2571     mTimeStats->setPresentFenceGlobal(mPreviousPresentFences[0].fenceTime);
2572 
2573     const size_t sfConnections = mScheduler->getEventThreadConnectionCount(mSfConnectionHandle);
2574     const size_t appConnections = mScheduler->getEventThreadConnectionCount(mAppConnectionHandle);
2575     mTimeStats->recordDisplayEventConnectionCount(sfConnections + appConnections);
2576 
2577     if (isDisplayConnected && !display->isPoweredOn()) {
2578         getRenderEngine().cleanupPostRender();
2579         return;
2580     }
2581 
2582     nsecs_t currentTime = systemTime();
2583     if (mHasPoweredOff) {
2584         mHasPoweredOff = false;
2585     } else {
2586         nsecs_t elapsedTime = currentTime - getBE().mLastSwapTime;
2587         size_t numPeriods = static_cast<size_t>(elapsedTime / stats.vsyncPeriod);
2588         if (numPeriods < SurfaceFlingerBE::NUM_BUCKETS - 1) {
2589             getBE().mFrameBuckets[numPeriods] += elapsedTime;
2590         } else {
2591             getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] += elapsedTime;
2592         }
2593         getBE().mTotalTime += elapsedTime;
2594     }
2595     getBE().mLastSwapTime = currentTime;
2596 
2597     // Cleanup any outstanding resources due to rendering a prior frame.
2598     getRenderEngine().cleanupPostRender();
2599 
2600     {
2601         std::lock_guard lock(mTexturePoolMutex);
2602         if (mTexturePool.size() < mTexturePoolSize) {
2603             const size_t refillCount = mTexturePoolSize - mTexturePool.size();
2604             const size_t offset = mTexturePool.size();
2605             mTexturePool.resize(mTexturePoolSize);
2606             getRenderEngine().genTextures(refillCount, mTexturePool.data() + offset);
2607             ATRACE_INT("TexturePoolSize", mTexturePool.size());
2608         } else if (mTexturePool.size() > mTexturePoolSize) {
2609             const size_t deleteCount = mTexturePool.size() - mTexturePoolSize;
2610             const size_t offset = mTexturePoolSize;
2611             getRenderEngine().deleteTextures(deleteCount, mTexturePool.data() + offset);
2612             mTexturePool.resize(mTexturePoolSize);
2613             ATRACE_INT("TexturePoolSize", mTexturePool.size());
2614         }
2615     }
2616 
2617     // Even though ATRACE_INT64 already checks if tracing is enabled, it doesn't prevent the
2618     // side-effect of getTotalSize(), so we check that again here
2619     if (ATRACE_ENABLED()) {
2620         // getTotalSize returns the total number of buffers that were allocated by SurfaceFlinger
2621         ATRACE_INT64("Total Buffer Size", GraphicBufferAllocator::get().getTotalSize());
2622     }
2623 }
2624 
getMaxDisplayBounds()2625 FloatRect SurfaceFlinger::getMaxDisplayBounds() {
2626     const ui::Size maxSize = [this] {
2627         ftl::FakeGuard guard(mStateLock);
2628 
2629         // The LayerTraceGenerator tool runs without displays.
2630         if (mDisplays.empty()) return ui::Size{5000, 5000};
2631 
2632         return std::accumulate(mDisplays.begin(), mDisplays.end(), ui::kEmptySize,
2633                                [](ui::Size size, const auto& pair) -> ui::Size {
2634                                    const auto& display = pair.second;
2635                                    return {std::max(size.getWidth(), display->getWidth()),
2636                                            std::max(size.getHeight(), display->getHeight())};
2637                                });
2638     }();
2639 
2640     // Ignore display bounds for now since they will be computed later. Use a large Rect bound
2641     // to ensure it's bigger than an actual display will be.
2642     const float xMax = maxSize.getWidth() * 10.f;
2643     const float yMax = maxSize.getHeight() * 10.f;
2644 
2645     return {-xMax, -yMax, xMax, yMax};
2646 }
2647 
computeLayerBounds()2648 void SurfaceFlinger::computeLayerBounds() {
2649     const FloatRect maxBounds = getMaxDisplayBounds();
2650     for (const auto& layer : mDrawingState.layersSortedByZ) {
2651         layer->computeBounds(maxBounds, ui::Transform(), 0.f /* shadowRadius */);
2652     }
2653 }
2654 
postFrame()2655 void SurfaceFlinger::postFrame() {
2656     const auto display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked());
2657     if (display && getHwComposer().isConnected(display->getPhysicalId())) {
2658         uint32_t flipCount = display->getPageFlipCount();
2659         if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
2660             logFrameStats();
2661         }
2662     }
2663 }
2664 
commitTransactions()2665 void SurfaceFlinger::commitTransactions() {
2666     ATRACE_CALL();
2667 
2668     // Keep a copy of the drawing state (that is going to be overwritten
2669     // by commitTransactionsLocked) outside of mStateLock so that the side
2670     // effects of the State assignment don't happen with mStateLock held,
2671     // which can cause deadlocks.
2672     State drawingState(mDrawingState);
2673 
2674     Mutex::Autolock lock(mStateLock);
2675     mDebugInTransaction = systemTime();
2676 
2677     // Here we're guaranteed that some transaction flags are set
2678     // so we can call commitTransactionsLocked unconditionally.
2679     // We clear the flags with mStateLock held to guarantee that
2680     // mCurrentState won't change until the transaction is committed.
2681     modulateVsync(&VsyncModulator::onTransactionCommit);
2682     commitTransactionsLocked(clearTransactionFlags(eTransactionMask));
2683 
2684     mDebugInTransaction = 0;
2685 }
2686 
loadDisplayModes(PhysicalDisplayId displayId) const2687 std::pair<DisplayModes, DisplayModePtr> SurfaceFlinger::loadDisplayModes(
2688         PhysicalDisplayId displayId) const {
2689     std::vector<HWComposer::HWCDisplayMode> hwcModes;
2690     std::optional<hal::HWDisplayId> activeModeHwcId;
2691 
2692     int attempt = 0;
2693     constexpr int kMaxAttempts = 3;
2694     do {
2695         hwcModes = getHwComposer().getModes(displayId);
2696         activeModeHwcId = getHwComposer().getActiveMode(displayId);
2697         LOG_ALWAYS_FATAL_IF(!activeModeHwcId, "HWC returned no active mode");
2698 
2699         const auto isActiveMode = [activeModeHwcId](const HWComposer::HWCDisplayMode& mode) {
2700             return mode.hwcId == *activeModeHwcId;
2701         };
2702 
2703         if (std::any_of(hwcModes.begin(), hwcModes.end(), isActiveMode)) {
2704             break;
2705         }
2706     } while (++attempt < kMaxAttempts);
2707 
2708     LOG_ALWAYS_FATAL_IF(attempt == kMaxAttempts,
2709                         "After %d attempts HWC still returns an active mode which is not"
2710                         " supported. Active mode ID = %" PRIu64 ". Supported modes = %s",
2711                         kMaxAttempts, *activeModeHwcId, base::Join(hwcModes, ", ").c_str());
2712 
2713     DisplayModes oldModes;
2714     if (const auto token = getPhysicalDisplayTokenLocked(displayId)) {
2715         oldModes = getDisplayDeviceLocked(token)->getSupportedModes();
2716     }
2717 
2718     ui::DisplayModeId nextModeId = 1 +
2719             std::accumulate(oldModes.begin(), oldModes.end(), static_cast<ui::DisplayModeId>(-1),
2720                             [](ui::DisplayModeId max, const auto& pair) {
2721                                 return std::max(max, pair.first.value());
2722                             });
2723 
2724     DisplayModes newModes;
2725     for (const auto& hwcMode : hwcModes) {
2726         const DisplayModeId id{nextModeId++};
2727         newModes.try_emplace(id,
2728                              DisplayMode::Builder(hwcMode.hwcId)
2729                                      .setId(id)
2730                                      .setPhysicalDisplayId(displayId)
2731                                      .setResolution({hwcMode.width, hwcMode.height})
2732                                      .setVsyncPeriod(hwcMode.vsyncPeriod)
2733                                      .setDpiX(hwcMode.dpiX)
2734                                      .setDpiY(hwcMode.dpiY)
2735                                      .setGroup(hwcMode.configGroup)
2736                                      .build());
2737     }
2738 
2739     const bool sameModes =
2740             std::equal(newModes.begin(), newModes.end(), oldModes.begin(), oldModes.end(),
2741                        [](const auto& lhs, const auto& rhs) {
2742                            return equalsExceptDisplayModeId(*lhs.second, *rhs.second);
2743                        });
2744 
2745     // Keep IDs if modes have not changed.
2746     const auto& modes = sameModes ? oldModes : newModes;
2747     const DisplayModePtr activeMode =
2748             std::find_if(modes.begin(), modes.end(), [activeModeHwcId](const auto& pair) {
2749                 return pair.second->getHwcId() == activeModeHwcId;
2750             })->second;
2751 
2752     return {modes, activeMode};
2753 }
2754 
processDisplayHotplugEventsLocked()2755 void SurfaceFlinger::processDisplayHotplugEventsLocked() {
2756     for (const auto& event : mPendingHotplugEvents) {
2757         std::optional<DisplayIdentificationInfo> info =
2758                 getHwComposer().onHotplug(event.hwcDisplayId, event.connection);
2759 
2760         if (!info) {
2761             continue;
2762         }
2763 
2764         const auto displayId = info->id;
2765         const auto token = mPhysicalDisplayTokens.get(displayId);
2766 
2767         if (event.connection == hal::Connection::CONNECTED) {
2768             auto [supportedModes, activeMode] = loadDisplayModes(displayId);
2769 
2770             if (!token) {
2771                 ALOGV("Creating display %s", to_string(displayId).c_str());
2772 
2773                 DisplayDeviceState state;
2774                 state.physical = {.id = displayId,
2775                                   .type = getHwComposer().getDisplayConnectionType(displayId),
2776                                   .hwcDisplayId = event.hwcDisplayId,
2777                                   .deviceProductInfo = std::move(info->deviceProductInfo),
2778                                   .supportedModes = std::move(supportedModes),
2779                                   .activeMode = std::move(activeMode)};
2780                 state.isSecure = true; // All physical displays are currently considered secure.
2781                 state.displayName = std::move(info->name);
2782 
2783                 sp<IBinder> token = new BBinder();
2784                 mCurrentState.displays.add(token, state);
2785                 mPhysicalDisplayTokens.try_emplace(displayId, std::move(token));
2786                 mInterceptor->saveDisplayCreation(state);
2787             } else {
2788                 ALOGV("Recreating display %s", to_string(displayId).c_str());
2789 
2790                 auto& state = mCurrentState.displays.editValueFor(token->get());
2791                 state.sequenceId = DisplayDeviceState{}.sequenceId; // Generate new sequenceId.
2792                 state.physical->supportedModes = std::move(supportedModes);
2793                 state.physical->activeMode = std::move(activeMode);
2794                 if (getHwComposer().updatesDeviceProductInfoOnHotplugReconnect()) {
2795                     state.physical->deviceProductInfo = std::move(info->deviceProductInfo);
2796                 }
2797             }
2798         } else {
2799             ALOGV("Removing display %s", to_string(displayId).c_str());
2800 
2801             if (const ssize_t index = mCurrentState.displays.indexOfKey(token->get()); index >= 0) {
2802                 const DisplayDeviceState& state = mCurrentState.displays.valueAt(index);
2803                 mInterceptor->saveDisplayDeletion(state.sequenceId);
2804                 mCurrentState.displays.removeItemsAt(index);
2805             }
2806 
2807             mPhysicalDisplayTokens.erase(displayId);
2808         }
2809 
2810         processDisplayChangesLocked();
2811     }
2812 
2813     mPendingHotplugEvents.clear();
2814 }
2815 
dispatchDisplayHotplugEvent(PhysicalDisplayId displayId,bool connected)2816 void SurfaceFlinger::dispatchDisplayHotplugEvent(PhysicalDisplayId displayId, bool connected) {
2817     ALOGI("Dispatching display hotplug event displayId=%s, connected=%d",
2818           to_string(displayId).c_str(), connected);
2819     mScheduler->onHotplugReceived(mAppConnectionHandle, displayId, connected);
2820     mScheduler->onHotplugReceived(mSfConnectionHandle, displayId, connected);
2821 }
2822 
setupNewDisplayDeviceInternal(const wp<IBinder> & displayToken,std::shared_ptr<compositionengine::Display> compositionDisplay,const DisplayDeviceState & state,const sp<compositionengine::DisplaySurface> & displaySurface,const sp<IGraphicBufferProducer> & producer)2823 sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
2824         const wp<IBinder>& displayToken,
2825         std::shared_ptr<compositionengine::Display> compositionDisplay,
2826         const DisplayDeviceState& state,
2827         const sp<compositionengine::DisplaySurface>& displaySurface,
2828         const sp<IGraphicBufferProducer>& producer) {
2829     DisplayDeviceCreationArgs creationArgs(this, getHwComposer(), displayToken, compositionDisplay);
2830     creationArgs.sequenceId = state.sequenceId;
2831     creationArgs.isSecure = state.isSecure;
2832     creationArgs.displaySurface = displaySurface;
2833     creationArgs.hasWideColorGamut = false;
2834     creationArgs.supportedPerFrameMetadata = 0;
2835 
2836     if (const auto& physical = state.physical) {
2837         creationArgs.connectionType = physical->type;
2838         creationArgs.supportedModes = physical->supportedModes;
2839         creationArgs.activeModeId = physical->activeMode->getId();
2840         const auto [kernelIdleTimerController, idleTimerTimeoutMs] =
2841                 getKernelIdleTimerProperties(compositionDisplay->getId());
2842 
2843         scheduler::RefreshRateConfigs::Config config =
2844                 {.enableFrameRateOverride = android::sysprop::enable_frame_rate_override(false),
2845                  .frameRateMultipleThreshold =
2846                          base::GetIntProperty("debug.sf.frame_rate_multiple_threshold", 0),
2847                  .idleTimerTimeout = idleTimerTimeoutMs,
2848                  .kernelIdleTimerController = kernelIdleTimerController};
2849         creationArgs.refreshRateConfigs =
2850                 std::make_shared<scheduler::RefreshRateConfigs>(creationArgs.supportedModes,
2851                                                                 creationArgs.activeModeId, config);
2852     }
2853 
2854     if (const auto id = PhysicalDisplayId::tryCast(compositionDisplay->getId())) {
2855         creationArgs.isPrimary = id == getPrimaryDisplayIdLocked();
2856 
2857         if (useColorManagement) {
2858             std::vector<ColorMode> modes = getHwComposer().getColorModes(*id);
2859             for (ColorMode colorMode : modes) {
2860                 if (isWideColorMode(colorMode)) {
2861                     creationArgs.hasWideColorGamut = true;
2862                 }
2863 
2864                 std::vector<RenderIntent> renderIntents =
2865                         getHwComposer().getRenderIntents(*id, colorMode);
2866                 creationArgs.hwcColorModes.emplace(colorMode, renderIntents);
2867             }
2868         }
2869     }
2870 
2871     if (const auto id = HalDisplayId::tryCast(compositionDisplay->getId())) {
2872         getHwComposer().getHdrCapabilities(*id, &creationArgs.hdrCapabilities);
2873         creationArgs.supportedPerFrameMetadata = getHwComposer().getSupportedPerFrameMetadata(*id);
2874     }
2875 
2876     auto nativeWindowSurface = getFactory().createNativeWindowSurface(producer);
2877     auto nativeWindow = nativeWindowSurface->getNativeWindow();
2878     creationArgs.nativeWindow = nativeWindow;
2879 
2880     // Make sure that composition can never be stalled by a virtual display
2881     // consumer that isn't processing buffers fast enough. We have to do this
2882     // here, in case the display is composed entirely by HWC.
2883     if (state.isVirtual()) {
2884         nativeWindow->setSwapInterval(nativeWindow.get(), 0);
2885     }
2886 
2887     creationArgs.physicalOrientation =
2888             getPhysicalDisplayOrientation(compositionDisplay->getId(), creationArgs.isPrimary);
2889     ALOGV("Display Orientation: %s", toCString(creationArgs.physicalOrientation));
2890 
2891     // virtual displays are always considered enabled
2892     creationArgs.initialPowerMode =
2893             state.isVirtual() ? std::make_optional(hal::PowerMode::ON) : std::nullopt;
2894 
2895     sp<DisplayDevice> display = getFactory().createDisplayDevice(creationArgs);
2896 
2897     nativeWindowSurface->preallocateBuffers();
2898 
2899     ColorMode defaultColorMode = ColorMode::NATIVE;
2900     Dataspace defaultDataSpace = Dataspace::UNKNOWN;
2901     if (display->hasWideColorGamut()) {
2902         defaultColorMode = ColorMode::SRGB;
2903         defaultDataSpace = Dataspace::V0_SRGB;
2904     }
2905     display->getCompositionDisplay()->setColorProfile(
2906             compositionengine::Output::ColorProfile{defaultColorMode, defaultDataSpace,
2907                                                     RenderIntent::COLORIMETRIC,
2908                                                     Dataspace::UNKNOWN});
2909     if (!state.isVirtual()) {
2910         FTL_FAKE_GUARD(kMainThreadContext,
2911                        display->setActiveMode(state.physical->activeMode->getId()));
2912         display->setDeviceProductInfo(state.physical->deviceProductInfo);
2913     }
2914 
2915     display->setLayerStack(state.layerStack);
2916     display->setProjection(state.orientation, state.layerStackSpaceRect,
2917                            state.orientedDisplaySpaceRect);
2918     display->setDisplayName(state.displayName);
2919     display->setFlags(state.flags);
2920 
2921     return display;
2922 }
2923 
processDisplayAdded(const wp<IBinder> & displayToken,const DisplayDeviceState & state)2924 void SurfaceFlinger::processDisplayAdded(const wp<IBinder>& displayToken,
2925                                          const DisplayDeviceState& state) {
2926     ui::Size resolution(0, 0);
2927     ui::PixelFormat pixelFormat = static_cast<ui::PixelFormat>(PIXEL_FORMAT_UNKNOWN);
2928     if (state.physical) {
2929         resolution = state.physical->activeMode->getResolution();
2930         pixelFormat = static_cast<ui::PixelFormat>(PIXEL_FORMAT_RGBA_8888);
2931     } else if (state.surface != nullptr) {
2932         int status = state.surface->query(NATIVE_WINDOW_WIDTH, &resolution.width);
2933         ALOGE_IF(status != NO_ERROR, "Unable to query width (%d)", status);
2934         status = state.surface->query(NATIVE_WINDOW_HEIGHT, &resolution.height);
2935         ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status);
2936         int format;
2937         status = state.surface->query(NATIVE_WINDOW_FORMAT, &format);
2938         ALOGE_IF(status != NO_ERROR, "Unable to query format (%d)", status);
2939         pixelFormat = static_cast<ui::PixelFormat>(format);
2940     } else {
2941         // Virtual displays without a surface are dormant:
2942         // they have external state (layer stack, projection,
2943         // etc.) but no internal state (i.e. a DisplayDevice).
2944         return;
2945     }
2946 
2947     compositionengine::DisplayCreationArgsBuilder builder;
2948     if (const auto& physical = state.physical) {
2949         builder.setId(physical->id);
2950     } else {
2951         builder.setId(acquireVirtualDisplay(resolution, pixelFormat));
2952     }
2953 
2954     builder.setPixels(resolution);
2955     builder.setIsSecure(state.isSecure);
2956     builder.setPowerAdvisor(mPowerAdvisor.get());
2957     builder.setName(state.displayName);
2958     auto compositionDisplay = getCompositionEngine().createDisplay(builder.build());
2959     compositionDisplay->setLayerCachingEnabled(mLayerCachingEnabled);
2960 
2961     sp<compositionengine::DisplaySurface> displaySurface;
2962     sp<IGraphicBufferProducer> producer;
2963     sp<IGraphicBufferProducer> bqProducer;
2964     sp<IGraphicBufferConsumer> bqConsumer;
2965     getFactory().createBufferQueue(&bqProducer, &bqConsumer, /*consumerIsSurfaceFlinger =*/false);
2966 
2967     if (state.isVirtual()) {
2968         const auto displayId = VirtualDisplayId::tryCast(compositionDisplay->getId());
2969         LOG_FATAL_IF(!displayId);
2970         auto surface = sp<VirtualDisplaySurface>::make(getHwComposer(), *displayId, state.surface,
2971                                                        bqProducer, bqConsumer, state.displayName);
2972         displaySurface = surface;
2973         producer = std::move(surface);
2974     } else {
2975         ALOGE_IF(state.surface != nullptr,
2976                  "adding a supported display, but rendering "
2977                  "surface is provided (%p), ignoring it",
2978                  state.surface.get());
2979         const auto displayId = PhysicalDisplayId::tryCast(compositionDisplay->getId());
2980         LOG_FATAL_IF(!displayId);
2981         displaySurface =
2982                 sp<FramebufferSurface>::make(getHwComposer(), *displayId, bqConsumer,
2983                                              state.physical->activeMode->getResolution(),
2984                                              ui::Size(maxGraphicsWidth, maxGraphicsHeight));
2985         producer = bqProducer;
2986     }
2987 
2988     LOG_FATAL_IF(!displaySurface);
2989     auto display = setupNewDisplayDeviceInternal(displayToken, std::move(compositionDisplay), state,
2990                                                  displaySurface, producer);
2991     if (display->isPrimary()) {
2992         initScheduler(display);
2993     }
2994     if (!state.isVirtual()) {
2995         dispatchDisplayHotplugEvent(display->getPhysicalId(), true);
2996     }
2997 
2998     mDisplays.try_emplace(displayToken, std::move(display));
2999 }
3000 
processDisplayRemoved(const wp<IBinder> & displayToken)3001 void SurfaceFlinger::processDisplayRemoved(const wp<IBinder>& displayToken) {
3002     auto display = getDisplayDeviceLocked(displayToken);
3003     if (display) {
3004         display->disconnect();
3005 
3006         if (display->isVirtual()) {
3007             releaseVirtualDisplay(display->getVirtualId());
3008         } else {
3009             dispatchDisplayHotplugEvent(display->getPhysicalId(), false);
3010         }
3011     }
3012 
3013     mDisplays.erase(displayToken);
3014 
3015     if (display && display->isVirtual()) {
3016         static_cast<void>(mScheduler->schedule([display = std::move(display)] {
3017             // Destroy the display without holding the mStateLock.
3018             // This is a temporary solution until we can manage transaction queues without
3019             // holding the mStateLock.
3020             // With blast, the IGBP that is passed to the VirtualDisplaySurface is owned by the
3021             // client. When the IGBP is disconnected, its buffer cache in SF will be cleared
3022             // via SurfaceComposerClient::doUncacheBufferTransaction. This call from the client
3023             // ends up running on the main thread causing a deadlock since setTransactionstate
3024             // will try to acquire the mStateLock. Instead we extend the lifetime of
3025             // DisplayDevice and destroy it in the main thread without holding the mStateLock.
3026             // The display will be disconnected and removed from the mDisplays list so it will
3027             // not be accessible.
3028         }));
3029     }
3030 }
3031 
processDisplayChanged(const wp<IBinder> & displayToken,const DisplayDeviceState & currentState,const DisplayDeviceState & drawingState)3032 void SurfaceFlinger::processDisplayChanged(const wp<IBinder>& displayToken,
3033                                            const DisplayDeviceState& currentState,
3034                                            const DisplayDeviceState& drawingState) {
3035     const sp<IBinder> currentBinder = IInterface::asBinder(currentState.surface);
3036     const sp<IBinder> drawingBinder = IInterface::asBinder(drawingState.surface);
3037 
3038     // Recreate the DisplayDevice if the surface or sequence ID changed.
3039     if (currentBinder != drawingBinder || currentState.sequenceId != drawingState.sequenceId) {
3040         getRenderEngine().cleanFramebufferCache();
3041 
3042         if (const auto display = getDisplayDeviceLocked(displayToken)) {
3043             display->disconnect();
3044             if (display->isVirtual()) {
3045                 releaseVirtualDisplay(display->getVirtualId());
3046             }
3047         }
3048 
3049         mDisplays.erase(displayToken);
3050 
3051         if (const auto& physical = currentState.physical) {
3052             getHwComposer().allocatePhysicalDisplay(physical->hwcDisplayId, physical->id);
3053         }
3054 
3055         processDisplayAdded(displayToken, currentState);
3056 
3057         if (currentState.physical) {
3058             const auto display = getDisplayDeviceLocked(displayToken);
3059             setPowerModeInternal(display, hal::PowerMode::ON);
3060 
3061             // TODO(b/175678251) Call a listener instead.
3062             if (currentState.physical->hwcDisplayId == getHwComposer().getPrimaryHwcDisplayId()) {
3063                 updateInternalDisplayVsyncLocked(display);
3064             }
3065         }
3066         return;
3067     }
3068 
3069     if (const auto display = getDisplayDeviceLocked(displayToken)) {
3070         if (currentState.layerStack != drawingState.layerStack) {
3071             display->setLayerStack(currentState.layerStack);
3072         }
3073         if (currentState.flags != drawingState.flags) {
3074             display->setFlags(currentState.flags);
3075         }
3076         if ((currentState.orientation != drawingState.orientation) ||
3077             (currentState.layerStackSpaceRect != drawingState.layerStackSpaceRect) ||
3078             (currentState.orientedDisplaySpaceRect != drawingState.orientedDisplaySpaceRect)) {
3079             display->setProjection(currentState.orientation, currentState.layerStackSpaceRect,
3080                                    currentState.orientedDisplaySpaceRect);
3081             if (isDisplayActiveLocked(display)) {
3082                 mActiveDisplayTransformHint = display->getTransformHint();
3083             }
3084         }
3085         if (currentState.width != drawingState.width ||
3086             currentState.height != drawingState.height) {
3087             display->setDisplaySize(currentState.width, currentState.height);
3088 
3089             if (isDisplayActiveLocked(display)) {
3090                 onActiveDisplaySizeChanged(display);
3091             }
3092         }
3093     }
3094 }
updateInternalDisplayVsyncLocked(const sp<DisplayDevice> & activeDisplay)3095 void SurfaceFlinger::updateInternalDisplayVsyncLocked(const sp<DisplayDevice>& activeDisplay) {
3096     mVsyncConfiguration->reset();
3097     const Fps refreshRate = activeDisplay->refreshRateConfigs().getActiveMode()->getFps();
3098     updatePhaseConfiguration(refreshRate);
3099     mRefreshRateStats->setRefreshRate(refreshRate);
3100 }
3101 
processDisplayChangesLocked()3102 void SurfaceFlinger::processDisplayChangesLocked() {
3103     // here we take advantage of Vector's copy-on-write semantics to
3104     // improve performance by skipping the transaction entirely when
3105     // know that the lists are identical
3106     const KeyedVector<wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
3107     const KeyedVector<wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
3108     if (!curr.isIdenticalTo(draw)) {
3109         mVisibleRegionsDirty = true;
3110 
3111         // find the displays that were removed
3112         // (ie: in drawing state but not in current state)
3113         // also handle displays that changed
3114         // (ie: displays that are in both lists)
3115         for (size_t i = 0; i < draw.size(); i++) {
3116             const wp<IBinder>& displayToken = draw.keyAt(i);
3117             const ssize_t j = curr.indexOfKey(displayToken);
3118             if (j < 0) {
3119                 // in drawing state but not in current state
3120                 processDisplayRemoved(displayToken);
3121             } else {
3122                 // this display is in both lists. see if something changed.
3123                 const DisplayDeviceState& currentState = curr[j];
3124                 const DisplayDeviceState& drawingState = draw[i];
3125                 processDisplayChanged(displayToken, currentState, drawingState);
3126             }
3127         }
3128 
3129         // find displays that were added
3130         // (ie: in current state but not in drawing state)
3131         for (size_t i = 0; i < curr.size(); i++) {
3132             const wp<IBinder>& displayToken = curr.keyAt(i);
3133             if (draw.indexOfKey(displayToken) < 0) {
3134                 processDisplayAdded(displayToken, curr[i]);
3135             }
3136         }
3137     }
3138 
3139     mDrawingState.displays = mCurrentState.displays;
3140 }
3141 
commitTransactionsLocked(uint32_t transactionFlags)3142 void SurfaceFlinger::commitTransactionsLocked(uint32_t transactionFlags) {
3143     // Commit display transactions.
3144     const bool displayTransactionNeeded = transactionFlags & eDisplayTransactionNeeded;
3145     if (displayTransactionNeeded) {
3146         processDisplayChangesLocked();
3147         processDisplayHotplugEventsLocked();
3148     }
3149     mForceTransactionDisplayChange = displayTransactionNeeded;
3150 
3151     if (mSomeChildrenChanged) {
3152         mVisibleRegionsDirty = true;
3153         mSomeChildrenChanged = false;
3154     }
3155 
3156     // Update transform hint.
3157     if (transactionFlags & (eTransformHintUpdateNeeded | eDisplayTransactionNeeded)) {
3158         // Layers and/or displays have changed, so update the transform hint for each layer.
3159         //
3160         // NOTE: we do this here, rather than when presenting the display so that
3161         // the hint is set before we acquire a buffer from the surface texture.
3162         //
3163         // NOTE: layer transactions have taken place already, so we use their
3164         // drawing state. However, SurfaceFlinger's own transaction has not
3165         // happened yet, so we must use the current state layer list
3166         // (soon to become the drawing state list).
3167         //
3168         sp<const DisplayDevice> hintDisplay;
3169         ui::LayerStack layerStack;
3170 
3171         mCurrentState.traverse([&](Layer* layer) REQUIRES(mStateLock) {
3172             // NOTE: we rely on the fact that layers are sorted by
3173             // layerStack first (so we don't have to traverse the list
3174             // of displays for every layer).
3175             if (const auto filter = layer->getOutputFilter(); layerStack != filter.layerStack) {
3176                 layerStack = filter.layerStack;
3177                 hintDisplay = nullptr;
3178 
3179                 // Find the display that includes the layer.
3180                 for (const auto& [token, display] : mDisplays) {
3181                     if (!display->getCompositionDisplay()->includesLayer(filter)) {
3182                         continue;
3183                     }
3184 
3185                     // Pick the primary display if another display mirrors the layer.
3186                     if (hintDisplay) {
3187                         hintDisplay = nullptr;
3188                         break;
3189                     }
3190 
3191                     hintDisplay = display;
3192                 }
3193             }
3194 
3195             if (!hintDisplay) {
3196                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
3197                 // redraw after transform hint changes. See bug 8508397.
3198 
3199                 // could be null when this layer is using a layerStack
3200                 // that is not visible on any display. Also can occur at
3201                 // screen off/on times.
3202                 hintDisplay = getDefaultDisplayDeviceLocked();
3203             }
3204 
3205             layer->updateTransformHint(hintDisplay->getTransformHint());
3206         });
3207     }
3208 
3209     if (mLayersAdded) {
3210         mLayersAdded = false;
3211         // Layers have been added.
3212         mVisibleRegionsDirty = true;
3213     }
3214 
3215     // some layers might have been removed, so
3216     // we need to update the regions they're exposing.
3217     if (mLayersRemoved) {
3218         mLayersRemoved = false;
3219         mVisibleRegionsDirty = true;
3220         mDrawingState.traverseInZOrder([&](Layer* layer) {
3221             if (mLayersPendingRemoval.indexOf(layer) >= 0) {
3222                 // this layer is not visible anymore
3223                 Region visibleReg;
3224                 visibleReg.set(layer->getScreenBounds());
3225                 invalidateLayerStack(layer, visibleReg);
3226             }
3227         });
3228     }
3229 
3230     doCommitTransactions();
3231     signalSynchronousTransactions(CountDownLatch::eSyncTransaction);
3232     mAnimTransactionPending = false;
3233 }
3234 
updateInputFlinger()3235 void SurfaceFlinger::updateInputFlinger() {
3236     ATRACE_CALL();
3237     if (!mInputFlinger) {
3238         return;
3239     }
3240 
3241     std::vector<WindowInfo> windowInfos;
3242     std::vector<DisplayInfo> displayInfos;
3243     bool updateWindowInfo = false;
3244     if (mVisibleRegionsDirty || mInputInfoChanged) {
3245         mInputInfoChanged = false;
3246         updateWindowInfo = true;
3247         buildWindowInfos(windowInfos, displayInfos);
3248     }
3249     if (!updateWindowInfo && mInputWindowCommands.empty()) {
3250         return;
3251     }
3252     BackgroundExecutor::getInstance().sendCallbacks({[updateWindowInfo,
3253                                                       windowInfos = std::move(windowInfos),
3254                                                       displayInfos = std::move(displayInfos),
3255                                                       inputWindowCommands =
3256                                                               std::move(mInputWindowCommands),
3257                                                       inputFlinger = mInputFlinger, this]() {
3258         ATRACE_NAME("BackgroundExecutor::updateInputFlinger");
3259         if (updateWindowInfo) {
3260             mWindowInfosListenerInvoker->windowInfosChanged(windowInfos, displayInfos,
3261                                                             inputWindowCommands.syncInputWindows);
3262         } else if (inputWindowCommands.syncInputWindows) {
3263             // If the caller requested to sync input windows, but there are no
3264             // changes to input windows, notify immediately.
3265             windowInfosReported();
3266         }
3267         for (const auto& focusRequest : inputWindowCommands.focusRequests) {
3268             inputFlinger->setFocusedWindow(focusRequest);
3269         }
3270     }});
3271 
3272     mInputWindowCommands.clear();
3273 }
3274 
persistDisplayBrightness(bool needsComposite)3275 void SurfaceFlinger::persistDisplayBrightness(bool needsComposite) {
3276     const bool supportsDisplayBrightnessCommand = getHwComposer().getComposer()->isSupported(
3277             Hwc2::Composer::OptionalFeature::DisplayBrightnessCommand);
3278     if (!supportsDisplayBrightnessCommand) {
3279         return;
3280     }
3281 
3282     for (const auto& [_, display] : FTL_FAKE_GUARD(mStateLock, mDisplays)) {
3283         if (const auto brightness = display->getStagedBrightness(); brightness) {
3284             if (!needsComposite) {
3285                 const status_t error =
3286                         getHwComposer()
3287                                 .setDisplayBrightness(display->getPhysicalId(), *brightness,
3288                                                       display->getCompositionDisplay()
3289                                                               ->getState()
3290                                                               .displayBrightnessNits,
3291                                                       Hwc2::Composer::DisplayBrightnessOptions{
3292                                                               .applyImmediately = true})
3293                                 .get();
3294 
3295                 ALOGE_IF(error != NO_ERROR,
3296                          "Error setting display brightness for display %s: %d (%s)",
3297                          display->getDebugName().c_str(), error, strerror(error));
3298             }
3299             display->persistBrightness(needsComposite);
3300         }
3301     }
3302 }
3303 
buildWindowInfos(std::vector<WindowInfo> & outWindowInfos,std::vector<DisplayInfo> & outDisplayInfos)3304 void SurfaceFlinger::buildWindowInfos(std::vector<WindowInfo>& outWindowInfos,
3305                                       std::vector<DisplayInfo>& outDisplayInfos) {
3306     ftl::SmallMap<ui::LayerStack, DisplayDevice::InputInfo, 4> displayInputInfos;
3307 
3308     for (const auto& [_, display] : FTL_FAKE_GUARD(mStateLock, mDisplays)) {
3309         const auto layerStack = display->getLayerStack();
3310         const auto info = display->getInputInfo();
3311 
3312         const auto [it, emplaced] = displayInputInfos.try_emplace(layerStack, info);
3313         if (emplaced) {
3314             continue;
3315         }
3316 
3317         // If the layer stack is mirrored on multiple displays, the first display that is configured
3318         // to receive input takes precedence.
3319         auto& otherInfo = it->second;
3320         if (otherInfo.receivesInput) {
3321             ALOGW_IF(display->receivesInput(),
3322                      "Multiple displays claim to accept input for the same layer stack: %u",
3323                      layerStack.id);
3324         } else {
3325             otherInfo = info;
3326         }
3327     }
3328 
3329     static size_t sNumWindowInfos = 0;
3330     outWindowInfos.reserve(sNumWindowInfos);
3331     sNumWindowInfos = 0;
3332 
3333     mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
3334         if (!layer->needsInputInfo()) return;
3335 
3336         const auto opt = displayInputInfos.get(layer->getLayerStack(),
3337                                                [](const auto& info) -> Layer::InputDisplayArgs {
3338                                                    return {&info.transform, info.isSecure};
3339                                                });
3340         outWindowInfos.push_back(layer->fillInputInfo(opt.value_or(Layer::InputDisplayArgs{})));
3341     });
3342 
3343     sNumWindowInfos = outWindowInfos.size();
3344 
3345     outDisplayInfos.reserve(displayInputInfos.size());
3346     for (const auto& [_, info] : displayInputInfos) {
3347         outDisplayInfos.push_back(info.info);
3348     }
3349 }
3350 
updateCursorAsync()3351 void SurfaceFlinger::updateCursorAsync() {
3352     compositionengine::CompositionRefreshArgs refreshArgs;
3353     for (const auto& [_, display] : FTL_FAKE_GUARD(mStateLock, mDisplays)) {
3354         if (HalDisplayId::tryCast(display->getId())) {
3355             refreshArgs.outputs.push_back(display->getCompositionDisplay());
3356         }
3357     }
3358 
3359     mCompositionEngine->updateCursorAsync(refreshArgs);
3360 }
3361 
requestDisplayMode(DisplayModePtr mode,DisplayModeEvent event)3362 void SurfaceFlinger::requestDisplayMode(DisplayModePtr mode, DisplayModeEvent event) {
3363     // If this is called from the main thread mStateLock must be locked before
3364     // Currently the only way to call this function from the main thread is from
3365     // Scheduler::chooseRefreshRateForContent
3366 
3367     ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
3368 
3369     const auto display = getDefaultDisplayDeviceLocked();
3370     if (!display || mBootStage != BootStage::FINISHED) {
3371         return;
3372     }
3373     ATRACE_CALL();
3374 
3375     if (display->isInternal() && !isDisplayActiveLocked(display)) {
3376         ALOGV("%s(%s): Inactive display", __func__, to_string(display->getId()).c_str());
3377         return;
3378     }
3379 
3380     if (!display->refreshRateConfigs().isModeAllowed(mode->getId())) {
3381         ALOGV("%s(%s): Disallowed mode %d", __func__, to_string(display->getId()).c_str(),
3382               mode->getId().value());
3383         return;
3384     }
3385 
3386     setDesiredActiveMode({std::move(mode), event});
3387 }
3388 
triggerOnFrameRateOverridesChanged()3389 void SurfaceFlinger::triggerOnFrameRateOverridesChanged() {
3390     PhysicalDisplayId displayId = [&]() {
3391         ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
3392         return getDefaultDisplayDeviceLocked()->getPhysicalId();
3393     }();
3394 
3395     mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId);
3396 }
3397 
initScheduler(const sp<DisplayDevice> & display)3398 void SurfaceFlinger::initScheduler(const sp<DisplayDevice>& display) {
3399     if (mScheduler) {
3400         // If the scheduler is already initialized, this means that we received
3401         // a hotplug(connected) on the primary display. In that case we should
3402         // update the scheduler with the most recent display information.
3403         ALOGW("Scheduler already initialized, updating instead");
3404         mScheduler->setRefreshRateConfigs(display->holdRefreshRateConfigs());
3405         return;
3406     }
3407     const auto currRefreshRate = display->getActiveMode()->getFps();
3408     mRefreshRateStats = std::make_unique<scheduler::RefreshRateStats>(*mTimeStats, currRefreshRate,
3409                                                                       hal::PowerMode::OFF);
3410 
3411     mVsyncConfiguration = getFactory().createVsyncConfiguration(currRefreshRate);
3412     mVsyncModulator = sp<VsyncModulator>::make(mVsyncConfiguration->getCurrentConfigs());
3413 
3414     using Feature = scheduler::Feature;
3415     scheduler::FeatureFlags features;
3416 
3417     if (sysprop::use_content_detection_for_refresh_rate(false)) {
3418         features |= Feature::kContentDetection;
3419     }
3420     if (base::GetBoolProperty("debug.sf.show_predicted_vsync"s, false)) {
3421         features |= Feature::kTracePredictedVsync;
3422     }
3423     if (!base::GetBoolProperty("debug.sf.vsync_reactor_ignore_present_fences"s, false) &&
3424         !getHwComposer().hasCapability(Capability::PRESENT_FENCE_IS_NOT_RELIABLE)) {
3425         features |= Feature::kPresentFences;
3426     }
3427 
3428     mScheduler = std::make_unique<scheduler::Scheduler>(static_cast<ICompositor&>(*this),
3429                                                         static_cast<ISchedulerCallback&>(*this),
3430                                                         features);
3431     {
3432         auto configs = display->holdRefreshRateConfigs();
3433         if (configs->kernelIdleTimerController().has_value()) {
3434             features |= Feature::kKernelIdleTimer;
3435         }
3436 
3437         mScheduler->createVsyncSchedule(features);
3438         mScheduler->setRefreshRateConfigs(std::move(configs));
3439     }
3440     setVsyncEnabled(false);
3441     mScheduler->startTimers();
3442 
3443     const auto configs = mVsyncConfiguration->getCurrentConfigs();
3444     const nsecs_t vsyncPeriod = currRefreshRate.getPeriodNsecs();
3445     mAppConnectionHandle =
3446             mScheduler->createConnection("app", mFrameTimeline->getTokenManager(),
3447                                          /*workDuration=*/configs.late.appWorkDuration,
3448                                          /*readyDuration=*/configs.late.sfWorkDuration,
3449                                          impl::EventThread::InterceptVSyncsCallback());
3450     mSfConnectionHandle =
3451             mScheduler->createConnection("appSf", mFrameTimeline->getTokenManager(),
3452                                          /*workDuration=*/std::chrono::nanoseconds(vsyncPeriod),
3453                                          /*readyDuration=*/configs.late.sfWorkDuration,
3454                                          [this](nsecs_t timestamp) {
3455                                              mInterceptor->saveVSyncEvent(timestamp);
3456                                          });
3457 
3458     mScheduler->initVsync(mScheduler->getVsyncDispatch(), *mFrameTimeline->getTokenManager(),
3459                           configs.late.sfWorkDuration);
3460 
3461     mRegionSamplingThread =
3462             new RegionSamplingThread(*this, RegionSamplingThread::EnvironmentTimingTunables());
3463     mFpsReporter = new FpsReporter(*mFrameTimeline, *this);
3464     // Dispatch a mode change request for the primary display on scheduler
3465     // initialization, so that the EventThreads always contain a reference to a
3466     // prior configuration.
3467     //
3468     // This is a bit hacky, but this avoids a back-pointer into the main SF
3469     // classes from EventThread, and there should be no run-time binder cost
3470     // anyway since there are no connected apps at this point.
3471     mScheduler->onPrimaryDisplayModeChanged(mAppConnectionHandle, display->getActiveMode());
3472 }
3473 
updatePhaseConfiguration(const Fps & refreshRate)3474 void SurfaceFlinger::updatePhaseConfiguration(const Fps& refreshRate) {
3475     mVsyncConfiguration->setRefreshRateFps(refreshRate);
3476     setVsyncConfig(mVsyncModulator->setVsyncConfigSet(mVsyncConfiguration->getCurrentConfigs()),
3477                    refreshRate.getPeriodNsecs());
3478 }
3479 
setVsyncConfig(const VsyncModulator::VsyncConfig & config,nsecs_t vsyncPeriod)3480 void SurfaceFlinger::setVsyncConfig(const VsyncModulator::VsyncConfig& config,
3481                                     nsecs_t vsyncPeriod) {
3482     mScheduler->setDuration(mAppConnectionHandle,
3483                             /*workDuration=*/config.appWorkDuration,
3484                             /*readyDuration=*/config.sfWorkDuration);
3485     mScheduler->setDuration(mSfConnectionHandle,
3486                             /*workDuration=*/std::chrono::nanoseconds(vsyncPeriod),
3487                             /*readyDuration=*/config.sfWorkDuration);
3488     mScheduler->setDuration(config.sfWorkDuration);
3489 }
3490 
doCommitTransactions()3491 void SurfaceFlinger::doCommitTransactions() {
3492     ATRACE_CALL();
3493 
3494     if (!mLayersPendingRemoval.isEmpty()) {
3495         // Notify removed layers now that they can't be drawn from
3496         for (const auto& l : mLayersPendingRemoval) {
3497             // Ensure any buffers set to display on any children are released.
3498             if (l->isRemovedFromCurrentState()) {
3499                 l->latchAndReleaseBuffer();
3500             }
3501 
3502             // If a layer has a parent, we allow it to out-live it's handle
3503             // with the idea that the parent holds a reference and will eventually
3504             // be cleaned up. However no one cleans up the top-level so we do so
3505             // here.
3506             if (l->isAtRoot()) {
3507                 l->setIsAtRoot(false);
3508                 mCurrentState.layersSortedByZ.remove(l);
3509             }
3510 
3511             // If the layer has been removed and has no parent, then it will not be reachable
3512             // when traversing layers on screen. Add the layer to the offscreenLayers set to
3513             // ensure we can copy its current to drawing state.
3514             if (!l->getParent()) {
3515                 mOffscreenLayers.emplace(l.get());
3516             }
3517         }
3518         mLayersPendingRemoval.clear();
3519     }
3520 
3521     // If this transaction is part of a window animation then the next frame
3522     // we composite should be considered an animation as well.
3523     mAnimCompositionPending = mAnimTransactionPending;
3524 
3525     mDrawingState = mCurrentState;
3526     // clear the "changed" flags in current state
3527     mCurrentState.colorMatrixChanged = false;
3528 
3529     if (mVisibleRegionsDirty) {
3530         for (const auto& rootLayer : mDrawingState.layersSortedByZ) {
3531             rootLayer->commitChildList();
3532         }
3533     }
3534 
3535     commitOffscreenLayers();
3536     if (mNumClones > 0) {
3537         mDrawingState.traverse([&](Layer* layer) { layer->updateMirrorInfo(); });
3538     }
3539 }
3540 
commitOffscreenLayers()3541 void SurfaceFlinger::commitOffscreenLayers() {
3542     for (Layer* offscreenLayer : mOffscreenLayers) {
3543         offscreenLayer->traverse(LayerVector::StateSet::Drawing, [](Layer* layer) {
3544             if (layer->clearTransactionFlags(eTransactionNeeded)) {
3545                 layer->doTransaction(0);
3546                 layer->commitChildList();
3547             }
3548         });
3549     }
3550 }
3551 
invalidateLayerStack(const sp<const Layer> & layer,const Region & dirty)3552 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
3553     for (const auto& [token, displayDevice] : FTL_FAKE_GUARD(mStateLock, mDisplays)) {
3554         auto display = displayDevice->getCompositionDisplay();
3555         if (display->includesLayer(layer->getOutputFilter())) {
3556             display->editState().dirtyRegion.orSelf(dirty);
3557         }
3558     }
3559 }
3560 
latchBuffers()3561 bool SurfaceFlinger::latchBuffers() {
3562     ATRACE_CALL();
3563 
3564     const nsecs_t latchTime = systemTime();
3565 
3566     bool visibleRegions = false;
3567     bool frameQueued = false;
3568     bool newDataLatched = false;
3569 
3570     const nsecs_t expectedPresentTime = mExpectedPresentTime.load();
3571 
3572     // Store the set of layers that need updates. This set must not change as
3573     // buffers are being latched, as this could result in a deadlock.
3574     // Example: Two producers share the same command stream and:
3575     // 1.) Layer 0 is latched
3576     // 2.) Layer 0 gets a new frame
3577     // 2.) Layer 1 gets a new frame
3578     // 3.) Layer 1 is latched.
3579     // Display is now waiting on Layer 1's frame, which is behind layer 0's
3580     // second frame. But layer 0's second frame could be waiting on display.
3581     mDrawingState.traverse([&](Layer* layer) {
3582         if (layer->clearTransactionFlags(eTransactionNeeded) || mForceTransactionDisplayChange) {
3583             const uint32_t flags = layer->doTransaction(0);
3584             if (flags & Layer::eVisibleRegion) {
3585                 mVisibleRegionsDirty = true;
3586             }
3587         }
3588 
3589         if (layer->hasReadyFrame()) {
3590             frameQueued = true;
3591             if (layer->shouldPresentNow(expectedPresentTime)) {
3592                 mLayersWithQueuedFrames.emplace(layer);
3593             } else {
3594                 ATRACE_NAME("!layer->shouldPresentNow()");
3595                 layer->useEmptyDamage();
3596             }
3597         } else {
3598             layer->useEmptyDamage();
3599         }
3600     });
3601     mForceTransactionDisplayChange = false;
3602 
3603     // The client can continue submitting buffers for offscreen layers, but they will not
3604     // be shown on screen. Therefore, we need to latch and release buffers of offscreen
3605     // layers to ensure dequeueBuffer doesn't block indefinitely.
3606     for (Layer* offscreenLayer : mOffscreenLayers) {
3607         offscreenLayer->traverse(LayerVector::StateSet::Drawing,
3608                                          [&](Layer* l) { l->latchAndReleaseBuffer(); });
3609     }
3610 
3611     if (!mLayersWithQueuedFrames.empty()) {
3612         // mStateLock is needed for latchBuffer as LayerRejecter::reject()
3613         // writes to Layer current state. See also b/119481871
3614         Mutex::Autolock lock(mStateLock);
3615 
3616         for (const auto& layer : mLayersWithQueuedFrames) {
3617             if (layer->latchBuffer(visibleRegions, latchTime, expectedPresentTime)) {
3618                 mLayersPendingRefresh.push_back(layer);
3619                 newDataLatched = true;
3620             }
3621             layer->useSurfaceDamage();
3622         }
3623     }
3624 
3625     mVisibleRegionsDirty |= visibleRegions;
3626 
3627     // If we will need to wake up at some time in the future to deal with a
3628     // queued frame that shouldn't be displayed during this vsync period, wake
3629     // up during the next vsync period to check again.
3630     if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {
3631         scheduleCommit(FrameHint::kNone);
3632     }
3633 
3634     // enter boot animation on first buffer latch
3635     if (CC_UNLIKELY(mBootStage == BootStage::BOOTLOADER && newDataLatched)) {
3636         ALOGI("Enter boot animation");
3637         mBootStage = BootStage::BOOTANIMATION;
3638     }
3639 
3640     if (mNumClones > 0) {
3641         mDrawingState.traverse([&](Layer* layer) { layer->updateCloneBufferInfo(); });
3642     }
3643 
3644     // Only continue with the refresh if there is actually new work to do
3645     return !mLayersWithQueuedFrames.empty() && newDataLatched;
3646 }
3647 
addClientLayer(const sp<Client> & client,const sp<IBinder> & handle,const sp<Layer> & layer,const wp<Layer> & parent,bool addToRoot,uint32_t * outTransformHint)3648 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,
3649                                         const sp<Layer>& layer, const wp<Layer>& parent,
3650                                         bool addToRoot, uint32_t* outTransformHint) {
3651     if (mNumLayers >= ISurfaceComposer::MAX_LAYERS) {
3652         ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers.load(),
3653               ISurfaceComposer::MAX_LAYERS);
3654         static_cast<void>(mScheduler->schedule([=] {
3655             ALOGE("Dumping random sampling of on-screen layers: ");
3656             mDrawingState.traverse([&](Layer *layer) {
3657                 // Aim to dump about 200 layers to avoid totally trashing
3658                 // logcat. On the other hand, if there really are 4096 layers
3659                 // something has gone totally wrong its probably the most
3660                 // useful information in logcat.
3661                 if (rand() % 20 == 13) {
3662                     ALOGE("Layer: %s", layer->getName().c_str());
3663                 }
3664             });
3665             for (Layer* offscreenLayer : mOffscreenLayers) {
3666                 if (rand() % 20 == 13) {
3667                     ALOGE("Offscreen-layer: %s", offscreenLayer->getName().c_str());
3668                 }
3669             }
3670         }));
3671         return NO_MEMORY;
3672     }
3673 
3674     {
3675         std::scoped_lock<std::mutex> lock(mCreatedLayersLock);
3676         mCreatedLayers.emplace_back(layer, parent, addToRoot);
3677     }
3678 
3679     layer->updateTransformHint(mActiveDisplayTransformHint);
3680     if (outTransformHint) {
3681         *outTransformHint = mActiveDisplayTransformHint;
3682     }
3683     // attach this layer to the client
3684     if (client != nullptr) {
3685         client->attachLayer(handle, layer);
3686     }
3687 
3688     setTransactionFlags(eTransactionNeeded);
3689     return NO_ERROR;
3690 }
3691 
getTransactionFlags() const3692 uint32_t SurfaceFlinger::getTransactionFlags() const {
3693     return mTransactionFlags;
3694 }
3695 
clearTransactionFlags(uint32_t mask)3696 uint32_t SurfaceFlinger::clearTransactionFlags(uint32_t mask) {
3697     return mTransactionFlags.fetch_and(~mask) & mask;
3698 }
3699 
setTransactionFlags(uint32_t mask,TransactionSchedule schedule,const sp<IBinder> & applyToken,FrameHint frameHint)3700 void SurfaceFlinger::setTransactionFlags(uint32_t mask, TransactionSchedule schedule,
3701                                          const sp<IBinder>& applyToken, FrameHint frameHint) {
3702     modulateVsync(&VsyncModulator::setTransactionSchedule, schedule, applyToken);
3703 
3704     if (const bool scheduled = mTransactionFlags.fetch_or(mask) & mask; !scheduled) {
3705         scheduleCommit(frameHint);
3706     }
3707 }
3708 
stopTransactionProcessing(const std::unordered_set<sp<IBinder>,SpHash<IBinder>> & applyTokensWithUnsignaledTransactions) const3709 bool SurfaceFlinger::stopTransactionProcessing(
3710         const std::unordered_set<sp<IBinder>, SpHash<IBinder>>&
3711                 applyTokensWithUnsignaledTransactions) const {
3712     if (enableLatchUnsignaledConfig == LatchUnsignaledConfig::AutoSingleLayer) {
3713         // if we are in LatchUnsignaledConfig::AutoSingleLayer
3714         // then we should have only one applyToken for processing.
3715         // so we can stop further transactions on this applyToken.
3716         return !applyTokensWithUnsignaledTransactions.empty();
3717     }
3718 
3719     return false;
3720 }
3721 
flushUnsignaledPendingTransactionQueues(std::vector<TransactionState> & transactions,std::unordered_map<sp<IBinder>,uint64_t,SpHash<IBinder>> & bufferLayersReadyToPresent,std::unordered_set<sp<IBinder>,SpHash<IBinder>> & applyTokensWithUnsignaledTransactions)3722 int SurfaceFlinger::flushUnsignaledPendingTransactionQueues(
3723         std::vector<TransactionState>& transactions,
3724         std::unordered_map<sp<IBinder>, uint64_t, SpHash<IBinder>>& bufferLayersReadyToPresent,
3725         std::unordered_set<sp<IBinder>, SpHash<IBinder>>& applyTokensWithUnsignaledTransactions) {
3726     return flushPendingTransactionQueues(transactions, bufferLayersReadyToPresent,
3727                                          applyTokensWithUnsignaledTransactions,
3728                                          /*tryApplyUnsignaled*/ true);
3729 }
3730 
flushPendingTransactionQueues(std::vector<TransactionState> & transactions,std::unordered_map<sp<IBinder>,uint64_t,SpHash<IBinder>> & bufferLayersReadyToPresent,std::unordered_set<sp<IBinder>,SpHash<IBinder>> & applyTokensWithUnsignaledTransactions,bool tryApplyUnsignaled)3731 int SurfaceFlinger::flushPendingTransactionQueues(
3732         std::vector<TransactionState>& transactions,
3733         std::unordered_map<sp<IBinder>, uint64_t, SpHash<IBinder>>& bufferLayersReadyToPresent,
3734         std::unordered_set<sp<IBinder>, SpHash<IBinder>>& applyTokensWithUnsignaledTransactions,
3735         bool tryApplyUnsignaled) {
3736     int transactionsPendingBarrier = 0;
3737     auto it = mPendingTransactionQueues.begin();
3738     while (it != mPendingTransactionQueues.end()) {
3739         auto& [applyToken, transactionQueue] = *it;
3740         while (!transactionQueue.empty()) {
3741             if (stopTransactionProcessing(applyTokensWithUnsignaledTransactions)) {
3742                 ATRACE_NAME("stopTransactionProcessing");
3743                 break;
3744             }
3745 
3746             auto& transaction = transactionQueue.front();
3747             const auto ready =
3748                 transactionIsReadyToBeApplied(transaction,
3749                                               transaction.frameTimelineInfo,
3750                                               transaction.isAutoTimestamp,
3751                                               transaction.desiredPresentTime,
3752                                               transaction.originUid, transaction.states,
3753                                               bufferLayersReadyToPresent, transactions.size(),
3754                                               tryApplyUnsignaled);
3755             ATRACE_INT("TransactionReadiness", static_cast<int>(ready));
3756             if (ready == TransactionReadiness::NotReady) {
3757                 setTransactionFlags(eTransactionFlushNeeded);
3758                 break;
3759             }
3760             if (ready == TransactionReadiness::NotReadyBarrier) {
3761                 transactionsPendingBarrier++;
3762                 setTransactionFlags(eTransactionFlushNeeded);
3763                 break;
3764             }
3765             transaction.traverseStatesWithBuffers([&](const layer_state_t& state) {
3766                 const bool frameNumberChanged = state.bufferData->flags.test(
3767                         BufferData::BufferDataChange::frameNumberChanged);
3768                 if (frameNumberChanged) {
3769                     bufferLayersReadyToPresent[state.surface] = state.bufferData->frameNumber;
3770                 } else {
3771                     // Barrier function only used for BBQ which always includes a frame number
3772                     bufferLayersReadyToPresent[state.surface] =
3773                         std::numeric_limits<uint64_t>::max();
3774                 }
3775             });
3776             const bool appliedUnsignaled = (ready == TransactionReadiness::ReadyUnsignaled);
3777             if (appliedUnsignaled) {
3778                 applyTokensWithUnsignaledTransactions.insert(transaction.applyToken);
3779             }
3780 
3781             transactions.emplace_back(std::move(transaction));
3782             transactionQueue.pop();
3783         }
3784 
3785         if (transactionQueue.empty()) {
3786             it = mPendingTransactionQueues.erase(it);
3787             mTransactionQueueCV.broadcast();
3788         } else {
3789             it = std::next(it, 1);
3790         }
3791     }
3792     return transactionsPendingBarrier;
3793 }
3794 
flushTransactionQueues(int64_t vsyncId)3795 bool SurfaceFlinger::flushTransactionQueues(int64_t vsyncId) {
3796     // to prevent onHandleDestroyed from being called while the lock is held,
3797     // we must keep a copy of the transactions (specifically the composer
3798     // states) around outside the scope of the lock
3799     std::vector<TransactionState> transactions;
3800     // Layer handles that have transactions with buffers that are ready to be applied.
3801     std::unordered_map<sp<IBinder>, uint64_t, SpHash<IBinder>> bufferLayersReadyToPresent;
3802     std::unordered_set<sp<IBinder>, SpHash<IBinder>> applyTokensWithUnsignaledTransactions;
3803     {
3804         Mutex::Autolock _l(mStateLock);
3805         {
3806             Mutex::Autolock _l(mQueueLock);
3807 
3808             int lastTransactionsPendingBarrier = 0;
3809             int transactionsPendingBarrier = 0;
3810             // First collect transactions from the pending transaction queues.
3811             // We are not allowing unsignaled buffers here as we want to
3812             // collect all the transactions from applyTokens that are ready first.
3813             transactionsPendingBarrier =
3814                     flushPendingTransactionQueues(transactions, bufferLayersReadyToPresent,
3815                             applyTokensWithUnsignaledTransactions, /*tryApplyUnsignaled*/ false);
3816 
3817             // Second, collect transactions from the transaction queue.
3818             // Here as well we are not allowing unsignaled buffers for the same
3819             // reason as above.
3820             while (!mTransactionQueue.empty()) {
3821                 auto& transaction = mTransactionQueue.front();
3822                 const bool pendingTransactions =
3823                         mPendingTransactionQueues.find(transaction.applyToken) !=
3824                         mPendingTransactionQueues.end();
3825                 const auto ready = [&]() REQUIRES(mStateLock) {
3826                     if (pendingTransactions) {
3827                         ATRACE_NAME("pendingTransactions");
3828                         return TransactionReadiness::NotReady;
3829                     }
3830 
3831                     return transactionIsReadyToBeApplied(transaction, transaction.frameTimelineInfo,
3832                                                          transaction.isAutoTimestamp,
3833                                                          transaction.desiredPresentTime,
3834                                                          transaction.originUid, transaction.states,
3835                                                          bufferLayersReadyToPresent,
3836                                                          transactions.size(),
3837                                                          /*tryApplyUnsignaled*/ false);
3838                 }();
3839                 ATRACE_INT("TransactionReadiness", static_cast<int>(ready));
3840                 if (ready != TransactionReadiness::Ready) {
3841                     if (ready == TransactionReadiness::NotReadyBarrier) {
3842                         transactionsPendingBarrier++;
3843                     }
3844                     mPendingTransactionQueues[transaction.applyToken].push(std::move(transaction));
3845                 } else {
3846                     transaction.traverseStatesWithBuffers([&](const layer_state_t& state) {
3847                         const bool frameNumberChanged = state.bufferData->flags.test(
3848                                 BufferData::BufferDataChange::frameNumberChanged);
3849                         if (frameNumberChanged) {
3850                             bufferLayersReadyToPresent[state.surface] = state.bufferData->frameNumber;
3851                         } else {
3852                             // Barrier function only used for BBQ which always includes a frame number.
3853                             // This value only used for barrier logic.
3854                             bufferLayersReadyToPresent[state.surface] =
3855                                 std::numeric_limits<uint64_t>::max();
3856                         }
3857                     });
3858                     transactions.emplace_back(std::move(transaction));
3859                 }
3860                 mTransactionQueue.pop_front();
3861                 ATRACE_INT("TransactionQueue", mTransactionQueue.size());
3862             }
3863 
3864             // Transactions with a buffer pending on a barrier may be on a different applyToken
3865             // than the transaction which satisfies our barrier. In fact this is the exact use case
3866             // that the primitive is designed for. This means we may first process
3867             // the barrier dependent transaction, determine it ineligible to complete
3868             // and then satisfy in a later inner iteration of flushPendingTransactionQueues.
3869             // The barrier dependent transaction was eligible to be presented in this frame
3870             // but we would have prevented it without case. To fix this we continually
3871             // loop through flushPendingTransactionQueues until we perform an iteration
3872             // where the number of transactionsPendingBarrier doesn't change. This way
3873             // we can continue to resolve dependency chains of barriers as far as possible.
3874             while (lastTransactionsPendingBarrier != transactionsPendingBarrier) {
3875                 lastTransactionsPendingBarrier = transactionsPendingBarrier;
3876                 transactionsPendingBarrier =
3877                     flushPendingTransactionQueues(transactions, bufferLayersReadyToPresent,
3878                         applyTokensWithUnsignaledTransactions,
3879                         /*tryApplyUnsignaled*/ false);
3880             }
3881 
3882             // We collected all transactions that could apply without latching unsignaled buffers.
3883             // If we are allowing latch unsignaled of some form, now it's the time to go over the
3884             // transactions that were not applied and try to apply them unsignaled.
3885             if (enableLatchUnsignaledConfig != LatchUnsignaledConfig::Disabled) {
3886                 flushUnsignaledPendingTransactionQueues(transactions, bufferLayersReadyToPresent,
3887                                                         applyTokensWithUnsignaledTransactions);
3888             }
3889 
3890             return applyTransactions(transactions, vsyncId);
3891         }
3892     }
3893 }
3894 
applyTransactions(std::vector<TransactionState> & transactions,int64_t vsyncId)3895 bool SurfaceFlinger::applyTransactions(std::vector<TransactionState>& transactions,
3896                                        int64_t vsyncId) {
3897     bool needsTraversal = false;
3898     // Now apply all transactions.
3899     for (auto& transaction : transactions) {
3900         needsTraversal |=
3901                 applyTransactionState(transaction.frameTimelineInfo, transaction.states,
3902                                       transaction.displays, transaction.flags,
3903                                       transaction.inputWindowCommands,
3904                                       transaction.desiredPresentTime, transaction.isAutoTimestamp,
3905                                       transaction.buffer, transaction.postTime,
3906                                       transaction.permissions, transaction.hasListenerCallbacks,
3907                                       transaction.listenerCallbacks, transaction.originPid,
3908                                       transaction.originUid, transaction.id);
3909         if (transaction.transactionCommittedSignal) {
3910             mTransactionCommittedSignals.emplace_back(
3911                     std::move(transaction.transactionCommittedSignal));
3912         }
3913     }
3914 
3915     if (mTransactionTracing) {
3916         mTransactionTracing->addCommittedTransactions(transactions, vsyncId);
3917     }
3918     return needsTraversal;
3919 }
3920 
transactionFlushNeeded()3921 bool SurfaceFlinger::transactionFlushNeeded() {
3922     Mutex::Autolock _l(mQueueLock);
3923     return !mPendingTransactionQueues.empty() || !mTransactionQueue.empty();
3924 }
3925 
frameIsEarly(nsecs_t expectedPresentTime,int64_t vsyncId) const3926 bool SurfaceFlinger::frameIsEarly(nsecs_t expectedPresentTime, int64_t vsyncId) const {
3927     // The amount of time SF can delay a frame if it is considered early based
3928     // on the VsyncModulator::VsyncConfig::appWorkDuration
3929     constexpr static std::chrono::nanoseconds kEarlyLatchMaxThreshold = 100ms;
3930 
3931     const auto currentVsyncPeriod = mScheduler->getDisplayStatInfo(systemTime()).vsyncPeriod;
3932     const auto earlyLatchVsyncThreshold = currentVsyncPeriod / 2;
3933 
3934     const auto prediction = mFrameTimeline->getTokenManager()->getPredictionsForToken(vsyncId);
3935     if (!prediction.has_value()) {
3936         return false;
3937     }
3938 
3939     if (std::abs(prediction->presentTime - expectedPresentTime) >=
3940         kEarlyLatchMaxThreshold.count()) {
3941         return false;
3942     }
3943 
3944     return prediction->presentTime >= expectedPresentTime &&
3945             prediction->presentTime - expectedPresentTime >= earlyLatchVsyncThreshold;
3946 }
shouldLatchUnsignaled(const sp<Layer> & layer,const layer_state_t & state,size_t numStates,size_t totalTXapplied) const3947 bool SurfaceFlinger::shouldLatchUnsignaled(const sp<Layer>& layer, const layer_state_t& state,
3948                                            size_t numStates, size_t totalTXapplied) const {
3949     if (enableLatchUnsignaledConfig == LatchUnsignaledConfig::Disabled) {
3950         ALOGV("%s: false (LatchUnsignaledConfig::Disabled)", __func__);
3951         return false;
3952     }
3953 
3954     if (enableLatchUnsignaledConfig == LatchUnsignaledConfig::Always) {
3955         ALOGV("%s: true (LatchUnsignaledConfig::Always)", __func__);
3956         return true;
3957     }
3958 
3959     // We only want to latch unsignaled when a single layer is updated in this
3960     // transaction (i.e. not a blast sync transaction).
3961     if (numStates != 1) {
3962         ALOGV("%s: false (numStates=%zu)", __func__, numStates);
3963         return false;
3964     }
3965 
3966     if (enableLatchUnsignaledConfig == LatchUnsignaledConfig::AutoSingleLayer) {
3967         if (totalTXapplied > 0) {
3968             ALOGV("%s: false (LatchUnsignaledConfig::AutoSingleLayer; totalTXapplied=%zu)",
3969                   __func__, totalTXapplied);
3970             return false;
3971         }
3972 
3973         // We don't want to latch unsignaled if are in early / client composition
3974         // as it leads to jank due to RenderEngine waiting for unsignaled buffer
3975         // or window animations being slow.
3976         const auto isDefaultVsyncConfig = mVsyncModulator->isVsyncConfigDefault();
3977         if (!isDefaultVsyncConfig) {
3978             ALOGV("%s: false (LatchUnsignaledConfig::AutoSingleLayer; !isDefaultVsyncConfig)",
3979                   __func__);
3980             return false;
3981         }
3982     }
3983 
3984     if (!layer->simpleBufferUpdate(state)) {
3985         ALOGV("%s: false (!simpleBufferUpdate)", __func__);
3986         return false;
3987     }
3988 
3989     ALOGV("%s: true", __func__);
3990     return true;
3991 }
3992 
transactionIsReadyToBeApplied(TransactionState & transaction,const FrameTimelineInfo & info,bool isAutoTimestamp,int64_t desiredPresentTime,uid_t originUid,const Vector<ComposerState> & states,const std::unordered_map<sp<IBinder>,uint64_t,SpHash<IBinder>> & bufferLayersReadyToPresent,size_t totalTXapplied,bool tryApplyUnsignaled) const3993 auto SurfaceFlinger::transactionIsReadyToBeApplied(TransactionState& transaction,
3994         const FrameTimelineInfo& info, bool isAutoTimestamp, int64_t desiredPresentTime,
3995         uid_t originUid, const Vector<ComposerState>& states,
3996         const std::unordered_map<
3997             sp<IBinder>, uint64_t, SpHash<IBinder>>& bufferLayersReadyToPresent,
3998         size_t totalTXapplied, bool tryApplyUnsignaled) const -> TransactionReadiness {
3999     ATRACE_FORMAT("transactionIsReadyToBeApplied vsyncId: %" PRId64, info.vsyncId);
4000     const nsecs_t expectedPresentTime = mExpectedPresentTime.load();
4001     // Do not present if the desiredPresentTime has not passed unless it is more than one second
4002     // in the future. We ignore timestamps more than 1 second in the future for stability reasons.
4003     if (!isAutoTimestamp && desiredPresentTime >= expectedPresentTime &&
4004         desiredPresentTime < expectedPresentTime + s2ns(1)) {
4005         ATRACE_NAME("not current");
4006         return TransactionReadiness::NotReady;
4007     }
4008 
4009     if (!mScheduler->isVsyncValid(expectedPresentTime, originUid)) {
4010         ATRACE_NAME("!isVsyncValid");
4011         return TransactionReadiness::NotReady;
4012     }
4013 
4014     // If the client didn't specify desiredPresentTime, use the vsyncId to determine the expected
4015     // present time of this transaction.
4016     if (isAutoTimestamp && frameIsEarly(expectedPresentTime, info.vsyncId)) {
4017         ATRACE_NAME("frameIsEarly");
4018         return TransactionReadiness::NotReady;
4019     }
4020 
4021     bool fenceUnsignaled = false;
4022     auto queueProcessTime = systemTime();
4023     for (const ComposerState& state : states) {
4024         const layer_state_t& s = state.state;
4025 
4026         sp<Layer> layer = nullptr;
4027         if (s.surface) {
4028             layer = fromHandle(s.surface).promote();
4029         } else if (s.hasBufferChanges()) {
4030             ALOGW("Transaction with buffer, but no Layer?");
4031             continue;
4032         }
4033         if (!layer) {
4034             continue;
4035         }
4036 
4037         if (s.hasBufferChanges() && s.bufferData->hasBarrier &&
4038             ((layer->getDrawingState().frameNumber) < s.bufferData->barrierFrameNumber)) {
4039             const bool willApplyBarrierFrame =
4040                 (bufferLayersReadyToPresent.find(s.surface) != bufferLayersReadyToPresent.end()) &&
4041                 (bufferLayersReadyToPresent.at(s.surface) >= s.bufferData->barrierFrameNumber);
4042             if (!willApplyBarrierFrame) {
4043                 ATRACE_NAME("NotReadyBarrier");
4044                 return TransactionReadiness::NotReadyBarrier;
4045             }
4046         }
4047 
4048         const bool allowLatchUnsignaled = tryApplyUnsignaled &&
4049                 shouldLatchUnsignaled(layer, s, states.size(), totalTXapplied);
4050         ATRACE_FORMAT("%s allowLatchUnsignaled=%s", layer->getName().c_str(),
4051                       allowLatchUnsignaled ? "true" : "false");
4052 
4053         const bool acquireFenceChanged = s.bufferData &&
4054                 s.bufferData->flags.test(BufferData::BufferDataChange::fenceChanged) &&
4055                 s.bufferData->acquireFence;
4056         fenceUnsignaled = fenceUnsignaled ||
4057                 (acquireFenceChanged &&
4058                  s.bufferData->acquireFence->getStatus() == Fence::Status::Unsignaled);
4059 
4060         if (fenceUnsignaled && !allowLatchUnsignaled) {
4061             if (!transaction.sentFenceTimeoutWarning &&
4062                 queueProcessTime - transaction.queueTime > std::chrono::nanoseconds(4s).count()) {
4063                 transaction.sentFenceTimeoutWarning = true;
4064                 auto listener = s.bufferData->releaseBufferListener;
4065                 if (listener) {
4066                     listener->onTransactionQueueStalled();
4067                 }
4068             }
4069 
4070             ATRACE_NAME("fence unsignaled");
4071             return TransactionReadiness::NotReady;
4072         }
4073 
4074         if (s.hasBufferChanges()) {
4075             // If backpressure is enabled and we already have a buffer to commit, keep the
4076             // transaction in the queue.
4077             const bool hasPendingBuffer = bufferLayersReadyToPresent.find(s.surface) !=
4078                 bufferLayersReadyToPresent.end();
4079             if (layer->backpressureEnabled() && hasPendingBuffer && isAutoTimestamp) {
4080                 ATRACE_NAME("hasPendingBuffer");
4081                 return TransactionReadiness::NotReady;
4082             }
4083         }
4084     }
4085     return fenceUnsignaled ? TransactionReadiness::ReadyUnsignaled : TransactionReadiness::Ready;
4086 }
4087 
queueTransaction(TransactionState & state)4088 void SurfaceFlinger::queueTransaction(TransactionState& state) {
4089     state.queueTime = systemTime();
4090 
4091     Mutex::Autolock lock(mQueueLock);
4092 
4093     // Generate a CountDownLatch pending state if this is a synchronous transaction.
4094     if ((state.flags & eSynchronous) || state.inputWindowCommands.syncInputWindows) {
4095         state.transactionCommittedSignal = std::make_shared<CountDownLatch>(
4096                 (state.inputWindowCommands.syncInputWindows
4097                          ? (CountDownLatch::eSyncInputWindows | CountDownLatch::eSyncTransaction)
4098                          : CountDownLatch::eSyncTransaction));
4099     }
4100 
4101     mTransactionQueue.emplace_back(state);
4102     ATRACE_INT("TransactionQueue", mTransactionQueue.size());
4103 
4104     const auto schedule = [](uint32_t flags) {
4105         if (flags & eEarlyWakeupEnd) return TransactionSchedule::EarlyEnd;
4106         if (flags & eEarlyWakeupStart) return TransactionSchedule::EarlyStart;
4107         return TransactionSchedule::Late;
4108     }(state.flags);
4109 
4110     const auto frameHint = state.isFrameActive() ? FrameHint::kActive : FrameHint::kNone;
4111 
4112     setTransactionFlags(eTransactionFlushNeeded, schedule, state.applyToken, frameHint);
4113 }
4114 
waitForSynchronousTransaction(const CountDownLatch & transactionCommittedSignal)4115 void SurfaceFlinger::waitForSynchronousTransaction(
4116         const CountDownLatch& transactionCommittedSignal) {
4117     // applyTransactionState is called on the main SF thread.  While a given process may wish
4118     // to wait on synchronous transactions, the main SF thread should apply the transaction and
4119     // set the value to notify this after committed.
4120     if (!transactionCommittedSignal.wait_until(
4121                 std::chrono::nanoseconds(mAnimationTransactionTimeout))) {
4122         ALOGE("setTransactionState timed out!");
4123     }
4124 }
4125 
signalSynchronousTransactions(const uint32_t flag)4126 void SurfaceFlinger::signalSynchronousTransactions(const uint32_t flag) {
4127     for (auto it = mTransactionCommittedSignals.begin();
4128          it != mTransactionCommittedSignals.end();) {
4129         if ((*it)->countDown(flag)) {
4130             it = mTransactionCommittedSignals.erase(it);
4131         } else {
4132             it++;
4133         }
4134     }
4135 }
4136 
setTransactionState(const FrameTimelineInfo & frameTimelineInfo,const Vector<ComposerState> & states,const Vector<DisplayState> & displays,uint32_t flags,const sp<IBinder> & applyToken,const InputWindowCommands & inputWindowCommands,int64_t desiredPresentTime,bool isAutoTimestamp,const client_cache_t & uncacheBuffer,bool hasListenerCallbacks,const std::vector<ListenerCallbacks> & listenerCallbacks,uint64_t transactionId)4137 status_t SurfaceFlinger::setTransactionState(
4138         const FrameTimelineInfo& frameTimelineInfo, const Vector<ComposerState>& states,
4139         const Vector<DisplayState>& displays, uint32_t flags, const sp<IBinder>& applyToken,
4140         const InputWindowCommands& inputWindowCommands, int64_t desiredPresentTime,
4141         bool isAutoTimestamp, const client_cache_t& uncacheBuffer, bool hasListenerCallbacks,
4142         const std::vector<ListenerCallbacks>& listenerCallbacks, uint64_t transactionId) {
4143     ATRACE_CALL();
4144 
4145     uint32_t permissions =
4146         callingThreadHasUnscopedSurfaceFlingerAccess() ?
4147         layer_state_t::Permission::ACCESS_SURFACE_FLINGER : 0;
4148     // Avoid checking for rotation permissions if the caller already has ACCESS_SURFACE_FLINGER
4149     // permissions.
4150     if ((permissions & layer_state_t::Permission::ACCESS_SURFACE_FLINGER) ||
4151         callingThreadHasRotateSurfaceFlingerAccess()) {
4152         permissions |= layer_state_t::Permission::ROTATE_SURFACE_FLINGER;
4153     }
4154 
4155     if (callingThreadHasInternalSystemWindowAccess()) {
4156         permissions |= layer_state_t::Permission::INTERNAL_SYSTEM_WINDOW;
4157     }
4158 
4159     if (!(permissions & layer_state_t::Permission::ACCESS_SURFACE_FLINGER) &&
4160         (flags & (eEarlyWakeupStart | eEarlyWakeupEnd))) {
4161         ALOGE("Only WindowManager is allowed to use eEarlyWakeup[Start|End] flags");
4162         flags &= ~(eEarlyWakeupStart | eEarlyWakeupEnd);
4163     }
4164 
4165     const int64_t postTime = systemTime();
4166 
4167     IPCThreadState* ipc = IPCThreadState::self();
4168     const int originPid = ipc->getCallingPid();
4169     const int originUid = ipc->getCallingUid();
4170     TransactionState state{frameTimelineInfo,  states,
4171                            displays,           flags,
4172                            applyToken,         inputWindowCommands,
4173                            desiredPresentTime, isAutoTimestamp,
4174                            uncacheBuffer,      postTime,
4175                            permissions,        hasListenerCallbacks,
4176                            listenerCallbacks,  originPid,
4177                            originUid,          transactionId};
4178 
4179     // Check for incoming buffer updates and increment the pending buffer count.
4180     state.traverseStatesWithBuffers([&](const layer_state_t& state) {
4181         mBufferCountTracker.increment(state.surface->localBinder());
4182     });
4183 
4184     if (mTransactionTracing) {
4185         mTransactionTracing->addQueuedTransaction(state);
4186     }
4187     queueTransaction(state);
4188 
4189     // Check the pending state to make sure the transaction is synchronous.
4190     if (state.transactionCommittedSignal) {
4191         waitForSynchronousTransaction(*state.transactionCommittedSignal);
4192     }
4193 
4194     return NO_ERROR;
4195 }
4196 
applyTransactionState(const FrameTimelineInfo & frameTimelineInfo,Vector<ComposerState> & states,Vector<DisplayState> & displays,uint32_t flags,const InputWindowCommands & inputWindowCommands,const int64_t desiredPresentTime,bool isAutoTimestamp,const client_cache_t & uncacheBuffer,const int64_t postTime,uint32_t permissions,bool hasListenerCallbacks,const std::vector<ListenerCallbacks> & listenerCallbacks,int originPid,int originUid,uint64_t transactionId)4197 bool SurfaceFlinger::applyTransactionState(const FrameTimelineInfo& frameTimelineInfo,
4198                                            Vector<ComposerState>& states,
4199                                            Vector<DisplayState>& displays, uint32_t flags,
4200                                            const InputWindowCommands& inputWindowCommands,
4201                                            const int64_t desiredPresentTime, bool isAutoTimestamp,
4202                                            const client_cache_t& uncacheBuffer,
4203                                            const int64_t postTime, uint32_t permissions,
4204                                            bool hasListenerCallbacks,
4205                                            const std::vector<ListenerCallbacks>& listenerCallbacks,
4206                                            int originPid, int originUid, uint64_t transactionId) {
4207     uint32_t transactionFlags = 0;
4208     for (DisplayState& display : displays) {
4209         display.sanitize(permissions);
4210         transactionFlags |= setDisplayStateLocked(display);
4211     }
4212 
4213     // start and end registration for listeners w/ no surface so they can get their callback.  Note
4214     // that listeners with SurfaceControls will start registration during setClientStateLocked
4215     // below.
4216     for (const auto& listener : listenerCallbacks) {
4217         mTransactionCallbackInvoker.addEmptyTransaction(listener);
4218     }
4219 
4220     uint32_t clientStateFlags = 0;
4221     for (int i = 0; i < states.size(); i++) {
4222         ComposerState& state = states.editItemAt(i);
4223         clientStateFlags |= setClientStateLocked(frameTimelineInfo, state, desiredPresentTime,
4224                                                  isAutoTimestamp, postTime, permissions);
4225         if ((flags & eAnimation) && state.state.surface) {
4226             if (const auto layer = fromHandle(state.state.surface).promote()) {
4227                 using LayerUpdateType = scheduler::LayerHistory::LayerUpdateType;
4228                 mScheduler->recordLayerHistory(layer.get(),
4229                                                isAutoTimestamp ? 0 : desiredPresentTime,
4230                                                LayerUpdateType::AnimationTX);
4231             }
4232         }
4233     }
4234 
4235     transactionFlags |= clientStateFlags;
4236 
4237     if (permissions & layer_state_t::Permission::ACCESS_SURFACE_FLINGER) {
4238         transactionFlags |= addInputWindowCommands(inputWindowCommands);
4239     } else if (!inputWindowCommands.empty()) {
4240         ALOGE("Only privileged callers are allowed to send input commands.");
4241     }
4242 
4243     if (uncacheBuffer.isValid()) {
4244         ClientCache::getInstance().erase(uncacheBuffer);
4245     }
4246 
4247     // If a synchronous transaction is explicitly requested without any changes, force a transaction
4248     // anyway. This can be used as a flush mechanism for previous async transactions.
4249     // Empty animation transaction can be used to simulate back-pressure, so also force a
4250     // transaction for empty animation transactions.
4251     if (transactionFlags == 0 &&
4252             ((flags & eSynchronous) || (flags & eAnimation))) {
4253         transactionFlags = eTransactionNeeded;
4254     }
4255 
4256     bool needsTraversal = false;
4257     if (transactionFlags) {
4258         if (mInterceptor->isEnabled()) {
4259             mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags,
4260                                           originPid, originUid, transactionId);
4261         }
4262 
4263         // We are on the main thread, we are about to preform a traversal. Clear the traversal bit
4264         // so we don't have to wake up again next frame to preform an unnecessary traversal.
4265         if (transactionFlags & eTraversalNeeded) {
4266             transactionFlags = transactionFlags & (~eTraversalNeeded);
4267             needsTraversal = true;
4268         }
4269         if (transactionFlags) {
4270             setTransactionFlags(transactionFlags);
4271         }
4272 
4273         if (flags & eAnimation) {
4274             mAnimTransactionPending = true;
4275         }
4276     }
4277 
4278     return needsTraversal;
4279 }
4280 
setDisplayStateLocked(const DisplayState & s)4281 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s) {
4282     const ssize_t index = mCurrentState.displays.indexOfKey(s.token);
4283     if (index < 0) return 0;
4284 
4285     uint32_t flags = 0;
4286     DisplayDeviceState& state = mCurrentState.displays.editValueAt(index);
4287 
4288     const uint32_t what = s.what;
4289     if (what & DisplayState::eSurfaceChanged) {
4290         if (IInterface::asBinder(state.surface) != IInterface::asBinder(s.surface)) {
4291             state.surface = s.surface;
4292             flags |= eDisplayTransactionNeeded;
4293         }
4294     }
4295     if (what & DisplayState::eLayerStackChanged) {
4296         if (state.layerStack != s.layerStack) {
4297             state.layerStack = s.layerStack;
4298             flags |= eDisplayTransactionNeeded;
4299         }
4300     }
4301     if (what & DisplayState::eFlagsChanged) {
4302         if (state.flags != s.flags) {
4303             state.flags = s.flags;
4304             flags |= eDisplayTransactionNeeded;
4305         }
4306     }
4307     if (what & DisplayState::eDisplayProjectionChanged) {
4308         if (state.orientation != s.orientation) {
4309             state.orientation = s.orientation;
4310             flags |= eDisplayTransactionNeeded;
4311         }
4312         if (state.orientedDisplaySpaceRect != s.orientedDisplaySpaceRect) {
4313             state.orientedDisplaySpaceRect = s.orientedDisplaySpaceRect;
4314             flags |= eDisplayTransactionNeeded;
4315         }
4316         if (state.layerStackSpaceRect != s.layerStackSpaceRect) {
4317             state.layerStackSpaceRect = s.layerStackSpaceRect;
4318             flags |= eDisplayTransactionNeeded;
4319         }
4320     }
4321     if (what & DisplayState::eDisplaySizeChanged) {
4322         if (state.width != s.width) {
4323             state.width = s.width;
4324             flags |= eDisplayTransactionNeeded;
4325         }
4326         if (state.height != s.height) {
4327             state.height = s.height;
4328             flags |= eDisplayTransactionNeeded;
4329         }
4330     }
4331 
4332     return flags;
4333 }
4334 
callingThreadHasUnscopedSurfaceFlingerAccess(bool usePermissionCache)4335 bool SurfaceFlinger::callingThreadHasUnscopedSurfaceFlingerAccess(bool usePermissionCache) {
4336     IPCThreadState* ipc = IPCThreadState::self();
4337     const int pid = ipc->getCallingPid();
4338     const int uid = ipc->getCallingUid();
4339     if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
4340         (usePermissionCache ? !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)
4341                             : !checkPermission(sAccessSurfaceFlinger, pid, uid))) {
4342         return false;
4343     }
4344     return true;
4345 }
4346 
setClientStateLocked(const FrameTimelineInfo & frameTimelineInfo,ComposerState & composerState,int64_t desiredPresentTime,bool isAutoTimestamp,int64_t postTime,uint32_t permissions)4347 uint32_t SurfaceFlinger::setClientStateLocked(const FrameTimelineInfo& frameTimelineInfo,
4348                                               ComposerState& composerState,
4349                                               int64_t desiredPresentTime, bool isAutoTimestamp,
4350                                               int64_t postTime, uint32_t permissions) {
4351     layer_state_t& s = composerState.state;
4352     s.sanitize(permissions);
4353 
4354     std::vector<ListenerCallbacks> filteredListeners;
4355     for (auto& listener : s.listeners) {
4356         // Starts a registration but separates the callback ids according to callback type. This
4357         // allows the callback invoker to send on latch callbacks earlier.
4358         // note that startRegistration will not re-register if the listener has
4359         // already be registered for a prior surface control
4360 
4361         ListenerCallbacks onCommitCallbacks = listener.filter(CallbackId::Type::ON_COMMIT);
4362         if (!onCommitCallbacks.callbackIds.empty()) {
4363             filteredListeners.push_back(onCommitCallbacks);
4364         }
4365 
4366         ListenerCallbacks onCompleteCallbacks = listener.filter(CallbackId::Type::ON_COMPLETE);
4367         if (!onCompleteCallbacks.callbackIds.empty()) {
4368             filteredListeners.push_back(onCompleteCallbacks);
4369         }
4370     }
4371 
4372     const uint64_t what = s.what;
4373     uint32_t flags = 0;
4374     sp<Layer> layer = nullptr;
4375     if (s.surface) {
4376         layer = fromHandle(s.surface).promote();
4377     } else {
4378         // The client may provide us a null handle. Treat it as if the layer was removed.
4379         ALOGW("Attempt to set client state with a null layer handle");
4380     }
4381     if (layer == nullptr) {
4382         for (auto& [listener, callbackIds] : s.listeners) {
4383             mTransactionCallbackInvoker.registerUnpresentedCallbackHandle(
4384                     new CallbackHandle(listener, callbackIds, s.surface));
4385         }
4386         return 0;
4387     }
4388 
4389     // Only set by BLAST adapter layers
4390     if (what & layer_state_t::eProducerDisconnect) {
4391         layer->onDisconnect();
4392     }
4393 
4394     if (what & layer_state_t::ePositionChanged) {
4395         if (layer->setPosition(s.x, s.y)) {
4396             flags |= eTraversalNeeded;
4397         }
4398     }
4399     if (what & layer_state_t::eLayerChanged) {
4400         // NOTE: index needs to be calculated before we update the state
4401         const auto& p = layer->getParent();
4402         if (p == nullptr) {
4403             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
4404             if (layer->setLayer(s.z) && idx >= 0) {
4405                 mCurrentState.layersSortedByZ.removeAt(idx);
4406                 mCurrentState.layersSortedByZ.add(layer);
4407                 // we need traversal (state changed)
4408                 // AND transaction (list changed)
4409                 flags |= eTransactionNeeded|eTraversalNeeded;
4410             }
4411         } else {
4412             if (p->setChildLayer(layer, s.z)) {
4413                 flags |= eTransactionNeeded|eTraversalNeeded;
4414             }
4415         }
4416     }
4417     if (what & layer_state_t::eRelativeLayerChanged) {
4418         // NOTE: index needs to be calculated before we update the state
4419         const auto& p = layer->getParent();
4420         const auto& relativeHandle = s.relativeLayerSurfaceControl ?
4421                 s.relativeLayerSurfaceControl->getHandle() : nullptr;
4422         if (p == nullptr) {
4423             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
4424             if (layer->setRelativeLayer(relativeHandle, s.z) &&
4425                 idx >= 0) {
4426                 mCurrentState.layersSortedByZ.removeAt(idx);
4427                 mCurrentState.layersSortedByZ.add(layer);
4428                 // we need traversal (state changed)
4429                 // AND transaction (list changed)
4430                 flags |= eTransactionNeeded|eTraversalNeeded;
4431             }
4432         } else {
4433             if (p->setChildRelativeLayer(layer, relativeHandle, s.z)) {
4434                 flags |= eTransactionNeeded|eTraversalNeeded;
4435             }
4436         }
4437     }
4438     if (what & layer_state_t::eSizeChanged) {
4439         if (layer->setSize(s.w, s.h)) {
4440             flags |= eTraversalNeeded;
4441         }
4442     }
4443     if (what & layer_state_t::eAlphaChanged) {
4444         if (layer->setAlpha(s.alpha))
4445             flags |= eTraversalNeeded;
4446     }
4447     if (what & layer_state_t::eColorChanged) {
4448         if (layer->setColor(s.color))
4449             flags |= eTraversalNeeded;
4450     }
4451     if (what & layer_state_t::eColorTransformChanged) {
4452         if (layer->setColorTransform(s.colorTransform)) {
4453             flags |= eTraversalNeeded;
4454         }
4455     }
4456     if (what & layer_state_t::eBackgroundColorChanged) {
4457         if (layer->setBackgroundColor(s.color, s.bgColorAlpha, s.bgColorDataspace)) {
4458             flags |= eTraversalNeeded;
4459         }
4460     }
4461     if (what & layer_state_t::eMatrixChanged) {
4462         if (layer->setMatrix(s.matrix)) flags |= eTraversalNeeded;
4463     }
4464     if (what & layer_state_t::eTransparentRegionChanged) {
4465         if (layer->setTransparentRegionHint(s.transparentRegion))
4466             flags |= eTraversalNeeded;
4467     }
4468     if (what & layer_state_t::eFlagsChanged) {
4469         if (layer->setFlags(s.flags, s.mask)) flags |= eTraversalNeeded;
4470     }
4471     if (what & layer_state_t::eCornerRadiusChanged) {
4472         if (layer->setCornerRadius(s.cornerRadius))
4473             flags |= eTraversalNeeded;
4474     }
4475     if (what & layer_state_t::eBackgroundBlurRadiusChanged && mSupportsBlur) {
4476         if (layer->setBackgroundBlurRadius(s.backgroundBlurRadius)) flags |= eTraversalNeeded;
4477     }
4478     if (what & layer_state_t::eBlurRegionsChanged) {
4479         if (layer->setBlurRegions(s.blurRegions)) flags |= eTraversalNeeded;
4480     }
4481     if (what & layer_state_t::eLayerStackChanged) {
4482         ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
4483         // We only allow setting layer stacks for top level layers,
4484         // everything else inherits layer stack from its parent.
4485         if (layer->hasParent()) {
4486             ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
4487                   layer->getDebugName());
4488         } else if (idx < 0) {
4489             ALOGE("Attempt to set layer stack on layer without parent (%s) that "
4490                   "that also does not appear in the top level layer list. Something"
4491                   " has gone wrong.",
4492                   layer->getDebugName());
4493         } else if (layer->setLayerStack(s.layerStack)) {
4494             mCurrentState.layersSortedByZ.removeAt(idx);
4495             mCurrentState.layersSortedByZ.add(layer);
4496             // we need traversal (state changed)
4497             // AND transaction (list changed)
4498             flags |= eTransactionNeeded | eTraversalNeeded | eTransformHintUpdateNeeded;
4499         }
4500     }
4501     if (what & layer_state_t::eTransformChanged) {
4502         if (layer->setTransform(s.transform)) flags |= eTraversalNeeded;
4503     }
4504     if (what & layer_state_t::eTransformToDisplayInverseChanged) {
4505         if (layer->setTransformToDisplayInverse(s.transformToDisplayInverse))
4506             flags |= eTraversalNeeded;
4507     }
4508     if (what & layer_state_t::eCropChanged) {
4509         if (layer->setCrop(s.crop)) flags |= eTraversalNeeded;
4510     }
4511     if (what & layer_state_t::eDataspaceChanged) {
4512         if (layer->setDataspace(s.dataspace)) flags |= eTraversalNeeded;
4513     }
4514     if (what & layer_state_t::eHdrMetadataChanged) {
4515         if (layer->setHdrMetadata(s.hdrMetadata)) flags |= eTraversalNeeded;
4516     }
4517     if (what & layer_state_t::eSurfaceDamageRegionChanged) {
4518         if (layer->setSurfaceDamageRegion(s.surfaceDamageRegion)) flags |= eTraversalNeeded;
4519     }
4520     if (what & layer_state_t::eApiChanged) {
4521         if (layer->setApi(s.api)) flags |= eTraversalNeeded;
4522     }
4523     if (what & layer_state_t::eSidebandStreamChanged) {
4524         if (layer->setSidebandStream(s.sidebandStream)) flags |= eTraversalNeeded;
4525     }
4526     if (what & layer_state_t::eInputInfoChanged) {
4527         layer->setInputInfo(*s.windowInfoHandle->getInfo());
4528         flags |= eTraversalNeeded;
4529     }
4530     std::optional<nsecs_t> dequeueBufferTimestamp;
4531     if (what & layer_state_t::eMetadataChanged) {
4532         dequeueBufferTimestamp = s.metadata.getInt64(METADATA_DEQUEUE_TIME);
4533 
4534         if (const int32_t gameMode = s.metadata.getInt32(METADATA_GAME_MODE, -1); gameMode != -1) {
4535             // The transaction will be received on the Task layer and needs to be applied to all
4536             // child layers. Child layers that are added at a later point will obtain the game mode
4537             // info through addChild().
4538             layer->setGameModeForTree(static_cast<GameMode>(gameMode));
4539         }
4540 
4541         if (layer->setMetadata(s.metadata)) flags |= eTraversalNeeded;
4542     }
4543     if (what & layer_state_t::eColorSpaceAgnosticChanged) {
4544         if (layer->setColorSpaceAgnostic(s.colorSpaceAgnostic)) {
4545             flags |= eTraversalNeeded;
4546         }
4547     }
4548     if (what & layer_state_t::eShadowRadiusChanged) {
4549         if (layer->setShadowRadius(s.shadowRadius)) flags |= eTraversalNeeded;
4550     }
4551     if (what & layer_state_t::eFrameRateSelectionPriority) {
4552         if (layer->setFrameRateSelectionPriority(s.frameRateSelectionPriority)) {
4553             flags |= eTraversalNeeded;
4554         }
4555     }
4556     if (what & layer_state_t::eFrameRateChanged) {
4557         const auto compatibility =
4558             Layer::FrameRate::convertCompatibility(s.frameRateCompatibility);
4559         const auto strategy =
4560             Layer::FrameRate::convertChangeFrameRateStrategy(s.changeFrameRateStrategy);
4561 
4562         if (layer->setFrameRate(
4563                 Layer::FrameRate(Fps::fromValue(s.frameRate), compatibility, strategy))) {
4564           flags |= eTraversalNeeded;
4565         }
4566     }
4567     if (what & layer_state_t::eFixedTransformHintChanged) {
4568         if (layer->setFixedTransformHint(s.fixedTransformHint)) {
4569             flags |= eTraversalNeeded | eTransformHintUpdateNeeded;
4570         }
4571     }
4572     if (what & layer_state_t::eAutoRefreshChanged) {
4573         layer->setAutoRefresh(s.autoRefresh);
4574     }
4575     if (what & layer_state_t::eDimmingEnabledChanged) {
4576         if (layer->setDimmingEnabled(s.dimmingEnabled)) flags |= eTraversalNeeded;
4577     }
4578     if (what & layer_state_t::eTrustedOverlayChanged) {
4579         if (layer->setTrustedOverlay(s.isTrustedOverlay)) {
4580             flags |= eTraversalNeeded;
4581         }
4582     }
4583     if (what & layer_state_t::eStretchChanged) {
4584         if (layer->setStretchEffect(s.stretchEffect)) {
4585             flags |= eTraversalNeeded;
4586         }
4587     }
4588     if (what & layer_state_t::eBufferCropChanged) {
4589         if (layer->setBufferCrop(s.bufferCrop)) {
4590             flags |= eTraversalNeeded;
4591         }
4592     }
4593     if (what & layer_state_t::eDestinationFrameChanged) {
4594         if (layer->setDestinationFrame(s.destinationFrame)) {
4595             flags |= eTraversalNeeded;
4596         }
4597     }
4598     if (what & layer_state_t::eDropInputModeChanged) {
4599         if (layer->setDropInputMode(s.dropInputMode)) {
4600             flags |= eTraversalNeeded;
4601             mInputInfoChanged = true;
4602         }
4603     }
4604     // This has to happen after we reparent children because when we reparent to null we remove
4605     // child layers from current state and remove its relative z. If the children are reparented in
4606     // the same transaction, then we have to make sure we reparent the children first so we do not
4607     // lose its relative z order.
4608     if (what & layer_state_t::eReparent) {
4609         bool hadParent = layer->hasParent();
4610         auto parentHandle = (s.parentSurfaceControlForChild)
4611                 ? s.parentSurfaceControlForChild->getHandle()
4612                 : nullptr;
4613         if (layer->reparent(parentHandle)) {
4614             if (!hadParent) {
4615                 layer->setIsAtRoot(false);
4616                 mCurrentState.layersSortedByZ.remove(layer);
4617             }
4618             flags |= eTransactionNeeded | eTraversalNeeded;
4619         }
4620     }
4621     std::vector<sp<CallbackHandle>> callbackHandles;
4622     if ((what & layer_state_t::eHasListenerCallbacksChanged) && (!filteredListeners.empty())) {
4623         for (auto& [listener, callbackIds] : filteredListeners) {
4624             callbackHandles.emplace_back(new CallbackHandle(listener, callbackIds, s.surface));
4625         }
4626     }
4627 
4628     if (what & layer_state_t::eBufferChanged) {
4629         std::shared_ptr<renderengine::ExternalTexture> buffer =
4630                 getExternalTextureFromBufferData(*s.bufferData, layer->getDebugName());
4631         if (layer->setBuffer(buffer, *s.bufferData, postTime, desiredPresentTime, isAutoTimestamp,
4632                              dequeueBufferTimestamp, frameTimelineInfo)) {
4633             flags |= eTraversalNeeded;
4634         }
4635     } else if (frameTimelineInfo.vsyncId != FrameTimelineInfo::INVALID_VSYNC_ID) {
4636         layer->setFrameTimelineVsyncForBufferlessTransaction(frameTimelineInfo, postTime);
4637     }
4638 
4639     if (layer->setTransactionCompletedListeners(callbackHandles)) flags |= eTraversalNeeded;
4640     // Do not put anything that updates layer state or modifies flags after
4641     // setTransactionCompletedListener
4642     return flags;
4643 }
4644 
addInputWindowCommands(const InputWindowCommands & inputWindowCommands)4645 uint32_t SurfaceFlinger::addInputWindowCommands(const InputWindowCommands& inputWindowCommands) {
4646     bool hasChanges = mInputWindowCommands.merge(inputWindowCommands);
4647     return hasChanges ? eTraversalNeeded : 0;
4648 }
4649 
mirrorLayer(const LayerCreationArgs & args,const sp<IBinder> & mirrorFromHandle,sp<IBinder> * outHandle,int32_t * outLayerId)4650 status_t SurfaceFlinger::mirrorLayer(const LayerCreationArgs& args,
4651                                      const sp<IBinder>& mirrorFromHandle, sp<IBinder>* outHandle,
4652                                      int32_t* outLayerId) {
4653     if (!mirrorFromHandle) {
4654         return NAME_NOT_FOUND;
4655     }
4656 
4657     sp<Layer> mirrorLayer;
4658     sp<Layer> mirrorFrom;
4659     {
4660         Mutex::Autolock _l(mStateLock);
4661         mirrorFrom = fromHandle(mirrorFromHandle).promote();
4662         if (!mirrorFrom) {
4663             return NAME_NOT_FOUND;
4664         }
4665         status_t result = createContainerLayer(args, outHandle, &mirrorLayer);
4666         if (result != NO_ERROR) {
4667             return result;
4668         }
4669 
4670         mirrorLayer->setClonedChild(mirrorFrom->createClone());
4671     }
4672 
4673     *outLayerId = mirrorLayer->sequence;
4674     if (mTransactionTracing) {
4675         mTransactionTracing->onMirrorLayerAdded((*outHandle)->localBinder(), mirrorLayer->sequence,
4676                                                 args.name, mirrorFrom->sequence);
4677     }
4678     return addClientLayer(args.client, *outHandle, mirrorLayer /* layer */, nullptr /* parent */,
4679                           false /* addToRoot */, nullptr /* outTransformHint */);
4680 }
4681 
createLayer(LayerCreationArgs & args,sp<IBinder> * outHandle,const sp<IBinder> & parentHandle,int32_t * outLayerId,const sp<Layer> & parentLayer,uint32_t * outTransformHint)4682 status_t SurfaceFlinger::createLayer(LayerCreationArgs& args, sp<IBinder>* outHandle,
4683                                      const sp<IBinder>& parentHandle, int32_t* outLayerId,
4684                                      const sp<Layer>& parentLayer, uint32_t* outTransformHint) {
4685     ALOG_ASSERT(parentLayer == nullptr || parentHandle == nullptr,
4686             "Expected only one of parentLayer or parentHandle to be non-null. "
4687             "Programmer error?");
4688 
4689     status_t result = NO_ERROR;
4690 
4691     sp<Layer> layer;
4692 
4693     switch (args.flags & ISurfaceComposerClient::eFXSurfaceMask) {
4694         case ISurfaceComposerClient::eFXSurfaceBufferQueue:
4695         case ISurfaceComposerClient::eFXSurfaceBufferState: {
4696             result = createBufferStateLayer(args, outHandle, &layer);
4697             std::atomic<int32_t>* pendingBufferCounter = layer->getPendingBufferCounter();
4698             if (pendingBufferCounter) {
4699                 std::string counterName = layer->getPendingBufferCounterName();
4700                 mBufferCountTracker.add((*outHandle)->localBinder(), counterName,
4701                                         pendingBufferCounter);
4702             }
4703         } break;
4704         case ISurfaceComposerClient::eFXSurfaceEffect:
4705             result = createEffectLayer(args, outHandle, &layer);
4706             break;
4707         case ISurfaceComposerClient::eFXSurfaceContainer:
4708             result = createContainerLayer(args, outHandle, &layer);
4709             break;
4710         default:
4711             result = BAD_VALUE;
4712             break;
4713     }
4714 
4715     if (result != NO_ERROR) {
4716         return result;
4717     }
4718 
4719     bool addToRoot = args.addToRoot && callingThreadHasUnscopedSurfaceFlingerAccess();
4720     wp<Layer> parent(parentHandle != nullptr ? fromHandle(parentHandle) : parentLayer);
4721     if (parentHandle != nullptr && parent == nullptr) {
4722         ALOGE("Invalid parent handle %p.", parentHandle.get());
4723         addToRoot = false;
4724     }
4725     if (parentLayer != nullptr) {
4726         addToRoot = false;
4727     }
4728 
4729     int parentId = -1;
4730     // We can safely promote the layer in binder thread because we have a strong reference
4731     // to the layer's handle inside this scope or we were passed in a sp reference to the layer.
4732     sp<Layer> parentSp = parent.promote();
4733     if (parentSp != nullptr) {
4734         parentId = parentSp->getSequence();
4735     }
4736     if (mTransactionTracing) {
4737         mTransactionTracing->onLayerAdded((*outHandle)->localBinder(), layer->sequence, args.name,
4738                                           args.flags, parentId);
4739     }
4740 
4741     result = addClientLayer(args.client, *outHandle, layer, parent, addToRoot, outTransformHint);
4742     if (result != NO_ERROR) {
4743         return result;
4744     }
4745 
4746     *outLayerId = layer->sequence;
4747     return result;
4748 }
4749 
createBufferQueueLayer(LayerCreationArgs & args,PixelFormat & format,sp<IBinder> * handle,sp<IGraphicBufferProducer> * gbp,sp<Layer> * outLayer)4750 status_t SurfaceFlinger::createBufferQueueLayer(LayerCreationArgs& args, PixelFormat& format,
4751                                                 sp<IBinder>* handle,
4752                                                 sp<IGraphicBufferProducer>* gbp,
4753                                                 sp<Layer>* outLayer) {
4754     // initialize the surfaces
4755     switch (format) {
4756     case PIXEL_FORMAT_TRANSPARENT:
4757     case PIXEL_FORMAT_TRANSLUCENT:
4758         format = PIXEL_FORMAT_RGBA_8888;
4759         break;
4760     case PIXEL_FORMAT_OPAQUE:
4761         format = PIXEL_FORMAT_RGBX_8888;
4762         break;
4763     }
4764 
4765     sp<BufferQueueLayer> layer;
4766     args.textureName = getNewTexture();
4767     {
4768         // Grab the SF state lock during this since it's the only safe way to access
4769         // RenderEngine when creating a BufferLayerConsumer
4770         // TODO: Check if this lock is still needed here
4771         Mutex::Autolock lock(mStateLock);
4772         layer = getFactory().createBufferQueueLayer(args);
4773     }
4774 
4775     status_t err = layer->setDefaultBufferProperties(0, 0, format);
4776     if (err == NO_ERROR) {
4777         *handle = layer->getHandle();
4778         *gbp = layer->getProducer();
4779         *outLayer = layer;
4780     }
4781 
4782     ALOGE_IF(err, "createBufferQueueLayer() failed (%s)", strerror(-err));
4783     return err;
4784 }
4785 
createBufferStateLayer(LayerCreationArgs & args,sp<IBinder> * handle,sp<Layer> * outLayer)4786 status_t SurfaceFlinger::createBufferStateLayer(LayerCreationArgs& args, sp<IBinder>* handle,
4787                                                 sp<Layer>* outLayer) {
4788     args.textureName = getNewTexture();
4789     *outLayer = getFactory().createBufferStateLayer(args);
4790     *handle = (*outLayer)->getHandle();
4791     return NO_ERROR;
4792 }
4793 
createEffectLayer(const LayerCreationArgs & args,sp<IBinder> * handle,sp<Layer> * outLayer)4794 status_t SurfaceFlinger::createEffectLayer(const LayerCreationArgs& args, sp<IBinder>* handle,
4795                                            sp<Layer>* outLayer) {
4796     *outLayer = getFactory().createEffectLayer(args);
4797     *handle = (*outLayer)->getHandle();
4798     return NO_ERROR;
4799 }
4800 
createContainerLayer(const LayerCreationArgs & args,sp<IBinder> * handle,sp<Layer> * outLayer)4801 status_t SurfaceFlinger::createContainerLayer(const LayerCreationArgs& args, sp<IBinder>* handle,
4802                                               sp<Layer>* outLayer) {
4803     *outLayer = getFactory().createContainerLayer(args);
4804     *handle = (*outLayer)->getHandle();
4805     return NO_ERROR;
4806 }
4807 
markLayerPendingRemovalLocked(const sp<Layer> & layer)4808 void SurfaceFlinger::markLayerPendingRemovalLocked(const sp<Layer>& layer) {
4809     mLayersPendingRemoval.add(layer);
4810     mLayersRemoved = true;
4811     setTransactionFlags(eTransactionNeeded);
4812 }
4813 
onHandleDestroyed(BBinder * handle,sp<Layer> & layer)4814 void SurfaceFlinger::onHandleDestroyed(BBinder* handle, sp<Layer>& layer) {
4815     Mutex::Autolock lock(mStateLock);
4816     markLayerPendingRemovalLocked(layer);
4817     mBufferCountTracker.remove(handle);
4818     layer.clear();
4819     if (mTransactionTracing) {
4820         mTransactionTracing->onHandleRemoved(handle);
4821     }
4822 }
4823 
4824 // ---------------------------------------------------------------------------
4825 
onInitializeDisplays()4826 void SurfaceFlinger::onInitializeDisplays() {
4827     const auto display = getDefaultDisplayDeviceLocked();
4828     if (!display) return;
4829 
4830     const sp<IBinder> token = display->getDisplayToken().promote();
4831     LOG_ALWAYS_FATAL_IF(token == nullptr);
4832 
4833     // reset screen orientation and use primary layer stack
4834     Vector<ComposerState> state;
4835     Vector<DisplayState> displays;
4836     DisplayState d;
4837     d.what = DisplayState::eDisplayProjectionChanged |
4838              DisplayState::eLayerStackChanged;
4839     d.token = token;
4840     d.layerStack = ui::DEFAULT_LAYER_STACK;
4841     d.orientation = ui::ROTATION_0;
4842     d.orientedDisplaySpaceRect.makeInvalid();
4843     d.layerStackSpaceRect.makeInvalid();
4844     d.width = 0;
4845     d.height = 0;
4846     displays.add(d);
4847 
4848     nsecs_t now = systemTime();
4849 
4850     int64_t transactionId = (((int64_t)mPid) << 32) | mUniqueTransactionId++;
4851     // It should be on the main thread, apply it directly.
4852     applyTransactionState(FrameTimelineInfo{}, state, displays, 0, mInputWindowCommands,
4853                           /* desiredPresentTime */ now, true, {}, /* postTime */ now, true, false,
4854                           {}, mPid, getuid(), transactionId);
4855 
4856     setPowerModeInternal(display, hal::PowerMode::ON);
4857     const nsecs_t vsyncPeriod = display->refreshRateConfigs().getActiveMode()->getVsyncPeriod();
4858     mAnimFrameTracker.setDisplayRefreshPeriod(vsyncPeriod);
4859     mActiveDisplayTransformHint = display->getTransformHint();
4860     // Use phase of 0 since phase is not known.
4861     // Use latency of 0, which will snap to the ideal latency.
4862     DisplayStatInfo stats{0 /* vsyncTime */, vsyncPeriod};
4863     setCompositorTimingSnapped(stats, 0);
4864 }
4865 
initializeDisplays()4866 void SurfaceFlinger::initializeDisplays() {
4867     // Async since we may be called from the main thread.
4868     static_cast<void>(
4869             mScheduler->schedule([this]() FTL_FAKE_GUARD(mStateLock) { onInitializeDisplays(); }));
4870 }
4871 
setPowerModeInternal(const sp<DisplayDevice> & display,hal::PowerMode mode)4872 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& display, hal::PowerMode mode) {
4873     if (display->isVirtual()) {
4874         ALOGE("%s: Invalid operation on virtual display", __func__);
4875         return;
4876     }
4877 
4878     const auto displayId = display->getPhysicalId();
4879     ALOGD("Setting power mode %d on display %s", mode, to_string(displayId).c_str());
4880 
4881     std::optional<hal::PowerMode> currentMode = display->getPowerMode();
4882     if (currentMode.has_value() && mode == *currentMode) {
4883         return;
4884     }
4885 
4886     const auto activeDisplay = getDisplayDeviceLocked(mActiveDisplayToken);
4887     if (activeDisplay != display && display->isInternal() && activeDisplay &&
4888         activeDisplay->isPoweredOn()) {
4889         ALOGW("Trying to change power mode on non active display while the active display is ON");
4890     }
4891 
4892     display->setPowerMode(mode);
4893 
4894     if (mInterceptor->isEnabled()) {
4895         mInterceptor->savePowerModeUpdate(display->getSequenceId(), static_cast<int32_t>(mode));
4896     }
4897     const auto refreshRate = display->refreshRateConfigs().getActiveMode()->getFps();
4898     if (!currentMode || *currentMode == hal::PowerMode::OFF) {
4899         // Turn on the display
4900         if (display->isInternal() && (!activeDisplay || !activeDisplay->isPoweredOn())) {
4901             onActiveDisplayChangedLocked(display);
4902         }
4903         // Keep uclamp in a separate syscall and set it before changing to RT due to b/190237315.
4904         // We can merge the syscall later.
4905         if (SurfaceFlinger::setSchedAttr(true) != NO_ERROR) {
4906             ALOGW("Couldn't set uclamp.min on display on: %s\n", strerror(errno));
4907         }
4908         if (SurfaceFlinger::setSchedFifo(true) != NO_ERROR) {
4909             ALOGW("Couldn't set SCHED_FIFO on display on: %s\n", strerror(errno));
4910         }
4911         getHwComposer().setPowerMode(displayId, mode);
4912         if (isDisplayActiveLocked(display) && mode != hal::PowerMode::DOZE_SUSPEND) {
4913             setHWCVsyncEnabled(displayId, mHWCVsyncPendingState);
4914             mScheduler->onScreenAcquired(mAppConnectionHandle);
4915             mScheduler->resyncToHardwareVsync(true, refreshRate);
4916         }
4917 
4918         mVisibleRegionsDirty = true;
4919         mHasPoweredOff = true;
4920         scheduleComposite(FrameHint::kActive);
4921     } else if (mode == hal::PowerMode::OFF) {
4922         // Turn off the display
4923         if (SurfaceFlinger::setSchedFifo(false) != NO_ERROR) {
4924             ALOGW("Couldn't set SCHED_OTHER on display off: %s\n", strerror(errno));
4925         }
4926         if (SurfaceFlinger::setSchedAttr(false) != NO_ERROR) {
4927             ALOGW("Couldn't set uclamp.min on display off: %s\n", strerror(errno));
4928         }
4929         if (isDisplayActiveLocked(display) && *currentMode != hal::PowerMode::DOZE_SUSPEND) {
4930             mScheduler->disableHardwareVsync(true);
4931             mScheduler->onScreenReleased(mAppConnectionHandle);
4932         }
4933 
4934         // Make sure HWVsync is disabled before turning off the display
4935         setHWCVsyncEnabled(displayId, hal::Vsync::DISABLE);
4936 
4937         getHwComposer().setPowerMode(displayId, mode);
4938         mVisibleRegionsDirty = true;
4939         // from this point on, SF will stop drawing on this display
4940     } else if (mode == hal::PowerMode::DOZE || mode == hal::PowerMode::ON) {
4941         // Update display while dozing
4942         getHwComposer().setPowerMode(displayId, mode);
4943         if (isDisplayActiveLocked(display) && *currentMode == hal::PowerMode::DOZE_SUSPEND) {
4944             mScheduler->onScreenAcquired(mAppConnectionHandle);
4945             mScheduler->resyncToHardwareVsync(true, refreshRate);
4946         }
4947     } else if (mode == hal::PowerMode::DOZE_SUSPEND) {
4948         // Leave display going to doze
4949         if (isDisplayActiveLocked(display)) {
4950             mScheduler->disableHardwareVsync(true);
4951             mScheduler->onScreenReleased(mAppConnectionHandle);
4952         }
4953         getHwComposer().setPowerMode(displayId, mode);
4954     } else {
4955         ALOGE("Attempting to set unknown power mode: %d\n", mode);
4956         getHwComposer().setPowerMode(displayId, mode);
4957     }
4958 
4959     if (isDisplayActiveLocked(display)) {
4960         mTimeStats->setPowerMode(mode);
4961         mRefreshRateStats->setPowerMode(mode);
4962         mScheduler->setDisplayPowerMode(mode);
4963     }
4964 
4965     ALOGD("Finished setting power mode %d on display %s", mode, to_string(displayId).c_str());
4966 }
4967 
setPowerMode(const sp<IBinder> & displayToken,int mode)4968 void SurfaceFlinger::setPowerMode(const sp<IBinder>& displayToken, int mode) {
4969     auto future = mScheduler->schedule([=]() FTL_FAKE_GUARD(mStateLock) {
4970         const auto display = getDisplayDeviceLocked(displayToken);
4971         if (!display) {
4972             ALOGE("Attempt to set power mode %d for invalid display token %p", mode,
4973                   displayToken.get());
4974         } else if (display->isVirtual()) {
4975             ALOGW("Attempt to set power mode %d for virtual display", mode);
4976         } else {
4977             setPowerModeInternal(display, static_cast<hal::PowerMode>(mode));
4978         }
4979     });
4980 
4981     future.wait();
4982 }
4983 
doDump(int fd,const DumpArgs & args,bool asProto)4984 status_t SurfaceFlinger::doDump(int fd, const DumpArgs& args, bool asProto) {
4985     std::string result;
4986 
4987     IPCThreadState* ipc = IPCThreadState::self();
4988     const int pid = ipc->getCallingPid();
4989     const int uid = ipc->getCallingUid();
4990 
4991     if ((uid != AID_SHELL) &&
4992             !PermissionCache::checkPermission(sDump, pid, uid)) {
4993         StringAppendF(&result, "Permission Denial: can't dump SurfaceFlinger from pid=%d, uid=%d\n",
4994                       pid, uid);
4995     } else {
4996         static const std::unordered_map<std::string, Dumper> dumpers = {
4997                 {"--comp-displays"s, dumper(&SurfaceFlinger::dumpCompositionDisplays)},
4998                 {"--display-id"s, dumper(&SurfaceFlinger::dumpDisplayIdentificationData)},
4999                 {"--displays"s, dumper(&SurfaceFlinger::dumpDisplays)},
5000                 {"--dispsync"s, dumper([this](std::string& s) { mScheduler->dumpVsync(s); })},
5001                 {"--edid"s, argsDumper(&SurfaceFlinger::dumpRawDisplayIdentificationData)},
5002                 {"--latency"s, argsDumper(&SurfaceFlinger::dumpStatsLocked)},
5003                 {"--latency-clear"s, argsDumper(&SurfaceFlinger::clearStatsLocked)},
5004                 {"--list"s, dumper(&SurfaceFlinger::listLayersLocked)},
5005                 {"--planner"s, argsDumper(&SurfaceFlinger::dumpPlannerInfo)},
5006                 {"--static-screen"s, dumper(&SurfaceFlinger::dumpStaticScreenStats)},
5007                 {"--timestats"s, protoDumper(&SurfaceFlinger::dumpTimeStats)},
5008                 {"--vsync"s, dumper(&SurfaceFlinger::dumpVSync)},
5009                 {"--wide-color"s, dumper(&SurfaceFlinger::dumpWideColorInfo)},
5010                 {"--frametimeline"s, argsDumper(&SurfaceFlinger::dumpFrameTimeline)},
5011         };
5012 
5013         const auto flag = args.empty() ? ""s : std::string(String8(args[0]));
5014 
5015         // Traversal of drawing state must happen on the main thread.
5016         // Otherwise, SortedVector may have shared ownership during concurrent
5017         // traversals, which can result in use-after-frees.
5018         std::string compositionLayers;
5019         mScheduler
5020                 ->schedule([&] {
5021                     StringAppendF(&compositionLayers, "Composition layers\n");
5022                     mDrawingState.traverseInZOrder([&](Layer* layer) {
5023                         auto* compositionState = layer->getCompositionState();
5024                         if (!compositionState || !compositionState->isVisible) return;
5025 
5026                         android::base::StringAppendF(&compositionLayers, "* Layer %p (%s)\n", layer,
5027                                                      layer->getDebugName() ? layer->getDebugName()
5028                                                                            : "<unknown>");
5029                         compositionState->dump(compositionLayers);
5030                     });
5031                 })
5032                 .get();
5033 
5034         bool dumpLayers = true;
5035         {
5036             TimedLock lock(mStateLock, s2ns(1), __func__);
5037             if (!lock.locked()) {
5038                 StringAppendF(&result, "Dumping without lock after timeout: %s (%d)\n",
5039                               strerror(-lock.status), lock.status);
5040             }
5041 
5042             if (const auto it = dumpers.find(flag); it != dumpers.end()) {
5043                 (it->second)(args, asProto, result);
5044                 dumpLayers = false;
5045             } else if (!asProto) {
5046                 dumpAllLocked(args, compositionLayers, result);
5047             }
5048         }
5049 
5050         if (dumpLayers) {
5051             LayersTraceFileProto traceFileProto = mLayerTracing.createTraceFileProto();
5052             LayersTraceProto* layersTrace = traceFileProto.add_entry();
5053             LayersProto layersProto = dumpProtoFromMainThread();
5054             layersTrace->mutable_layers()->Swap(&layersProto);
5055             dumpDisplayProto(*layersTrace);
5056 
5057             if (asProto) {
5058                 result.append(traceFileProto.SerializeAsString());
5059             } else {
5060                 // Dump info that we need to access from the main thread
5061                 const auto layerTree = LayerProtoParser::generateLayerTree(layersTrace->layers());
5062                 result.append(LayerProtoParser::layerTreeToString(layerTree));
5063                 result.append("\n");
5064                 dumpOffscreenLayers(result);
5065             }
5066         }
5067     }
5068     write(fd, result.c_str(), result.size());
5069     return NO_ERROR;
5070 }
5071 
dumpCritical(int fd,const DumpArgs &,bool asProto)5072 status_t SurfaceFlinger::dumpCritical(int fd, const DumpArgs&, bool asProto) {
5073     if (asProto) {
5074         mLayerTracing.writeToFile();
5075         if (mTransactionTracing) {
5076             mTransactionTracing->writeToFile();
5077         }
5078     }
5079 
5080     return doDump(fd, DumpArgs(), asProto);
5081 }
5082 
listLayersLocked(std::string & result) const5083 void SurfaceFlinger::listLayersLocked(std::string& result) const {
5084     mCurrentState.traverseInZOrder(
5085             [&](Layer* layer) { StringAppendF(&result, "%s\n", layer->getDebugName()); });
5086 }
5087 
dumpStatsLocked(const DumpArgs & args,std::string & result) const5088 void SurfaceFlinger::dumpStatsLocked(const DumpArgs& args, std::string& result) const {
5089     StringAppendF(&result, "%" PRId64 "\n", getVsyncPeriodFromHWC());
5090 
5091     if (args.size() > 1) {
5092         const auto name = String8(args[1]);
5093         mCurrentState.traverseInZOrder([&](Layer* layer) {
5094             if (layer->getName() == name.string()) {
5095                 layer->dumpFrameStats(result);
5096             }
5097         });
5098     } else {
5099         mAnimFrameTracker.dumpStats(result);
5100     }
5101 }
5102 
clearStatsLocked(const DumpArgs & args,std::string &)5103 void SurfaceFlinger::clearStatsLocked(const DumpArgs& args, std::string&) {
5104     const bool clearAll = args.size() < 2;
5105     const auto name = clearAll ? String8() : String8(args[1]);
5106 
5107     mCurrentState.traverse([&](Layer* layer) {
5108         if (clearAll || layer->getName() == name.string()) {
5109             layer->clearFrameStats();
5110         }
5111     });
5112 
5113     mAnimFrameTracker.clearStats();
5114 }
5115 
dumpTimeStats(const DumpArgs & args,bool asProto,std::string & result) const5116 void SurfaceFlinger::dumpTimeStats(const DumpArgs& args, bool asProto, std::string& result) const {
5117     mTimeStats->parseArgs(asProto, args, result);
5118 }
5119 
dumpFrameTimeline(const DumpArgs & args,std::string & result) const5120 void SurfaceFlinger::dumpFrameTimeline(const DumpArgs& args, std::string& result) const {
5121     mFrameTimeline->parseArgs(args, result);
5122 }
5123 
logFrameStats()5124 void SurfaceFlinger::logFrameStats() {
5125     mDrawingState.traverse([&](Layer* layer) {
5126         layer->logFrameStats();
5127     });
5128 
5129     mAnimFrameTracker.logAndResetStats("<win-anim>");
5130 }
5131 
appendSfConfigString(std::string & result) const5132 void SurfaceFlinger::appendSfConfigString(std::string& result) const {
5133     result.append(" [sf");
5134 
5135     StringAppendF(&result, " PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
5136     StringAppendF(&result, " FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
5137     StringAppendF(&result, " MAX_VIRT_DISPLAY_DIM=%zu",
5138                   getHwComposer().getMaxVirtualDisplayDimension());
5139     StringAppendF(&result, " RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
5140     StringAppendF(&result, " NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
5141                   maxFrameBufferAcquiredBuffers);
5142     result.append("]");
5143 }
5144 
dumpVSync(std::string & result) const5145 void SurfaceFlinger::dumpVSync(std::string& result) const {
5146     mScheduler->dump(result);
5147 
5148     mRefreshRateStats->dump(result);
5149     result.append("\n");
5150 
5151     mVsyncConfiguration->dump(result);
5152     StringAppendF(&result,
5153                   "      present offset: %9" PRId64 " ns\t     VSYNC period: %9" PRId64 " ns\n\n",
5154                   dispSyncPresentTimeOffset, getVsyncPeriodFromHWC());
5155 
5156     StringAppendF(&result, "(mode override by backdoor: %s)\n\n",
5157                   mDebugDisplayModeSetByBackdoor ? "yes" : "no");
5158 
5159     mScheduler->dump(mAppConnectionHandle, result);
5160     mScheduler->dumpVsync(result);
5161     StringAppendF(&result, "mHWCVsyncPendingState=%s mLastHWCVsyncState=%s\n",
5162                   to_string(mHWCVsyncPendingState).c_str(), to_string(mLastHWCVsyncState).c_str());
5163 }
5164 
dumpPlannerInfo(const DumpArgs & args,std::string & result) const5165 void SurfaceFlinger::dumpPlannerInfo(const DumpArgs& args, std::string& result) const {
5166     for (const auto& [token, display] : mDisplays) {
5167         const auto compositionDisplay = display->getCompositionDisplay();
5168         compositionDisplay->dumpPlannerInfo(args, result);
5169     }
5170 }
5171 
dumpStaticScreenStats(std::string & result) const5172 void SurfaceFlinger::dumpStaticScreenStats(std::string& result) const {
5173     result.append("Static screen stats:\n");
5174     for (size_t b = 0; b < SurfaceFlingerBE::NUM_BUCKETS - 1; ++b) {
5175         float bucketTimeSec = getBE().mFrameBuckets[b] / 1e9;
5176         float percent = 100.0f *
5177                 static_cast<float>(getBE().mFrameBuckets[b]) / getBE().mTotalTime;
5178         StringAppendF(&result, "  < %zd frames: %.3f s (%.1f%%)\n", b + 1, bucketTimeSec, percent);
5179     }
5180     float bucketTimeSec = getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] / 1e9;
5181     float percent = 100.0f *
5182             static_cast<float>(getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1]) / getBE().mTotalTime;
5183     StringAppendF(&result, "  %zd+ frames: %.3f s (%.1f%%)\n", SurfaceFlingerBE::NUM_BUCKETS - 1,
5184                   bucketTimeSec, percent);
5185 }
5186 
dumpCompositionDisplays(std::string & result) const5187 void SurfaceFlinger::dumpCompositionDisplays(std::string& result) const {
5188     for (const auto& [token, display] : mDisplays) {
5189         display->getCompositionDisplay()->dump(result);
5190         result += '\n';
5191     }
5192 }
5193 
dumpDisplays(std::string & result) const5194 void SurfaceFlinger::dumpDisplays(std::string& result) const {
5195     for (const auto& [token, display] : mDisplays) {
5196         display->dump(result);
5197         result += '\n';
5198     }
5199 }
5200 
dumpDisplayIdentificationData(std::string & result) const5201 void SurfaceFlinger::dumpDisplayIdentificationData(std::string& result) const {
5202     for (const auto& [token, display] : mDisplays) {
5203         const auto displayId = PhysicalDisplayId::tryCast(display->getId());
5204         if (!displayId) {
5205             continue;
5206         }
5207         const auto hwcDisplayId = getHwComposer().fromPhysicalDisplayId(*displayId);
5208         if (!hwcDisplayId) {
5209             continue;
5210         }
5211 
5212         StringAppendF(&result,
5213                       "Display %s (HWC display %" PRIu64 "): ", to_string(*displayId).c_str(),
5214                       *hwcDisplayId);
5215         uint8_t port;
5216         DisplayIdentificationData data;
5217         if (!getHwComposer().getDisplayIdentificationData(*hwcDisplayId, &port, &data)) {
5218             result.append("no identification data\n");
5219             continue;
5220         }
5221 
5222         if (!isEdid(data)) {
5223             result.append("unknown identification data\n");
5224             continue;
5225         }
5226 
5227         const auto edid = parseEdid(data);
5228         if (!edid) {
5229             result.append("invalid EDID\n");
5230             continue;
5231         }
5232 
5233         StringAppendF(&result, "port=%u pnpId=%s displayName=\"", port, edid->pnpId.data());
5234         result.append(edid->displayName.data(), edid->displayName.length());
5235         result.append("\"\n");
5236     }
5237 }
5238 
dumpRawDisplayIdentificationData(const DumpArgs & args,std::string & result) const5239 void SurfaceFlinger::dumpRawDisplayIdentificationData(const DumpArgs& args,
5240                                                       std::string& result) const {
5241     hal::HWDisplayId hwcDisplayId;
5242     uint8_t port;
5243     DisplayIdentificationData data;
5244 
5245     if (args.size() > 1 && base::ParseUint(String8(args[1]), &hwcDisplayId) &&
5246         getHwComposer().getDisplayIdentificationData(hwcDisplayId, &port, &data)) {
5247         result.append(reinterpret_cast<const char*>(data.data()), data.size());
5248     }
5249 }
5250 
dumpWideColorInfo(std::string & result) const5251 void SurfaceFlinger::dumpWideColorInfo(std::string& result) const {
5252     StringAppendF(&result, "Device has wide color built-in display: %d\n", hasWideColorDisplay);
5253     StringAppendF(&result, "Device uses color management: %d\n", useColorManagement);
5254     StringAppendF(&result, "DisplayColorSetting: %s\n",
5255                   decodeDisplayColorSetting(mDisplayColorSetting).c_str());
5256 
5257     // TODO: print out if wide-color mode is active or not
5258 
5259     for (const auto& [token, display] : mDisplays) {
5260         const auto displayId = PhysicalDisplayId::tryCast(display->getId());
5261         if (!displayId) {
5262             continue;
5263         }
5264 
5265         StringAppendF(&result, "Display %s color modes:\n", to_string(*displayId).c_str());
5266         std::vector<ColorMode> modes = getHwComposer().getColorModes(*displayId);
5267         for (auto&& mode : modes) {
5268             StringAppendF(&result, "    %s (%d)\n", decodeColorMode(mode).c_str(), mode);
5269         }
5270 
5271         ColorMode currentMode = display->getCompositionDisplay()->getState().colorMode;
5272         StringAppendF(&result, "    Current color mode: %s (%d)\n",
5273                       decodeColorMode(currentMode).c_str(), currentMode);
5274     }
5275     result.append("\n");
5276 }
5277 
dumpDrawingStateProto(uint32_t traceFlags) const5278 LayersProto SurfaceFlinger::dumpDrawingStateProto(uint32_t traceFlags) const {
5279     LayersProto layersProto;
5280     for (const sp<Layer>& layer : mDrawingState.layersSortedByZ) {
5281         layer->writeToProto(layersProto, traceFlags);
5282     }
5283 
5284     return layersProto;
5285 }
5286 
dumpDisplayProto(LayersTraceProto & layersTraceProto) const5287 void SurfaceFlinger::dumpDisplayProto(LayersTraceProto& layersTraceProto) const {
5288     for (const auto& [_, display] : FTL_FAKE_GUARD(mStateLock, mDisplays)) {
5289         DisplayProto* displayProto = layersTraceProto.add_displays();
5290         displayProto->set_id(display->getId().value);
5291         displayProto->set_name(display->getDisplayName());
5292         displayProto->set_layer_stack(display->getLayerStack().id);
5293         LayerProtoHelper::writeSizeToProto(display->getWidth(), display->getHeight(),
5294                                            [&]() { return displayProto->mutable_size(); });
5295         LayerProtoHelper::writeToProto(display->getLayerStackSpaceRect(), [&]() {
5296             return displayProto->mutable_layer_stack_space_rect();
5297         });
5298         LayerProtoHelper::writeTransformToProto(display->getTransform(),
5299                                                 displayProto->mutable_transform());
5300         displayProto->set_is_virtual(display->isVirtual());
5301     }
5302 }
5303 
dumpHwc(std::string & result) const5304 void SurfaceFlinger::dumpHwc(std::string& result) const {
5305     getHwComposer().dump(result);
5306 }
5307 
dumpOffscreenLayersProto(LayersProto & layersProto,uint32_t traceFlags) const5308 void SurfaceFlinger::dumpOffscreenLayersProto(LayersProto& layersProto, uint32_t traceFlags) const {
5309     // Add a fake invisible root layer to the proto output and parent all the offscreen layers to
5310     // it.
5311     LayerProto* rootProto = layersProto.add_layers();
5312     const int32_t offscreenRootLayerId = INT32_MAX - 2;
5313     rootProto->set_id(offscreenRootLayerId);
5314     rootProto->set_name("Offscreen Root");
5315     rootProto->set_parent(-1);
5316 
5317     for (Layer* offscreenLayer : mOffscreenLayers) {
5318         // Add layer as child of the fake root
5319         rootProto->add_children(offscreenLayer->sequence);
5320 
5321         // Add layer
5322         LayerProto* layerProto = offscreenLayer->writeToProto(layersProto, traceFlags);
5323         layerProto->set_parent(offscreenRootLayerId);
5324     }
5325 }
5326 
dumpProtoFromMainThread(uint32_t traceFlags)5327 LayersProto SurfaceFlinger::dumpProtoFromMainThread(uint32_t traceFlags) {
5328     return mScheduler->schedule([=] { return dumpDrawingStateProto(traceFlags); }).get();
5329 }
5330 
dumpOffscreenLayers(std::string & result)5331 void SurfaceFlinger::dumpOffscreenLayers(std::string& result) {
5332     auto future = mScheduler->schedule([this] {
5333         std::string result;
5334         for (Layer* offscreenLayer : mOffscreenLayers) {
5335             offscreenLayer->traverse(LayerVector::StateSet::Drawing,
5336                                      [&](Layer* layer) { layer->dumpCallingUidPid(result); });
5337         }
5338         return result;
5339     });
5340 
5341     result.append("Offscreen Layers:\n");
5342     result.append(future.get());
5343 }
5344 
dumpAllLocked(const DumpArgs & args,const std::string & compositionLayers,std::string & result) const5345 void SurfaceFlinger::dumpAllLocked(const DumpArgs& args, const std::string& compositionLayers,
5346                                    std::string& result) const {
5347     const bool colorize = !args.empty() && args[0] == String16("--color");
5348     Colorizer colorizer(colorize);
5349 
5350     // figure out if we're stuck somewhere
5351     const nsecs_t now = systemTime();
5352     const nsecs_t inTransaction(mDebugInTransaction);
5353     nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
5354 
5355     /*
5356      * Dump library configuration.
5357      */
5358 
5359     colorizer.bold(result);
5360     result.append("Build configuration:");
5361     colorizer.reset(result);
5362     appendSfConfigString(result);
5363     result.append("\n");
5364 
5365     result.append("\nDisplay identification data:\n");
5366     dumpDisplayIdentificationData(result);
5367 
5368     result.append("\nWide-Color information:\n");
5369     dumpWideColorInfo(result);
5370 
5371     colorizer.bold(result);
5372     result.append("Sync configuration: ");
5373     colorizer.reset(result);
5374     result.append(SyncFeatures::getInstance().toString());
5375     result.append("\n\n");
5376 
5377     colorizer.bold(result);
5378     result.append("Scheduler:\n");
5379     colorizer.reset(result);
5380     dumpVSync(result);
5381     result.append("\n");
5382 
5383     dumpStaticScreenStats(result);
5384     result.append("\n");
5385 
5386     StringAppendF(&result, "Total missed frame count: %u\n", mFrameMissedCount.load());
5387     StringAppendF(&result, "HWC missed frame count: %u\n", mHwcFrameMissedCount.load());
5388     StringAppendF(&result, "GPU missed frame count: %u\n\n", mGpuFrameMissedCount.load());
5389 
5390     /*
5391      * Dump the visible layer list
5392      */
5393     colorizer.bold(result);
5394     StringAppendF(&result, "Visible layers (count = %zu)\n", mNumLayers.load());
5395     colorizer.reset(result);
5396 
5397     result.append(compositionLayers);
5398 
5399     colorizer.bold(result);
5400     StringAppendF(&result, "Displays (%zu entries)\n", mDisplays.size());
5401     colorizer.reset(result);
5402     dumpDisplays(result);
5403     dumpCompositionDisplays(result);
5404     result.push_back('\n');
5405 
5406     mCompositionEngine->dump(result);
5407 
5408     /*
5409      * Dump SurfaceFlinger global state
5410      */
5411 
5412     colorizer.bold(result);
5413     result.append("SurfaceFlinger global state:\n");
5414     colorizer.reset(result);
5415 
5416     getRenderEngine().dump(result);
5417 
5418     result.append("ClientCache state:\n");
5419     ClientCache::getInstance().dump(result);
5420     DebugEGLImageTracker::getInstance()->dump(result);
5421 
5422     if (const auto display = getDefaultDisplayDeviceLocked()) {
5423         display->getCompositionDisplay()->getState().undefinedRegion.dump(result,
5424                                                                           "undefinedRegion");
5425         StringAppendF(&result, "  orientation=%s, isPoweredOn=%d\n",
5426                       toCString(display->getOrientation()), display->isPoweredOn());
5427     }
5428     StringAppendF(&result,
5429                   "  transaction-flags         : %08x\n"
5430                   "  gpu_to_cpu_unsupported    : %d\n",
5431                   mTransactionFlags.load(), !mGpuToCpuSupported);
5432 
5433     if (const auto display = getDefaultDisplayDeviceLocked()) {
5434         std::string fps, xDpi, yDpi;
5435         if (const auto activeMode = display->getActiveMode()) {
5436             fps = to_string(activeMode->getFps());
5437 
5438             const auto dpi = activeMode->getDpi();
5439             xDpi = base::StringPrintf("%.2f", dpi.x);
5440             yDpi = base::StringPrintf("%.2f", dpi.y);
5441         } else {
5442             fps = "unknown";
5443             xDpi = "unknown";
5444             yDpi = "unknown";
5445         }
5446         StringAppendF(&result,
5447                       "  refresh-rate              : %s\n"
5448                       "  x-dpi                     : %s\n"
5449                       "  y-dpi                     : %s\n",
5450                       fps.c_str(), xDpi.c_str(), yDpi.c_str());
5451     }
5452 
5453     StringAppendF(&result, "  transaction time: %f us\n", inTransactionDuration / 1000.0);
5454 
5455     /*
5456      * Tracing state
5457      */
5458     mLayerTracing.dump(result);
5459 
5460     result.append("\nTransaction tracing: ");
5461     if (mTransactionTracing) {
5462         result.append("enabled\n");
5463         mTransactionTracing->dump(result);
5464     } else {
5465         result.append("disabled\n");
5466     }
5467     result.push_back('\n');
5468 
5469     /*
5470      * HWC layer minidump
5471      */
5472     for (const auto& [token, display] : mDisplays) {
5473         const auto displayId = HalDisplayId::tryCast(display->getId());
5474         if (!displayId) {
5475             continue;
5476         }
5477 
5478         StringAppendF(&result, "Display %s (%s) HWC layers:\n", to_string(*displayId).c_str(),
5479                       (isDisplayActiveLocked(display) ? "active" : "inactive"));
5480         Layer::miniDumpHeader(result);
5481 
5482         const DisplayDevice& ref = *display;
5483         mCurrentState.traverseInZOrder([&](Layer* layer) { layer->miniDump(result, ref); });
5484         result.append("\n");
5485     }
5486 
5487     {
5488         DumpArgs plannerArgs;
5489         plannerArgs.add(); // first argument is ignored
5490         plannerArgs.add(String16("--layers"));
5491         dumpPlannerInfo(plannerArgs, result);
5492     }
5493 
5494     /*
5495      * Dump HWComposer state
5496      */
5497     colorizer.bold(result);
5498     result.append("h/w composer state:\n");
5499     colorizer.reset(result);
5500     const bool hwcDisabled = mDebugDisableHWC || mDebugFlashDelay;
5501     StringAppendF(&result, "  h/w composer %s\n", hwcDisabled ? "disabled" : "enabled");
5502     dumpHwc(result);
5503 
5504     /*
5505      * Dump gralloc state
5506      */
5507     const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
5508     alloc.dump(result);
5509 
5510     /*
5511      * Dump flag/property manager state
5512      */
5513     mFlagManager.dump(result);
5514 
5515     result.append(mTimeStats->miniDump());
5516     result.append("\n");
5517 }
5518 
calculateColorMatrix(float saturation)5519 mat4 SurfaceFlinger::calculateColorMatrix(float saturation) {
5520     if (saturation == 1) {
5521         return mat4();
5522     }
5523 
5524     float3 luminance{0.213f, 0.715f, 0.072f};
5525     luminance *= 1.0f - saturation;
5526     mat4 saturationMatrix = mat4(vec4{luminance.r + saturation, luminance.r, luminance.r, 0.0f},
5527                                  vec4{luminance.g, luminance.g + saturation, luminance.g, 0.0f},
5528                                  vec4{luminance.b, luminance.b, luminance.b + saturation, 0.0f},
5529                                  vec4{0.0f, 0.0f, 0.0f, 1.0f});
5530     return saturationMatrix;
5531 }
5532 
updateColorMatrixLocked()5533 void SurfaceFlinger::updateColorMatrixLocked() {
5534     mat4 colorMatrix =
5535             mClientColorMatrix * calculateColorMatrix(mGlobalSaturationFactor) * mDaltonizer();
5536 
5537     if (mCurrentState.colorMatrix != colorMatrix) {
5538         mCurrentState.colorMatrix = colorMatrix;
5539         mCurrentState.colorMatrixChanged = true;
5540         setTransactionFlags(eTransactionNeeded);
5541     }
5542 }
5543 
CheckTransactCodeCredentials(uint32_t code)5544 status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
5545 #pragma clang diagnostic push
5546 #pragma clang diagnostic error "-Wswitch-enum"
5547     switch (static_cast<ISurfaceComposerTag>(code)) {
5548         case ENABLE_VSYNC_INJECTIONS:
5549         case INJECT_VSYNC:
5550             if (!hasMockHwc()) return PERMISSION_DENIED;
5551             [[fallthrough]];
5552         // These methods should at minimum make sure that the client requested
5553         // access to SF.
5554         case BOOT_FINISHED:
5555         case CLEAR_ANIMATION_FRAME_STATS:
5556         case GET_ANIMATION_FRAME_STATS:
5557         case OVERRIDE_HDR_TYPES:
5558         case GET_HDR_CAPABILITIES:
5559         case SET_DESIRED_DISPLAY_MODE_SPECS:
5560         case GET_DESIRED_DISPLAY_MODE_SPECS:
5561         case SET_ACTIVE_COLOR_MODE:
5562         case SET_BOOT_DISPLAY_MODE:
5563         case GET_AUTO_LOW_LATENCY_MODE_SUPPORT:
5564         case GET_GAME_CONTENT_TYPE_SUPPORT:
5565         case GET_DISPLAYED_CONTENT_SAMPLING_ATTRIBUTES:
5566         case SET_DISPLAY_CONTENT_SAMPLING_ENABLED:
5567         case GET_DISPLAYED_CONTENT_SAMPLE:
5568         case ADD_TUNNEL_MODE_ENABLED_LISTENER:
5569         case REMOVE_TUNNEL_MODE_ENABLED_LISTENER:
5570         case SET_GLOBAL_SHADOW_SETTINGS:
5571         case ACQUIRE_FRAME_RATE_FLEXIBILITY_TOKEN: {
5572             // OVERRIDE_HDR_TYPES is used by CTS tests, which acquire the necessary
5573             // permission dynamically. Don't use the permission cache for this check.
5574             bool usePermissionCache = code != OVERRIDE_HDR_TYPES;
5575             if (!callingThreadHasUnscopedSurfaceFlingerAccess(usePermissionCache)) {
5576                 IPCThreadState* ipc = IPCThreadState::self();
5577                 ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d",
5578                         ipc->getCallingPid(), ipc->getCallingUid());
5579                 return PERMISSION_DENIED;
5580             }
5581             return OK;
5582         }
5583         case GET_LAYER_DEBUG_INFO: {
5584             IPCThreadState* ipc = IPCThreadState::self();
5585             const int pid = ipc->getCallingPid();
5586             const int uid = ipc->getCallingUid();
5587             if ((uid != AID_SHELL) && !PermissionCache::checkPermission(sDump, pid, uid)) {
5588                 ALOGE("Layer debug info permission denied for pid=%d, uid=%d", pid, uid);
5589                 return PERMISSION_DENIED;
5590             }
5591             return OK;
5592         }
5593         // Used by apps to hook Choreographer to SurfaceFlinger.
5594         case CREATE_DISPLAY_EVENT_CONNECTION:
5595         // The following calls are currently used by clients that do not
5596         // request necessary permissions. However, they do not expose any secret
5597         // information, so it is OK to pass them.
5598         case AUTHENTICATE_SURFACE:
5599         case GET_ACTIVE_COLOR_MODE:
5600         case GET_ACTIVE_DISPLAY_MODE:
5601         case GET_DISPLAY_COLOR_MODES:
5602         case GET_DISPLAY_NATIVE_PRIMARIES:
5603         case GET_STATIC_DISPLAY_INFO:
5604         case GET_DYNAMIC_DISPLAY_INFO:
5605         case GET_DISPLAY_MODES:
5606         case GET_SUPPORTED_FRAME_TIMESTAMPS:
5607         // Calling setTransactionState is safe, because you need to have been
5608         // granted a reference to Client* and Handle* to do anything with it.
5609         case SET_TRANSACTION_STATE:
5610         case CREATE_CONNECTION:
5611         case GET_COLOR_MANAGEMENT:
5612         case GET_COMPOSITION_PREFERENCE:
5613         case GET_PROTECTED_CONTENT_SUPPORT:
5614         // setFrameRate() is deliberately available for apps to call without any
5615         // special permissions.
5616         case SET_FRAME_RATE:
5617         case GET_DISPLAY_DECORATION_SUPPORT:
5618         case SET_FRAME_TIMELINE_INFO:
5619         case GET_GPU_CONTEXT_PRIORITY:
5620         case GET_MAX_ACQUIRED_BUFFER_COUNT: {
5621             // This is not sensitive information, so should not require permission control.
5622             return OK;
5623         }
5624         case ADD_FPS_LISTENER:
5625         case REMOVE_FPS_LISTENER:
5626         case ADD_REGION_SAMPLING_LISTENER:
5627         case REMOVE_REGION_SAMPLING_LISTENER: {
5628             // codes that require permission check
5629             IPCThreadState* ipc = IPCThreadState::self();
5630             const int pid = ipc->getCallingPid();
5631             const int uid = ipc->getCallingUid();
5632             if ((uid != AID_GRAPHICS) &&
5633                 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
5634                 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
5635                 return PERMISSION_DENIED;
5636             }
5637             return OK;
5638         }
5639         case ADD_TRANSACTION_TRACE_LISTENER: {
5640             IPCThreadState* ipc = IPCThreadState::self();
5641             const int uid = ipc->getCallingUid();
5642             if (uid == AID_ROOT || uid == AID_GRAPHICS || uid == AID_SYSTEM || uid == AID_SHELL) {
5643                 return OK;
5644             }
5645             return PERMISSION_DENIED;
5646         }
5647         case SET_OVERRIDE_FRAME_RATE: {
5648             const int uid = IPCThreadState::self()->getCallingUid();
5649             if (uid == AID_ROOT || uid == AID_SYSTEM) {
5650                 return OK;
5651             }
5652             return PERMISSION_DENIED;
5653         }
5654         case ON_PULL_ATOM: {
5655             const int uid = IPCThreadState::self()->getCallingUid();
5656             if (uid == AID_SYSTEM) {
5657                 return OK;
5658             }
5659             return PERMISSION_DENIED;
5660         }
5661         case ADD_WINDOW_INFOS_LISTENER:
5662         case REMOVE_WINDOW_INFOS_LISTENER: {
5663             const int uid = IPCThreadState::self()->getCallingUid();
5664             if (uid == AID_SYSTEM || uid == AID_GRAPHICS) {
5665                 return OK;
5666             }
5667             return PERMISSION_DENIED;
5668         }
5669         case CREATE_DISPLAY:
5670         case DESTROY_DISPLAY:
5671         case GET_PRIMARY_PHYSICAL_DISPLAY_ID:
5672         case GET_PHYSICAL_DISPLAY_IDS:
5673         case GET_PHYSICAL_DISPLAY_TOKEN:
5674         case SET_POWER_MODE:
5675         case GET_DISPLAY_STATE:
5676         case GET_DISPLAY_STATS:
5677         case CLEAR_BOOT_DISPLAY_MODE:
5678         case GET_BOOT_DISPLAY_MODE_SUPPORT:
5679         case SET_AUTO_LOW_LATENCY_MODE:
5680         case SET_GAME_CONTENT_TYPE:
5681         case CAPTURE_LAYERS:
5682         case CAPTURE_DISPLAY:
5683         case CAPTURE_DISPLAY_BY_ID:
5684         case IS_WIDE_COLOR_DISPLAY:
5685         case GET_DISPLAY_BRIGHTNESS_SUPPORT:
5686         case SET_DISPLAY_BRIGHTNESS:
5687         case ADD_HDR_LAYER_INFO_LISTENER:
5688         case REMOVE_HDR_LAYER_INFO_LISTENER:
5689         case NOTIFY_POWER_BOOST:
5690             LOG_FATAL("Deprecated opcode: %d, migrated to AIDL", code);
5691             return PERMISSION_DENIED;
5692     }
5693 
5694     // These codes are used for the IBinder protocol to either interrogate the recipient
5695     // side of the transaction for its canonical interface descriptor or to dump its state.
5696     // We let them pass by default.
5697     if (code == IBinder::INTERFACE_TRANSACTION || code == IBinder::DUMP_TRANSACTION ||
5698         code == IBinder::PING_TRANSACTION || code == IBinder::SHELL_COMMAND_TRANSACTION ||
5699         code == IBinder::SYSPROPS_TRANSACTION) {
5700         return OK;
5701     }
5702     // Numbers from 1000 to 1042 are currently used for backdoors. The code
5703     // in onTransact verifies that the user is root, and has access to use SF.
5704     if (code >= 1000 && code <= 1042) {
5705         ALOGV("Accessing SurfaceFlinger through backdoor code: %u", code);
5706         return OK;
5707     }
5708     ALOGE("Permission Denial: SurfaceFlinger did not recognize request code: %u", code);
5709     return PERMISSION_DENIED;
5710 #pragma clang diagnostic pop
5711 }
5712 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)5713 status_t SurfaceFlinger::onTransact(uint32_t code, const Parcel& data, Parcel* reply,
5714                                     uint32_t flags) {
5715     if (const status_t error = CheckTransactCodeCredentials(code); error != OK) {
5716         return error;
5717     }
5718 
5719     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
5720     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
5721         CHECK_INTERFACE(ISurfaceComposer, data, reply);
5722         IPCThreadState* ipc = IPCThreadState::self();
5723         const int uid = ipc->getCallingUid();
5724         if (CC_UNLIKELY(uid != AID_SYSTEM
5725                 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
5726             const int pid = ipc->getCallingPid();
5727             ALOGE("Permission Denial: "
5728                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
5729             return PERMISSION_DENIED;
5730         }
5731         int n;
5732         switch (code) {
5733             case 1000: // Unused.
5734             case 1001:
5735                 return NAME_NOT_FOUND;
5736             case 1002: // Toggle flashing on surface damage.
5737                 if (const int delay = data.readInt32(); delay > 0) {
5738                     mDebugFlashDelay = delay;
5739                 } else {
5740                     mDebugFlashDelay = mDebugFlashDelay ? 0 : 1;
5741                 }
5742                 scheduleRepaint();
5743                 return NO_ERROR;
5744             case 1004: // Force composite ahead of next VSYNC.
5745             case 1006:
5746                 scheduleComposite(FrameHint::kActive);
5747                 return NO_ERROR;
5748             case 1005: { // Force commit ahead of next VSYNC.
5749                 Mutex::Autolock lock(mStateLock);
5750                 setTransactionFlags(eTransactionNeeded | eDisplayTransactionNeeded |
5751                                     eTraversalNeeded);
5752                 return NO_ERROR;
5753             }
5754             case 1007: // Unused.
5755                 return NAME_NOT_FOUND;
5756             case 1008: // Toggle forced GPU composition.
5757                 mDebugDisableHWC = data.readInt32() != 0;
5758                 scheduleRepaint();
5759                 return NO_ERROR;
5760             case 1009: // Toggle use of transform hint.
5761                 mDebugDisableTransformHint = data.readInt32() != 0;
5762                 scheduleRepaint();
5763                 return NO_ERROR;
5764             case 1010: // Interrogate.
5765                 reply->writeInt32(0);
5766                 reply->writeInt32(0);
5767                 reply->writeInt32(mDebugFlashDelay);
5768                 reply->writeInt32(0);
5769                 reply->writeInt32(mDebugDisableHWC);
5770                 return NO_ERROR;
5771             case 1013: {
5772                 const auto display = getDefaultDisplayDevice();
5773                 if (!display) {
5774                     return NAME_NOT_FOUND;
5775                 }
5776 
5777                 reply->writeInt32(display->getPageFlipCount());
5778                 return NO_ERROR;
5779             }
5780             case 1014: {
5781                 Mutex::Autolock _l(mStateLock);
5782                 // daltonize
5783                 n = data.readInt32();
5784                 switch (n % 10) {
5785                     case 1:
5786                         mDaltonizer.setType(ColorBlindnessType::Protanomaly);
5787                         break;
5788                     case 2:
5789                         mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
5790                         break;
5791                     case 3:
5792                         mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
5793                         break;
5794                     default:
5795                         mDaltonizer.setType(ColorBlindnessType::None);
5796                         break;
5797                 }
5798                 if (n >= 10) {
5799                     mDaltonizer.setMode(ColorBlindnessMode::Correction);
5800                 } else {
5801                     mDaltonizer.setMode(ColorBlindnessMode::Simulation);
5802                 }
5803 
5804                 updateColorMatrixLocked();
5805                 return NO_ERROR;
5806             }
5807             case 1015: {
5808                 Mutex::Autolock _l(mStateLock);
5809                 // apply a color matrix
5810                 n = data.readInt32();
5811                 if (n) {
5812                     // color matrix is sent as a column-major mat4 matrix
5813                     for (size_t i = 0 ; i < 4; i++) {
5814                         for (size_t j = 0; j < 4; j++) {
5815                             mClientColorMatrix[i][j] = data.readFloat();
5816                         }
5817                     }
5818                 } else {
5819                     mClientColorMatrix = mat4();
5820                 }
5821 
5822                 // Check that supplied matrix's last row is {0,0,0,1} so we can avoid
5823                 // the division by w in the fragment shader
5824                 float4 lastRow(transpose(mClientColorMatrix)[3]);
5825                 if (any(greaterThan(abs(lastRow - float4{0, 0, 0, 1}), float4{1e-4f}))) {
5826                     ALOGE("The color transform's last row must be (0, 0, 0, 1)");
5827                 }
5828 
5829                 updateColorMatrixLocked();
5830                 return NO_ERROR;
5831             }
5832             case 1016: { // Unused.
5833                 return NAME_NOT_FOUND;
5834             }
5835             case 1017: {
5836                 n = data.readInt32();
5837                 mForceFullDamage = n != 0;
5838                 return NO_ERROR;
5839             }
5840             case 1018: { // Modify Choreographer's duration
5841                 n = data.readInt32();
5842                 mScheduler->setDuration(mAppConnectionHandle, std::chrono::nanoseconds(n), 0ns);
5843                 return NO_ERROR;
5844             }
5845             case 1019: { // Modify SurfaceFlinger's duration
5846                 n = data.readInt32();
5847                 mScheduler->setDuration(mSfConnectionHandle, std::chrono::nanoseconds(n), 0ns);
5848                 return NO_ERROR;
5849             }
5850             case 1020: { // Layer updates interceptor
5851                 n = data.readInt32();
5852                 if (n) {
5853                     ALOGV("Interceptor enabled");
5854                     mInterceptor->enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
5855                 }
5856                 else{
5857                     ALOGV("Interceptor disabled");
5858                     mInterceptor->disable();
5859                 }
5860                 return NO_ERROR;
5861             }
5862             case 1021: { // Disable HWC virtual displays
5863                 const bool enable = data.readInt32() != 0;
5864                 static_cast<void>(
5865                         mScheduler->schedule([this, enable] { enableHalVirtualDisplays(enable); }));
5866                 return NO_ERROR;
5867             }
5868             case 1022: { // Set saturation boost
5869                 Mutex::Autolock _l(mStateLock);
5870                 mGlobalSaturationFactor = std::max(0.0f, std::min(data.readFloat(), 2.0f));
5871 
5872                 updateColorMatrixLocked();
5873                 return NO_ERROR;
5874             }
5875             case 1023: { // Set native mode
5876                 int32_t colorMode;
5877 
5878                 mDisplayColorSetting = static_cast<DisplayColorSetting>(data.readInt32());
5879                 if (data.readInt32(&colorMode) == NO_ERROR) {
5880                     mForceColorMode = static_cast<ColorMode>(colorMode);
5881                 }
5882                 scheduleRepaint();
5883                 return NO_ERROR;
5884             }
5885             // Deprecate, use 1030 to check whether the device is color managed.
5886             case 1024: {
5887                 return NAME_NOT_FOUND;
5888             }
5889             case 1025: { // Set layer tracing
5890                 n = data.readInt32();
5891                 bool tracingEnabledChanged;
5892                 if (n == 1) {
5893                     int64_t fixedStartingTime = data.readInt64();
5894                     ALOGD("LayerTracing enabled");
5895                     tracingEnabledChanged = mLayerTracing.enable();
5896                     if (tracingEnabledChanged) {
5897                         int64_t startingTime =
5898                                 (fixedStartingTime) ? fixedStartingTime : systemTime();
5899                         mScheduler
5900                                 ->schedule([&]() FTL_FAKE_GUARD(mStateLock) {
5901                                     mLayerTracing.notify("start", startingTime);
5902                                 })
5903                                 .wait();
5904                     }
5905                 } else if (n == 2) {
5906                     std::string filename = std::string(data.readCString());
5907                     ALOGD("LayerTracing disabled. Trace wrote to %s", filename.c_str());
5908                     tracingEnabledChanged = mLayerTracing.disable(filename.c_str());
5909                 } else {
5910                     ALOGD("LayerTracing disabled");
5911                     tracingEnabledChanged = mLayerTracing.disable();
5912                 }
5913                 mTracingEnabledChanged = tracingEnabledChanged;
5914                 reply->writeInt32(NO_ERROR);
5915                 return NO_ERROR;
5916             }
5917             case 1026: { // Get layer tracing status
5918                 reply->writeBool(mLayerTracing.isEnabled());
5919                 return NO_ERROR;
5920             }
5921             // Is a DisplayColorSetting supported?
5922             case 1027: {
5923                 const auto display = getDefaultDisplayDevice();
5924                 if (!display) {
5925                     return NAME_NOT_FOUND;
5926                 }
5927 
5928                 DisplayColorSetting setting = static_cast<DisplayColorSetting>(data.readInt32());
5929                 switch (setting) {
5930                     case DisplayColorSetting::kManaged:
5931                         reply->writeBool(useColorManagement);
5932                         break;
5933                     case DisplayColorSetting::kUnmanaged:
5934                         reply->writeBool(true);
5935                         break;
5936                     case DisplayColorSetting::kEnhanced:
5937                         reply->writeBool(display->hasRenderIntent(RenderIntent::ENHANCE));
5938                         break;
5939                     default: // vendor display color setting
5940                         reply->writeBool(
5941                                 display->hasRenderIntent(static_cast<RenderIntent>(setting)));
5942                         break;
5943                 }
5944                 return NO_ERROR;
5945             }
5946             case 1028: { // Unused.
5947                 return NAME_NOT_FOUND;
5948             }
5949             // Set buffer size for SF tracing (value in KB)
5950             case 1029: {
5951                 n = data.readInt32();
5952                 if (n <= 0 || n > MAX_TRACING_MEMORY) {
5953                     ALOGW("Invalid buffer size: %d KB", n);
5954                     reply->writeInt32(BAD_VALUE);
5955                     return BAD_VALUE;
5956                 }
5957 
5958                 ALOGD("Updating trace buffer to %d KB", n);
5959                 mLayerTracing.setBufferSize(n * 1024);
5960                 reply->writeInt32(NO_ERROR);
5961                 return NO_ERROR;
5962             }
5963             // Is device color managed?
5964             case 1030: {
5965                 reply->writeBool(useColorManagement);
5966                 return NO_ERROR;
5967             }
5968             // Override default composition data space
5969             // adb shell service call SurfaceFlinger 1031 i32 1 DATASPACE_NUMBER DATASPACE_NUMBER \
5970             // && adb shell stop zygote && adb shell start zygote
5971             // to restore: adb shell service call SurfaceFlinger 1031 i32 0 && \
5972             // adb shell stop zygote && adb shell start zygote
5973             case 1031: {
5974                 Mutex::Autolock _l(mStateLock);
5975                 n = data.readInt32();
5976                 if (n) {
5977                     n = data.readInt32();
5978                     if (n) {
5979                         Dataspace dataspace = static_cast<Dataspace>(n);
5980                         if (!validateCompositionDataspace(dataspace)) {
5981                             return BAD_VALUE;
5982                         }
5983                         mDefaultCompositionDataspace = dataspace;
5984                     }
5985                     n = data.readInt32();
5986                     if (n) {
5987                         Dataspace dataspace = static_cast<Dataspace>(n);
5988                         if (!validateCompositionDataspace(dataspace)) {
5989                             return BAD_VALUE;
5990                         }
5991                         mWideColorGamutCompositionDataspace = dataspace;
5992                     }
5993                 } else {
5994                     // restore composition data space.
5995                     mDefaultCompositionDataspace = defaultCompositionDataspace;
5996                     mWideColorGamutCompositionDataspace = wideColorGamutCompositionDataspace;
5997                 }
5998                 return NO_ERROR;
5999             }
6000             // Set trace flags
6001             case 1033: {
6002                 n = data.readUint32();
6003                 ALOGD("Updating trace flags to 0x%x", n);
6004                 mLayerTracing.setTraceFlags(n);
6005                 reply->writeInt32(NO_ERROR);
6006                 return NO_ERROR;
6007             }
6008             case 1034: {
6009                 auto future = mScheduler->schedule([&] {
6010                     switch (n = data.readInt32()) {
6011                         case 0:
6012                         case 1:
6013                             FTL_FAKE_GUARD(mStateLock,
6014                                            enableRefreshRateOverlay(static_cast<bool>(n)));
6015                             break;
6016                         default: {
6017                             reply->writeBool(
6018                                     FTL_FAKE_GUARD(mStateLock, isRefreshRateOverlayEnabled()));
6019                         }
6020                     }
6021                 });
6022 
6023                 future.wait();
6024                 return NO_ERROR;
6025             }
6026             case 1035: {
6027                 const int modeId = data.readInt32();
6028 
6029                 const auto display = [&]() -> sp<IBinder> {
6030                     uint64_t value;
6031                     if (data.readUint64(&value) != NO_ERROR) {
6032                         return getDefaultDisplayDevice()->getDisplayToken().promote();
6033                     }
6034 
6035                     if (const auto id = DisplayId::fromValue<PhysicalDisplayId>(value)) {
6036                         return getPhysicalDisplayToken(*id);
6037                     }
6038 
6039                     ALOGE("Invalid physical display ID");
6040                     return nullptr;
6041                 }();
6042 
6043                 mDebugDisplayModeSetByBackdoor = false;
6044                 const status_t result = setActiveModeFromBackdoor(display, modeId);
6045                 mDebugDisplayModeSetByBackdoor = result == NO_ERROR;
6046                 return result;
6047             }
6048             // Turn on/off frame rate flexibility mode. When turned on it overrides the display
6049             // manager frame rate policy a new policy which allows switching between all refresh
6050             // rates.
6051             case 1036: {
6052                 if (data.readInt32() > 0) { // turn on
6053                     return mScheduler
6054                             ->schedule([this] {
6055                                 const auto display =
6056                                         FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked());
6057 
6058                                 // This is a little racy, but not in a way that hurts anything. As
6059                                 // we grab the defaultMode from the display manager policy, we could
6060                                 // be setting a new display manager policy, leaving us using a stale
6061                                 // defaultMode. The defaultMode doesn't matter for the override
6062                                 // policy though, since we set allowGroupSwitching to true, so it's
6063                                 // not a problem.
6064                                 scheduler::RefreshRateConfigs::Policy overridePolicy;
6065                                 overridePolicy.defaultMode = display->refreshRateConfigs()
6066                                                                      .getDisplayManagerPolicy()
6067                                                                      .defaultMode;
6068                                 overridePolicy.allowGroupSwitching = true;
6069                                 constexpr bool kOverridePolicy = true;
6070                                 return setDesiredDisplayModeSpecsInternal(display, overridePolicy,
6071                                                                           kOverridePolicy);
6072                             })
6073                             .get();
6074                 } else { // turn off
6075                     return mScheduler
6076                             ->schedule([this] {
6077                                 const auto display =
6078                                         FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked());
6079                                 constexpr bool kOverridePolicy = true;
6080                                 return setDesiredDisplayModeSpecsInternal(display, {},
6081                                                                           kOverridePolicy);
6082                             })
6083                             .get();
6084                 }
6085             }
6086             // Inject a hotplug connected event for the primary display. This will deallocate and
6087             // reallocate the display state including framebuffers.
6088             case 1037: {
6089                 const hal::HWDisplayId hwcId =
6090                         (Mutex::Autolock(mStateLock), getHwComposer().getPrimaryHwcDisplayId());
6091 
6092                 onComposerHalHotplug(hwcId, hal::Connection::CONNECTED);
6093                 return NO_ERROR;
6094             }
6095             // Modify the max number of display frames stored within FrameTimeline
6096             case 1038: {
6097                 n = data.readInt32();
6098                 if (n < 0 || n > MAX_ALLOWED_DISPLAY_FRAMES) {
6099                     ALOGW("Invalid max size. Maximum allowed is %d", MAX_ALLOWED_DISPLAY_FRAMES);
6100                     return BAD_VALUE;
6101                 }
6102                 if (n == 0) {
6103                     // restore to default
6104                     mFrameTimeline->reset();
6105                     return NO_ERROR;
6106                 }
6107                 mFrameTimeline->setMaxDisplayFrames(n);
6108                 return NO_ERROR;
6109             }
6110             case 1039: {
6111                 PhysicalDisplayId displayId = [&]() {
6112                     Mutex::Autolock lock(mStateLock);
6113                     return getDefaultDisplayDeviceLocked()->getPhysicalId();
6114                 }();
6115 
6116                 auto inUid = static_cast<uid_t>(data.readInt32());
6117                 const auto refreshRate = data.readFloat();
6118                 mScheduler->setPreferredRefreshRateForUid(FrameRateOverride{inUid, refreshRate});
6119                 mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId);
6120                 return NO_ERROR;
6121             }
6122             // Toggle caching feature
6123             // First argument is an int32 - nonzero enables caching and zero disables caching
6124             // Second argument is an optional uint64 - if present, then limits enabling/disabling
6125             // caching to a particular physical display
6126             case 1040: {
6127                 auto future = mScheduler->schedule([&] {
6128                     n = data.readInt32();
6129                     std::optional<PhysicalDisplayId> inputId = std::nullopt;
6130                     if (uint64_t inputDisplayId; data.readUint64(&inputDisplayId) == NO_ERROR) {
6131                         inputId = DisplayId::fromValue<PhysicalDisplayId>(inputDisplayId);
6132                         if (!inputId || getPhysicalDisplayToken(*inputId)) {
6133                             ALOGE("No display with id: %" PRIu64, inputDisplayId);
6134                             return NAME_NOT_FOUND;
6135                         }
6136                     }
6137                     {
6138                         Mutex::Autolock lock(mStateLock);
6139                         mLayerCachingEnabled = n != 0;
6140                         for (const auto& [_, display] : mDisplays) {
6141                             if (!inputId || *inputId == display->getPhysicalId()) {
6142                                 display->enableLayerCaching(mLayerCachingEnabled);
6143                             }
6144                         }
6145                     }
6146                     return OK;
6147                 });
6148 
6149                 if (const status_t error = future.get(); error != OK) {
6150                     return error;
6151                 }
6152                 scheduleRepaint();
6153                 return NO_ERROR;
6154             }
6155             case 1041: { // Transaction tracing
6156                 if (mTransactionTracing) {
6157                     if (data.readInt32()) {
6158                         // Transaction tracing is always running but allow the user to temporarily
6159                         // increase the buffer when actively debugging.
6160                         mTransactionTracing->setBufferSize(
6161                                 TransactionTracing::ACTIVE_TRACING_BUFFER_SIZE);
6162                     } else {
6163                         mTransactionTracing->writeToFile();
6164                         mTransactionTracing->setBufferSize(
6165                                 TransactionTracing::CONTINUOUS_TRACING_BUFFER_SIZE);
6166                     }
6167                 }
6168                 reply->writeInt32(NO_ERROR);
6169                 return NO_ERROR;
6170             }
6171             case 1042: { // Write layers trace or transaction trace to file
6172                 if (mTransactionTracing) {
6173                     mTransactionTracing->writeToFile();
6174                 }
6175                 if (mLayerTracingEnabled) {
6176                     mLayerTracing.writeToFile();
6177                 }
6178                 reply->writeInt32(NO_ERROR);
6179                 return NO_ERROR;
6180             }
6181         }
6182     }
6183     return err;
6184 }
6185 
kernelTimerChanged(bool expired)6186 void SurfaceFlinger::kernelTimerChanged(bool expired) {
6187     static bool updateOverlay =
6188             property_get_bool("debug.sf.kernel_idle_timer_update_overlay", true);
6189     if (!updateOverlay) return;
6190 
6191     // Update the overlay on the main thread to avoid race conditions with
6192     // mRefreshRateConfigs->getActiveMode()
6193     static_cast<void>(mScheduler->schedule([=] {
6194         const auto display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked());
6195         if (!display) {
6196             ALOGW("%s: default display is null", __func__);
6197             return;
6198         }
6199         if (!display->isRefreshRateOverlayEnabled()) return;
6200 
6201         const auto desiredActiveMode = display->getDesiredActiveMode();
6202         const std::optional<DisplayModeId> desiredModeId = desiredActiveMode
6203                 ? std::make_optional(desiredActiveMode->mode->getId())
6204                 : std::nullopt;
6205 
6206         const bool timerExpired = mKernelIdleTimerEnabled && expired;
6207 
6208         if (display->onKernelTimerChanged(desiredModeId, timerExpired)) {
6209             mScheduler->scheduleFrame();
6210         }
6211     }));
6212 }
6213 
6214 std::pair<std::optional<KernelIdleTimerController>, std::chrono::milliseconds>
getKernelIdleTimerProperties(DisplayId displayId)6215 SurfaceFlinger::getKernelIdleTimerProperties(DisplayId displayId) {
6216     const bool isKernelIdleTimerHwcSupported = getHwComposer().getComposer()->isSupported(
6217             android::Hwc2::Composer::OptionalFeature::KernelIdleTimer);
6218     const auto timeout = getIdleTimerTimeout(displayId);
6219     if (isKernelIdleTimerHwcSupported) {
6220         if (const auto id = PhysicalDisplayId::tryCast(displayId);
6221             getHwComposer().hasDisplayIdleTimerCapability(*id)) {
6222             // In order to decide if we can use the HWC api for idle timer
6223             // we query DisplayCapability::DISPLAY_IDLE_TIMER directly on the composer
6224             // without relying on hasDisplayCapability.
6225             // hasDisplayCapability relies on DisplayCapabilities
6226             // which are updated after we set the PowerMode::ON.
6227             // DISPLAY_IDLE_TIMER is a display driver property
6228             // and is available before the PowerMode::ON
6229             return {KernelIdleTimerController::HwcApi, timeout};
6230         }
6231         return {std::nullopt, timeout};
6232     }
6233     if (getKernelIdleTimerSyspropConfig(displayId)) {
6234         return {KernelIdleTimerController::Sysprop, timeout};
6235     }
6236 
6237     return {std::nullopt, timeout};
6238 }
6239 
updateKernelIdleTimer(std::chrono::milliseconds timeout,KernelIdleTimerController controller,PhysicalDisplayId displayId)6240 void SurfaceFlinger::updateKernelIdleTimer(std::chrono::milliseconds timeout,
6241                                            KernelIdleTimerController controller,
6242                                            PhysicalDisplayId displayId) {
6243     switch (controller) {
6244         case KernelIdleTimerController::HwcApi: {
6245             getHwComposer().setIdleTimerEnabled(displayId, timeout);
6246             break;
6247         }
6248         case KernelIdleTimerController::Sysprop: {
6249             base::SetProperty(KERNEL_IDLE_TIMER_PROP, timeout > 0ms ? "true" : "false");
6250             break;
6251         }
6252     }
6253 }
6254 
toggleKernelIdleTimer()6255 void SurfaceFlinger::toggleKernelIdleTimer() {
6256     using KernelIdleTimerAction = scheduler::RefreshRateConfigs::KernelIdleTimerAction;
6257 
6258     const auto display = getDefaultDisplayDeviceLocked();
6259     if (!display) {
6260         ALOGW("%s: default display is null", __func__);
6261         return;
6262     }
6263 
6264     // If the support for kernel idle timer is disabled for the active display,
6265     // don't do anything.
6266     const std::optional<KernelIdleTimerController> kernelIdleTimerController =
6267             display->refreshRateConfigs().kernelIdleTimerController();
6268     if (!kernelIdleTimerController.has_value()) {
6269         return;
6270     }
6271 
6272     const KernelIdleTimerAction action = display->refreshRateConfigs().getIdleTimerAction();
6273 
6274     switch (action) {
6275         case KernelIdleTimerAction::TurnOff:
6276             if (mKernelIdleTimerEnabled) {
6277                 ATRACE_INT("KernelIdleTimer", 0);
6278                 std::chrono::milliseconds constexpr kTimerDisabledTimeout = 0ms;
6279                 updateKernelIdleTimer(kTimerDisabledTimeout, kernelIdleTimerController.value(),
6280                                       display->getPhysicalId());
6281                 mKernelIdleTimerEnabled = false;
6282             }
6283             break;
6284         case KernelIdleTimerAction::TurnOn:
6285             if (!mKernelIdleTimerEnabled) {
6286                 ATRACE_INT("KernelIdleTimer", 1);
6287                 const std::chrono::milliseconds timeout =
6288                         display->refreshRateConfigs().getIdleTimerTimeout();
6289                 updateKernelIdleTimer(timeout, kernelIdleTimerController.value(),
6290                                       display->getPhysicalId());
6291                 mKernelIdleTimerEnabled = true;
6292             }
6293             break;
6294     }
6295 }
6296 
6297 // A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
6298 class WindowDisconnector {
6299 public:
WindowDisconnector(ANativeWindow * window,int api)6300     WindowDisconnector(ANativeWindow* window, int api) : mWindow(window), mApi(api) {}
~WindowDisconnector()6301     ~WindowDisconnector() {
6302         native_window_api_disconnect(mWindow, mApi);
6303     }
6304 
6305 private:
6306     ANativeWindow* mWindow;
6307     const int mApi;
6308 };
6309 
pickDataspaceFromColorMode(const ColorMode colorMode)6310 static Dataspace pickDataspaceFromColorMode(const ColorMode colorMode) {
6311     switch (colorMode) {
6312         case ColorMode::DISPLAY_P3:
6313         case ColorMode::BT2100_PQ:
6314         case ColorMode::BT2100_HLG:
6315         case ColorMode::DISPLAY_BT2020:
6316             return Dataspace::DISPLAY_P3;
6317         default:
6318             return Dataspace::V0_SRGB;
6319     }
6320 }
6321 
hasCaptureBlackoutContentPermission()6322 static bool hasCaptureBlackoutContentPermission() {
6323     IPCThreadState* ipc = IPCThreadState::self();
6324     const int pid = ipc->getCallingPid();
6325     const int uid = ipc->getCallingUid();
6326     return uid == AID_GRAPHICS || uid == AID_SYSTEM ||
6327             PermissionCache::checkPermission(sCaptureBlackoutContent, pid, uid);
6328 }
6329 
validateScreenshotPermissions(const CaptureArgs & captureArgs)6330 static status_t validateScreenshotPermissions(const CaptureArgs& captureArgs) {
6331     IPCThreadState* ipc = IPCThreadState::self();
6332     const int pid = ipc->getCallingPid();
6333     const int uid = ipc->getCallingUid();
6334     if (uid == AID_GRAPHICS || PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
6335         return OK;
6336     }
6337 
6338     // If the caller doesn't have the correct permissions but is only attempting to screenshot
6339     // itself, we allow it to continue.
6340     if (captureArgs.uid == uid) {
6341         return OK;
6342     }
6343 
6344     ALOGE("Permission Denial: can't take screenshot pid=%d, uid=%d", pid, uid);
6345     return PERMISSION_DENIED;
6346 }
6347 
setSchedFifo(bool enabled)6348 status_t SurfaceFlinger::setSchedFifo(bool enabled) {
6349     static constexpr int kFifoPriority = 2;
6350     static constexpr int kOtherPriority = 0;
6351 
6352     struct sched_param param = {0};
6353     int sched_policy;
6354     if (enabled) {
6355         sched_policy = SCHED_FIFO;
6356         param.sched_priority = kFifoPriority;
6357     } else {
6358         sched_policy = SCHED_OTHER;
6359         param.sched_priority = kOtherPriority;
6360     }
6361 
6362     if (sched_setscheduler(0, sched_policy, &param) != 0) {
6363         return -errno;
6364     }
6365 
6366     return NO_ERROR;
6367 }
6368 
setSchedAttr(bool enabled)6369 status_t SurfaceFlinger::setSchedAttr(bool enabled) {
6370     static const unsigned int kUclampMin =
6371             base::GetUintProperty<unsigned int>("ro.surface_flinger.uclamp.min", 0U);
6372 
6373     if (!kUclampMin) {
6374         // uclamp.min set to 0 (default), skip setting
6375         return NO_ERROR;
6376     }
6377 
6378     // Currently, there is no wrapper in bionic: b/183240349.
6379     struct sched_attr {
6380         uint32_t size;
6381         uint32_t sched_policy;
6382         uint64_t sched_flags;
6383         int32_t sched_nice;
6384         uint32_t sched_priority;
6385         uint64_t sched_runtime;
6386         uint64_t sched_deadline;
6387         uint64_t sched_period;
6388         uint32_t sched_util_min;
6389         uint32_t sched_util_max;
6390     };
6391 
6392     sched_attr attr = {};
6393     attr.size = sizeof(attr);
6394 
6395     attr.sched_flags = (SCHED_FLAG_KEEP_ALL | SCHED_FLAG_UTIL_CLAMP);
6396     attr.sched_util_min = enabled ? kUclampMin : 0;
6397     attr.sched_util_max = 1024;
6398 
6399     if (syscall(__NR_sched_setattr, 0, &attr, 0)) {
6400         return -errno;
6401     }
6402 
6403     return NO_ERROR;
6404 }
6405 
captureDisplay(const DisplayCaptureArgs & args,const sp<IScreenCaptureListener> & captureListener)6406 status_t SurfaceFlinger::captureDisplay(const DisplayCaptureArgs& args,
6407                                         const sp<IScreenCaptureListener>& captureListener) {
6408     ATRACE_CALL();
6409 
6410     status_t validate = validateScreenshotPermissions(args);
6411     if (validate != OK) {
6412         return validate;
6413     }
6414 
6415     if (!args.displayToken) return BAD_VALUE;
6416 
6417     wp<const DisplayDevice> displayWeak;
6418     ui::LayerStack layerStack;
6419     ui::Size reqSize(args.width, args.height);
6420     ui::Dataspace dataspace;
6421     {
6422         Mutex::Autolock lock(mStateLock);
6423         sp<DisplayDevice> display = getDisplayDeviceLocked(args.displayToken);
6424         if (!display) return NAME_NOT_FOUND;
6425         displayWeak = display;
6426         layerStack = display->getLayerStack();
6427 
6428         // set the requested width/height to the logical display layer stack rect size by default
6429         if (args.width == 0 || args.height == 0) {
6430             reqSize = display->getLayerStackSpaceRect().getSize();
6431         }
6432 
6433         // The dataspace is depended on the color mode of display, that could use non-native mode
6434         // (ex. displayP3) to enhance the content, but some cases are checking native RGB in bytes,
6435         // and failed if display is not in native mode. This provide a way to force using native
6436         // colors when capture.
6437         dataspace = args.dataspace;
6438         if (dataspace == ui::Dataspace::UNKNOWN) {
6439             const ui::ColorMode colorMode = display->getCompositionDisplay()->getState().colorMode;
6440             dataspace = pickDataspaceFromColorMode(colorMode);
6441         }
6442     }
6443 
6444     RenderAreaFuture renderAreaFuture = ftl::defer([=] {
6445         return DisplayRenderArea::create(displayWeak, args.sourceCrop, reqSize, dataspace,
6446                                          args.useIdentityTransform, args.captureSecureLayers);
6447     });
6448 
6449     auto traverseLayers = [this, args, layerStack](const LayerVector::Visitor& visitor) {
6450         traverseLayersInLayerStack(layerStack, args.uid, visitor);
6451     };
6452 
6453     auto future = captureScreenCommon(std::move(renderAreaFuture), traverseLayers, reqSize,
6454                                       args.pixelFormat, args.allowProtected, args.grayscale,
6455                                       captureListener);
6456     return fenceStatus(future.get());
6457 }
6458 
captureDisplay(DisplayId displayId,const sp<IScreenCaptureListener> & captureListener)6459 status_t SurfaceFlinger::captureDisplay(DisplayId displayId,
6460                                         const sp<IScreenCaptureListener>& captureListener) {
6461     ui::LayerStack layerStack;
6462     wp<const DisplayDevice> displayWeak;
6463     ui::Size size;
6464     ui::Dataspace dataspace;
6465     {
6466         Mutex::Autolock lock(mStateLock);
6467 
6468         const auto display = getDisplayDeviceLocked(displayId);
6469         if (!display) {
6470             return NAME_NOT_FOUND;
6471         }
6472 
6473         displayWeak = display;
6474         layerStack = display->getLayerStack();
6475         size = display->getLayerStackSpaceRect().getSize();
6476 
6477         dataspace =
6478                 pickDataspaceFromColorMode(display->getCompositionDisplay()->getState().colorMode);
6479     }
6480 
6481     RenderAreaFuture renderAreaFuture = ftl::defer([=] {
6482         return DisplayRenderArea::create(displayWeak, Rect(), size, dataspace,
6483                                          false /* useIdentityTransform */,
6484                                          false /* captureSecureLayers */);
6485     });
6486 
6487     auto traverseLayers = [this, layerStack](const LayerVector::Visitor& visitor) {
6488         traverseLayersInLayerStack(layerStack, CaptureArgs::UNSET_UID, visitor);
6489     };
6490 
6491     if (captureListener == nullptr) {
6492         ALOGE("capture screen must provide a capture listener callback");
6493         return BAD_VALUE;
6494     }
6495 
6496     constexpr bool kAllowProtected = false;
6497     constexpr bool kGrayscale = false;
6498 
6499     auto future = captureScreenCommon(std::move(renderAreaFuture), traverseLayers, size,
6500                                       ui::PixelFormat::RGBA_8888, kAllowProtected, kGrayscale,
6501                                       captureListener);
6502     return fenceStatus(future.get());
6503 }
6504 
captureLayers(const LayerCaptureArgs & args,const sp<IScreenCaptureListener> & captureListener)6505 status_t SurfaceFlinger::captureLayers(const LayerCaptureArgs& args,
6506                                        const sp<IScreenCaptureListener>& captureListener) {
6507     ATRACE_CALL();
6508 
6509     status_t validate = validateScreenshotPermissions(args);
6510     if (validate != OK) {
6511         return validate;
6512     }
6513 
6514     ui::Size reqSize;
6515     sp<Layer> parent;
6516     Rect crop(args.sourceCrop);
6517     std::unordered_set<sp<Layer>, SpHash<Layer>> excludeLayers;
6518     ui::Dataspace dataspace;
6519 
6520     // Call this before holding mStateLock to avoid any deadlocking.
6521     bool canCaptureBlackoutContent = hasCaptureBlackoutContentPermission();
6522 
6523     {
6524         Mutex::Autolock lock(mStateLock);
6525 
6526         parent = fromHandle(args.layerHandle).promote();
6527         if (parent == nullptr) {
6528             ALOGE("captureLayers called with an invalid or removed parent");
6529             return NAME_NOT_FOUND;
6530         }
6531 
6532         if (!canCaptureBlackoutContent &&
6533             parent->getDrawingState().flags & layer_state_t::eLayerSecure) {
6534             ALOGW("Attempting to capture secure layer: PERMISSION_DENIED");
6535             return PERMISSION_DENIED;
6536         }
6537 
6538         Rect parentSourceBounds = parent->getCroppedBufferSize(parent->getDrawingState());
6539         if (args.sourceCrop.width() <= 0) {
6540             crop.left = 0;
6541             crop.right = parentSourceBounds.getWidth();
6542         }
6543 
6544         if (args.sourceCrop.height() <= 0) {
6545             crop.top = 0;
6546             crop.bottom = parentSourceBounds.getHeight();
6547         }
6548 
6549         if (crop.isEmpty() || args.frameScaleX <= 0.0f || args.frameScaleY <= 0.0f) {
6550             // Error out if the layer has no source bounds (i.e. they are boundless) and a source
6551             // crop was not specified, or an invalid frame scale was provided.
6552             return BAD_VALUE;
6553         }
6554         reqSize = ui::Size(crop.width() * args.frameScaleX, crop.height() * args.frameScaleY);
6555 
6556         for (const auto& handle : args.excludeHandles) {
6557             sp<Layer> excludeLayer = fromHandle(handle).promote();
6558             if (excludeLayer != nullptr) {
6559                 excludeLayers.emplace(excludeLayer);
6560             } else {
6561                 ALOGW("Invalid layer handle passed as excludeLayer to captureLayers");
6562                 return NAME_NOT_FOUND;
6563             }
6564         }
6565 
6566         // The dataspace is depended on the color mode of display, that could use non-native mode
6567         // (ex. displayP3) to enhance the content, but some cases are checking native RGB in bytes,
6568         // and failed if display is not in native mode. This provide a way to force using native
6569         // colors when capture.
6570         dataspace = args.dataspace;
6571     } // mStateLock
6572 
6573     // really small crop or frameScale
6574     if (reqSize.width <= 0 || reqSize.height <= 0) {
6575         ALOGW("Failed to captureLayes: crop or scale too small");
6576         return BAD_VALUE;
6577     }
6578 
6579     Rect layerStackSpaceRect(0, 0, reqSize.width, reqSize.height);
6580     bool childrenOnly = args.childrenOnly;
6581     RenderAreaFuture renderAreaFuture = ftl::defer([=]() -> std::unique_ptr<RenderArea> {
6582         return std::make_unique<LayerRenderArea>(*this, parent, crop, reqSize, dataspace,
6583                                                  childrenOnly, layerStackSpaceRect,
6584                                                  args.captureSecureLayers);
6585     });
6586 
6587     auto traverseLayers = [parent, args, excludeLayers](const LayerVector::Visitor& visitor) {
6588         parent->traverseChildrenInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
6589             if (!layer->isVisible()) {
6590                 return;
6591             } else if (args.childrenOnly && layer == parent.get()) {
6592                 return;
6593             } else if (args.uid != CaptureArgs::UNSET_UID && args.uid != layer->getOwnerUid()) {
6594                 return;
6595             }
6596 
6597             sp<Layer> p = layer;
6598             while (p != nullptr) {
6599                 if (excludeLayers.count(p) != 0) {
6600                     return;
6601                 }
6602                 p = p->getParent();
6603             }
6604 
6605             visitor(layer);
6606         });
6607     };
6608 
6609     if (captureListener == nullptr) {
6610         ALOGE("capture screen must provide a capture listener callback");
6611         return BAD_VALUE;
6612     }
6613 
6614     auto future = captureScreenCommon(std::move(renderAreaFuture), traverseLayers, reqSize,
6615                                       args.pixelFormat, args.allowProtected, args.grayscale,
6616                                       captureListener);
6617     return fenceStatus(future.get());
6618 }
6619 
captureScreenCommon(RenderAreaFuture renderAreaFuture,TraverseLayersFunction traverseLayers,ui::Size bufferSize,ui::PixelFormat reqPixelFormat,bool allowProtected,bool grayscale,const sp<IScreenCaptureListener> & captureListener)6620 ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon(
6621         RenderAreaFuture renderAreaFuture, TraverseLayersFunction traverseLayers,
6622         ui::Size bufferSize, ui::PixelFormat reqPixelFormat, bool allowProtected, bool grayscale,
6623         const sp<IScreenCaptureListener>& captureListener) {
6624     ATRACE_CALL();
6625 
6626     if (exceedsMaxRenderTargetSize(bufferSize.getWidth(), bufferSize.getHeight())) {
6627         ALOGE("Attempted to capture screen with size (%" PRId32 ", %" PRId32
6628               ") that exceeds render target size limit.",
6629               bufferSize.getWidth(), bufferSize.getHeight());
6630         return ftl::yield<FenceResult>(base::unexpected(BAD_VALUE)).share();
6631     }
6632 
6633     // Loop over all visible layers to see whether there's any protected layer. A protected layer is
6634     // typically a layer with DRM contents, or have the GRALLOC_USAGE_PROTECTED set on the buffer.
6635     // A protected layer has no implication on whether it's secure, which is explicitly set by
6636     // application to avoid being screenshot or drawn via unsecure display.
6637     const bool supportsProtected = getRenderEngine().supportsProtectedContent();
6638     bool hasProtectedLayer = false;
6639     if (allowProtected && supportsProtected) {
6640         auto future = mScheduler->schedule([=]() {
6641             bool protectedLayerFound = false;
6642             traverseLayers([&](Layer* layer) {
6643                 protectedLayerFound =
6644                         protectedLayerFound || (layer->isVisible() && layer->isProtected());
6645             });
6646             return protectedLayerFound;
6647         });
6648         hasProtectedLayer = future.get();
6649     }
6650 
6651     const uint32_t usage = GRALLOC_USAGE_HW_COMPOSER | GRALLOC_USAGE_HW_RENDER |
6652             GRALLOC_USAGE_HW_TEXTURE |
6653             (hasProtectedLayer && allowProtected && supportsProtected
6654                      ? GRALLOC_USAGE_PROTECTED
6655                      : GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN);
6656     sp<GraphicBuffer> buffer =
6657             getFactory().createGraphicBuffer(bufferSize.getWidth(), bufferSize.getHeight(),
6658                                              static_cast<android_pixel_format>(reqPixelFormat),
6659                                              1 /* layerCount */, usage, "screenshot");
6660 
6661     const status_t bufferStatus = buffer->initCheck();
6662     if (bufferStatus != OK) {
6663         // Animations may end up being really janky, but don't crash here.
6664         // Otherwise an irreponsible process may cause an SF crash by allocating
6665         // too much.
6666         ALOGE("%s: Buffer failed to allocate: %d", __func__, bufferStatus);
6667         return ftl::yield<FenceResult>(base::unexpected(bufferStatus)).share();
6668     }
6669     const std::shared_ptr<renderengine::ExternalTexture> texture = std::make_shared<
6670             renderengine::impl::ExternalTexture>(buffer, getRenderEngine(),
6671                                                  renderengine::impl::ExternalTexture::Usage::
6672                                                          WRITEABLE);
6673     return captureScreenCommon(std::move(renderAreaFuture), traverseLayers, texture,
6674                                false /* regionSampling */, grayscale, captureListener);
6675 }
6676 
captureScreenCommon(RenderAreaFuture renderAreaFuture,TraverseLayersFunction traverseLayers,const std::shared_ptr<renderengine::ExternalTexture> & buffer,bool regionSampling,bool grayscale,const sp<IScreenCaptureListener> & captureListener)6677 ftl::SharedFuture<FenceResult> SurfaceFlinger::captureScreenCommon(
6678         RenderAreaFuture renderAreaFuture, TraverseLayersFunction traverseLayers,
6679         const std::shared_ptr<renderengine::ExternalTexture>& buffer, bool regionSampling,
6680         bool grayscale, const sp<IScreenCaptureListener>& captureListener) {
6681     ATRACE_CALL();
6682 
6683     bool canCaptureBlackoutContent = hasCaptureBlackoutContentPermission();
6684 
6685     auto future = mScheduler->schedule([=, renderAreaFuture = std::move(renderAreaFuture)]() mutable
6686                                        -> ftl::SharedFuture<FenceResult> {
6687         ScreenCaptureResults captureResults;
6688         std::unique_ptr<RenderArea> renderArea = renderAreaFuture.get();
6689         if (!renderArea) {
6690             ALOGW("Skipping screen capture because of invalid render area.");
6691             if (captureListener) {
6692                 captureResults.result = NO_MEMORY;
6693                 captureListener->onScreenCaptureCompleted(captureResults);
6694             }
6695             return ftl::yield<FenceResult>(base::unexpected(NO_ERROR)).share();
6696         }
6697 
6698         ftl::SharedFuture<FenceResult> renderFuture;
6699         renderArea->render([&] {
6700             renderFuture =
6701                     renderScreenImpl(*renderArea, traverseLayers, buffer, canCaptureBlackoutContent,
6702                                      regionSampling, grayscale, captureResults);
6703         });
6704 
6705         if (captureListener) {
6706             // TODO: The future returned by std::async blocks the main thread. Return a chain of
6707             // futures to the Binder thread instead.
6708             std::async([=]() mutable {
6709                 ATRACE_NAME("captureListener is nonnull!");
6710                 auto fenceResult = renderFuture.get();
6711                 // TODO(b/232535621): Change ScreenCaptureResults to store a FenceResult.
6712                 captureResults.result = fenceStatus(fenceResult);
6713                 captureResults.fence = std::move(fenceResult).value_or(Fence::NO_FENCE);
6714                 captureListener->onScreenCaptureCompleted(captureResults);
6715             });
6716         }
6717         return renderFuture;
6718     });
6719 
6720     if (captureListener) {
6721         return ftl::yield<FenceResult>(base::unexpected(NO_ERROR)).share();
6722     }
6723 
6724     // Flatten nested futures.
6725     auto chain = ftl::Future(std::move(future)).then([](ftl::SharedFuture<FenceResult> future) {
6726         return future;
6727     });
6728 
6729     return chain.share();
6730 }
6731 
renderScreenImpl(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,const std::shared_ptr<renderengine::ExternalTexture> & buffer,bool canCaptureBlackoutContent,bool regionSampling,bool grayscale,ScreenCaptureResults & captureResults)6732 ftl::SharedFuture<FenceResult> SurfaceFlinger::renderScreenImpl(
6733         const RenderArea& renderArea, TraverseLayersFunction traverseLayers,
6734         const std::shared_ptr<renderengine::ExternalTexture>& buffer,
6735         bool canCaptureBlackoutContent, bool regionSampling, bool grayscale,
6736         ScreenCaptureResults& captureResults) {
6737     ATRACE_CALL();
6738 
6739     traverseLayers([&](Layer* layer) {
6740         captureResults.capturedSecureLayers =
6741                 captureResults.capturedSecureLayers || (layer->isVisible() && layer->isSecure());
6742     });
6743 
6744     const bool useProtected = buffer->getUsage() & GRALLOC_USAGE_PROTECTED;
6745 
6746     // We allow the system server to take screenshots of secure layers for
6747     // use in situations like the Screen-rotation animation and place
6748     // the impetus on WindowManager to not persist them.
6749     if (captureResults.capturedSecureLayers && !canCaptureBlackoutContent) {
6750         ALOGW("FB is protected: PERMISSION_DENIED");
6751         return ftl::yield<FenceResult>(base::unexpected(PERMISSION_DENIED)).share();
6752     }
6753 
6754     captureResults.buffer = buffer->getBuffer();
6755     auto dataspace = renderArea.getReqDataSpace();
6756     auto parent = renderArea.getParentLayer();
6757     auto renderIntent = RenderIntent::TONE_MAP_COLORIMETRIC;
6758     auto sdrWhitePointNits = DisplayDevice::sDefaultMaxLumiance;
6759     auto displayBrightnessNits = DisplayDevice::sDefaultMaxLumiance;
6760 
6761     if ((dataspace == ui::Dataspace::UNKNOWN) && (parent != nullptr)) {
6762         Mutex::Autolock lock(mStateLock);
6763         auto display = findDisplay([layerStack = parent->getLayerStack()](const auto& display) {
6764             return display.getLayerStack() == layerStack;
6765         });
6766         if (!display) {
6767             // If the layer is not on a display, use the dataspace for the default display.
6768             display = getDefaultDisplayDeviceLocked();
6769         }
6770 
6771         const ui::ColorMode colorMode = display->getCompositionDisplay()->getState().colorMode;
6772         dataspace = pickDataspaceFromColorMode(colorMode);
6773         renderIntent = display->getCompositionDisplay()->getState().renderIntent;
6774         sdrWhitePointNits = display->getCompositionDisplay()->getState().sdrWhitePointNits;
6775         displayBrightnessNits = display->getCompositionDisplay()->getState().displayBrightnessNits;
6776     }
6777     captureResults.capturedDataspace = dataspace;
6778 
6779     const auto reqWidth = renderArea.getReqWidth();
6780     const auto reqHeight = renderArea.getReqHeight();
6781     const auto sourceCrop = renderArea.getSourceCrop();
6782     const auto transform = renderArea.getTransform();
6783     const auto rotation = renderArea.getRotationFlags();
6784     const auto& layerStackSpaceRect = renderArea.getLayerStackSpaceRect();
6785 
6786     renderengine::DisplaySettings clientCompositionDisplay;
6787     std::vector<compositionengine::LayerFE::LayerSettings> clientCompositionLayers;
6788 
6789     // assume that bounds are never offset, and that they are the same as the
6790     // buffer bounds.
6791     clientCompositionDisplay.physicalDisplay = Rect(reqWidth, reqHeight);
6792     clientCompositionDisplay.clip = sourceCrop;
6793     clientCompositionDisplay.orientation = rotation;
6794 
6795     clientCompositionDisplay.outputDataspace = dataspace;
6796     clientCompositionDisplay.currentLuminanceNits = displayBrightnessNits;
6797     clientCompositionDisplay.maxLuminance = DisplayDevice::sDefaultMaxLumiance;
6798     clientCompositionDisplay.renderIntent =
6799             static_cast<aidl::android::hardware::graphics::composer3::RenderIntent>(renderIntent);
6800 
6801     const float colorSaturation = grayscale ? 0 : 1;
6802     clientCompositionDisplay.colorTransform = calculateColorMatrix(colorSaturation);
6803 
6804     const float alpha = RenderArea::getCaptureFillValue(renderArea.getCaptureFill());
6805 
6806     compositionengine::LayerFE::LayerSettings fillLayer;
6807     fillLayer.source.buffer.buffer = nullptr;
6808     fillLayer.source.solidColor = half3(0.0, 0.0, 0.0);
6809     fillLayer.geometry.boundaries =
6810             FloatRect(sourceCrop.left, sourceCrop.top, sourceCrop.right, sourceCrop.bottom);
6811     fillLayer.alpha = half(alpha);
6812     clientCompositionLayers.push_back(fillLayer);
6813 
6814     const auto display = renderArea.getDisplayDevice();
6815     std::vector<Layer*> renderedLayers;
6816     bool disableBlurs = false;
6817     traverseLayers([&](Layer* layer) {
6818         disableBlurs |= layer->getDrawingState().sidebandStream != nullptr;
6819 
6820         Region clip(renderArea.getBounds());
6821         compositionengine::LayerFE::ClientCompositionTargetSettings targetSettings{
6822                 clip,
6823                 layer->needsFilteringForScreenshots(display.get(), transform) ||
6824                         renderArea.needsFiltering(),
6825                 renderArea.isSecure(),
6826                 useProtected,
6827                 layerStackSpaceRect,
6828                 clientCompositionDisplay.outputDataspace,
6829                 true,  /* realContentIsVisible */
6830                 false, /* clearContent */
6831                 disableBlurs ? compositionengine::LayerFE::ClientCompositionTargetSettings::
6832                                        BlurSetting::Disabled
6833                              : compositionengine::LayerFE::ClientCompositionTargetSettings::
6834                                        BlurSetting::Enabled,
6835                 isHdrLayer(layer) ? displayBrightnessNits : sdrWhitePointNits,
6836 
6837         };
6838         std::vector<compositionengine::LayerFE::LayerSettings> results =
6839                 layer->prepareClientCompositionList(targetSettings);
6840         if (results.size() > 0) {
6841             for (auto& settings : results) {
6842                 settings.geometry.positionTransform =
6843                         transform.asMatrix4() * settings.geometry.positionTransform;
6844                 // There's no need to process blurs when we're executing region sampling,
6845                 // we're just trying to understand what we're drawing, and doing so without
6846                 // blurs is already a pretty good approximation.
6847                 if (regionSampling) {
6848                     settings.backgroundBlurRadius = 0;
6849                 }
6850                 captureResults.capturedHdrLayers |= isHdrLayer(layer);
6851             }
6852 
6853             clientCompositionLayers.insert(clientCompositionLayers.end(),
6854                                            std::make_move_iterator(results.begin()),
6855                                            std::make_move_iterator(results.end()));
6856             renderedLayers.push_back(layer);
6857         }
6858 
6859     });
6860 
6861     std::vector<renderengine::LayerSettings> clientRenderEngineLayers;
6862     clientRenderEngineLayers.reserve(clientCompositionLayers.size());
6863     std::transform(clientCompositionLayers.begin(), clientCompositionLayers.end(),
6864                    std::back_inserter(clientRenderEngineLayers),
6865                    [](compositionengine::LayerFE::LayerSettings& settings)
6866                            -> renderengine::LayerSettings { return settings; });
6867 
6868     // Use an empty fence for the buffer fence, since we just created the buffer so
6869     // there is no need for synchronization with the GPU.
6870     base::unique_fd bufferFence;
6871     getRenderEngine().useProtectedContext(useProtected);
6872 
6873     constexpr bool kUseFramebufferCache = false;
6874     auto chain =
6875             ftl::Future(getRenderEngine().drawLayers(clientCompositionDisplay,
6876                                                      clientRenderEngineLayers, buffer,
6877                                                      kUseFramebufferCache, std::move(bufferFence)))
6878                     .then(&toFenceResult);
6879 
6880     const auto future = chain.share();
6881     for (auto* layer : renderedLayers) {
6882         layer->onLayerDisplayed(future);
6883     }
6884 
6885     // Always switch back to unprotected context.
6886     getRenderEngine().useProtectedContext(false);
6887 
6888     return future;
6889 }
6890 
windowInfosReported()6891 void SurfaceFlinger::windowInfosReported() {
6892     Mutex::Autolock _l(mStateLock);
6893     signalSynchronousTransactions(CountDownLatch::eSyncInputWindows);
6894 }
6895 
6896 // ---------------------------------------------------------------------------
6897 
traverse(const LayerVector::Visitor & visitor) const6898 void SurfaceFlinger::State::traverse(const LayerVector::Visitor& visitor) const {
6899     layersSortedByZ.traverse(visitor);
6900 }
6901 
traverseInZOrder(const LayerVector::Visitor & visitor) const6902 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
6903     layersSortedByZ.traverseInZOrder(stateSet, visitor);
6904 }
6905 
traverseInReverseZOrder(const LayerVector::Visitor & visitor) const6906 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
6907     layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
6908 }
6909 
traverseLayersInLayerStack(ui::LayerStack layerStack,const int32_t uid,const LayerVector::Visitor & visitor)6910 void SurfaceFlinger::traverseLayersInLayerStack(ui::LayerStack layerStack, const int32_t uid,
6911                                                 const LayerVector::Visitor& visitor) {
6912     // We loop through the first level of layers without traversing,
6913     // as we need to determine which layers belong to the requested display.
6914     for (const auto& layer : mDrawingState.layersSortedByZ) {
6915         if (layer->getLayerStack() != layerStack) {
6916             continue;
6917         }
6918         // relative layers are traversed in Layer::traverseInZOrder
6919         layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
6920             if (layer->isInternalDisplayOverlay()) {
6921                 return;
6922             }
6923             if (!layer->isVisible()) {
6924                 return;
6925             }
6926             if (uid != CaptureArgs::UNSET_UID && layer->getOwnerUid() != uid) {
6927                 return;
6928             }
6929             visitor(layer);
6930         });
6931     }
6932 }
6933 
setDesiredDisplayModeSpecsInternal(const sp<DisplayDevice> & display,const std::optional<scheduler::RefreshRateConfigs::Policy> & policy,bool overridePolicy)6934 status_t SurfaceFlinger::setDesiredDisplayModeSpecsInternal(
6935         const sp<DisplayDevice>& display,
6936         const std::optional<scheduler::RefreshRateConfigs::Policy>& policy, bool overridePolicy) {
6937     Mutex::Autolock lock(mStateLock);
6938 
6939     if (mDebugDisplayModeSetByBackdoor) {
6940         // ignore this request as mode is overridden by backdoor
6941         return NO_ERROR;
6942     }
6943 
6944     const status_t setPolicyResult = display->setRefreshRatePolicy(policy, overridePolicy);
6945     if (setPolicyResult < 0) {
6946         return BAD_VALUE;
6947     }
6948     if (setPolicyResult == scheduler::RefreshRateConfigs::CURRENT_POLICY_UNCHANGED) {
6949         return NO_ERROR;
6950     }
6951 
6952     if (display->isInternal() && !isDisplayActiveLocked(display)) {
6953         // The policy will be be applied when the display becomes active.
6954         ALOGV("%s(%s): Inactive display", __func__, to_string(display->getId()).c_str());
6955         return NO_ERROR;
6956     }
6957 
6958     return applyRefreshRateConfigsPolicy(display);
6959 }
6960 
applyRefreshRateConfigsPolicy(const sp<DisplayDevice> & display,bool force)6961 status_t SurfaceFlinger::applyRefreshRateConfigsPolicy(const sp<DisplayDevice>& display,
6962                                                        bool force) {
6963     const scheduler::RefreshRateConfigs::Policy currentPolicy =
6964             display->refreshRateConfigs().getCurrentPolicy();
6965     ALOGV("Setting desired display mode specs: %s", currentPolicy.toString().c_str());
6966 
6967     // TODO(b/140204874): Leave the event in until we do proper testing with all apps that might
6968     // be depending in this callback.
6969     const auto activeMode = display->getActiveMode();
6970     if (isDisplayActiveLocked(display)) {
6971         mScheduler->onPrimaryDisplayModeChanged(mAppConnectionHandle, activeMode);
6972         toggleKernelIdleTimer();
6973     } else {
6974         mScheduler->onNonPrimaryDisplayModeChanged(mAppConnectionHandle, activeMode);
6975     }
6976 
6977     const DisplayModePtr preferredDisplayMode = [&] {
6978         const auto schedulerMode = mScheduler->getPreferredDisplayMode();
6979         if (schedulerMode && schedulerMode->getPhysicalDisplayId() == display->getPhysicalId()) {
6980             return schedulerMode;
6981         }
6982 
6983         return display->getMode(currentPolicy.defaultMode);
6984     }();
6985 
6986     ALOGV("trying to switch to Scheduler preferred mode %d (%s)",
6987           preferredDisplayMode->getId().value(), to_string(preferredDisplayMode->getFps()).c_str());
6988 
6989     if (display->refreshRateConfigs().isModeAllowed(preferredDisplayMode->getId())) {
6990         ALOGV("switching to Scheduler preferred display mode %d",
6991               preferredDisplayMode->getId().value());
6992         setDesiredActiveMode({preferredDisplayMode, DisplayModeEvent::Changed}, force);
6993     } else {
6994         LOG_ALWAYS_FATAL("Desired display mode not allowed: %d",
6995                          preferredDisplayMode->getId().value());
6996     }
6997 
6998     return NO_ERROR;
6999 }
7000 
setDesiredDisplayModeSpecs(const sp<IBinder> & displayToken,ui::DisplayModeId defaultMode,bool allowGroupSwitching,float primaryRefreshRateMin,float primaryRefreshRateMax,float appRequestRefreshRateMin,float appRequestRefreshRateMax)7001 status_t SurfaceFlinger::setDesiredDisplayModeSpecs(
7002         const sp<IBinder>& displayToken, ui::DisplayModeId defaultMode, bool allowGroupSwitching,
7003         float primaryRefreshRateMin, float primaryRefreshRateMax, float appRequestRefreshRateMin,
7004         float appRequestRefreshRateMax) {
7005     ATRACE_CALL();
7006 
7007     if (!displayToken) {
7008         return BAD_VALUE;
7009     }
7010 
7011     auto future = mScheduler->schedule([=]() -> status_t {
7012         const auto display = FTL_FAKE_GUARD(mStateLock, getDisplayDeviceLocked(displayToken));
7013         if (!display) {
7014             ALOGE("Attempt to set desired display modes for invalid display token %p",
7015                   displayToken.get());
7016             return NAME_NOT_FOUND;
7017         } else if (display->isVirtual()) {
7018             ALOGW("Attempt to set desired display modes for virtual display");
7019             return INVALID_OPERATION;
7020         } else {
7021             using Policy = scheduler::RefreshRateConfigs::Policy;
7022             const Policy policy{DisplayModeId(defaultMode),
7023                                 allowGroupSwitching,
7024                                 {Fps::fromValue(primaryRefreshRateMin),
7025                                  Fps::fromValue(primaryRefreshRateMax)},
7026                                 {Fps::fromValue(appRequestRefreshRateMin),
7027                                  Fps::fromValue(appRequestRefreshRateMax)}};
7028             constexpr bool kOverridePolicy = false;
7029 
7030             return setDesiredDisplayModeSpecsInternal(display, policy, kOverridePolicy);
7031         }
7032     });
7033 
7034     return future.get();
7035 }
7036 
getDesiredDisplayModeSpecs(const sp<IBinder> & displayToken,ui::DisplayModeId * outDefaultMode,bool * outAllowGroupSwitching,float * outPrimaryRefreshRateMin,float * outPrimaryRefreshRateMax,float * outAppRequestRefreshRateMin,float * outAppRequestRefreshRateMax)7037 status_t SurfaceFlinger::getDesiredDisplayModeSpecs(const sp<IBinder>& displayToken,
7038                                                     ui::DisplayModeId* outDefaultMode,
7039                                                     bool* outAllowGroupSwitching,
7040                                                     float* outPrimaryRefreshRateMin,
7041                                                     float* outPrimaryRefreshRateMax,
7042                                                     float* outAppRequestRefreshRateMin,
7043                                                     float* outAppRequestRefreshRateMax) {
7044     ATRACE_CALL();
7045 
7046     if (!displayToken || !outDefaultMode || !outPrimaryRefreshRateMin ||
7047         !outPrimaryRefreshRateMax || !outAppRequestRefreshRateMin || !outAppRequestRefreshRateMax) {
7048         return BAD_VALUE;
7049     }
7050 
7051     Mutex::Autolock lock(mStateLock);
7052     const auto display = getDisplayDeviceLocked(displayToken);
7053     if (!display) {
7054         return NAME_NOT_FOUND;
7055     }
7056 
7057     if (display->isVirtual()) {
7058         return INVALID_OPERATION;
7059     }
7060 
7061     scheduler::RefreshRateConfigs::Policy policy =
7062             display->refreshRateConfigs().getDisplayManagerPolicy();
7063     *outDefaultMode = policy.defaultMode.value();
7064     *outAllowGroupSwitching = policy.allowGroupSwitching;
7065     *outPrimaryRefreshRateMin = policy.primaryRange.min.getValue();
7066     *outPrimaryRefreshRateMax = policy.primaryRange.max.getValue();
7067     *outAppRequestRefreshRateMin = policy.appRequestRange.min.getValue();
7068     *outAppRequestRefreshRateMax = policy.appRequestRange.max.getValue();
7069     return NO_ERROR;
7070 }
7071 
fromHandle(const sp<IBinder> & handle) const7072 wp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) const {
7073     return Layer::fromHandle(handle);
7074 }
7075 
onLayerFirstRef(Layer * layer)7076 void SurfaceFlinger::onLayerFirstRef(Layer* layer) {
7077     mNumLayers++;
7078     if (!layer->isRemovedFromCurrentState()) {
7079         mScheduler->registerLayer(layer);
7080     }
7081 }
7082 
onLayerDestroyed(Layer * layer)7083 void SurfaceFlinger::onLayerDestroyed(Layer* layer) {
7084     mNumLayers--;
7085     removeHierarchyFromOffscreenLayers(layer);
7086     if (!layer->isRemovedFromCurrentState()) {
7087         mScheduler->deregisterLayer(layer);
7088     }
7089     if (mTransactionTracing) {
7090         mTransactionTracing->onLayerRemoved(layer->getSequence());
7091     }
7092 }
7093 
onLayerUpdate()7094 void SurfaceFlinger::onLayerUpdate() {
7095     scheduleCommit(FrameHint::kActive);
7096 }
7097 
7098 // WARNING: ONLY CALL THIS FROM LAYER DTOR
7099 // Here we add children in the current state to offscreen layers and remove the
7100 // layer itself from the offscreen layer list.  Since
7101 // this is the dtor, it is safe to access the current state.  This keeps us
7102 // from dangling children layers such that they are not reachable from the
7103 // Drawing state nor the offscreen layer list
7104 // See b/141111965
removeHierarchyFromOffscreenLayers(Layer * layer)7105 void SurfaceFlinger::removeHierarchyFromOffscreenLayers(Layer* layer) {
7106     for (auto& child : layer->getCurrentChildren()) {
7107         mOffscreenLayers.emplace(child.get());
7108     }
7109     mOffscreenLayers.erase(layer);
7110 }
7111 
removeFromOffscreenLayers(Layer * layer)7112 void SurfaceFlinger::removeFromOffscreenLayers(Layer* layer) {
7113     mOffscreenLayers.erase(layer);
7114 }
7115 
setGlobalShadowSettings(const half4 & ambientColor,const half4 & spotColor,float lightPosY,float lightPosZ,float lightRadius)7116 status_t SurfaceFlinger::setGlobalShadowSettings(const half4& ambientColor, const half4& spotColor,
7117                                                  float lightPosY, float lightPosZ,
7118                                                  float lightRadius) {
7119     Mutex::Autolock _l(mStateLock);
7120     mCurrentState.globalShadowSettings.ambientColor = vec4(ambientColor);
7121     mCurrentState.globalShadowSettings.spotColor = vec4(spotColor);
7122     mCurrentState.globalShadowSettings.lightPos.y = lightPosY;
7123     mCurrentState.globalShadowSettings.lightPos.z = lightPosZ;
7124     mCurrentState.globalShadowSettings.lightRadius = lightRadius;
7125 
7126     // these values are overridden when calculating the shadow settings for a layer.
7127     mCurrentState.globalShadowSettings.lightPos.x = 0.f;
7128     mCurrentState.globalShadowSettings.length = 0.f;
7129     return NO_ERROR;
7130 }
7131 
getGenericLayerMetadataKeyMap() const7132 const std::unordered_map<std::string, uint32_t>& SurfaceFlinger::getGenericLayerMetadataKeyMap()
7133         const {
7134     // TODO(b/149500060): Remove this fixed/static mapping. Please prefer taking
7135     // on the work to remove the table in that bug rather than adding more to
7136     // it.
7137     static const std::unordered_map<std::string, uint32_t> genericLayerMetadataKeyMap{
7138             {"org.chromium.arc.V1_0.TaskId", METADATA_TASK_ID},
7139             {"org.chromium.arc.V1_0.CursorInfo", METADATA_MOUSE_CURSOR},
7140     };
7141     return genericLayerMetadataKeyMap;
7142 }
7143 
setFrameRate(const sp<IGraphicBufferProducer> & surface,float frameRate,int8_t compatibility,int8_t changeFrameRateStrategy)7144 status_t SurfaceFlinger::setFrameRate(const sp<IGraphicBufferProducer>& surface, float frameRate,
7145                                       int8_t compatibility, int8_t changeFrameRateStrategy) {
7146     if (!ValidateFrameRate(frameRate, compatibility, changeFrameRateStrategy,
7147                            "SurfaceFlinger::setFrameRate")) {
7148         return BAD_VALUE;
7149     }
7150 
7151     static_cast<void>(mScheduler->schedule([=] {
7152         Mutex::Autolock lock(mStateLock);
7153         if (authenticateSurfaceTextureLocked(surface)) {
7154             sp<Layer> layer = (static_cast<MonitoredProducer*>(surface.get()))->getLayer();
7155             if (layer == nullptr) {
7156                 ALOGE("Attempt to set frame rate on a layer that no longer exists");
7157                 return BAD_VALUE;
7158             }
7159             const auto strategy =
7160                     Layer::FrameRate::convertChangeFrameRateStrategy(changeFrameRateStrategy);
7161             if (layer->setFrameRate(
7162                         Layer::FrameRate(Fps::fromValue(frameRate),
7163                                          Layer::FrameRate::convertCompatibility(compatibility),
7164                                          strategy))) {
7165                 setTransactionFlags(eTraversalNeeded);
7166             }
7167         } else {
7168             ALOGE("Attempt to set frame rate on an unrecognized IGraphicBufferProducer");
7169             return BAD_VALUE;
7170         }
7171         return NO_ERROR;
7172     }));
7173 
7174     return NO_ERROR;
7175 }
7176 
setOverrideFrameRate(uid_t uid,float frameRate)7177 status_t SurfaceFlinger::setOverrideFrameRate(uid_t uid, float frameRate) {
7178     PhysicalDisplayId displayId = [&]() {
7179         Mutex::Autolock lock(mStateLock);
7180         return getDefaultDisplayDeviceLocked()->getPhysicalId();
7181     }();
7182 
7183     mScheduler->setGameModeRefreshRateForUid(FrameRateOverride{static_cast<uid_t>(uid), frameRate});
7184     mScheduler->onFrameRateOverridesChanged(mAppConnectionHandle, displayId);
7185     return NO_ERROR;
7186 }
7187 
setFrameTimelineInfo(const sp<IGraphicBufferProducer> & surface,const FrameTimelineInfo & frameTimelineInfo)7188 status_t SurfaceFlinger::setFrameTimelineInfo(const sp<IGraphicBufferProducer>& surface,
7189                                               const FrameTimelineInfo& frameTimelineInfo) {
7190     Mutex::Autolock lock(mStateLock);
7191     if (!authenticateSurfaceTextureLocked(surface)) {
7192         ALOGE("Attempt to set frame timeline info on an unrecognized IGraphicBufferProducer");
7193         return BAD_VALUE;
7194     }
7195 
7196     sp<Layer> layer = (static_cast<MonitoredProducer*>(surface.get()))->getLayer();
7197     if (layer == nullptr) {
7198         ALOGE("Attempt to set frame timeline info on a layer that no longer exists");
7199         return BAD_VALUE;
7200     }
7201 
7202     layer->setFrameTimelineInfoForBuffer(frameTimelineInfo);
7203     return NO_ERROR;
7204 }
7205 
enableRefreshRateOverlay(bool enable)7206 void SurfaceFlinger::enableRefreshRateOverlay(bool enable) {
7207     for (const auto& [ignored, display] : mDisplays) {
7208         if (display->isInternal()) {
7209             display->enableRefreshRateOverlay(enable, mRefreshRateOverlaySpinner);
7210         }
7211     }
7212 }
7213 
addTransactionTraceListener(const sp<gui::ITransactionTraceListener> & listener)7214 status_t SurfaceFlinger::addTransactionTraceListener(
7215         const sp<gui::ITransactionTraceListener>& listener) {
7216     if (!listener) {
7217         return BAD_VALUE;
7218     }
7219 
7220     mInterceptor->addTransactionTraceListener(listener);
7221 
7222     return NO_ERROR;
7223 }
7224 
getGPUContextPriority()7225 int SurfaceFlinger::getGPUContextPriority() {
7226     return getRenderEngine().getContextPriority();
7227 }
7228 
calculateMaxAcquiredBufferCount(Fps refreshRate,std::chrono::nanoseconds presentLatency)7229 int SurfaceFlinger::calculateMaxAcquiredBufferCount(Fps refreshRate,
7230                                                     std::chrono::nanoseconds presentLatency) {
7231     auto pipelineDepth = presentLatency.count() / refreshRate.getPeriodNsecs();
7232     if (presentLatency.count() % refreshRate.getPeriodNsecs()) {
7233         pipelineDepth++;
7234     }
7235     return std::max(1ll, pipelineDepth - 1);
7236 }
7237 
getMaxAcquiredBufferCount(int * buffers) const7238 status_t SurfaceFlinger::getMaxAcquiredBufferCount(int* buffers) const {
7239     Fps maxRefreshRate = 60_Hz;
7240 
7241     if (!getHwComposer().isHeadless()) {
7242         if (const auto display = getDefaultDisplayDevice()) {
7243             maxRefreshRate = display->refreshRateConfigs().getSupportedRefreshRateRange().max;
7244         }
7245     }
7246 
7247     *buffers = getMaxAcquiredBufferCountForRefreshRate(maxRefreshRate);
7248     return NO_ERROR;
7249 }
7250 
getMaxAcquiredBufferCountForCurrentRefreshRate(uid_t uid) const7251 uint32_t SurfaceFlinger::getMaxAcquiredBufferCountForCurrentRefreshRate(uid_t uid) const {
7252     Fps refreshRate = 60_Hz;
7253 
7254     if (const auto frameRateOverride = mScheduler->getFrameRateOverride(uid)) {
7255         refreshRate = *frameRateOverride;
7256     } else if (!getHwComposer().isHeadless()) {
7257         if (const auto display = FTL_FAKE_GUARD(mStateLock, getDefaultDisplayDeviceLocked())) {
7258             refreshRate = display->refreshRateConfigs().getActiveMode()->getFps();
7259         }
7260     }
7261 
7262     return getMaxAcquiredBufferCountForRefreshRate(refreshRate);
7263 }
7264 
getMaxAcquiredBufferCountForRefreshRate(Fps refreshRate) const7265 int SurfaceFlinger::getMaxAcquiredBufferCountForRefreshRate(Fps refreshRate) const {
7266     const auto vsyncConfig = mVsyncConfiguration->getConfigsForRefreshRate(refreshRate).late;
7267     const auto presentLatency = vsyncConfig.appWorkDuration + vsyncConfig.sfWorkDuration;
7268     return calculateMaxAcquiredBufferCount(refreshRate, presentLatency);
7269 }
7270 
handleLayerCreatedLocked(const LayerCreatedState & state)7271 void SurfaceFlinger::handleLayerCreatedLocked(const LayerCreatedState& state) {
7272     sp<Layer> layer = state.layer.promote();
7273     if (!layer) {
7274         ALOGD("Layer was destroyed soon after creation %p", state.layer.unsafe_get());
7275         return;
7276     }
7277 
7278     sp<Layer> parent;
7279     bool addToRoot = state.addToRoot;
7280     if (state.initialParent != nullptr) {
7281         parent = state.initialParent.promote();
7282         if (parent == nullptr) {
7283             ALOGD("Parent was destroyed soon after creation %p", state.initialParent.unsafe_get());
7284             addToRoot = false;
7285         }
7286     }
7287 
7288     if (parent == nullptr && addToRoot) {
7289         layer->setIsAtRoot(true);
7290         mCurrentState.layersSortedByZ.add(layer);
7291     } else if (parent == nullptr) {
7292         layer->onRemovedFromCurrentState();
7293     } else if (parent->isRemovedFromCurrentState()) {
7294         parent->addChild(layer);
7295         layer->onRemovedFromCurrentState();
7296     } else {
7297         parent->addChild(layer);
7298     }
7299 
7300     layer->updateTransformHint(mActiveDisplayTransformHint);
7301 
7302     mInterceptor->saveSurfaceCreation(layer);
7303 }
7304 
sample()7305 void SurfaceFlinger::sample() {
7306     if (!mLumaSampling || !mRegionSamplingThread) {
7307         return;
7308     }
7309 
7310     mRegionSamplingThread->onCompositionComplete(mScheduler->getScheduledFrameTime());
7311 }
7312 
onActiveDisplaySizeChanged(const sp<DisplayDevice> & activeDisplay)7313 void SurfaceFlinger::onActiveDisplaySizeChanged(const sp<DisplayDevice>& activeDisplay) {
7314     mScheduler->onActiveDisplayAreaChanged(activeDisplay->getWidth() * activeDisplay->getHeight());
7315     getRenderEngine().onActiveDisplaySizeChanged(activeDisplay->getSize());
7316 }
7317 
onActiveDisplayChangedLocked(const sp<DisplayDevice> & activeDisplay)7318 void SurfaceFlinger::onActiveDisplayChangedLocked(const sp<DisplayDevice>& activeDisplay) {
7319     ATRACE_CALL();
7320 
7321     // During boot, SF powers on the primary display, which is the first display to be active. In
7322     // that case, there is no need to force setDesiredActiveMode, because DM is about to send its
7323     // policy via setDesiredDisplayModeSpecs.
7324     bool forceApplyPolicy = false;
7325 
7326     if (const auto display = getDisplayDeviceLocked(mActiveDisplayToken)) {
7327         display->getCompositionDisplay()->setLayerCachingTexturePoolEnabled(false);
7328         forceApplyPolicy = true;
7329     }
7330 
7331     if (!activeDisplay) {
7332         ALOGE("%s: activeDisplay is null", __func__);
7333         return;
7334     }
7335 
7336     ALOGI("Active display is %s", to_string(activeDisplay->getPhysicalId()).c_str());
7337 
7338     mActiveDisplayToken = activeDisplay->getDisplayToken();
7339     activeDisplay->getCompositionDisplay()->setLayerCachingTexturePoolEnabled(true);
7340     updateInternalDisplayVsyncLocked(activeDisplay);
7341     mScheduler->setModeChangePending(false);
7342     mScheduler->setRefreshRateConfigs(activeDisplay->holdRefreshRateConfigs());
7343     onActiveDisplaySizeChanged(activeDisplay);
7344     mActiveDisplayTransformHint = activeDisplay->getTransformHint();
7345 
7346     // The policy of the new active/leader display may have changed while it was inactive. In that
7347     // case, its preferred mode has not been propagated to HWC (via setDesiredActiveMode). In either
7348     // case, the Scheduler's cachedModeChangedParams must be initialized to the newly active mode,
7349     // and the kernel idle timer of the newly active display must be toggled.
7350     applyRefreshRateConfigsPolicy(activeDisplay, forceApplyPolicy);
7351 }
7352 
addWindowInfosListener(const sp<IWindowInfosListener> & windowInfosListener) const7353 status_t SurfaceFlinger::addWindowInfosListener(
7354         const sp<IWindowInfosListener>& windowInfosListener) const {
7355     mWindowInfosListenerInvoker->addWindowInfosListener(windowInfosListener);
7356     return NO_ERROR;
7357 }
7358 
removeWindowInfosListener(const sp<IWindowInfosListener> & windowInfosListener) const7359 status_t SurfaceFlinger::removeWindowInfosListener(
7360         const sp<IWindowInfosListener>& windowInfosListener) const {
7361     mWindowInfosListenerInvoker->removeWindowInfosListener(windowInfosListener);
7362     return NO_ERROR;
7363 }
7364 
getExternalTextureFromBufferData(const BufferData & bufferData,const char * layerName) const7365 std::shared_ptr<renderengine::ExternalTexture> SurfaceFlinger::getExternalTextureFromBufferData(
7366         const BufferData& bufferData, const char* layerName) const {
7367     bool cacheIdChanged = bufferData.flags.test(BufferData::BufferDataChange::cachedBufferChanged);
7368     bool bufferSizeExceedsLimit = false;
7369     std::shared_ptr<renderengine::ExternalTexture> buffer = nullptr;
7370     if (cacheIdChanged && bufferData.buffer != nullptr) {
7371         bufferSizeExceedsLimit = exceedsMaxRenderTargetSize(bufferData.buffer->getWidth(),
7372                                                             bufferData.buffer->getHeight());
7373         if (!bufferSizeExceedsLimit) {
7374             ClientCache::getInstance().add(bufferData.cachedBuffer, bufferData.buffer);
7375             buffer = ClientCache::getInstance().get(bufferData.cachedBuffer);
7376         }
7377     } else if (cacheIdChanged) {
7378         buffer = ClientCache::getInstance().get(bufferData.cachedBuffer);
7379     } else if (bufferData.buffer != nullptr) {
7380         bufferSizeExceedsLimit = exceedsMaxRenderTargetSize(bufferData.buffer->getWidth(),
7381                                                             bufferData.buffer->getHeight());
7382         if (!bufferSizeExceedsLimit) {
7383             buffer = std::make_shared<
7384                     renderengine::impl::ExternalTexture>(bufferData.buffer, getRenderEngine(),
7385                                                          renderengine::impl::ExternalTexture::
7386                                                                  Usage::READABLE);
7387         }
7388     }
7389     ALOGE_IF(bufferSizeExceedsLimit,
7390              "Attempted to create an ExternalTexture for layer %s that exceeds render target size "
7391              "limit.",
7392              layerName);
7393     return buffer;
7394 }
7395 
commitCreatedLayers()7396 bool SurfaceFlinger::commitCreatedLayers() {
7397     std::vector<LayerCreatedState> createdLayers;
7398     {
7399         std::scoped_lock<std::mutex> lock(mCreatedLayersLock);
7400         createdLayers = std::move(mCreatedLayers);
7401         mCreatedLayers.clear();
7402         if (createdLayers.size() == 0) {
7403             return false;
7404         }
7405     }
7406 
7407     Mutex::Autolock _l(mStateLock);
7408     for (const auto& createdLayer : createdLayers) {
7409         handleLayerCreatedLocked(createdLayer);
7410     }
7411     createdLayers.clear();
7412     mLayersAdded = true;
7413     return true;
7414 }
7415 
7416 // gui::ISurfaceComposer
7417 
createDisplay(const std::string & displayName,bool secure,sp<IBinder> * outDisplay)7418 binder::Status SurfaceComposerAIDL::createDisplay(const std::string& displayName, bool secure,
7419                                                   sp<IBinder>* outDisplay) {
7420     status_t status = checkAccessPermission();
7421     if (status == OK) {
7422         String8 displayName8 = String8::format("%s", displayName.c_str());
7423         *outDisplay = mFlinger->createDisplay(displayName8, secure);
7424         return binder::Status::ok();
7425     }
7426     return binder::Status::fromStatusT(status);
7427 }
7428 
destroyDisplay(const sp<IBinder> & display)7429 binder::Status SurfaceComposerAIDL::destroyDisplay(const sp<IBinder>& display) {
7430     status_t status = checkAccessPermission();
7431     if (status == OK) {
7432         mFlinger->destroyDisplay(display);
7433         return binder::Status::ok();
7434     }
7435     return binder::Status::fromStatusT(status);
7436 }
7437 
getPhysicalDisplayIds(std::vector<int64_t> * outDisplayIds)7438 binder::Status SurfaceComposerAIDL::getPhysicalDisplayIds(std::vector<int64_t>* outDisplayIds) {
7439     std::vector<PhysicalDisplayId> physicalDisplayIds = mFlinger->getPhysicalDisplayIds();
7440     std::vector<int64_t> displayIds;
7441     displayIds.reserve(physicalDisplayIds.size());
7442     for (auto item : physicalDisplayIds) {
7443         displayIds.push_back(static_cast<int64_t>(item.value));
7444     }
7445     *outDisplayIds = displayIds;
7446     return binder::Status::ok();
7447 }
7448 
getPrimaryPhysicalDisplayId(int64_t * outDisplayId)7449 binder::Status SurfaceComposerAIDL::getPrimaryPhysicalDisplayId(int64_t* outDisplayId) {
7450     status_t status = checkAccessPermission();
7451     if (status != OK) {
7452         return binder::Status::fromStatusT(status);
7453     }
7454 
7455     PhysicalDisplayId id;
7456     status = mFlinger->getPrimaryPhysicalDisplayId(&id);
7457     if (status == NO_ERROR) {
7458         *outDisplayId = id.value;
7459     }
7460     return binder::Status::fromStatusT(status);
7461 }
7462 
getPhysicalDisplayToken(int64_t displayId,sp<IBinder> * outDisplay)7463 binder::Status SurfaceComposerAIDL::getPhysicalDisplayToken(int64_t displayId,
7464                                                             sp<IBinder>* outDisplay) {
7465     const auto id = DisplayId::fromValue<PhysicalDisplayId>(static_cast<uint64_t>(displayId));
7466     *outDisplay = mFlinger->getPhysicalDisplayToken(*id);
7467     return binder::Status::ok();
7468 }
7469 
setPowerMode(const sp<IBinder> & display,int mode)7470 binder::Status SurfaceComposerAIDL::setPowerMode(const sp<IBinder>& display, int mode) {
7471     status_t status = checkAccessPermission();
7472     if (status != OK) return binder::Status::fromStatusT(status);
7473 
7474     mFlinger->setPowerMode(display, mode);
7475     return binder::Status::ok();
7476 }
7477 
getDisplayStats(const sp<IBinder> & display,gui::DisplayStatInfo * outStatInfo)7478 binder::Status SurfaceComposerAIDL::getDisplayStats(const sp<IBinder>& display,
7479                                                     gui::DisplayStatInfo* outStatInfo) {
7480     DisplayStatInfo statInfo;
7481     status_t status = mFlinger->getDisplayStats(display, &statInfo);
7482     if (status == NO_ERROR) {
7483         outStatInfo->vsyncTime = static_cast<long>(statInfo.vsyncTime);
7484         outStatInfo->vsyncPeriod = static_cast<long>(statInfo.vsyncPeriod);
7485     }
7486     return binder::Status::fromStatusT(status);
7487 }
7488 
getDisplayState(const sp<IBinder> & display,gui::DisplayState * outState)7489 binder::Status SurfaceComposerAIDL::getDisplayState(const sp<IBinder>& display,
7490                                                     gui::DisplayState* outState) {
7491     ui::DisplayState state;
7492     status_t status = mFlinger->getDisplayState(display, &state);
7493     if (status == NO_ERROR) {
7494         outState->layerStack = state.layerStack.id;
7495         outState->orientation = static_cast<gui::Rotation>(state.orientation);
7496         outState->layerStackSpaceRect.width = state.layerStackSpaceRect.width;
7497         outState->layerStackSpaceRect.height = state.layerStackSpaceRect.height;
7498     }
7499     return binder::Status::fromStatusT(status);
7500 }
7501 
clearBootDisplayMode(const sp<IBinder> & display)7502 binder::Status SurfaceComposerAIDL::clearBootDisplayMode(const sp<IBinder>& display) {
7503     status_t status = checkAccessPermission();
7504     if (status != OK) return binder::Status::fromStatusT(status);
7505 
7506     status = mFlinger->clearBootDisplayMode(display);
7507     return binder::Status::fromStatusT(status);
7508 }
7509 
getBootDisplayModeSupport(bool * outMode)7510 binder::Status SurfaceComposerAIDL::getBootDisplayModeSupport(bool* outMode) {
7511     status_t status = checkAccessPermission();
7512     if (status != OK) return binder::Status::fromStatusT(status);
7513 
7514     status = mFlinger->getBootDisplayModeSupport(outMode);
7515     return binder::Status::fromStatusT(status);
7516 }
7517 
setAutoLowLatencyMode(const sp<IBinder> & display,bool on)7518 binder::Status SurfaceComposerAIDL::setAutoLowLatencyMode(const sp<IBinder>& display, bool on) {
7519     status_t status = checkAccessPermission();
7520     if (status != OK) return binder::Status::fromStatusT(status);
7521 
7522     mFlinger->setAutoLowLatencyMode(display, on);
7523     return binder::Status::ok();
7524 }
7525 
setGameContentType(const sp<IBinder> & display,bool on)7526 binder::Status SurfaceComposerAIDL::setGameContentType(const sp<IBinder>& display, bool on) {
7527     status_t status = checkAccessPermission();
7528     if (status != OK) return binder::Status::fromStatusT(status);
7529 
7530     mFlinger->setGameContentType(display, on);
7531     return binder::Status::ok();
7532 }
7533 
captureDisplay(const DisplayCaptureArgs & args,const sp<IScreenCaptureListener> & captureListener)7534 binder::Status SurfaceComposerAIDL::captureDisplay(
7535         const DisplayCaptureArgs& args, const sp<IScreenCaptureListener>& captureListener) {
7536     status_t status = mFlinger->captureDisplay(args, captureListener);
7537     return binder::Status::fromStatusT(status);
7538 }
7539 
captureDisplayById(int64_t displayId,const sp<IScreenCaptureListener> & captureListener)7540 binder::Status SurfaceComposerAIDL::captureDisplayById(
7541         int64_t displayId, const sp<IScreenCaptureListener>& captureListener) {
7542     status_t status;
7543     IPCThreadState* ipc = IPCThreadState::self();
7544     const int uid = ipc->getCallingUid();
7545     if (uid == AID_ROOT || uid == AID_GRAPHICS || uid == AID_SYSTEM || uid == AID_SHELL) {
7546         std::optional<DisplayId> id = DisplayId::fromValue(static_cast<uint64_t>(displayId));
7547         status = mFlinger->captureDisplay(*id, captureListener);
7548     } else {
7549         status = PERMISSION_DENIED;
7550     }
7551     return binder::Status::fromStatusT(status);
7552 }
7553 
captureLayers(const LayerCaptureArgs & args,const sp<IScreenCaptureListener> & captureListener)7554 binder::Status SurfaceComposerAIDL::captureLayers(
7555         const LayerCaptureArgs& args, const sp<IScreenCaptureListener>& captureListener) {
7556     status_t status = mFlinger->captureLayers(args, captureListener);
7557     return binder::Status::fromStatusT(status);
7558 }
7559 
isWideColorDisplay(const sp<IBinder> & token,bool * outIsWideColorDisplay)7560 binder::Status SurfaceComposerAIDL::isWideColorDisplay(const sp<IBinder>& token,
7561                                                        bool* outIsWideColorDisplay) {
7562     status_t status = mFlinger->isWideColorDisplay(token, outIsWideColorDisplay);
7563     return binder::Status::fromStatusT(status);
7564 }
7565 
getDisplayBrightnessSupport(const sp<IBinder> & displayToken,bool * outSupport)7566 binder::Status SurfaceComposerAIDL::getDisplayBrightnessSupport(const sp<IBinder>& displayToken,
7567                                                                 bool* outSupport) {
7568     status_t status = mFlinger->getDisplayBrightnessSupport(displayToken, outSupport);
7569     return binder::Status::fromStatusT(status);
7570 }
7571 
setDisplayBrightness(const sp<IBinder> & displayToken,const gui::DisplayBrightness & brightness)7572 binder::Status SurfaceComposerAIDL::setDisplayBrightness(const sp<IBinder>& displayToken,
7573                                                          const gui::DisplayBrightness& brightness) {
7574     status_t status = checkControlDisplayBrightnessPermission();
7575     if (status != OK) return binder::Status::fromStatusT(status);
7576 
7577     status = mFlinger->setDisplayBrightness(displayToken, brightness);
7578     return binder::Status::fromStatusT(status);
7579 }
7580 
addHdrLayerInfoListener(const sp<IBinder> & displayToken,const sp<gui::IHdrLayerInfoListener> & listener)7581 binder::Status SurfaceComposerAIDL::addHdrLayerInfoListener(
7582         const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
7583     status_t status = checkControlDisplayBrightnessPermission();
7584     if (status != OK) return binder::Status::fromStatusT(status);
7585 
7586     status = mFlinger->addHdrLayerInfoListener(displayToken, listener);
7587     return binder::Status::fromStatusT(status);
7588 }
7589 
removeHdrLayerInfoListener(const sp<IBinder> & displayToken,const sp<gui::IHdrLayerInfoListener> & listener)7590 binder::Status SurfaceComposerAIDL::removeHdrLayerInfoListener(
7591         const sp<IBinder>& displayToken, const sp<gui::IHdrLayerInfoListener>& listener) {
7592     status_t status = checkControlDisplayBrightnessPermission();
7593     if (status != OK) return binder::Status::fromStatusT(status);
7594 
7595     status = mFlinger->removeHdrLayerInfoListener(displayToken, listener);
7596     return binder::Status::fromStatusT(status);
7597 }
7598 
notifyPowerBoost(int boostId)7599 binder::Status SurfaceComposerAIDL::notifyPowerBoost(int boostId) {
7600     status_t status = checkAccessPermission();
7601     if (status != OK) return binder::Status::fromStatusT(status);
7602 
7603     status = mFlinger->notifyPowerBoost(boostId);
7604     return binder::Status::fromStatusT(status);
7605 }
7606 
checkAccessPermission(bool usePermissionCache)7607 status_t SurfaceComposerAIDL::checkAccessPermission(bool usePermissionCache) {
7608     if (!mFlinger->callingThreadHasUnscopedSurfaceFlingerAccess(usePermissionCache)) {
7609         IPCThreadState* ipc = IPCThreadState::self();
7610         ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d", ipc->getCallingPid(),
7611               ipc->getCallingUid());
7612         return PERMISSION_DENIED;
7613     }
7614     return OK;
7615 }
7616 
checkControlDisplayBrightnessPermission()7617 status_t SurfaceComposerAIDL::checkControlDisplayBrightnessPermission() {
7618     IPCThreadState* ipc = IPCThreadState::self();
7619     const int pid = ipc->getCallingPid();
7620     const int uid = ipc->getCallingUid();
7621     if ((uid != AID_GRAPHICS) &&
7622         !PermissionCache::checkPermission(sControlDisplayBrightness, pid, uid)) {
7623         ALOGE("Permission Denial: can't control brightness pid=%d, uid=%d", pid, uid);
7624         return PERMISSION_DENIED;
7625     }
7626     return OK;
7627 }
7628 
7629 } // namespace android
7630 
7631 #if defined(__gl_h_)
7632 #error "don't include gl/gl.h in this file"
7633 #endif
7634 
7635 #if defined(__gl2_h_)
7636 #error "don't include gl2/gl2.h in this file"
7637 #endif
7638 
7639 // TODO(b/129481165): remove the #pragma below and fix conversion issues
7640 #pragma clang diagnostic pop // ignored "-Wconversion -Wextra"
7641