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, ¶m) != 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