1 /*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 // #define LOG_NDEBUG 0
18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
19
20 #include <stdint.h>
21 #include <sys/types.h>
22 #include <algorithm>
23 #include <errno.h>
24 #include <math.h>
25 #include <mutex>
26 #include <dlfcn.h>
27 #include <inttypes.h>
28 #include <stdatomic.h>
29 #include <optional>
30
31 #include <cutils/properties.h>
32 #include <log/log.h>
33
34 #include <binder/IPCThreadState.h>
35 #include <binder/IServiceManager.h>
36 #include <binder/PermissionCache.h>
37
38 #include <dvr/vr_flinger.h>
39
40 #include <ui/DebugUtils.h>
41 #include <ui/DisplayInfo.h>
42 #include <ui/DisplayStatInfo.h>
43
44 #include <gui/BufferQueue.h>
45 #include <gui/GuiConfig.h>
46 #include <gui/IDisplayEventConnection.h>
47 #include <gui/LayerDebugInfo.h>
48 #include <gui/Surface.h>
49
50 #include <ui/GraphicBufferAllocator.h>
51 #include <ui/PixelFormat.h>
52 #include <ui/UiConfig.h>
53
54 #include <utils/misc.h>
55 #include <utils/String8.h>
56 #include <utils/String16.h>
57 #include <utils/StopWatch.h>
58 #include <utils/Timers.h>
59 #include <utils/Trace.h>
60
61 #include <private/android_filesystem_config.h>
62 #include <private/gui/SyncFeatures.h>
63
64 #include "BufferLayer.h"
65 #include "Client.h"
66 #include "ColorLayer.h"
67 #include "Colorizer.h"
68 #include "ContainerLayer.h"
69 #include "DdmConnection.h"
70 #include "DispSync.h"
71 #include "DisplayDevice.h"
72 #include "EventControlThread.h"
73 #include "EventThread.h"
74 #include "Layer.h"
75 #include "LayerVector.h"
76 #include "MonitoredProducer.h"
77 #include "SurfaceFlinger.h"
78 #include "clz.h"
79
80 #include "DisplayHardware/ComposerHal.h"
81 #include "DisplayHardware/FramebufferSurface.h"
82 #include "DisplayHardware/HWComposer.h"
83 #include "DisplayHardware/VirtualDisplaySurface.h"
84
85 #include "Effects/Daltonizer.h"
86
87 #include "RenderEngine/RenderEngine.h"
88 #include <cutils/compiler.h>
89
90 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
91 #include <android/hardware/configstore/1.1/ISurfaceFlingerConfigs.h>
92 #include <android/hardware/configstore/1.1/types.h>
93 #include <configstore/Utils.h>
94
95 #include <layerproto/LayerProtoParser.h>
96
97 #define DISPLAY_COUNT 1
98
99 /*
100 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
101 * black pixels.
102 */
103 #define DEBUG_SCREENSHOTS false
104
105 namespace android {
106
107 using namespace android::hardware::configstore;
108 using namespace android::hardware::configstore::V1_0;
109 using ui::ColorMode;
110 using ui::Dataspace;
111 using ui::Hdr;
112 using ui::RenderIntent;
113
114 namespace {
115 class ConditionalLock {
116 public:
ConditionalLock(Mutex & mutex,bool lock)117 ConditionalLock(Mutex& mutex, bool lock) : mMutex(mutex), mLocked(lock) {
118 if (lock) {
119 mMutex.lock();
120 }
121 }
~ConditionalLock()122 ~ConditionalLock() { if (mLocked) mMutex.unlock(); }
123 private:
124 Mutex& mMutex;
125 bool mLocked;
126 };
127 } // namespace anonymous
128
129 // ---------------------------------------------------------------------------
130
131 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
132 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
133 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
134 const String16 sDump("android.permission.DUMP");
135
136 // ---------------------------------------------------------------------------
137 int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
138 int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
139 int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
140 bool SurfaceFlinger::useHwcForRgbToYuv;
141 uint64_t SurfaceFlinger::maxVirtualDisplaySize;
142 bool SurfaceFlinger::hasSyncFramework;
143 bool SurfaceFlinger::useVrFlinger;
144 int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
145 // TODO(courtneygo): Rename hasWideColorDisplay to clarify its actual meaning.
146 bool SurfaceFlinger::hasWideColorDisplay;
147
148
getHwcServiceName()149 std::string getHwcServiceName() {
150 char value[PROPERTY_VALUE_MAX] = {};
151 property_get("debug.sf.hwc_service_name", value, "default");
152 ALOGI("Using HWComposer service: '%s'", value);
153 return std::string(value);
154 }
155
useTrebleTestingOverride()156 bool useTrebleTestingOverride() {
157 char value[PROPERTY_VALUE_MAX] = {};
158 property_get("debug.sf.treble_testing_override", value, "false");
159 ALOGI("Treble testing override: '%s'", value);
160 return std::string(value) == "true";
161 }
162
decodeDisplayColorSetting(DisplayColorSetting displayColorSetting)163 std::string decodeDisplayColorSetting(DisplayColorSetting displayColorSetting) {
164 switch(displayColorSetting) {
165 case DisplayColorSetting::MANAGED:
166 return std::string("Managed");
167 case DisplayColorSetting::UNMANAGED:
168 return std::string("Unmanaged");
169 case DisplayColorSetting::ENHANCED:
170 return std::string("Enhanced");
171 default:
172 return std::string("Unknown ") +
173 std::to_string(static_cast<int>(displayColorSetting));
174 }
175 }
176
177 NativeWindowSurface::~NativeWindowSurface() = default;
178
179 namespace impl {
180
181 class NativeWindowSurface final : public android::NativeWindowSurface {
182 public:
create(const sp<IGraphicBufferProducer> & producer)183 static std::unique_ptr<android::NativeWindowSurface> create(
184 const sp<IGraphicBufferProducer>& producer) {
185 return std::make_unique<NativeWindowSurface>(producer);
186 }
187
NativeWindowSurface(const sp<IGraphicBufferProducer> & producer)188 explicit NativeWindowSurface(const sp<IGraphicBufferProducer>& producer)
189 : surface(new Surface(producer, false)) {}
190
191 ~NativeWindowSurface() override = default;
192
193 private:
getNativeWindow() const194 sp<ANativeWindow> getNativeWindow() const override { return surface; }
195
preallocateBuffers()196 void preallocateBuffers() override { surface->allocateBuffers(); }
197
198 sp<Surface> surface;
199 };
200
201 } // namespace impl
202
SurfaceFlingerBE()203 SurfaceFlingerBE::SurfaceFlingerBE()
204 : mHwcServiceName(getHwcServiceName()),
205 mRenderEngine(nullptr),
206 mFrameBuckets(),
207 mTotalTime(0),
208 mLastSwapTime(0),
209 mComposerSequenceId(0) {
210 }
211
SurfaceFlinger(SurfaceFlinger::SkipInitializationTag)212 SurfaceFlinger::SurfaceFlinger(SurfaceFlinger::SkipInitializationTag)
213 : BnSurfaceComposer(),
214 mTransactionFlags(0),
215 mTransactionPending(false),
216 mAnimTransactionPending(false),
217 mLayersRemoved(false),
218 mLayersAdded(false),
219 mRepaintEverything(0),
220 mBootTime(systemTime()),
221 mBuiltinDisplays(),
222 mVisibleRegionsDirty(false),
223 mGeometryInvalid(false),
224 mAnimCompositionPending(false),
225 mDebugRegion(0),
226 mDebugDDMS(0),
227 mDebugDisableHWC(0),
228 mDebugDisableTransformHint(0),
229 mDebugInSwapBuffers(0),
230 mLastSwapBufferTime(0),
231 mDebugInTransaction(0),
232 mLastTransactionTime(0),
233 mBootFinished(false),
234 mForceFullDamage(false),
235 mPrimaryDispSync("PrimaryDispSync"),
236 mPrimaryHWVsyncEnabled(false),
237 mHWVsyncAvailable(false),
238 mHasPoweredOff(false),
239 mNumLayers(0),
240 mVrFlingerRequestsDisplay(false),
241 mMainThreadId(std::this_thread::get_id()),
242 mCreateBufferQueue(&BufferQueue::createBufferQueue),
243 mCreateNativeWindowSurface(&impl::NativeWindowSurface::create) {}
244
SurfaceFlinger()245 SurfaceFlinger::SurfaceFlinger() : SurfaceFlinger(SkipInitialization) {
246 ALOGI("SurfaceFlinger is starting");
247
248 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
249 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
250
251 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
252 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
253
254 hasSyncFramework = getBool< ISurfaceFlingerConfigs,
255 &ISurfaceFlingerConfigs::hasSyncFramework>(true);
256
257 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
258 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
259
260 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
261 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
262
263 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
264 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
265
266 // Vr flinger is only enabled on Daydream ready devices.
267 useVrFlinger = getBool< ISurfaceFlingerConfigs,
268 &ISurfaceFlingerConfigs::useVrFlinger>(false);
269
270 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
271 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
272
273 hasWideColorDisplay =
274 getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);
275
276 V1_1::DisplayOrientation primaryDisplayOrientation =
277 getDisplayOrientation< V1_1::ISurfaceFlingerConfigs, &V1_1::ISurfaceFlingerConfigs::primaryDisplayOrientation>(
278 V1_1::DisplayOrientation::ORIENTATION_0);
279
280 switch (primaryDisplayOrientation) {
281 case V1_1::DisplayOrientation::ORIENTATION_90:
282 mPrimaryDisplayOrientation = DisplayState::eOrientation90;
283 break;
284 case V1_1::DisplayOrientation::ORIENTATION_180:
285 mPrimaryDisplayOrientation = DisplayState::eOrientation180;
286 break;
287 case V1_1::DisplayOrientation::ORIENTATION_270:
288 mPrimaryDisplayOrientation = DisplayState::eOrientation270;
289 break;
290 default:
291 mPrimaryDisplayOrientation = DisplayState::eOrientationDefault;
292 break;
293 }
294 ALOGV("Primary Display Orientation is set to %2d.", mPrimaryDisplayOrientation);
295
296 mPrimaryDispSync.init(SurfaceFlinger::hasSyncFramework, SurfaceFlinger::dispSyncPresentTimeOffset);
297
298 // debugging stuff...
299 char value[PROPERTY_VALUE_MAX];
300
301 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
302 mGpuToCpuSupported = !atoi(value);
303
304 property_get("debug.sf.showupdates", value, "0");
305 mDebugRegion = atoi(value);
306
307 property_get("debug.sf.ddms", value, "0");
308 mDebugDDMS = atoi(value);
309 if (mDebugDDMS) {
310 if (!startDdmConnection()) {
311 // start failed, and DDMS debugging not enabled
312 mDebugDDMS = 0;
313 }
314 }
315 ALOGI_IF(mDebugRegion, "showupdates enabled");
316 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
317
318 property_get("debug.sf.disable_backpressure", value, "0");
319 mPropagateBackpressure = !atoi(value);
320 ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation");
321
322 property_get("debug.sf.enable_hwc_vds", value, "0");
323 mUseHwcVirtualDisplays = atoi(value);
324 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
325
326 property_get("ro.sf.disable_triple_buffer", value, "1");
327 mLayerTripleBufferingDisabled = atoi(value);
328 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
329
330 const size_t defaultListSize = MAX_LAYERS;
331 auto listSize = property_get_int32("debug.sf.max_igbp_list_size", int32_t(defaultListSize));
332 mMaxGraphicBufferProducerListSize = (listSize > 0) ? size_t(listSize) : defaultListSize;
333
334 property_get("debug.sf.early_phase_offset_ns", value, "0");
335 const int earlyWakeupOffsetOffsetNs = atoi(value);
336 ALOGI_IF(earlyWakeupOffsetOffsetNs != 0, "Enabling separate early offset");
337 mVsyncModulator.setPhaseOffsets(sfVsyncPhaseOffsetNs - earlyWakeupOffsetOffsetNs,
338 sfVsyncPhaseOffsetNs);
339
340 // We should be reading 'persist.sys.sf.color_saturation' here
341 // but since /data may be encrypted, we need to wait until after vold
342 // comes online to attempt to read the property. The property is
343 // instead read after the boot animation
344
345 if (useTrebleTestingOverride()) {
346 // Without the override SurfaceFlinger cannot connect to HIDL
347 // services that are not listed in the manifests. Considered
348 // deriving the setting from the set service name, but it
349 // would be brittle if the name that's not 'default' is used
350 // for production purposes later on.
351 setenv("TREBLE_TESTING_OVERRIDE", "true", true);
352 }
353 }
354
onFirstRef()355 void SurfaceFlinger::onFirstRef()
356 {
357 mEventQueue->init(this);
358 }
359
~SurfaceFlinger()360 SurfaceFlinger::~SurfaceFlinger()
361 {
362 }
363
binderDied(const wp<IBinder> &)364 void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
365 {
366 // the window manager died on us. prepare its eulogy.
367
368 // restore initial conditions (default device unblank, etc)
369 initializeDisplays();
370
371 // restart the boot-animation
372 startBootAnim();
373 }
374
initClient(const sp<Client> & client)375 static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
376 status_t err = client->initCheck();
377 if (err == NO_ERROR) {
378 return client;
379 }
380 return nullptr;
381 }
382
createConnection()383 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
384 return initClient(new Client(this));
385 }
386
createScopedConnection(const sp<IGraphicBufferProducer> & gbp)387 sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
388 const sp<IGraphicBufferProducer>& gbp) {
389 if (authenticateSurfaceTexture(gbp) == false) {
390 return nullptr;
391 }
392 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
393 if (layer == nullptr) {
394 return nullptr;
395 }
396
397 return initClient(new Client(this, layer));
398 }
399
createDisplay(const String8 & displayName,bool secure)400 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
401 bool secure)
402 {
403 class DisplayToken : public BBinder {
404 sp<SurfaceFlinger> flinger;
405 virtual ~DisplayToken() {
406 // no more references, this display must be terminated
407 Mutex::Autolock _l(flinger->mStateLock);
408 flinger->mCurrentState.displays.removeItem(this);
409 flinger->setTransactionFlags(eDisplayTransactionNeeded);
410 }
411 public:
412 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
413 : flinger(flinger) {
414 }
415 };
416
417 sp<BBinder> token = new DisplayToken(this);
418
419 Mutex::Autolock _l(mStateLock);
420 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
421 info.displayName = displayName;
422 mCurrentState.displays.add(token, info);
423 mInterceptor->saveDisplayCreation(info);
424 return token;
425 }
426
destroyDisplay(const sp<IBinder> & display)427 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
428 Mutex::Autolock _l(mStateLock);
429
430 ssize_t idx = mCurrentState.displays.indexOfKey(display);
431 if (idx < 0) {
432 ALOGW("destroyDisplay: invalid display token");
433 return;
434 }
435
436 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
437 if (!info.isVirtualDisplay()) {
438 ALOGE("destroyDisplay called for non-virtual display");
439 return;
440 }
441 mInterceptor->saveDisplayDeletion(info.displayId);
442 mCurrentState.displays.removeItemsAt(idx);
443 setTransactionFlags(eDisplayTransactionNeeded);
444 }
445
getBuiltInDisplay(int32_t id)446 sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
447 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
448 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
449 return nullptr;
450 }
451 return mBuiltinDisplays[id];
452 }
453
bootFinished()454 void SurfaceFlinger::bootFinished()
455 {
456 if (mStartPropertySetThread->join() != NO_ERROR) {
457 ALOGE("Join StartPropertySetThread failed!");
458 }
459 const nsecs_t now = systemTime();
460 const nsecs_t duration = now - mBootTime;
461 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
462
463 // wait patiently for the window manager death
464 const String16 name("window");
465 sp<IBinder> window(defaultServiceManager()->getService(name));
466 if (window != 0) {
467 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
468 }
469
470 if (mVrFlinger) {
471 mVrFlinger->OnBootFinished();
472 }
473
474 // stop boot animation
475 // formerly we would just kill the process, but we now ask it to exit so it
476 // can choose where to stop the animation.
477 property_set("service.bootanim.exit", "1");
478
479 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
480 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
481 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
482
483 sp<LambdaMessage> readProperties = new LambdaMessage([&]() {
484 readPersistentProperties();
485 });
486 postMessageAsync(readProperties);
487 }
488
deleteTextureAsync(uint32_t texture)489 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
490 class MessageDestroyGLTexture : public MessageBase {
491 RE::RenderEngine& engine;
492 uint32_t texture;
493 public:
494 MessageDestroyGLTexture(RE::RenderEngine& engine, uint32_t texture)
495 : engine(engine), texture(texture) {}
496 virtual bool handler() {
497 engine.deleteTextures(1, &texture);
498 return true;
499 }
500 };
501 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
502 }
503
504 class DispSyncSource final : public VSyncSource, private DispSync::Callback {
505 public:
DispSyncSource(DispSync * dispSync,nsecs_t phaseOffset,bool traceVsync,const char * name)506 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
507 const char* name) :
508 mName(name),
509 mValue(0),
510 mTraceVsync(traceVsync),
511 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
512 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
513 mDispSync(dispSync),
514 mCallbackMutex(),
515 mVsyncMutex(),
516 mPhaseOffset(phaseOffset),
517 mEnabled(false) {}
518
519 ~DispSyncSource() override = default;
520
setVSyncEnabled(bool enable)521 void setVSyncEnabled(bool enable) override {
522 Mutex::Autolock lock(mVsyncMutex);
523 if (enable) {
524 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
525 static_cast<DispSync::Callback*>(this));
526 if (err != NO_ERROR) {
527 ALOGE("error registering vsync callback: %s (%d)",
528 strerror(-err), err);
529 }
530 //ATRACE_INT(mVsyncOnLabel.string(), 1);
531 } else {
532 status_t err = mDispSync->removeEventListener(
533 static_cast<DispSync::Callback*>(this));
534 if (err != NO_ERROR) {
535 ALOGE("error unregistering vsync callback: %s (%d)",
536 strerror(-err), err);
537 }
538 //ATRACE_INT(mVsyncOnLabel.string(), 0);
539 }
540 mEnabled = enable;
541 }
542
setCallback(VSyncSource::Callback * callback)543 void setCallback(VSyncSource::Callback* callback) override{
544 Mutex::Autolock lock(mCallbackMutex);
545 mCallback = callback;
546 }
547
setPhaseOffset(nsecs_t phaseOffset)548 void setPhaseOffset(nsecs_t phaseOffset) override {
549 Mutex::Autolock lock(mVsyncMutex);
550
551 // Normalize phaseOffset to [0, period)
552 auto period = mDispSync->getPeriod();
553 phaseOffset %= period;
554 if (phaseOffset < 0) {
555 // If we're here, then phaseOffset is in (-period, 0). After this
556 // operation, it will be in (0, period)
557 phaseOffset += period;
558 }
559 mPhaseOffset = phaseOffset;
560
561 // If we're not enabled, we don't need to mess with the listeners
562 if (!mEnabled) {
563 return;
564 }
565
566 status_t err = mDispSync->changePhaseOffset(static_cast<DispSync::Callback*>(this),
567 mPhaseOffset);
568 if (err != NO_ERROR) {
569 ALOGE("error changing vsync offset: %s (%d)",
570 strerror(-err), err);
571 }
572 }
573
574 private:
onDispSyncEvent(nsecs_t when)575 virtual void onDispSyncEvent(nsecs_t when) {
576 VSyncSource::Callback* callback;
577 {
578 Mutex::Autolock lock(mCallbackMutex);
579 callback = mCallback;
580
581 if (mTraceVsync) {
582 mValue = (mValue + 1) % 2;
583 ATRACE_INT(mVsyncEventLabel.string(), mValue);
584 }
585 }
586
587 if (callback != nullptr) {
588 callback->onVSyncEvent(when);
589 }
590 }
591
592 const char* const mName;
593
594 int mValue;
595
596 const bool mTraceVsync;
597 const String8 mVsyncOnLabel;
598 const String8 mVsyncEventLabel;
599
600 DispSync* mDispSync;
601
602 Mutex mCallbackMutex; // Protects the following
603 VSyncSource::Callback* mCallback = nullptr;
604
605 Mutex mVsyncMutex; // Protects the following
606 nsecs_t mPhaseOffset;
607 bool mEnabled;
608 };
609
610 class InjectVSyncSource final : public VSyncSource {
611 public:
612 InjectVSyncSource() = default;
613 ~InjectVSyncSource() override = default;
614
setCallback(VSyncSource::Callback * callback)615 void setCallback(VSyncSource::Callback* callback) override {
616 std::lock_guard<std::mutex> lock(mCallbackMutex);
617 mCallback = callback;
618 }
619
onInjectSyncEvent(nsecs_t when)620 void onInjectSyncEvent(nsecs_t when) {
621 std::lock_guard<std::mutex> lock(mCallbackMutex);
622 if (mCallback) {
623 mCallback->onVSyncEvent(when);
624 }
625 }
626
setVSyncEnabled(bool)627 void setVSyncEnabled(bool) override {}
setPhaseOffset(nsecs_t)628 void setPhaseOffset(nsecs_t) override {}
629
630 private:
631 std::mutex mCallbackMutex; // Protects the following
632 VSyncSource::Callback* mCallback = nullptr;
633 };
634
635 // Do not call property_set on main thread which will be blocked by init
636 // Use StartPropertySetThread instead.
init()637 void SurfaceFlinger::init() {
638 ALOGI( "SurfaceFlinger's main thread ready to run. "
639 "Initializing graphics H/W...");
640
641 ALOGI("Phase offest NS: %" PRId64 "", vsyncPhaseOffsetNs);
642
643 Mutex::Autolock _l(mStateLock);
644
645 // start the EventThread
646 mEventThreadSource =
647 std::make_unique<DispSyncSource>(&mPrimaryDispSync, SurfaceFlinger::vsyncPhaseOffsetNs,
648 true, "app");
649 mEventThread = std::make_unique<impl::EventThread>(mEventThreadSource.get(),
650 [this]() { resyncWithRateLimit(); },
651 impl::EventThread::InterceptVSyncsCallback(),
652 "appEventThread");
653 mSfEventThreadSource =
654 std::make_unique<DispSyncSource>(&mPrimaryDispSync,
655 SurfaceFlinger::sfVsyncPhaseOffsetNs, true, "sf");
656
657 mSFEventThread =
658 std::make_unique<impl::EventThread>(mSfEventThreadSource.get(),
659 [this]() { resyncWithRateLimit(); },
660 [this](nsecs_t timestamp) {
661 mInterceptor->saveVSyncEvent(timestamp);
662 },
663 "sfEventThread");
664 mEventQueue->setEventThread(mSFEventThread.get());
665 mVsyncModulator.setEventThread(mSFEventThread.get());
666
667 // Get a RenderEngine for the given display / config (can't fail)
668 getBE().mRenderEngine =
669 RE::impl::RenderEngine::create(HAL_PIXEL_FORMAT_RGBA_8888,
670 hasWideColorDisplay
671 ? RE::RenderEngine::WIDE_COLOR_SUPPORT
672 : 0);
673 LOG_ALWAYS_FATAL_IF(getBE().mRenderEngine == nullptr, "couldn't create RenderEngine");
674
675 LOG_ALWAYS_FATAL_IF(mVrFlingerRequestsDisplay,
676 "Starting with vr flinger active is not currently supported.");
677 getBE().mHwc.reset(
678 new HWComposer(std::make_unique<Hwc2::impl::Composer>(getBE().mHwcServiceName)));
679 getBE().mHwc->registerCallback(this, getBE().mComposerSequenceId);
680 // Process any initial hotplug and resulting display changes.
681 processDisplayHotplugEventsLocked();
682 LOG_ALWAYS_FATAL_IF(!getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY),
683 "Registered composer callback but didn't create the default primary display");
684
685 // make the default display GLContext current so that we can create textures
686 // when creating Layers (which may happens before we render something)
687 getDefaultDisplayDeviceLocked()->makeCurrent();
688
689 if (useVrFlinger) {
690 auto vrFlingerRequestDisplayCallback = [this] (bool requestDisplay) {
691 // This callback is called from the vr flinger dispatch thread. We
692 // need to call signalTransaction(), which requires holding
693 // mStateLock when we're not on the main thread. Acquiring
694 // mStateLock from the vr flinger dispatch thread might trigger a
695 // deadlock in surface flinger (see b/66916578), so post a message
696 // to be handled on the main thread instead.
697 sp<LambdaMessage> message = new LambdaMessage([=]() {
698 ALOGI("VR request display mode: requestDisplay=%d", requestDisplay);
699 mVrFlingerRequestsDisplay = requestDisplay;
700 signalTransaction();
701 });
702 postMessageAsync(message);
703 };
704 mVrFlinger = dvr::VrFlinger::Create(getBE().mHwc->getComposer(),
705 getBE().mHwc->getHwcDisplayId(HWC_DISPLAY_PRIMARY).value_or(0),
706 vrFlingerRequestDisplayCallback);
707 if (!mVrFlinger) {
708 ALOGE("Failed to start vrflinger");
709 }
710 }
711
712 mEventControlThread = std::make_unique<impl::EventControlThread>(
713 [this](bool enabled) { setVsyncEnabled(HWC_DISPLAY_PRIMARY, enabled); });
714
715 // initialize our drawing state
716 mDrawingState = mCurrentState;
717
718 // set initial conditions (e.g. unblank default device)
719 initializeDisplays();
720
721 getBE().mRenderEngine->primeCache();
722
723 // Inform native graphics APIs whether the present timestamp is supported:
724 if (getHwComposer().hasCapability(
725 HWC2::Capability::PresentFenceIsNotReliable)) {
726 mStartPropertySetThread = new StartPropertySetThread(false);
727 } else {
728 mStartPropertySetThread = new StartPropertySetThread(true);
729 }
730
731 if (mStartPropertySetThread->Start() != NO_ERROR) {
732 ALOGE("Run StartPropertySetThread failed!");
733 }
734
735 mLegacySrgbSaturationMatrix = getBE().mHwc->getDataspaceSaturationMatrix(HWC_DISPLAY_PRIMARY,
736 Dataspace::SRGB_LINEAR);
737
738 ALOGV("Done initializing");
739 }
740
readPersistentProperties()741 void SurfaceFlinger::readPersistentProperties() {
742 Mutex::Autolock _l(mStateLock);
743
744 char value[PROPERTY_VALUE_MAX];
745
746 property_get("persist.sys.sf.color_saturation", value, "1.0");
747 mGlobalSaturationFactor = atof(value);
748 updateColorMatrixLocked();
749 ALOGV("Saturation is set to %.2f", mGlobalSaturationFactor);
750
751 property_get("persist.sys.sf.native_mode", value, "0");
752 mDisplayColorSetting = static_cast<DisplayColorSetting>(atoi(value));
753 }
754
startBootAnim()755 void SurfaceFlinger::startBootAnim() {
756 // Start boot animation service by setting a property mailbox
757 // if property setting thread is already running, Start() will be just a NOP
758 mStartPropertySetThread->Start();
759 // Wait until property was set
760 if (mStartPropertySetThread->join() != NO_ERROR) {
761 ALOGE("Join StartPropertySetThread failed!");
762 }
763 }
764
getMaxTextureSize() const765 size_t SurfaceFlinger::getMaxTextureSize() const {
766 return getBE().mRenderEngine->getMaxTextureSize();
767 }
768
getMaxViewportDims() const769 size_t SurfaceFlinger::getMaxViewportDims() const {
770 return getBE().mRenderEngine->getMaxViewportDims();
771 }
772
773 // ----------------------------------------------------------------------------
774
authenticateSurfaceTexture(const sp<IGraphicBufferProducer> & bufferProducer) const775 bool SurfaceFlinger::authenticateSurfaceTexture(
776 const sp<IGraphicBufferProducer>& bufferProducer) const {
777 Mutex::Autolock _l(mStateLock);
778 return authenticateSurfaceTextureLocked(bufferProducer);
779 }
780
authenticateSurfaceTextureLocked(const sp<IGraphicBufferProducer> & bufferProducer) const781 bool SurfaceFlinger::authenticateSurfaceTextureLocked(
782 const sp<IGraphicBufferProducer>& bufferProducer) const {
783 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
784 return mGraphicBufferProducerList.count(surfaceTextureBinder.get()) > 0;
785 }
786
getSupportedFrameTimestamps(std::vector<FrameEvent> * outSupported) const787 status_t SurfaceFlinger::getSupportedFrameTimestamps(
788 std::vector<FrameEvent>* outSupported) const {
789 *outSupported = {
790 FrameEvent::REQUESTED_PRESENT,
791 FrameEvent::ACQUIRE,
792 FrameEvent::LATCH,
793 FrameEvent::FIRST_REFRESH_START,
794 FrameEvent::LAST_REFRESH_START,
795 FrameEvent::GPU_COMPOSITION_DONE,
796 FrameEvent::DEQUEUE_READY,
797 FrameEvent::RELEASE,
798 };
799 ConditionalLock _l(mStateLock,
800 std::this_thread::get_id() != mMainThreadId);
801 if (!getHwComposer().hasCapability(
802 HWC2::Capability::PresentFenceIsNotReliable)) {
803 outSupported->push_back(FrameEvent::DISPLAY_PRESENT);
804 }
805 return NO_ERROR;
806 }
807
getDisplayConfigs(const sp<IBinder> & display,Vector<DisplayInfo> * configs)808 status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
809 Vector<DisplayInfo>* configs) {
810 if (configs == nullptr || display.get() == nullptr) {
811 return BAD_VALUE;
812 }
813
814 if (!display.get())
815 return NAME_NOT_FOUND;
816
817 int32_t type = NAME_NOT_FOUND;
818 for (int i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
819 if (display == mBuiltinDisplays[i]) {
820 type = i;
821 break;
822 }
823 }
824
825 if (type < 0) {
826 return type;
827 }
828
829 // TODO: Not sure if display density should handled by SF any longer
830 class Density {
831 static int getDensityFromProperty(char const* propName) {
832 char property[PROPERTY_VALUE_MAX];
833 int density = 0;
834 if (property_get(propName, property, nullptr) > 0) {
835 density = atoi(property);
836 }
837 return density;
838 }
839 public:
840 static int getEmuDensity() {
841 return getDensityFromProperty("qemu.sf.lcd_density"); }
842 static int getBuildDensity() {
843 return getDensityFromProperty("ro.sf.lcd_density"); }
844 };
845
846 configs->clear();
847
848 ConditionalLock _l(mStateLock,
849 std::this_thread::get_id() != mMainThreadId);
850 for (const auto& hwConfig : getHwComposer().getConfigs(type)) {
851 DisplayInfo info = DisplayInfo();
852
853 float xdpi = hwConfig->getDpiX();
854 float ydpi = hwConfig->getDpiY();
855
856 if (type == DisplayDevice::DISPLAY_PRIMARY) {
857 // The density of the device is provided by a build property
858 float density = Density::getBuildDensity() / 160.0f;
859 if (density == 0) {
860 // the build doesn't provide a density -- this is wrong!
861 // use xdpi instead
862 ALOGE("ro.sf.lcd_density must be defined as a build property");
863 density = xdpi / 160.0f;
864 }
865 if (Density::getEmuDensity()) {
866 // if "qemu.sf.lcd_density" is specified, it overrides everything
867 xdpi = ydpi = density = Density::getEmuDensity();
868 density /= 160.0f;
869 }
870 info.density = density;
871
872 // TODO: this needs to go away (currently needed only by webkit)
873 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
874 info.orientation = hw ? hw->getOrientation() : 0;
875 } else {
876 // TODO: where should this value come from?
877 static const int TV_DENSITY = 213;
878 info.density = TV_DENSITY / 160.0f;
879 info.orientation = 0;
880 }
881
882 info.w = hwConfig->getWidth();
883 info.h = hwConfig->getHeight();
884 info.xdpi = xdpi;
885 info.ydpi = ydpi;
886 info.fps = 1e9 / hwConfig->getVsyncPeriod();
887 info.appVsyncOffset = vsyncPhaseOffsetNs;
888
889 // This is how far in advance a buffer must be queued for
890 // presentation at a given time. If you want a buffer to appear
891 // on the screen at time N, you must submit the buffer before
892 // (N - presentationDeadline).
893 //
894 // Normally it's one full refresh period (to give SF a chance to
895 // latch the buffer), but this can be reduced by configuring a
896 // DispSync offset. Any additional delays introduced by the hardware
897 // composer or panel must be accounted for here.
898 //
899 // We add an additional 1ms to allow for processing time and
900 // differences between the ideal and actual refresh rate.
901 info.presentationDeadline = hwConfig->getVsyncPeriod() -
902 sfVsyncPhaseOffsetNs + 1000000;
903
904 // All non-virtual displays are currently considered secure.
905 info.secure = true;
906
907 if (type == DisplayDevice::DISPLAY_PRIMARY &&
908 mPrimaryDisplayOrientation & DisplayState::eOrientationSwapMask) {
909 std::swap(info.w, info.h);
910 }
911
912 configs->push_back(info);
913 }
914
915 return NO_ERROR;
916 }
917
getDisplayStats(const sp<IBinder> &,DisplayStatInfo * stats)918 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
919 DisplayStatInfo* stats) {
920 if (stats == nullptr) {
921 return BAD_VALUE;
922 }
923
924 // FIXME for now we always return stats for the primary display
925 memset(stats, 0, sizeof(*stats));
926 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
927 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
928 return NO_ERROR;
929 }
930
getActiveConfig(const sp<IBinder> & display)931 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
932 if (display == nullptr) {
933 ALOGE("%s : display is nullptr", __func__);
934 return BAD_VALUE;
935 }
936
937 sp<const DisplayDevice> device(getDisplayDevice(display));
938 if (device != nullptr) {
939 return device->getActiveConfig();
940 }
941
942 return BAD_VALUE;
943 }
944
setActiveConfigInternal(const sp<DisplayDevice> & hw,int mode)945 void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
946 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
947 this);
948 int32_t type = hw->getDisplayType();
949 int currentMode = hw->getActiveConfig();
950
951 if (mode == currentMode) {
952 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
953 return;
954 }
955
956 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
957 ALOGW("Trying to set config for virtual display");
958 return;
959 }
960
961 hw->setActiveConfig(mode);
962 getHwComposer().setActiveConfig(type, mode);
963 }
964
setActiveConfig(const sp<IBinder> & display,int mode)965 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
966 class MessageSetActiveConfig: public MessageBase {
967 SurfaceFlinger& mFlinger;
968 sp<IBinder> mDisplay;
969 int mMode;
970 public:
971 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
972 int mode) :
973 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
974 virtual bool handler() {
975 Vector<DisplayInfo> configs;
976 mFlinger.getDisplayConfigs(mDisplay, &configs);
977 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
978 ALOGE("Attempt to set active config = %d for display with %zu configs",
979 mMode, configs.size());
980 return true;
981 }
982 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
983 if (hw == nullptr) {
984 ALOGE("Attempt to set active config = %d for null display %p",
985 mMode, mDisplay.get());
986 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
987 ALOGW("Attempt to set active config = %d for virtual display",
988 mMode);
989 } else {
990 mFlinger.setActiveConfigInternal(hw, mMode);
991 }
992 return true;
993 }
994 };
995 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
996 postMessageSync(msg);
997 return NO_ERROR;
998 }
getDisplayColorModes(const sp<IBinder> & display,Vector<ColorMode> * outColorModes)999 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
1000 Vector<ColorMode>* outColorModes) {
1001 if ((outColorModes == nullptr) || (display.get() == nullptr)) {
1002 return BAD_VALUE;
1003 }
1004
1005 if (!display.get()) {
1006 return NAME_NOT_FOUND;
1007 }
1008
1009 int32_t type = NAME_NOT_FOUND;
1010 for (int i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
1011 if (display == mBuiltinDisplays[i]) {
1012 type = i;
1013 break;
1014 }
1015 }
1016
1017 if (type < 0) {
1018 return type;
1019 }
1020
1021 std::vector<ColorMode> modes;
1022 {
1023 ConditionalLock _l(mStateLock,
1024 std::this_thread::get_id() != mMainThreadId);
1025 modes = getHwComposer().getColorModes(type);
1026 }
1027 outColorModes->clear();
1028 std::copy(modes.cbegin(), modes.cend(), std::back_inserter(*outColorModes));
1029
1030 return NO_ERROR;
1031 }
1032
getActiveColorMode(const sp<IBinder> & display)1033 ColorMode SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
1034 sp<const DisplayDevice> device(getDisplayDevice(display));
1035 if (device != nullptr) {
1036 return device->getActiveColorMode();
1037 }
1038 return static_cast<ColorMode>(BAD_VALUE);
1039 }
1040
setActiveColorModeInternal(const sp<DisplayDevice> & hw,ColorMode mode,Dataspace dataSpace,RenderIntent renderIntent)1041 void SurfaceFlinger::setActiveColorModeInternal(const sp<DisplayDevice>& hw,
1042 ColorMode mode, Dataspace dataSpace,
1043 RenderIntent renderIntent) {
1044 int32_t type = hw->getDisplayType();
1045 ColorMode currentMode = hw->getActiveColorMode();
1046 Dataspace currentDataSpace = hw->getCompositionDataSpace();
1047 RenderIntent currentRenderIntent = hw->getActiveRenderIntent();
1048
1049 if (mode == currentMode && dataSpace == currentDataSpace &&
1050 renderIntent == currentRenderIntent) {
1051 return;
1052 }
1053
1054 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1055 ALOGW("Trying to set config for virtual display");
1056 return;
1057 }
1058
1059 hw->setActiveColorMode(mode);
1060 hw->setCompositionDataSpace(dataSpace);
1061 hw->setActiveRenderIntent(renderIntent);
1062 getHwComposer().setActiveColorMode(type, mode, renderIntent);
1063
1064 ALOGV("Set active color mode: %s (%d), active render intent: %s (%d), type=%d",
1065 decodeColorMode(mode).c_str(), mode,
1066 decodeRenderIntent(renderIntent).c_str(), renderIntent,
1067 hw->getDisplayType());
1068 }
1069
1070
setActiveColorMode(const sp<IBinder> & display,ColorMode colorMode)1071 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
1072 ColorMode colorMode) {
1073 class MessageSetActiveColorMode: public MessageBase {
1074 SurfaceFlinger& mFlinger;
1075 sp<IBinder> mDisplay;
1076 ColorMode mMode;
1077 public:
1078 MessageSetActiveColorMode(SurfaceFlinger& flinger, const sp<IBinder>& disp,
1079 ColorMode mode) :
1080 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
1081 virtual bool handler() {
1082 Vector<ColorMode> modes;
1083 mFlinger.getDisplayColorModes(mDisplay, &modes);
1084 bool exists = std::find(std::begin(modes), std::end(modes), mMode) != std::end(modes);
1085 if (mMode < ColorMode::NATIVE || !exists) {
1086 ALOGE("Attempt to set invalid active color mode %s (%d) for display %p",
1087 decodeColorMode(mMode).c_str(), mMode, mDisplay.get());
1088 return true;
1089 }
1090 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
1091 if (hw == nullptr) {
1092 ALOGE("Attempt to set active color mode %s (%d) for null display %p",
1093 decodeColorMode(mMode).c_str(), mMode, mDisplay.get());
1094 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
1095 ALOGW("Attempt to set active color mode %s %d for virtual display",
1096 decodeColorMode(mMode).c_str(), mMode);
1097 } else {
1098 mFlinger.setActiveColorModeInternal(hw, mMode, Dataspace::UNKNOWN,
1099 RenderIntent::COLORIMETRIC);
1100 }
1101 return true;
1102 }
1103 };
1104 sp<MessageBase> msg = new MessageSetActiveColorMode(*this, display, colorMode);
1105 postMessageSync(msg);
1106 return NO_ERROR;
1107 }
1108
clearAnimationFrameStats()1109 status_t SurfaceFlinger::clearAnimationFrameStats() {
1110 Mutex::Autolock _l(mStateLock);
1111 mAnimFrameTracker.clearStats();
1112 return NO_ERROR;
1113 }
1114
getAnimationFrameStats(FrameStats * outStats) const1115 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
1116 Mutex::Autolock _l(mStateLock);
1117 mAnimFrameTracker.getStats(outStats);
1118 return NO_ERROR;
1119 }
1120
getHdrCapabilities(const sp<IBinder> & display,HdrCapabilities * outCapabilities) const1121 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display,
1122 HdrCapabilities* outCapabilities) const {
1123 Mutex::Autolock _l(mStateLock);
1124
1125 sp<const DisplayDevice> displayDevice(getDisplayDeviceLocked(display));
1126 if (displayDevice == nullptr) {
1127 ALOGE("getHdrCapabilities: Invalid display %p", displayDevice.get());
1128 return BAD_VALUE;
1129 }
1130
1131 // At this point the DisplayDeivce should already be set up,
1132 // meaning the luminance information is already queried from
1133 // hardware composer and stored properly.
1134 const HdrCapabilities& capabilities = displayDevice->getHdrCapabilities();
1135 *outCapabilities = HdrCapabilities(capabilities.getSupportedHdrTypes(),
1136 capabilities.getDesiredMaxLuminance(),
1137 capabilities.getDesiredMaxAverageLuminance(),
1138 capabilities.getDesiredMinLuminance());
1139
1140 return NO_ERROR;
1141 }
1142
enableVSyncInjections(bool enable)1143 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
1144 sp<LambdaMessage> enableVSyncInjections = new LambdaMessage([&]() {
1145 Mutex::Autolock _l(mStateLock);
1146
1147 if (mInjectVSyncs == enable) {
1148 return;
1149 }
1150
1151 if (enable) {
1152 ALOGV("VSync Injections enabled");
1153 if (mVSyncInjector.get() == nullptr) {
1154 mVSyncInjector = std::make_unique<InjectVSyncSource>();
1155 mInjectorEventThread = std::make_unique<
1156 impl::EventThread>(mVSyncInjector.get(),
1157 [this]() { resyncWithRateLimit(); },
1158 impl::EventThread::InterceptVSyncsCallback(),
1159 "injEventThread");
1160 }
1161 mEventQueue->setEventThread(mInjectorEventThread.get());
1162 } else {
1163 ALOGV("VSync Injections disabled");
1164 mEventQueue->setEventThread(mSFEventThread.get());
1165 }
1166
1167 mInjectVSyncs = enable;
1168 });
1169 postMessageSync(enableVSyncInjections);
1170 return NO_ERROR;
1171 }
1172
injectVSync(nsecs_t when)1173 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
1174 Mutex::Autolock _l(mStateLock);
1175
1176 if (!mInjectVSyncs) {
1177 ALOGE("VSync Injections not enabled");
1178 return BAD_VALUE;
1179 }
1180 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
1181 ALOGV("Injecting VSync inside SurfaceFlinger");
1182 mVSyncInjector->onInjectSyncEvent(when);
1183 }
1184 return NO_ERROR;
1185 }
1186
getLayerDebugInfo(std::vector<LayerDebugInfo> * outLayers) const1187 status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers) const
1188 NO_THREAD_SAFETY_ANALYSIS {
1189 IPCThreadState* ipc = IPCThreadState::self();
1190 const int pid = ipc->getCallingPid();
1191 const int uid = ipc->getCallingUid();
1192 if ((uid != AID_SHELL) &&
1193 !PermissionCache::checkPermission(sDump, pid, uid)) {
1194 ALOGE("Layer debug info permission denied for pid=%d, uid=%d", pid, uid);
1195 return PERMISSION_DENIED;
1196 }
1197
1198 // Try to acquire a lock for 1s, fail gracefully
1199 const status_t err = mStateLock.timedLock(s2ns(1));
1200 const bool locked = (err == NO_ERROR);
1201 if (!locked) {
1202 ALOGE("LayerDebugInfo: SurfaceFlinger unresponsive (%s [%d]) - exit", strerror(-err), err);
1203 return TIMED_OUT;
1204 }
1205
1206 outLayers->clear();
1207 mCurrentState.traverseInZOrder([&](Layer* layer) {
1208 outLayers->push_back(layer->getLayerDebugInfo());
1209 });
1210
1211 mStateLock.unlock();
1212 return NO_ERROR;
1213 }
1214
1215 // ----------------------------------------------------------------------------
1216
createDisplayEventConnection(ISurfaceComposer::VsyncSource vsyncSource)1217 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
1218 ISurfaceComposer::VsyncSource vsyncSource) {
1219 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
1220 return mSFEventThread->createEventConnection();
1221 } else {
1222 return mEventThread->createEventConnection();
1223 }
1224 }
1225
1226 // ----------------------------------------------------------------------------
1227
waitForEvent()1228 void SurfaceFlinger::waitForEvent() {
1229 mEventQueue->waitMessage();
1230 }
1231
signalTransaction()1232 void SurfaceFlinger::signalTransaction() {
1233 mEventQueue->invalidate();
1234 }
1235
signalLayerUpdate()1236 void SurfaceFlinger::signalLayerUpdate() {
1237 mEventQueue->invalidate();
1238 }
1239
signalRefresh()1240 void SurfaceFlinger::signalRefresh() {
1241 mRefreshPending = true;
1242 mEventQueue->refresh();
1243 }
1244
postMessageAsync(const sp<MessageBase> & msg,nsecs_t reltime,uint32_t)1245 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
1246 nsecs_t reltime, uint32_t /* flags */) {
1247 return mEventQueue->postMessage(msg, reltime);
1248 }
1249
postMessageSync(const sp<MessageBase> & msg,nsecs_t reltime,uint32_t)1250 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
1251 nsecs_t reltime, uint32_t /* flags */) {
1252 status_t res = mEventQueue->postMessage(msg, reltime);
1253 if (res == NO_ERROR) {
1254 msg->wait();
1255 }
1256 return res;
1257 }
1258
run()1259 void SurfaceFlinger::run() {
1260 do {
1261 waitForEvent();
1262 } while (true);
1263 }
1264
enableHardwareVsync()1265 void SurfaceFlinger::enableHardwareVsync() {
1266 Mutex::Autolock _l(mHWVsyncLock);
1267 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
1268 mPrimaryDispSync.beginResync();
1269 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1270 mEventControlThread->setVsyncEnabled(true);
1271 mPrimaryHWVsyncEnabled = true;
1272 }
1273 }
1274
resyncToHardwareVsync(bool makeAvailable)1275 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
1276 Mutex::Autolock _l(mHWVsyncLock);
1277
1278 if (makeAvailable) {
1279 mHWVsyncAvailable = true;
1280 } else if (!mHWVsyncAvailable) {
1281 // Hardware vsync is not currently available, so abort the resync
1282 // attempt for now
1283 return;
1284 }
1285
1286 const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
1287 const nsecs_t period = activeConfig->getVsyncPeriod();
1288
1289 mPrimaryDispSync.reset();
1290 mPrimaryDispSync.setPeriod(period);
1291
1292 if (!mPrimaryHWVsyncEnabled) {
1293 mPrimaryDispSync.beginResync();
1294 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1295 mEventControlThread->setVsyncEnabled(true);
1296 mPrimaryHWVsyncEnabled = true;
1297 }
1298 }
1299
disableHardwareVsync(bool makeUnavailable)1300 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1301 Mutex::Autolock _l(mHWVsyncLock);
1302 if (mPrimaryHWVsyncEnabled) {
1303 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1304 mEventControlThread->setVsyncEnabled(false);
1305 mPrimaryDispSync.endResync();
1306 mPrimaryHWVsyncEnabled = false;
1307 }
1308 if (makeUnavailable) {
1309 mHWVsyncAvailable = false;
1310 }
1311 }
1312
resyncWithRateLimit()1313 void SurfaceFlinger::resyncWithRateLimit() {
1314 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1315
1316 // No explicit locking is needed here since EventThread holds a lock while calling this method
1317 static nsecs_t sLastResyncAttempted = 0;
1318 const nsecs_t now = systemTime();
1319 if (now - sLastResyncAttempted > kIgnoreDelay) {
1320 resyncToHardwareVsync(false);
1321 }
1322 sLastResyncAttempted = now;
1323 }
1324
onVsyncReceived(int32_t sequenceId,hwc2_display_t displayId,int64_t timestamp)1325 void SurfaceFlinger::onVsyncReceived(int32_t sequenceId,
1326 hwc2_display_t displayId, int64_t timestamp) {
1327 Mutex::Autolock lock(mStateLock);
1328 // Ignore any vsyncs from a previous hardware composer.
1329 if (sequenceId != getBE().mComposerSequenceId) {
1330 return;
1331 }
1332
1333 int32_t type;
1334 if (!getBE().mHwc->onVsync(displayId, timestamp, &type)) {
1335 return;
1336 }
1337
1338 bool needsHwVsync = false;
1339
1340 { // Scope for the lock
1341 Mutex::Autolock _l(mHWVsyncLock);
1342 if (type == DisplayDevice::DISPLAY_PRIMARY && mPrimaryHWVsyncEnabled) {
1343 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1344 }
1345 }
1346
1347 if (needsHwVsync) {
1348 enableHardwareVsync();
1349 } else {
1350 disableHardwareVsync(false);
1351 }
1352 }
1353
getCompositorTiming(CompositorTiming * compositorTiming)1354 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1355 std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1356 *compositorTiming = getBE().mCompositorTiming;
1357 }
1358
onHotplugReceived(int32_t sequenceId,hwc2_display_t display,HWC2::Connection connection)1359 void SurfaceFlinger::onHotplugReceived(int32_t sequenceId, hwc2_display_t display,
1360 HWC2::Connection connection) {
1361 ALOGV("onHotplugReceived(%d, %" PRIu64 ", %s)", sequenceId, display,
1362 connection == HWC2::Connection::Connected ? "connected" : "disconnected");
1363
1364 // Ignore events that do not have the right sequenceId.
1365 if (sequenceId != getBE().mComposerSequenceId) {
1366 return;
1367 }
1368
1369 // Only lock if we're not on the main thread. This function is normally
1370 // called on a hwbinder thread, but for the primary display it's called on
1371 // the main thread with the state lock already held, so don't attempt to
1372 // acquire it here.
1373 ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
1374
1375 mPendingHotplugEvents.emplace_back(HotplugEvent{display, connection});
1376
1377 if (std::this_thread::get_id() == mMainThreadId) {
1378 // Process all pending hot plug events immediately if we are on the main thread.
1379 processDisplayHotplugEventsLocked();
1380 }
1381
1382 setTransactionFlags(eDisplayTransactionNeeded);
1383 }
1384
onRefreshReceived(int sequenceId,hwc2_display_t)1385 void SurfaceFlinger::onRefreshReceived(int sequenceId,
1386 hwc2_display_t /*display*/) {
1387 Mutex::Autolock lock(mStateLock);
1388 if (sequenceId != getBE().mComposerSequenceId) {
1389 return;
1390 }
1391 repaintEverything();
1392 }
1393
setVsyncEnabled(int disp,int enabled)1394 void SurfaceFlinger::setVsyncEnabled(int disp, int enabled) {
1395 ATRACE_CALL();
1396 Mutex::Autolock lock(mStateLock);
1397 getHwComposer().setVsyncEnabled(disp,
1398 enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable);
1399 }
1400
1401 // Note: it is assumed the caller holds |mStateLock| when this is called
resetDisplayState()1402 void SurfaceFlinger::resetDisplayState() {
1403 disableHardwareVsync(true);
1404 // Clear the drawing state so that the logic inside of
1405 // handleTransactionLocked will fire. It will determine the delta between
1406 // mCurrentState and mDrawingState and re-apply all changes when we make the
1407 // transition.
1408 mDrawingState.displays.clear();
1409 getRenderEngine().resetCurrentSurface();
1410 mDisplays.clear();
1411 }
1412
updateVrFlinger()1413 void SurfaceFlinger::updateVrFlinger() {
1414 if (!mVrFlinger)
1415 return;
1416 bool vrFlingerRequestsDisplay = mVrFlingerRequestsDisplay;
1417 if (vrFlingerRequestsDisplay == getBE().mHwc->isUsingVrComposer()) {
1418 return;
1419 }
1420
1421 if (vrFlingerRequestsDisplay && !getBE().mHwc->getComposer()->isRemote()) {
1422 ALOGE("Vr flinger is only supported for remote hardware composer"
1423 " service connections. Ignoring request to transition to vr"
1424 " flinger.");
1425 mVrFlingerRequestsDisplay = false;
1426 return;
1427 }
1428
1429 Mutex::Autolock _l(mStateLock);
1430
1431 int currentDisplayPowerMode = getDisplayDeviceLocked(
1432 mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY])->getPowerMode();
1433
1434 if (!vrFlingerRequestsDisplay) {
1435 mVrFlinger->SeizeDisplayOwnership();
1436 }
1437
1438 resetDisplayState();
1439 getBE().mHwc.reset(); // Delete the current instance before creating the new one
1440 getBE().mHwc.reset(new HWComposer(std::make_unique<Hwc2::impl::Composer>(
1441 vrFlingerRequestsDisplay ? "vr" : getBE().mHwcServiceName)));
1442 getBE().mHwc->registerCallback(this, ++getBE().mComposerSequenceId);
1443
1444 LOG_ALWAYS_FATAL_IF(!getBE().mHwc->getComposer()->isRemote(),
1445 "Switched to non-remote hardware composer");
1446
1447 if (vrFlingerRequestsDisplay) {
1448 mVrFlinger->GrantDisplayOwnership();
1449 } else {
1450 enableHardwareVsync();
1451 }
1452
1453 mVisibleRegionsDirty = true;
1454 invalidateHwcGeometry();
1455
1456 // Re-enable default display.
1457 sp<DisplayDevice> hw(getDisplayDeviceLocked(
1458 mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]));
1459 setPowerModeInternal(hw, currentDisplayPowerMode, /*stateLockHeld*/ true);
1460
1461 // Reset the timing values to account for the period of the swapped in HWC
1462 const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
1463 const nsecs_t period = activeConfig->getVsyncPeriod();
1464 mAnimFrameTracker.setDisplayRefreshPeriod(period);
1465
1466 // Use phase of 0 since phase is not known.
1467 // Use latency of 0, which will snap to the ideal latency.
1468 setCompositorTimingSnapped(0, period, 0);
1469
1470 android_atomic_or(1, &mRepaintEverything);
1471 setTransactionFlags(eDisplayTransactionNeeded);
1472 }
1473
onMessageReceived(int32_t what)1474 void SurfaceFlinger::onMessageReceived(int32_t what) {
1475 ATRACE_CALL();
1476 switch (what) {
1477 case MessageQueue::INVALIDATE: {
1478 bool frameMissed = !mHadClientComposition &&
1479 mPreviousPresentFence != Fence::NO_FENCE &&
1480 (mPreviousPresentFence->getSignalTime() ==
1481 Fence::SIGNAL_TIME_PENDING);
1482 ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));
1483 if (frameMissed) {
1484 mTimeStats.incrementMissedFrames();
1485 if (mPropagateBackpressure) {
1486 signalLayerUpdate();
1487 break;
1488 }
1489 }
1490
1491 // Now that we're going to make it to the handleMessageTransaction()
1492 // call below it's safe to call updateVrFlinger(), which will
1493 // potentially trigger a display handoff.
1494 updateVrFlinger();
1495
1496 bool refreshNeeded = handleMessageTransaction();
1497 refreshNeeded |= handleMessageInvalidate();
1498 refreshNeeded |= mRepaintEverything;
1499 if (refreshNeeded) {
1500 // Signal a refresh if a transaction modified the window state,
1501 // a new buffer was latched, or if HWC has requested a full
1502 // repaint
1503 signalRefresh();
1504 }
1505 break;
1506 }
1507 case MessageQueue::REFRESH: {
1508 handleMessageRefresh();
1509 break;
1510 }
1511 }
1512 }
1513
handleMessageTransaction()1514 bool SurfaceFlinger::handleMessageTransaction() {
1515 uint32_t transactionFlags = peekTransactionFlags();
1516 if (transactionFlags) {
1517 handleTransaction(transactionFlags);
1518 return true;
1519 }
1520 return false;
1521 }
1522
handleMessageInvalidate()1523 bool SurfaceFlinger::handleMessageInvalidate() {
1524 ATRACE_CALL();
1525 return handlePageFlip();
1526 }
1527
handleMessageRefresh()1528 void SurfaceFlinger::handleMessageRefresh() {
1529 ATRACE_CALL();
1530
1531 mRefreshPending = false;
1532
1533 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1534
1535 preComposition(refreshStartTime);
1536 rebuildLayerStacks();
1537 setUpHWComposer();
1538 doDebugFlashRegions();
1539 doTracing("handleRefresh");
1540 logLayerStats();
1541 doComposition();
1542 postComposition(refreshStartTime);
1543
1544 mPreviousPresentFence = getBE().mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1545
1546 mHadClientComposition = false;
1547 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1548 const sp<DisplayDevice>& displayDevice = mDisplays[displayId];
1549 mHadClientComposition = mHadClientComposition ||
1550 getBE().mHwc->hasClientComposition(displayDevice->getHwcDisplayId());
1551 }
1552 mVsyncModulator.onRefreshed(mHadClientComposition);
1553
1554 mLayersWithQueuedFrames.clear();
1555 }
1556
doDebugFlashRegions()1557 void SurfaceFlinger::doDebugFlashRegions()
1558 {
1559 // is debugging enabled
1560 if (CC_LIKELY(!mDebugRegion))
1561 return;
1562
1563 const bool repaintEverything = mRepaintEverything;
1564 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1565 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1566 if (hw->isDisplayOn()) {
1567 // transform the dirty region into this screen's coordinate space
1568 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1569 if (!dirtyRegion.isEmpty()) {
1570 // redraw the whole screen
1571 doComposeSurfaces(hw);
1572
1573 // and draw the dirty region
1574 const int32_t height = hw->getHeight();
1575 auto& engine(getRenderEngine());
1576 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1577
1578 hw->swapBuffers(getHwComposer());
1579 }
1580 }
1581 }
1582
1583 postFramebuffer();
1584
1585 if (mDebugRegion > 1) {
1586 usleep(mDebugRegion * 1000);
1587 }
1588
1589 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1590 auto& displayDevice = mDisplays[displayId];
1591 if (!displayDevice->isDisplayOn()) {
1592 continue;
1593 }
1594
1595 status_t result = displayDevice->prepareFrame(*getBE().mHwc);
1596 ALOGE_IF(result != NO_ERROR,
1597 "prepareFrame for display %zd failed:"
1598 " %d (%s)",
1599 displayId, result, strerror(-result));
1600 }
1601 }
1602
doTracing(const char * where)1603 void SurfaceFlinger::doTracing(const char* where) {
1604 ATRACE_CALL();
1605 ATRACE_NAME(where);
1606 if (CC_UNLIKELY(mTracing.isEnabled())) {
1607 mTracing.traceLayers(where, dumpProtoInfo(LayerVector::StateSet::Drawing));
1608 }
1609 }
1610
logLayerStats()1611 void SurfaceFlinger::logLayerStats() {
1612 ATRACE_CALL();
1613 if (CC_UNLIKELY(mLayerStats.isEnabled())) {
1614 int32_t hwcId = -1;
1615 for (size_t dpy = 0; dpy < mDisplays.size(); ++dpy) {
1616 const sp<const DisplayDevice>& displayDevice(mDisplays[dpy]);
1617 if (displayDevice->isPrimary()) {
1618 hwcId = displayDevice->getHwcDisplayId();
1619 break;
1620 }
1621 }
1622 if (hwcId < 0) {
1623 ALOGE("LayerStats: Hmmm, no primary display?");
1624 return;
1625 }
1626 mLayerStats.logLayerStats(dumpVisibleLayersProtoInfo(hwcId));
1627 }
1628 }
1629
preComposition(nsecs_t refreshStartTime)1630 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
1631 {
1632 ATRACE_CALL();
1633 ALOGV("preComposition");
1634
1635 bool needExtraInvalidate = false;
1636 mDrawingState.traverseInZOrder([&](Layer* layer) {
1637 if (layer->onPreComposition(refreshStartTime)) {
1638 needExtraInvalidate = true;
1639 }
1640 });
1641
1642 if (needExtraInvalidate) {
1643 signalLayerUpdate();
1644 }
1645 }
1646
updateCompositorTiming(nsecs_t vsyncPhase,nsecs_t vsyncInterval,nsecs_t compositeTime,std::shared_ptr<FenceTime> & presentFenceTime)1647 void SurfaceFlinger::updateCompositorTiming(
1648 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1649 std::shared_ptr<FenceTime>& presentFenceTime) {
1650 // Update queue of past composite+present times and determine the
1651 // most recently known composite to present latency.
1652 getBE().mCompositePresentTimes.push({compositeTime, presentFenceTime});
1653 nsecs_t compositeToPresentLatency = -1;
1654 while (!getBE().mCompositePresentTimes.empty()) {
1655 SurfaceFlingerBE::CompositePresentTime& cpt = getBE().mCompositePresentTimes.front();
1656 // Cached values should have been updated before calling this method,
1657 // which helps avoid duplicate syscalls.
1658 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1659 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1660 break;
1661 }
1662 compositeToPresentLatency = displayTime - cpt.composite;
1663 getBE().mCompositePresentTimes.pop();
1664 }
1665
1666 // Don't let mCompositePresentTimes grow unbounded, just in case.
1667 while (getBE().mCompositePresentTimes.size() > 16) {
1668 getBE().mCompositePresentTimes.pop();
1669 }
1670
1671 setCompositorTimingSnapped(
1672 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1673 }
1674
setCompositorTimingSnapped(nsecs_t vsyncPhase,nsecs_t vsyncInterval,nsecs_t compositeToPresentLatency)1675 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1676 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
1677 // Integer division and modulo round toward 0 not -inf, so we need to
1678 // treat negative and positive offsets differently.
1679 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
1680 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1681 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1682
1683 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1684 if (idealLatency <= 0) {
1685 idealLatency = vsyncInterval;
1686 }
1687
1688 // Snap the latency to a value that removes scheduling jitter from the
1689 // composition and present times, which often have >1ms of jitter.
1690 // Reducing jitter is important if an app attempts to extrapolate
1691 // something (such as user input) to an accurate diasplay time.
1692 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1693 // with (presentLatency % interval).
1694 nsecs_t bias = vsyncInterval / 2;
1695 int64_t extraVsyncs =
1696 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1697 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1698 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
1699
1700 std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1701 getBE().mCompositorTiming.deadline = vsyncPhase - idealLatency;
1702 getBE().mCompositorTiming.interval = vsyncInterval;
1703 getBE().mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1704 }
1705
postComposition(nsecs_t refreshStartTime)1706 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1707 {
1708 ATRACE_CALL();
1709 ALOGV("postComposition");
1710
1711 // Release any buffers which were replaced this frame
1712 nsecs_t dequeueReadyTime = systemTime();
1713 for (auto& layer : mLayersWithQueuedFrames) {
1714 layer->releasePendingBuffer(dequeueReadyTime);
1715 }
1716
1717 // |mStateLock| not needed as we are on the main thread
1718 const sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
1719
1720 getBE().mGlCompositionDoneTimeline.updateSignalTimes();
1721 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1722 if (hw && getBE().mHwc->hasClientComposition(HWC_DISPLAY_PRIMARY)) {
1723 glCompositionDoneFenceTime =
1724 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1725 getBE().mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1726 } else {
1727 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1728 }
1729
1730 getBE().mDisplayTimeline.updateSignalTimes();
1731 sp<Fence> presentFence = getBE().mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1732 auto presentFenceTime = std::make_shared<FenceTime>(presentFence);
1733 getBE().mDisplayTimeline.push(presentFenceTime);
1734
1735 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1736 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1737
1738 // We use the refreshStartTime which might be sampled a little later than
1739 // when we started doing work for this frame, but that should be okay
1740 // since updateCompositorTiming has snapping logic.
1741 updateCompositorTiming(
1742 vsyncPhase, vsyncInterval, refreshStartTime, presentFenceTime);
1743 CompositorTiming compositorTiming;
1744 {
1745 std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1746 compositorTiming = getBE().mCompositorTiming;
1747 }
1748
1749 mDrawingState.traverseInZOrder([&](Layer* layer) {
1750 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
1751 presentFenceTime, compositorTiming);
1752 if (frameLatched) {
1753 recordBufferingStats(layer->getName().string(),
1754 layer->getOccupancyHistory(false));
1755 }
1756 });
1757
1758 if (presentFenceTime->isValid()) {
1759 if (mPrimaryDispSync.addPresentFence(presentFenceTime)) {
1760 enableHardwareVsync();
1761 } else {
1762 disableHardwareVsync(false);
1763 }
1764 }
1765
1766 if (!hasSyncFramework) {
1767 if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY) && hw->isDisplayOn()) {
1768 enableHardwareVsync();
1769 }
1770 }
1771
1772 if (mAnimCompositionPending) {
1773 mAnimCompositionPending = false;
1774
1775 if (presentFenceTime->isValid()) {
1776 mAnimFrameTracker.setActualPresentFence(
1777 std::move(presentFenceTime));
1778 } else if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY)) {
1779 // The HWC doesn't support present fences, so use the refresh
1780 // timestamp instead.
1781 nsecs_t presentTime =
1782 getBE().mHwc->getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1783 mAnimFrameTracker.setActualPresentTime(presentTime);
1784 }
1785 mAnimFrameTracker.advanceFrame();
1786 }
1787
1788 mTimeStats.incrementTotalFrames();
1789 if (mHadClientComposition) {
1790 mTimeStats.incrementClientCompositionFrames();
1791 }
1792
1793 if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY) &&
1794 hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1795 return;
1796 }
1797
1798 nsecs_t currentTime = systemTime();
1799 if (mHasPoweredOff) {
1800 mHasPoweredOff = false;
1801 } else {
1802 nsecs_t elapsedTime = currentTime - getBE().mLastSwapTime;
1803 size_t numPeriods = static_cast<size_t>(elapsedTime / vsyncInterval);
1804 if (numPeriods < SurfaceFlingerBE::NUM_BUCKETS - 1) {
1805 getBE().mFrameBuckets[numPeriods] += elapsedTime;
1806 } else {
1807 getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] += elapsedTime;
1808 }
1809 getBE().mTotalTime += elapsedTime;
1810 }
1811 getBE().mLastSwapTime = currentTime;
1812 }
1813
rebuildLayerStacks()1814 void SurfaceFlinger::rebuildLayerStacks() {
1815 ATRACE_CALL();
1816 ALOGV("rebuildLayerStacks");
1817
1818 // rebuild the visible layer list per screen
1819 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1820 ATRACE_NAME("rebuildLayerStacks VR Dirty");
1821 mVisibleRegionsDirty = false;
1822 invalidateHwcGeometry();
1823
1824 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1825 Region opaqueRegion;
1826 Region dirtyRegion;
1827 Vector<sp<Layer>> layersSortedByZ;
1828 Vector<sp<Layer>> layersNeedingFences;
1829 const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);
1830 const Transform& tr(displayDevice->getTransform());
1831 const Rect bounds(displayDevice->getBounds());
1832 if (displayDevice->isDisplayOn()) {
1833 computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion);
1834
1835 mDrawingState.traverseInZOrder([&](Layer* layer) {
1836 bool hwcLayerDestroyed = false;
1837 if (layer->belongsToDisplay(displayDevice->getLayerStack(),
1838 displayDevice->isPrimary())) {
1839 Region drawRegion(tr.transform(
1840 layer->visibleNonTransparentRegion));
1841 drawRegion.andSelf(bounds);
1842 if (!drawRegion.isEmpty()) {
1843 layersSortedByZ.add(layer);
1844 } else {
1845 // Clear out the HWC layer if this layer was
1846 // previously visible, but no longer is
1847 hwcLayerDestroyed = layer->destroyHwcLayer(
1848 displayDevice->getHwcDisplayId());
1849 }
1850 } else {
1851 // WM changes displayDevice->layerStack upon sleep/awake.
1852 // Here we make sure we delete the HWC layers even if
1853 // WM changed their layer stack.
1854 hwcLayerDestroyed = layer->destroyHwcLayer(
1855 displayDevice->getHwcDisplayId());
1856 }
1857
1858 // If a layer is not going to get a release fence because
1859 // it is invisible, but it is also going to release its
1860 // old buffer, add it to the list of layers needing
1861 // fences.
1862 if (hwcLayerDestroyed) {
1863 auto found = std::find(mLayersWithQueuedFrames.cbegin(),
1864 mLayersWithQueuedFrames.cend(), layer);
1865 if (found != mLayersWithQueuedFrames.cend()) {
1866 layersNeedingFences.add(layer);
1867 }
1868 }
1869 });
1870 }
1871 displayDevice->setVisibleLayersSortedByZ(layersSortedByZ);
1872 displayDevice->setLayersNeedingFences(layersNeedingFences);
1873 displayDevice->undefinedRegion.set(bounds);
1874 displayDevice->undefinedRegion.subtractSelf(
1875 tr.transform(opaqueRegion));
1876 displayDevice->dirtyRegion.orSelf(dirtyRegion);
1877 }
1878 }
1879 }
1880
1881 // Returns a data space that fits all visible layers. The returned data space
1882 // can only be one of
1883 // - Dataspace::SRGB (use legacy dataspace and let HWC saturate when colors are enhanced)
1884 // - Dataspace::DISPLAY_P3
1885 // The returned HDR data space is one of
1886 // - Dataspace::UNKNOWN
1887 // - Dataspace::BT2020_HLG
1888 // - Dataspace::BT2020_PQ
getBestDataspace(const sp<const DisplayDevice> & displayDevice,Dataspace * outHdrDataSpace) const1889 Dataspace SurfaceFlinger::getBestDataspace(
1890 const sp<const DisplayDevice>& displayDevice, Dataspace* outHdrDataSpace) const {
1891 Dataspace bestDataSpace = Dataspace::SRGB;
1892 *outHdrDataSpace = Dataspace::UNKNOWN;
1893
1894 for (const auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1895 switch (layer->getDataSpace()) {
1896 case Dataspace::V0_SCRGB:
1897 case Dataspace::V0_SCRGB_LINEAR:
1898 case Dataspace::DISPLAY_P3:
1899 bestDataSpace = Dataspace::DISPLAY_P3;
1900 break;
1901 case Dataspace::BT2020_PQ:
1902 case Dataspace::BT2020_ITU_PQ:
1903 *outHdrDataSpace = Dataspace::BT2020_PQ;
1904 break;
1905 case Dataspace::BT2020_HLG:
1906 case Dataspace::BT2020_ITU_HLG:
1907 // When there's mixed PQ content and HLG content, we set the HDR
1908 // data space to be BT2020_PQ and convert HLG to PQ.
1909 if (*outHdrDataSpace == Dataspace::UNKNOWN) {
1910 *outHdrDataSpace = Dataspace::BT2020_HLG;
1911 }
1912 break;
1913 default:
1914 break;
1915 }
1916 }
1917
1918 return bestDataSpace;
1919 }
1920
1921 // Pick the ColorMode / Dataspace for the display device.
pickColorMode(const sp<DisplayDevice> & displayDevice,ColorMode * outMode,Dataspace * outDataSpace,RenderIntent * outRenderIntent) const1922 void SurfaceFlinger::pickColorMode(const sp<DisplayDevice>& displayDevice,
1923 ColorMode* outMode, Dataspace* outDataSpace,
1924 RenderIntent* outRenderIntent) const {
1925 if (mDisplayColorSetting == DisplayColorSetting::UNMANAGED) {
1926 *outMode = ColorMode::NATIVE;
1927 *outDataSpace = Dataspace::UNKNOWN;
1928 *outRenderIntent = RenderIntent::COLORIMETRIC;
1929 return;
1930 }
1931
1932 Dataspace hdrDataSpace;
1933 Dataspace bestDataSpace = getBestDataspace(displayDevice, &hdrDataSpace);
1934
1935 // respect hdrDataSpace only when there is no legacy HDR support
1936 const bool isHdr = hdrDataSpace != Dataspace::UNKNOWN &&
1937 !displayDevice->hasLegacyHdrSupport(hdrDataSpace);
1938 if (isHdr) {
1939 bestDataSpace = hdrDataSpace;
1940 }
1941
1942 RenderIntent intent;
1943 switch (mDisplayColorSetting) {
1944 case DisplayColorSetting::MANAGED:
1945 case DisplayColorSetting::UNMANAGED:
1946 intent = isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
1947 break;
1948 case DisplayColorSetting::ENHANCED:
1949 intent = isHdr ? RenderIntent::TONE_MAP_ENHANCE : RenderIntent::ENHANCE;
1950 break;
1951 default: // vendor display color setting
1952 intent = static_cast<RenderIntent>(mDisplayColorSetting);
1953 break;
1954 }
1955
1956 displayDevice->getBestColorMode(bestDataSpace, intent, outDataSpace, outMode, outRenderIntent);
1957 }
1958
setUpHWComposer()1959 void SurfaceFlinger::setUpHWComposer() {
1960 ATRACE_CALL();
1961 ALOGV("setUpHWComposer");
1962
1963 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1964 bool dirty = !mDisplays[dpy]->getDirtyRegion(mRepaintEverything).isEmpty();
1965 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1966 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1967
1968 // If nothing has changed (!dirty), don't recompose.
1969 // If something changed, but we don't currently have any visible layers,
1970 // and didn't when we last did a composition, then skip it this time.
1971 // The second rule does two things:
1972 // - When all layers are removed from a display, we'll emit one black
1973 // frame, then nothing more until we get new layers.
1974 // - When a display is created with a private layer stack, we won't
1975 // emit any black frames until a layer is added to the layer stack.
1976 bool mustRecompose = dirty && !(empty && wasEmpty);
1977
1978 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1979 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1980 mustRecompose ? "doing" : "skipping",
1981 dirty ? "+" : "-",
1982 empty ? "+" : "-",
1983 wasEmpty ? "+" : "-");
1984
1985 mDisplays[dpy]->beginFrame(mustRecompose);
1986
1987 if (mustRecompose) {
1988 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1989 }
1990 }
1991
1992 // build the h/w work list
1993 if (CC_UNLIKELY(mGeometryInvalid)) {
1994 mGeometryInvalid = false;
1995 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1996 sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
1997 const auto hwcId = displayDevice->getHwcDisplayId();
1998 if (hwcId >= 0) {
1999 const Vector<sp<Layer>>& currentLayers(
2000 displayDevice->getVisibleLayersSortedByZ());
2001 for (size_t i = 0; i < currentLayers.size(); i++) {
2002 const auto& layer = currentLayers[i];
2003 if (!layer->hasHwcLayer(hwcId)) {
2004 if (!layer->createHwcLayer(getBE().mHwc.get(), hwcId)) {
2005 layer->forceClientComposition(hwcId);
2006 continue;
2007 }
2008 }
2009
2010 layer->setGeometry(displayDevice, i);
2011 if (mDebugDisableHWC || mDebugRegion) {
2012 layer->forceClientComposition(hwcId);
2013 }
2014 }
2015 }
2016 }
2017 }
2018
2019 // Set the per-frame data
2020 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2021 auto& displayDevice = mDisplays[displayId];
2022 const auto hwcId = displayDevice->getHwcDisplayId();
2023
2024 if (hwcId < 0) {
2025 continue;
2026 }
2027 if (mDrawingState.colorMatrixChanged) {
2028 displayDevice->setColorTransform(mDrawingState.colorMatrix);
2029 status_t result = getBE().mHwc->setColorTransform(hwcId, mDrawingState.colorMatrix);
2030 ALOGE_IF(result != NO_ERROR, "Failed to set color transform on "
2031 "display %zd: %d", displayId, result);
2032 }
2033 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2034 if (layer->isHdrY410()) {
2035 layer->forceClientComposition(hwcId);
2036 } else if ((layer->getDataSpace() == Dataspace::BT2020_PQ ||
2037 layer->getDataSpace() == Dataspace::BT2020_ITU_PQ) &&
2038 !displayDevice->hasHDR10Support()) {
2039 layer->forceClientComposition(hwcId);
2040 } else if ((layer->getDataSpace() == Dataspace::BT2020_HLG ||
2041 layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) &&
2042 !displayDevice->hasHLGSupport()) {
2043 layer->forceClientComposition(hwcId);
2044 }
2045
2046 if (layer->getForceClientComposition(hwcId)) {
2047 ALOGV("[%s] Requesting Client composition", layer->getName().string());
2048 layer->setCompositionType(hwcId, HWC2::Composition::Client);
2049 continue;
2050 }
2051
2052 layer->setPerFrameData(displayDevice);
2053 }
2054
2055 if (hasWideColorDisplay) {
2056 ColorMode colorMode;
2057 Dataspace dataSpace;
2058 RenderIntent renderIntent;
2059 pickColorMode(displayDevice, &colorMode, &dataSpace, &renderIntent);
2060 setActiveColorModeInternal(displayDevice, colorMode, dataSpace, renderIntent);
2061 }
2062 }
2063
2064 mDrawingState.colorMatrixChanged = false;
2065
2066 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2067 auto& displayDevice = mDisplays[displayId];
2068 if (!displayDevice->isDisplayOn()) {
2069 continue;
2070 }
2071
2072 status_t result = displayDevice->prepareFrame(*getBE().mHwc);
2073 ALOGE_IF(result != NO_ERROR, "prepareFrame for display %zd failed:"
2074 " %d (%s)", displayId, result, strerror(-result));
2075 }
2076 }
2077
doComposition()2078 void SurfaceFlinger::doComposition() {
2079 ATRACE_CALL();
2080 ALOGV("doComposition");
2081
2082 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
2083 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2084 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2085 if (hw->isDisplayOn()) {
2086 // transform the dirty region into this screen's coordinate space
2087 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
2088
2089 // repaint the framebuffer (if needed)
2090 doDisplayComposition(hw, dirtyRegion);
2091
2092 hw->dirtyRegion.clear();
2093 hw->flip();
2094 }
2095 }
2096 postFramebuffer();
2097 }
2098
postFramebuffer()2099 void SurfaceFlinger::postFramebuffer()
2100 {
2101 ATRACE_CALL();
2102 ALOGV("postFramebuffer");
2103
2104 const nsecs_t now = systemTime();
2105 mDebugInSwapBuffers = now;
2106
2107 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2108 auto& displayDevice = mDisplays[displayId];
2109 if (!displayDevice->isDisplayOn()) {
2110 continue;
2111 }
2112 const auto hwcId = displayDevice->getHwcDisplayId();
2113 if (hwcId >= 0) {
2114 getBE().mHwc->presentAndGetReleaseFences(hwcId);
2115 }
2116 displayDevice->onSwapBuffersCompleted();
2117 displayDevice->makeCurrent();
2118 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2119 // The layer buffer from the previous frame (if any) is released
2120 // by HWC only when the release fence from this frame (if any) is
2121 // signaled. Always get the release fence from HWC first.
2122 auto hwcLayer = layer->getHwcLayer(hwcId);
2123 sp<Fence> releaseFence = getBE().mHwc->getLayerReleaseFence(hwcId, hwcLayer);
2124
2125 // If the layer was client composited in the previous frame, we
2126 // need to merge with the previous client target acquire fence.
2127 // Since we do not track that, always merge with the current
2128 // client target acquire fence when it is available, even though
2129 // this is suboptimal.
2130 if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) {
2131 releaseFence = Fence::merge("LayerRelease", releaseFence,
2132 displayDevice->getClientTargetAcquireFence());
2133 }
2134
2135 layer->onLayerDisplayed(releaseFence);
2136 }
2137
2138 // We've got a list of layers needing fences, that are disjoint with
2139 // displayDevice->getVisibleLayersSortedByZ. The best we can do is to
2140 // supply them with the present fence.
2141 if (!displayDevice->getLayersNeedingFences().isEmpty()) {
2142 sp<Fence> presentFence = getBE().mHwc->getPresentFence(hwcId);
2143 for (auto& layer : displayDevice->getLayersNeedingFences()) {
2144 layer->onLayerDisplayed(presentFence);
2145 }
2146 }
2147
2148 if (hwcId >= 0) {
2149 getBE().mHwc->clearReleaseFences(hwcId);
2150 }
2151 }
2152
2153 mLastSwapBufferTime = systemTime() - now;
2154 mDebugInSwapBuffers = 0;
2155
2156 // |mStateLock| not needed as we are on the main thread
2157 if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY)) {
2158 uint32_t flipCount = getDefaultDisplayDeviceLocked()->getPageFlipCount();
2159 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
2160 logFrameStats();
2161 }
2162 }
2163 }
2164
handleTransaction(uint32_t transactionFlags)2165 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
2166 {
2167 ATRACE_CALL();
2168
2169 // here we keep a copy of the drawing state (that is the state that's
2170 // going to be overwritten by handleTransactionLocked()) outside of
2171 // mStateLock so that the side-effects of the State assignment
2172 // don't happen with mStateLock held (which can cause deadlocks).
2173 State drawingState(mDrawingState);
2174
2175 Mutex::Autolock _l(mStateLock);
2176 const nsecs_t now = systemTime();
2177 mDebugInTransaction = now;
2178
2179 // Here we're guaranteed that some transaction flags are set
2180 // so we can call handleTransactionLocked() unconditionally.
2181 // We call getTransactionFlags(), which will also clear the flags,
2182 // with mStateLock held to guarantee that mCurrentState won't change
2183 // until the transaction is committed.
2184
2185 mVsyncModulator.onTransactionHandled();
2186 transactionFlags = getTransactionFlags(eTransactionMask);
2187 handleTransactionLocked(transactionFlags);
2188
2189 mLastTransactionTime = systemTime() - now;
2190 mDebugInTransaction = 0;
2191 invalidateHwcGeometry();
2192 // here the transaction has been committed
2193 }
2194
determineDisplayType(hwc2_display_t display,HWC2::Connection connection) const2195 DisplayDevice::DisplayType SurfaceFlinger::determineDisplayType(hwc2_display_t display,
2196 HWC2::Connection connection) const {
2197 // Figure out whether the event is for the primary display or an
2198 // external display by matching the Hwc display id against one for a
2199 // connected display. If we did not find a match, we then check what
2200 // displays are not already connected to determine the type. If we don't
2201 // have a connected primary display, we assume the new display is meant to
2202 // be the primary display, and then if we don't have an external display,
2203 // we assume it is that.
2204 const auto primaryDisplayId =
2205 getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_PRIMARY);
2206 const auto externalDisplayId =
2207 getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_EXTERNAL);
2208 if (primaryDisplayId && primaryDisplayId == display) {
2209 return DisplayDevice::DISPLAY_PRIMARY;
2210 } else if (externalDisplayId && externalDisplayId == display) {
2211 return DisplayDevice::DISPLAY_EXTERNAL;
2212 } else if (connection == HWC2::Connection::Connected && !primaryDisplayId) {
2213 return DisplayDevice::DISPLAY_PRIMARY;
2214 } else if (connection == HWC2::Connection::Connected && !externalDisplayId) {
2215 return DisplayDevice::DISPLAY_EXTERNAL;
2216 }
2217
2218 return DisplayDevice::DISPLAY_ID_INVALID;
2219 }
2220
processDisplayHotplugEventsLocked()2221 void SurfaceFlinger::processDisplayHotplugEventsLocked() {
2222 for (const auto& event : mPendingHotplugEvents) {
2223 auto displayType = determineDisplayType(event.display, event.connection);
2224 if (displayType == DisplayDevice::DISPLAY_ID_INVALID) {
2225 ALOGW("Unable to determine the display type for display %" PRIu64, event.display);
2226 continue;
2227 }
2228
2229 if (getBE().mHwc->isUsingVrComposer() && displayType == DisplayDevice::DISPLAY_EXTERNAL) {
2230 ALOGE("External displays are not supported by the vr hardware composer.");
2231 continue;
2232 }
2233
2234 getBE().mHwc->onHotplug(event.display, displayType, event.connection);
2235
2236 if (event.connection == HWC2::Connection::Connected) {
2237 if (!mBuiltinDisplays[displayType].get()) {
2238 ALOGV("Creating built in display %d", displayType);
2239 mBuiltinDisplays[displayType] = new BBinder();
2240 // All non-virtual displays are currently considered secure.
2241 DisplayDeviceState info(displayType, true);
2242 info.displayName = displayType == DisplayDevice::DISPLAY_PRIMARY ?
2243 "Built-in Screen" : "External Screen";
2244 mCurrentState.displays.add(mBuiltinDisplays[displayType], info);
2245 mInterceptor->saveDisplayCreation(info);
2246 }
2247 } else {
2248 ALOGV("Removing built in display %d", displayType);
2249
2250 ssize_t idx = mCurrentState.displays.indexOfKey(mBuiltinDisplays[displayType]);
2251 if (idx >= 0) {
2252 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
2253 mInterceptor->saveDisplayDeletion(info.displayId);
2254 mCurrentState.displays.removeItemsAt(idx);
2255 }
2256 mBuiltinDisplays[displayType].clear();
2257 }
2258
2259 processDisplayChangesLocked();
2260 }
2261
2262 mPendingHotplugEvents.clear();
2263 }
2264
setupNewDisplayDeviceInternal(const wp<IBinder> & display,int hwcId,const DisplayDeviceState & state,const sp<DisplaySurface> & dispSurface,const sp<IGraphicBufferProducer> & producer)2265 sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
2266 const wp<IBinder>& display, int hwcId, const DisplayDeviceState& state,
2267 const sp<DisplaySurface>& dispSurface, const sp<IGraphicBufferProducer>& producer) {
2268 bool hasWideColorGamut = false;
2269 std::unordered_map<ColorMode, std::vector<RenderIntent>> hwcColorModes;
2270
2271 if (hasWideColorDisplay) {
2272 std::vector<ColorMode> modes = getHwComposer().getColorModes(hwcId);
2273 for (ColorMode colorMode : modes) {
2274 switch (colorMode) {
2275 case ColorMode::DISPLAY_P3:
2276 case ColorMode::ADOBE_RGB:
2277 case ColorMode::DCI_P3:
2278 hasWideColorGamut = true;
2279 break;
2280 default:
2281 break;
2282 }
2283
2284 std::vector<RenderIntent> renderIntents = getHwComposer().getRenderIntents(hwcId,
2285 colorMode);
2286 hwcColorModes.emplace(colorMode, renderIntents);
2287 }
2288 }
2289
2290 HdrCapabilities hdrCapabilities;
2291 getHwComposer().getHdrCapabilities(hwcId, &hdrCapabilities);
2292
2293 auto nativeWindowSurface = mCreateNativeWindowSurface(producer);
2294 auto nativeWindow = nativeWindowSurface->getNativeWindow();
2295
2296 /*
2297 * Create our display's surface
2298 */
2299 std::unique_ptr<RE::Surface> renderSurface = getRenderEngine().createSurface();
2300 renderSurface->setCritical(state.type == DisplayDevice::DISPLAY_PRIMARY);
2301 renderSurface->setAsync(state.type >= DisplayDevice::DISPLAY_VIRTUAL);
2302 renderSurface->setNativeWindow(nativeWindow.get());
2303 const int displayWidth = renderSurface->queryWidth();
2304 const int displayHeight = renderSurface->queryHeight();
2305
2306 // Make sure that composition can never be stalled by a virtual display
2307 // consumer that isn't processing buffers fast enough. We have to do this
2308 // in two places:
2309 // * Here, in case the display is composed entirely by HWC.
2310 // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
2311 // window's swap interval in eglMakeCurrent, so they'll override the
2312 // interval we set here.
2313 if (state.type >= DisplayDevice::DISPLAY_VIRTUAL) {
2314 nativeWindow->setSwapInterval(nativeWindow.get(), 0);
2315 }
2316
2317 // virtual displays are always considered enabled
2318 auto initialPowerMode = (state.type >= DisplayDevice::DISPLAY_VIRTUAL) ? HWC_POWER_MODE_NORMAL
2319 : HWC_POWER_MODE_OFF;
2320
2321 sp<DisplayDevice> hw =
2322 new DisplayDevice(this, state.type, hwcId, state.isSecure, display, nativeWindow,
2323 dispSurface, std::move(renderSurface), displayWidth, displayHeight,
2324 hasWideColorGamut, hdrCapabilities,
2325 getHwComposer().getSupportedPerFrameMetadata(hwcId),
2326 hwcColorModes, initialPowerMode);
2327
2328 if (maxFrameBufferAcquiredBuffers >= 3) {
2329 nativeWindowSurface->preallocateBuffers();
2330 }
2331
2332 ColorMode defaultColorMode = ColorMode::NATIVE;
2333 Dataspace defaultDataSpace = Dataspace::UNKNOWN;
2334 if (hasWideColorGamut) {
2335 defaultColorMode = ColorMode::SRGB;
2336 defaultDataSpace = Dataspace::SRGB;
2337 }
2338 setActiveColorModeInternal(hw, defaultColorMode, defaultDataSpace,
2339 RenderIntent::COLORIMETRIC);
2340 if (state.type < DisplayDevice::DISPLAY_VIRTUAL) {
2341 hw->setActiveConfig(getHwComposer().getActiveConfigIndex(state.type));
2342 }
2343 hw->setLayerStack(state.layerStack);
2344 hw->setProjection(state.orientation, state.viewport, state.frame);
2345 hw->setDisplayName(state.displayName);
2346
2347 return hw;
2348 }
2349
processDisplayChangesLocked()2350 void SurfaceFlinger::processDisplayChangesLocked() {
2351 // here we take advantage of Vector's copy-on-write semantics to
2352 // improve performance by skipping the transaction entirely when
2353 // know that the lists are identical
2354 const KeyedVector<wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
2355 const KeyedVector<wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
2356 if (!curr.isIdenticalTo(draw)) {
2357 mVisibleRegionsDirty = true;
2358 const size_t cc = curr.size();
2359 size_t dc = draw.size();
2360
2361 // find the displays that were removed
2362 // (ie: in drawing state but not in current state)
2363 // also handle displays that changed
2364 // (ie: displays that are in both lists)
2365 for (size_t i = 0; i < dc;) {
2366 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
2367 if (j < 0) {
2368 // in drawing state but not in current state
2369 // Call makeCurrent() on the primary display so we can
2370 // be sure that nothing associated with this display
2371 // is current.
2372 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
2373 if (defaultDisplay != nullptr) defaultDisplay->makeCurrent();
2374 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
2375 if (hw != nullptr) hw->disconnect(getHwComposer());
2376 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
2377 mEventThread->onHotplugReceived(draw[i].type, false);
2378 mDisplays.removeItem(draw.keyAt(i));
2379 } else {
2380 // this display is in both lists. see if something changed.
2381 const DisplayDeviceState& state(curr[j]);
2382 const wp<IBinder>& display(curr.keyAt(j));
2383 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
2384 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
2385 if (state_binder != draw_binder) {
2386 // changing the surface is like destroying and
2387 // recreating the DisplayDevice, so we just remove it
2388 // from the drawing state, so that it get re-added
2389 // below.
2390 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
2391 if (hw != nullptr) hw->disconnect(getHwComposer());
2392 mDisplays.removeItem(display);
2393 mDrawingState.displays.removeItemsAt(i);
2394 dc--;
2395 // at this point we must loop to the next item
2396 continue;
2397 }
2398
2399 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
2400 if (disp != nullptr) {
2401 if (state.layerStack != draw[i].layerStack) {
2402 disp->setLayerStack(state.layerStack);
2403 }
2404 if ((state.orientation != draw[i].orientation) ||
2405 (state.viewport != draw[i].viewport) || (state.frame != draw[i].frame)) {
2406 disp->setProjection(state.orientation, state.viewport, state.frame);
2407 }
2408 if (state.width != draw[i].width || state.height != draw[i].height) {
2409 disp->setDisplaySize(state.width, state.height);
2410 }
2411 }
2412 }
2413 ++i;
2414 }
2415
2416 // find displays that were added
2417 // (ie: in current state but not in drawing state)
2418 for (size_t i = 0; i < cc; i++) {
2419 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
2420 const DisplayDeviceState& state(curr[i]);
2421
2422 sp<DisplaySurface> dispSurface;
2423 sp<IGraphicBufferProducer> producer;
2424 sp<IGraphicBufferProducer> bqProducer;
2425 sp<IGraphicBufferConsumer> bqConsumer;
2426 mCreateBufferQueue(&bqProducer, &bqConsumer, false);
2427
2428 int32_t hwcId = -1;
2429 if (state.isVirtualDisplay()) {
2430 // Virtual displays without a surface are dormant:
2431 // they have external state (layer stack, projection,
2432 // etc.) but no internal state (i.e. a DisplayDevice).
2433 if (state.surface != nullptr) {
2434 // Allow VR composer to use virtual displays.
2435 if (mUseHwcVirtualDisplays || getBE().mHwc->isUsingVrComposer()) {
2436 int width = 0;
2437 int status = state.surface->query(NATIVE_WINDOW_WIDTH, &width);
2438 ALOGE_IF(status != NO_ERROR, "Unable to query width (%d)", status);
2439 int height = 0;
2440 status = state.surface->query(NATIVE_WINDOW_HEIGHT, &height);
2441 ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status);
2442 int intFormat = 0;
2443 status = state.surface->query(NATIVE_WINDOW_FORMAT, &intFormat);
2444 ALOGE_IF(status != NO_ERROR, "Unable to query format (%d)", status);
2445 auto format = static_cast<ui::PixelFormat>(intFormat);
2446
2447 getBE().mHwc->allocateVirtualDisplay(width, height, &format, &hwcId);
2448 }
2449
2450 // TODO: Plumb requested format back up to consumer
2451
2452 sp<VirtualDisplaySurface> vds =
2453 new VirtualDisplaySurface(*getBE().mHwc, hwcId, state.surface,
2454 bqProducer, bqConsumer,
2455 state.displayName);
2456
2457 dispSurface = vds;
2458 producer = vds;
2459 }
2460 } else {
2461 ALOGE_IF(state.surface != nullptr,
2462 "adding a supported display, but rendering "
2463 "surface is provided (%p), ignoring it",
2464 state.surface.get());
2465
2466 hwcId = state.type;
2467 dispSurface = new FramebufferSurface(*getBE().mHwc, hwcId, bqConsumer);
2468 producer = bqProducer;
2469 }
2470
2471 const wp<IBinder>& display(curr.keyAt(i));
2472 if (dispSurface != nullptr) {
2473 mDisplays.add(display,
2474 setupNewDisplayDeviceInternal(display, hwcId, state, dispSurface,
2475 producer));
2476 if (!state.isVirtualDisplay()) {
2477 mEventThread->onHotplugReceived(state.type, true);
2478 }
2479 }
2480 }
2481 }
2482 }
2483
2484 mDrawingState.displays = mCurrentState.displays;
2485 }
2486
handleTransactionLocked(uint32_t transactionFlags)2487 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
2488 {
2489 // Notify all layers of available frames
2490 mCurrentState.traverseInZOrder([](Layer* layer) {
2491 layer->notifyAvailableFrames();
2492 });
2493
2494 /*
2495 * Traversal of the children
2496 * (perform the transaction for each of them if needed)
2497 */
2498
2499 if (transactionFlags & eTraversalNeeded) {
2500 mCurrentState.traverseInZOrder([&](Layer* layer) {
2501 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
2502 if (!trFlags) return;
2503
2504 const uint32_t flags = layer->doTransaction(0);
2505 if (flags & Layer::eVisibleRegion)
2506 mVisibleRegionsDirty = true;
2507 });
2508 }
2509
2510 /*
2511 * Perform display own transactions if needed
2512 */
2513
2514 if (transactionFlags & eDisplayTransactionNeeded) {
2515 processDisplayChangesLocked();
2516 processDisplayHotplugEventsLocked();
2517 }
2518
2519 if (transactionFlags & (eDisplayLayerStackChanged|eDisplayTransactionNeeded)) {
2520 // The transform hint might have changed for some layers
2521 // (either because a display has changed, or because a layer
2522 // as changed).
2523 //
2524 // Walk through all the layers in currentLayers,
2525 // and update their transform hint.
2526 //
2527 // If a layer is visible only on a single display, then that
2528 // display is used to calculate the hint, otherwise we use the
2529 // default display.
2530 //
2531 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
2532 // the hint is set before we acquire a buffer from the surface texture.
2533 //
2534 // NOTE: layer transactions have taken place already, so we use their
2535 // drawing state. However, SurfaceFlinger's own transaction has not
2536 // happened yet, so we must use the current state layer list
2537 // (soon to become the drawing state list).
2538 //
2539 sp<const DisplayDevice> disp;
2540 uint32_t currentlayerStack = 0;
2541 bool first = true;
2542 mCurrentState.traverseInZOrder([&](Layer* layer) {
2543 // NOTE: we rely on the fact that layers are sorted by
2544 // layerStack first (so we don't have to traverse the list
2545 // of displays for every layer).
2546 uint32_t layerStack = layer->getLayerStack();
2547 if (first || currentlayerStack != layerStack) {
2548 currentlayerStack = layerStack;
2549 // figure out if this layerstack is mirrored
2550 // (more than one display) if so, pick the default display,
2551 // if not, pick the only display it's on.
2552 disp.clear();
2553 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2554 sp<const DisplayDevice> hw(mDisplays[dpy]);
2555 if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) {
2556 if (disp == nullptr) {
2557 disp = std::move(hw);
2558 } else {
2559 disp = nullptr;
2560 break;
2561 }
2562 }
2563 }
2564 }
2565
2566 if (disp == nullptr) {
2567 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
2568 // redraw after transform hint changes. See bug 8508397.
2569
2570 // could be null when this layer is using a layerStack
2571 // that is not visible on any display. Also can occur at
2572 // screen off/on times.
2573 disp = getDefaultDisplayDeviceLocked();
2574 }
2575
2576 // disp can be null if there is no display available at all to get
2577 // the transform hint from.
2578 if (disp != nullptr) {
2579 layer->updateTransformHint(disp);
2580 }
2581
2582 first = false;
2583 });
2584 }
2585
2586
2587 /*
2588 * Perform our own transaction if needed
2589 */
2590
2591 if (mLayersAdded) {
2592 mLayersAdded = false;
2593 // Layers have been added.
2594 mVisibleRegionsDirty = true;
2595 }
2596
2597 // some layers might have been removed, so
2598 // we need to update the regions they're exposing.
2599 if (mLayersRemoved) {
2600 mLayersRemoved = false;
2601 mVisibleRegionsDirty = true;
2602 mDrawingState.traverseInZOrder([&](Layer* layer) {
2603 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
2604 // this layer is not visible anymore
2605 // TODO: we could traverse the tree from front to back and
2606 // compute the actual visible region
2607 // TODO: we could cache the transformed region
2608 Region visibleReg;
2609 visibleReg.set(layer->computeScreenBounds());
2610 invalidateLayerStack(layer, visibleReg);
2611 }
2612 });
2613 }
2614
2615 commitTransaction();
2616
2617 updateCursorAsync();
2618 }
2619
updateCursorAsync()2620 void SurfaceFlinger::updateCursorAsync()
2621 {
2622 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2623 auto& displayDevice = mDisplays[displayId];
2624 if (displayDevice->getHwcDisplayId() < 0) {
2625 continue;
2626 }
2627
2628 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2629 layer->updateCursorPosition(displayDevice);
2630 }
2631 }
2632 }
2633
commitTransaction()2634 void SurfaceFlinger::commitTransaction()
2635 {
2636 if (!mLayersPendingRemoval.isEmpty()) {
2637 // Notify removed layers now that they can't be drawn from
2638 for (const auto& l : mLayersPendingRemoval) {
2639 recordBufferingStats(l->getName().string(),
2640 l->getOccupancyHistory(true));
2641 l->onRemoved();
2642 }
2643 mLayersPendingRemoval.clear();
2644 }
2645
2646 // If this transaction is part of a window animation then the next frame
2647 // we composite should be considered an animation as well.
2648 mAnimCompositionPending = mAnimTransactionPending;
2649
2650 mDrawingState = mCurrentState;
2651 // clear the "changed" flags in current state
2652 mCurrentState.colorMatrixChanged = false;
2653
2654 mDrawingState.traverseInZOrder([](Layer* layer) {
2655 layer->commitChildList();
2656 });
2657 mTransactionPending = false;
2658 mAnimTransactionPending = false;
2659 mTransactionCV.broadcast();
2660 }
2661
computeVisibleRegions(const sp<const DisplayDevice> & displayDevice,Region & outDirtyRegion,Region & outOpaqueRegion)2662 void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
2663 Region& outDirtyRegion, Region& outOpaqueRegion)
2664 {
2665 ATRACE_CALL();
2666 ALOGV("computeVisibleRegions");
2667
2668 Region aboveOpaqueLayers;
2669 Region aboveCoveredLayers;
2670 Region dirty;
2671
2672 outDirtyRegion.clear();
2673
2674 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
2675 // start with the whole surface at its current location
2676 const Layer::State& s(layer->getDrawingState());
2677
2678 // only consider the layers on the given layer stack
2679 if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary()))
2680 return;
2681
2682 /*
2683 * opaqueRegion: area of a surface that is fully opaque.
2684 */
2685 Region opaqueRegion;
2686
2687 /*
2688 * visibleRegion: area of a surface that is visible on screen
2689 * and not fully transparent. This is essentially the layer's
2690 * footprint minus the opaque regions above it.
2691 * Areas covered by a translucent surface are considered visible.
2692 */
2693 Region visibleRegion;
2694
2695 /*
2696 * coveredRegion: area of a surface that is covered by all
2697 * visible regions above it (which includes the translucent areas).
2698 */
2699 Region coveredRegion;
2700
2701 /*
2702 * transparentRegion: area of a surface that is hinted to be completely
2703 * transparent. This is only used to tell when the layer has no visible
2704 * non-transparent regions and can be removed from the layer list. It
2705 * does not affect the visibleRegion of this layer or any layers
2706 * beneath it. The hint may not be correct if apps don't respect the
2707 * SurfaceView restrictions (which, sadly, some don't).
2708 */
2709 Region transparentRegion;
2710
2711
2712 // handle hidden surfaces by setting the visible region to empty
2713 if (CC_LIKELY(layer->isVisible())) {
2714 const bool translucent = !layer->isOpaque(s);
2715 Rect bounds(layer->computeScreenBounds());
2716 visibleRegion.set(bounds);
2717 Transform tr = layer->getTransform();
2718 if (!visibleRegion.isEmpty()) {
2719 // Remove the transparent area from the visible region
2720 if (translucent) {
2721 if (tr.preserveRects()) {
2722 // transform the transparent region
2723 transparentRegion = tr.transform(s.activeTransparentRegion);
2724 } else {
2725 // transformation too complex, can't do the
2726 // transparent region optimization.
2727 transparentRegion.clear();
2728 }
2729 }
2730
2731 // compute the opaque region
2732 const int32_t layerOrientation = tr.getOrientation();
2733 if (layer->getAlpha() == 1.0f && !translucent &&
2734 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2735 // the opaque region is the layer's footprint
2736 opaqueRegion = visibleRegion;
2737 }
2738 }
2739 }
2740
2741 if (visibleRegion.isEmpty()) {
2742 layer->clearVisibilityRegions();
2743 return;
2744 }
2745
2746 // Clip the covered region to the visible region
2747 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2748
2749 // Update aboveCoveredLayers for next (lower) layer
2750 aboveCoveredLayers.orSelf(visibleRegion);
2751
2752 // subtract the opaque region covered by the layers above us
2753 visibleRegion.subtractSelf(aboveOpaqueLayers);
2754
2755 // compute this layer's dirty region
2756 if (layer->contentDirty) {
2757 // we need to invalidate the whole region
2758 dirty = visibleRegion;
2759 // as well, as the old visible region
2760 dirty.orSelf(layer->visibleRegion);
2761 layer->contentDirty = false;
2762 } else {
2763 /* compute the exposed region:
2764 * the exposed region consists of two components:
2765 * 1) what's VISIBLE now and was COVERED before
2766 * 2) what's EXPOSED now less what was EXPOSED before
2767 *
2768 * note that (1) is conservative, we start with the whole
2769 * visible region but only keep what used to be covered by
2770 * something -- which mean it may have been exposed.
2771 *
2772 * (2) handles areas that were not covered by anything but got
2773 * exposed because of a resize.
2774 */
2775 const Region newExposed = visibleRegion - coveredRegion;
2776 const Region oldVisibleRegion = layer->visibleRegion;
2777 const Region oldCoveredRegion = layer->coveredRegion;
2778 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2779 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2780 }
2781 dirty.subtractSelf(aboveOpaqueLayers);
2782
2783 // accumulate to the screen dirty region
2784 outDirtyRegion.orSelf(dirty);
2785
2786 // Update aboveOpaqueLayers for next (lower) layer
2787 aboveOpaqueLayers.orSelf(opaqueRegion);
2788
2789 // Store the visible region in screen space
2790 layer->setVisibleRegion(visibleRegion);
2791 layer->setCoveredRegion(coveredRegion);
2792 layer->setVisibleNonTransparentRegion(
2793 visibleRegion.subtract(transparentRegion));
2794 });
2795
2796 outOpaqueRegion = aboveOpaqueLayers;
2797 }
2798
invalidateLayerStack(const sp<const Layer> & layer,const Region & dirty)2799 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2800 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2801 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2802 if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) {
2803 hw->dirtyRegion.orSelf(dirty);
2804 }
2805 }
2806 }
2807
handlePageFlip()2808 bool SurfaceFlinger::handlePageFlip()
2809 {
2810 ALOGV("handlePageFlip");
2811
2812 nsecs_t latchTime = systemTime();
2813
2814 bool visibleRegions = false;
2815 bool frameQueued = false;
2816 bool newDataLatched = false;
2817
2818 // Store the set of layers that need updates. This set must not change as
2819 // buffers are being latched, as this could result in a deadlock.
2820 // Example: Two producers share the same command stream and:
2821 // 1.) Layer 0 is latched
2822 // 2.) Layer 0 gets a new frame
2823 // 2.) Layer 1 gets a new frame
2824 // 3.) Layer 1 is latched.
2825 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2826 // second frame. But layer 0's second frame could be waiting on display.
2827 mDrawingState.traverseInZOrder([&](Layer* layer) {
2828 if (layer->hasQueuedFrame()) {
2829 frameQueued = true;
2830 if (layer->shouldPresentNow(mPrimaryDispSync)) {
2831 mLayersWithQueuedFrames.push_back(layer);
2832 } else {
2833 layer->useEmptyDamage();
2834 }
2835 } else {
2836 layer->useEmptyDamage();
2837 }
2838 });
2839
2840 for (auto& layer : mLayersWithQueuedFrames) {
2841 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
2842 layer->useSurfaceDamage();
2843 invalidateLayerStack(layer, dirty);
2844 if (layer->isBufferLatched()) {
2845 newDataLatched = true;
2846 }
2847 }
2848
2849 mVisibleRegionsDirty |= visibleRegions;
2850
2851 // If we will need to wake up at some time in the future to deal with a
2852 // queued frame that shouldn't be displayed during this vsync period, wake
2853 // up during the next vsync period to check again.
2854 if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {
2855 signalLayerUpdate();
2856 }
2857
2858 // Only continue with the refresh if there is actually new work to do
2859 return !mLayersWithQueuedFrames.empty() && newDataLatched;
2860 }
2861
invalidateHwcGeometry()2862 void SurfaceFlinger::invalidateHwcGeometry()
2863 {
2864 mGeometryInvalid = true;
2865 }
2866
2867
doDisplayComposition(const sp<const DisplayDevice> & displayDevice,const Region & inDirtyRegion)2868 void SurfaceFlinger::doDisplayComposition(
2869 const sp<const DisplayDevice>& displayDevice,
2870 const Region& inDirtyRegion)
2871 {
2872 // We only need to actually compose the display if:
2873 // 1) It is being handled by hardware composer, which may need this to
2874 // keep its virtual display state machine in sync, or
2875 // 2) There is work to be done (the dirty region isn't empty)
2876 bool isHwcDisplay = displayDevice->getHwcDisplayId() >= 0;
2877 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2878 ALOGV("Skipping display composition");
2879 return;
2880 }
2881
2882 ALOGV("doDisplayComposition");
2883 if (!doComposeSurfaces(displayDevice)) return;
2884
2885 // swap buffers (presentation)
2886 displayDevice->swapBuffers(getHwComposer());
2887 }
2888
doComposeSurfaces(const sp<const DisplayDevice> & displayDevice)2889 bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& displayDevice)
2890 {
2891 ALOGV("doComposeSurfaces");
2892
2893 const Region bounds(displayDevice->bounds());
2894 const DisplayRenderArea renderArea(displayDevice);
2895 const auto hwcId = displayDevice->getHwcDisplayId();
2896 const bool hasClientComposition = getBE().mHwc->hasClientComposition(hwcId);
2897 ATRACE_INT("hasClientComposition", hasClientComposition);
2898
2899 bool applyColorMatrix = false;
2900 bool needsLegacyColorMatrix = false;
2901 bool legacyColorMatrixApplied = false;
2902
2903 if (hasClientComposition) {
2904 ALOGV("hasClientComposition");
2905
2906 Dataspace outputDataspace = Dataspace::UNKNOWN;
2907 if (displayDevice->hasWideColorGamut()) {
2908 outputDataspace = displayDevice->getCompositionDataSpace();
2909 }
2910 getBE().mRenderEngine->setOutputDataSpace(outputDataspace);
2911 getBE().mRenderEngine->setDisplayMaxLuminance(
2912 displayDevice->getHdrCapabilities().getDesiredMaxLuminance());
2913
2914 const bool hasDeviceComposition = getBE().mHwc->hasDeviceComposition(hwcId);
2915 const bool skipClientColorTransform = getBE().mHwc->hasCapability(
2916 HWC2::Capability::SkipClientColorTransform);
2917
2918 applyColorMatrix = !hasDeviceComposition && !skipClientColorTransform;
2919 if (applyColorMatrix) {
2920 getRenderEngine().setupColorTransform(mDrawingState.colorMatrix);
2921 }
2922
2923 needsLegacyColorMatrix =
2924 (displayDevice->getActiveRenderIntent() >= RenderIntent::ENHANCE &&
2925 outputDataspace != Dataspace::UNKNOWN &&
2926 outputDataspace != Dataspace::SRGB);
2927
2928 if (!displayDevice->makeCurrent()) {
2929 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2930 displayDevice->getDisplayName().string());
2931 getRenderEngine().resetCurrentSurface();
2932
2933 // |mStateLock| not needed as we are on the main thread
2934 if(!getDefaultDisplayDeviceLocked()->makeCurrent()) {
2935 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2936 }
2937 return false;
2938 }
2939
2940 // Never touch the framebuffer if we don't have any framebuffer layers
2941 if (hasDeviceComposition) {
2942 // when using overlays, we assume a fully transparent framebuffer
2943 // NOTE: we could reduce how much we need to clear, for instance
2944 // remove where there are opaque FB layers. however, on some
2945 // GPUs doing a "clean slate" clear might be more efficient.
2946 // We'll revisit later if needed.
2947 getBE().mRenderEngine->clearWithColor(0, 0, 0, 0);
2948 } else {
2949 // we start with the whole screen area and remove the scissor part
2950 // we're left with the letterbox region
2951 // (common case is that letterbox ends-up being empty)
2952 const Region letterbox(bounds.subtract(displayDevice->getScissor()));
2953
2954 // compute the area to clear
2955 Region region(displayDevice->undefinedRegion.merge(letterbox));
2956
2957 // screen is already cleared here
2958 if (!region.isEmpty()) {
2959 // can happen with SurfaceView
2960 drawWormhole(displayDevice, region);
2961 }
2962 }
2963
2964 if (displayDevice->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2965 // just to be on the safe side, we don't set the
2966 // scissor on the main display. It should never be needed
2967 // anyways (though in theory it could since the API allows it).
2968 const Rect& bounds(displayDevice->getBounds());
2969 const Rect& scissor(displayDevice->getScissor());
2970 if (scissor != bounds) {
2971 // scissor doesn't match the screen's dimensions, so we
2972 // need to clear everything outside of it and enable
2973 // the GL scissor so we don't draw anything where we shouldn't
2974
2975 // enable scissor for this frame
2976 const uint32_t height = displayDevice->getHeight();
2977 getBE().mRenderEngine->setScissor(scissor.left, height - scissor.bottom,
2978 scissor.getWidth(), scissor.getHeight());
2979 }
2980 }
2981 }
2982
2983 /*
2984 * and then, render the layers targeted at the framebuffer
2985 */
2986
2987 ALOGV("Rendering client layers");
2988 const Transform& displayTransform = displayDevice->getTransform();
2989 bool firstLayer = true;
2990 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2991 const Region clip(bounds.intersect(
2992 displayTransform.transform(layer->visibleRegion)));
2993 ALOGV("Layer: %s", layer->getName().string());
2994 ALOGV(" Composition type: %s",
2995 to_string(layer->getCompositionType(hwcId)).c_str());
2996 if (!clip.isEmpty()) {
2997 switch (layer->getCompositionType(hwcId)) {
2998 case HWC2::Composition::Cursor:
2999 case HWC2::Composition::Device:
3000 case HWC2::Composition::Sideband:
3001 case HWC2::Composition::SolidColor: {
3002 const Layer::State& state(layer->getDrawingState());
3003 if (layer->getClearClientTarget(hwcId) && !firstLayer &&
3004 layer->isOpaque(state) && (state.color.a == 1.0f)
3005 && hasClientComposition) {
3006 // never clear the very first layer since we're
3007 // guaranteed the FB is already cleared
3008 layer->clearWithOpenGL(renderArea);
3009 }
3010 break;
3011 }
3012 case HWC2::Composition::Client: {
3013 // switch color matrices lazily
3014 if (layer->isLegacyDataSpace() && needsLegacyColorMatrix) {
3015 if (!legacyColorMatrixApplied) {
3016 getRenderEngine().setSaturationMatrix(mLegacySrgbSaturationMatrix);
3017 legacyColorMatrixApplied = true;
3018 }
3019 } else if (legacyColorMatrixApplied) {
3020 getRenderEngine().setSaturationMatrix(mat4());
3021 legacyColorMatrixApplied = false;
3022 }
3023
3024 layer->draw(renderArea, clip);
3025 break;
3026 }
3027 default:
3028 break;
3029 }
3030 } else {
3031 ALOGV(" Skipping for empty clip");
3032 }
3033 firstLayer = false;
3034 }
3035
3036 if (applyColorMatrix) {
3037 getRenderEngine().setupColorTransform(mat4());
3038 }
3039 if (needsLegacyColorMatrix && legacyColorMatrixApplied) {
3040 getRenderEngine().setSaturationMatrix(mat4());
3041 }
3042
3043 // disable scissor at the end of the frame
3044 getBE().mRenderEngine->disableScissor();
3045 return true;
3046 }
3047
drawWormhole(const sp<const DisplayDevice> & displayDevice,const Region & region) const3048 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& displayDevice, const Region& region) const {
3049 const int32_t height = displayDevice->getHeight();
3050 auto& engine(getRenderEngine());
3051 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
3052 }
3053
addClientLayer(const sp<Client> & client,const sp<IBinder> & handle,const sp<IGraphicBufferProducer> & gbc,const sp<Layer> & lbc,const sp<Layer> & parent)3054 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
3055 const sp<IBinder>& handle,
3056 const sp<IGraphicBufferProducer>& gbc,
3057 const sp<Layer>& lbc,
3058 const sp<Layer>& parent)
3059 {
3060 // add this layer to the current state list
3061 {
3062 Mutex::Autolock _l(mStateLock);
3063 if (mNumLayers >= MAX_LAYERS) {
3064 ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers,
3065 MAX_LAYERS);
3066 return NO_MEMORY;
3067 }
3068 if (parent == nullptr) {
3069 mCurrentState.layersSortedByZ.add(lbc);
3070 } else {
3071 if (parent->isPendingRemoval()) {
3072 ALOGE("addClientLayer called with a removed parent");
3073 return NAME_NOT_FOUND;
3074 }
3075 parent->addChild(lbc);
3076 }
3077
3078 if (gbc != nullptr) {
3079 mGraphicBufferProducerList.insert(IInterface::asBinder(gbc).get());
3080 LOG_ALWAYS_FATAL_IF(mGraphicBufferProducerList.size() >
3081 mMaxGraphicBufferProducerListSize,
3082 "Suspected IGBP leak: %zu IGBPs (%zu max), %zu Layers",
3083 mGraphicBufferProducerList.size(),
3084 mMaxGraphicBufferProducerListSize, mNumLayers);
3085 }
3086 mLayersAdded = true;
3087 mNumLayers++;
3088 }
3089
3090 // attach this layer to the client
3091 client->attachLayer(handle, lbc);
3092
3093 return NO_ERROR;
3094 }
3095
removeLayer(const sp<Layer> & layer,bool topLevelOnly)3096 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
3097 Mutex::Autolock _l(mStateLock);
3098 return removeLayerLocked(mStateLock, layer, topLevelOnly);
3099 }
3100
removeLayerLocked(const Mutex &,const sp<Layer> & layer,bool topLevelOnly)3101 status_t SurfaceFlinger::removeLayerLocked(const Mutex&, const sp<Layer>& layer,
3102 bool topLevelOnly) {
3103 if (layer->isPendingRemoval()) {
3104 return NO_ERROR;
3105 }
3106
3107 const auto& p = layer->getParent();
3108 ssize_t index;
3109 if (p != nullptr) {
3110 if (topLevelOnly) {
3111 return NO_ERROR;
3112 }
3113
3114 sp<Layer> ancestor = p;
3115 while (ancestor->getParent() != nullptr) {
3116 ancestor = ancestor->getParent();
3117 }
3118 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
3119 ALOGE("removeLayer called with a layer whose parent has been removed");
3120 return NAME_NOT_FOUND;
3121 }
3122
3123 index = p->removeChild(layer);
3124 } else {
3125 index = mCurrentState.layersSortedByZ.remove(layer);
3126 }
3127
3128 // As a matter of normal operation, the LayerCleaner will produce a second
3129 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
3130 // so we will succeed in promoting it, but it's already been removed
3131 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
3132 // otherwise something has gone wrong and we are leaking the layer.
3133 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
3134 ALOGE("Failed to find layer (%s) in layer parent (%s).",
3135 layer->getName().string(),
3136 (p != nullptr) ? p->getName().string() : "no-parent");
3137 return BAD_VALUE;
3138 } else if (index < 0) {
3139 return NO_ERROR;
3140 }
3141
3142 layer->onRemovedFromCurrentState();
3143 mLayersPendingRemoval.add(layer);
3144 mLayersRemoved = true;
3145 mNumLayers -= 1 + layer->getChildrenCount();
3146 setTransactionFlags(eTransactionNeeded);
3147 return NO_ERROR;
3148 }
3149
peekTransactionFlags()3150 uint32_t SurfaceFlinger::peekTransactionFlags() {
3151 return android_atomic_release_load(&mTransactionFlags);
3152 }
3153
getTransactionFlags(uint32_t flags)3154 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
3155 return android_atomic_and(~flags, &mTransactionFlags) & flags;
3156 }
3157
setTransactionFlags(uint32_t flags)3158 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
3159 return setTransactionFlags(flags, VSyncModulator::TransactionStart::NORMAL);
3160 }
3161
setTransactionFlags(uint32_t flags,VSyncModulator::TransactionStart transactionStart)3162 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags,
3163 VSyncModulator::TransactionStart transactionStart) {
3164 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
3165 mVsyncModulator.setTransactionStart(transactionStart);
3166 if ((old & flags)==0) { // wake the server up
3167 signalTransaction();
3168 }
3169 return old;
3170 }
3171
containsAnyInvalidClientState(const Vector<ComposerState> & states)3172 bool SurfaceFlinger::containsAnyInvalidClientState(const Vector<ComposerState>& states) {
3173 for (const ComposerState& state : states) {
3174 // Here we need to check that the interface we're given is indeed
3175 // one of our own. A malicious client could give us a nullptr
3176 // IInterface, or one of its own or even one of our own but a
3177 // different type. All these situations would cause us to crash.
3178 if (state.client == nullptr) {
3179 return true;
3180 }
3181
3182 sp<IBinder> binder = IInterface::asBinder(state.client);
3183 if (binder == nullptr) {
3184 return true;
3185 }
3186
3187 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) == nullptr) {
3188 return true;
3189 }
3190 }
3191 return false;
3192 }
3193
setTransactionState(const Vector<ComposerState> & states,const Vector<DisplayState> & displays,uint32_t flags)3194 void SurfaceFlinger::setTransactionState(
3195 const Vector<ComposerState>& states,
3196 const Vector<DisplayState>& displays,
3197 uint32_t flags)
3198 {
3199 ATRACE_CALL();
3200 Mutex::Autolock _l(mStateLock);
3201 uint32_t transactionFlags = 0;
3202
3203 if (containsAnyInvalidClientState(states)) {
3204 return;
3205 }
3206
3207 if (flags & eAnimation) {
3208 // For window updates that are part of an animation we must wait for
3209 // previous animation "frames" to be handled.
3210 while (mAnimTransactionPending) {
3211 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3212 if (CC_UNLIKELY(err != NO_ERROR)) {
3213 // just in case something goes wrong in SF, return to the
3214 // caller after a few seconds.
3215 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
3216 "waiting for previous animation frame");
3217 mAnimTransactionPending = false;
3218 break;
3219 }
3220 }
3221 }
3222
3223 for (const DisplayState& display : displays) {
3224 transactionFlags |= setDisplayStateLocked(display);
3225 }
3226
3227 for (const ComposerState& state : states) {
3228 transactionFlags |= setClientStateLocked(state);
3229 }
3230
3231 // Iterate through all layers again to determine if any need to be destroyed. Marking layers
3232 // as destroyed should only occur after setting all other states. This is to allow for a
3233 // child re-parent to happen before marking its original parent as destroyed (which would
3234 // then mark the child as destroyed).
3235 for (const ComposerState& state : states) {
3236 setDestroyStateLocked(state);
3237 }
3238
3239 // If a synchronous transaction is explicitly requested without any changes, force a transaction
3240 // anyway. This can be used as a flush mechanism for previous async transactions.
3241 // Empty animation transaction can be used to simulate back-pressure, so also force a
3242 // transaction for empty animation transactions.
3243 if (transactionFlags == 0 &&
3244 ((flags & eSynchronous) || (flags & eAnimation))) {
3245 transactionFlags = eTransactionNeeded;
3246 }
3247
3248 if (transactionFlags) {
3249 if (mInterceptor->isEnabled()) {
3250 mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags);
3251 }
3252
3253 // this triggers the transaction
3254 const auto start = (flags & eEarlyWakeup)
3255 ? VSyncModulator::TransactionStart::EARLY
3256 : VSyncModulator::TransactionStart::NORMAL;
3257 setTransactionFlags(transactionFlags, start);
3258
3259 // if this is a synchronous transaction, wait for it to take effect
3260 // before returning.
3261 if (flags & eSynchronous) {
3262 mTransactionPending = true;
3263 }
3264 if (flags & eAnimation) {
3265 mAnimTransactionPending = true;
3266 }
3267 while (mTransactionPending) {
3268 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3269 if (CC_UNLIKELY(err != NO_ERROR)) {
3270 // just in case something goes wrong in SF, return to the
3271 // called after a few seconds.
3272 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
3273 mTransactionPending = false;
3274 break;
3275 }
3276 }
3277 }
3278 }
3279
setDisplayStateLocked(const DisplayState & s)3280 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
3281 {
3282 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
3283 if (dpyIdx < 0)
3284 return 0;
3285
3286 uint32_t flags = 0;
3287 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
3288 if (disp.isValid()) {
3289 const uint32_t what = s.what;
3290 if (what & DisplayState::eSurfaceChanged) {
3291 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
3292 disp.surface = s.surface;
3293 flags |= eDisplayTransactionNeeded;
3294 }
3295 }
3296 if (what & DisplayState::eLayerStackChanged) {
3297 if (disp.layerStack != s.layerStack) {
3298 disp.layerStack = s.layerStack;
3299 flags |= eDisplayTransactionNeeded;
3300 }
3301 }
3302 if (what & DisplayState::eDisplayProjectionChanged) {
3303 if (disp.orientation != s.orientation) {
3304 disp.orientation = s.orientation;
3305 flags |= eDisplayTransactionNeeded;
3306 }
3307 if (disp.frame != s.frame) {
3308 disp.frame = s.frame;
3309 flags |= eDisplayTransactionNeeded;
3310 }
3311 if (disp.viewport != s.viewport) {
3312 disp.viewport = s.viewport;
3313 flags |= eDisplayTransactionNeeded;
3314 }
3315 }
3316 if (what & DisplayState::eDisplaySizeChanged) {
3317 if (disp.width != s.width) {
3318 disp.width = s.width;
3319 flags |= eDisplayTransactionNeeded;
3320 }
3321 if (disp.height != s.height) {
3322 disp.height = s.height;
3323 flags |= eDisplayTransactionNeeded;
3324 }
3325 }
3326 }
3327 return flags;
3328 }
3329
setClientStateLocked(const ComposerState & composerState)3330 uint32_t SurfaceFlinger::setClientStateLocked(const ComposerState& composerState) {
3331 const layer_state_t& s = composerState.state;
3332 sp<Client> client(static_cast<Client*>(composerState.client.get()));
3333
3334 sp<Layer> layer(client->getLayerUser(s.surface));
3335 if (layer == nullptr) {
3336 return 0;
3337 }
3338
3339 if (layer->isPendingRemoval()) {
3340 ALOGW("Attempting to set client state on removed layer: %s", layer->getName().string());
3341 return 0;
3342 }
3343
3344 uint32_t flags = 0;
3345
3346 const uint32_t what = s.what;
3347 bool geometryAppliesWithResize =
3348 what & layer_state_t::eGeometryAppliesWithResize;
3349
3350 // If we are deferring transaction, make sure to push the pending state, as otherwise the
3351 // pending state will also be deferred.
3352 if (what & layer_state_t::eDeferTransaction) {
3353 layer->pushPendingState();
3354 }
3355
3356 if (what & layer_state_t::ePositionChanged) {
3357 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
3358 flags |= eTraversalNeeded;
3359 }
3360 }
3361 if (what & layer_state_t::eLayerChanged) {
3362 // NOTE: index needs to be calculated before we update the state
3363 const auto& p = layer->getParent();
3364 if (p == nullptr) {
3365 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3366 if (layer->setLayer(s.z) && idx >= 0) {
3367 mCurrentState.layersSortedByZ.removeAt(idx);
3368 mCurrentState.layersSortedByZ.add(layer);
3369 // we need traversal (state changed)
3370 // AND transaction (list changed)
3371 flags |= eTransactionNeeded|eTraversalNeeded;
3372 }
3373 } else {
3374 if (p->setChildLayer(layer, s.z)) {
3375 flags |= eTransactionNeeded|eTraversalNeeded;
3376 }
3377 }
3378 }
3379 if (what & layer_state_t::eRelativeLayerChanged) {
3380 // NOTE: index needs to be calculated before we update the state
3381 const auto& p = layer->getParent();
3382 if (p == nullptr) {
3383 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3384 if (layer->setRelativeLayer(s.relativeLayerHandle, s.z) && idx >= 0) {
3385 mCurrentState.layersSortedByZ.removeAt(idx);
3386 mCurrentState.layersSortedByZ.add(layer);
3387 // we need traversal (state changed)
3388 // AND transaction (list changed)
3389 flags |= eTransactionNeeded|eTraversalNeeded;
3390 }
3391 } else {
3392 if (p->setChildRelativeLayer(layer, s.relativeLayerHandle, s.z)) {
3393 flags |= eTransactionNeeded|eTraversalNeeded;
3394 }
3395 }
3396 }
3397 if (what & layer_state_t::eSizeChanged) {
3398 if (layer->setSize(s.w, s.h)) {
3399 flags |= eTraversalNeeded;
3400 }
3401 }
3402 if (what & layer_state_t::eAlphaChanged) {
3403 if (layer->setAlpha(s.alpha))
3404 flags |= eTraversalNeeded;
3405 }
3406 if (what & layer_state_t::eColorChanged) {
3407 if (layer->setColor(s.color))
3408 flags |= eTraversalNeeded;
3409 }
3410 if (what & layer_state_t::eMatrixChanged) {
3411 if (layer->setMatrix(s.matrix))
3412 flags |= eTraversalNeeded;
3413 }
3414 if (what & layer_state_t::eTransparentRegionChanged) {
3415 if (layer->setTransparentRegionHint(s.transparentRegion))
3416 flags |= eTraversalNeeded;
3417 }
3418 if (what & layer_state_t::eFlagsChanged) {
3419 if (layer->setFlags(s.flags, s.mask))
3420 flags |= eTraversalNeeded;
3421 }
3422 if (what & layer_state_t::eCropChanged) {
3423 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
3424 flags |= eTraversalNeeded;
3425 }
3426 if (what & layer_state_t::eFinalCropChanged) {
3427 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
3428 flags |= eTraversalNeeded;
3429 }
3430 if (what & layer_state_t::eLayerStackChanged) {
3431 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3432 // We only allow setting layer stacks for top level layers,
3433 // everything else inherits layer stack from its parent.
3434 if (layer->hasParent()) {
3435 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
3436 layer->getName().string());
3437 } else if (idx < 0) {
3438 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
3439 "that also does not appear in the top level layer list. Something"
3440 " has gone wrong.", layer->getName().string());
3441 } else if (layer->setLayerStack(s.layerStack)) {
3442 mCurrentState.layersSortedByZ.removeAt(idx);
3443 mCurrentState.layersSortedByZ.add(layer);
3444 // we need traversal (state changed)
3445 // AND transaction (list changed)
3446 flags |= eTransactionNeeded|eTraversalNeeded|eDisplayLayerStackChanged;
3447 }
3448 }
3449 if (what & layer_state_t::eDeferTransaction) {
3450 if (s.barrierHandle != nullptr) {
3451 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
3452 } else if (s.barrierGbp != nullptr) {
3453 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
3454 if (authenticateSurfaceTextureLocked(gbp)) {
3455 const auto& otherLayer =
3456 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
3457 layer->deferTransactionUntil(otherLayer, s.frameNumber);
3458 } else {
3459 ALOGE("Attempt to defer transaction to to an"
3460 " unrecognized GraphicBufferProducer");
3461 }
3462 }
3463 // We don't trigger a traversal here because if no other state is
3464 // changed, we don't want this to cause any more work
3465 }
3466 if (what & layer_state_t::eReparent) {
3467 bool hadParent = layer->hasParent();
3468 if (layer->reparent(s.parentHandleForChild)) {
3469 if (!hadParent) {
3470 mCurrentState.layersSortedByZ.remove(layer);
3471 }
3472 flags |= eTransactionNeeded|eTraversalNeeded;
3473 }
3474 }
3475 if (what & layer_state_t::eReparentChildren) {
3476 if (layer->reparentChildren(s.reparentHandle)) {
3477 flags |= eTransactionNeeded|eTraversalNeeded;
3478 }
3479 }
3480 if (what & layer_state_t::eDetachChildren) {
3481 layer->detachChildren();
3482 }
3483 if (what & layer_state_t::eOverrideScalingModeChanged) {
3484 layer->setOverrideScalingMode(s.overrideScalingMode);
3485 // We don't trigger a traversal here because if no other state is
3486 // changed, we don't want this to cause any more work
3487 }
3488 return flags;
3489 }
3490
setDestroyStateLocked(const ComposerState & composerState)3491 void SurfaceFlinger::setDestroyStateLocked(const ComposerState& composerState) {
3492 const layer_state_t& state = composerState.state;
3493 sp<Client> client(static_cast<Client*>(composerState.client.get()));
3494
3495 sp<Layer> layer(client->getLayerUser(state.surface));
3496 if (layer == nullptr) {
3497 return;
3498 }
3499
3500 if (layer->isPendingRemoval()) {
3501 ALOGW("Attempting to destroy on removed layer: %s", layer->getName().string());
3502 return;
3503 }
3504
3505 if (state.what & layer_state_t::eDestroySurface) {
3506 removeLayerLocked(mStateLock, layer);
3507 }
3508 }
3509
createLayer(const String8 & name,const sp<Client> & client,uint32_t w,uint32_t h,PixelFormat format,uint32_t flags,int32_t windowType,int32_t ownerUid,sp<IBinder> * handle,sp<IGraphicBufferProducer> * gbp,sp<Layer> * parent)3510 status_t SurfaceFlinger::createLayer(
3511 const String8& name,
3512 const sp<Client>& client,
3513 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
3514 int32_t windowType, int32_t ownerUid, sp<IBinder>* handle,
3515 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
3516 {
3517 if (int32_t(w|h) < 0) {
3518 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
3519 int(w), int(h));
3520 return BAD_VALUE;
3521 }
3522
3523 status_t result = NO_ERROR;
3524
3525 sp<Layer> layer;
3526
3527 String8 uniqueName = getUniqueLayerName(name);
3528
3529 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
3530 case ISurfaceComposerClient::eFXSurfaceNormal:
3531 result = createBufferLayer(client,
3532 uniqueName, w, h, flags, format,
3533 handle, gbp, &layer);
3534
3535 break;
3536 case ISurfaceComposerClient::eFXSurfaceColor:
3537 result = createColorLayer(client,
3538 uniqueName, w, h, flags,
3539 handle, &layer);
3540 break;
3541 default:
3542 result = BAD_VALUE;
3543 break;
3544 }
3545
3546 if (result != NO_ERROR) {
3547 return result;
3548 }
3549
3550 // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java
3551 // TODO b/64227542
3552 if (windowType == 441731) {
3553 windowType = 2024; // TYPE_NAVIGATION_BAR_PANEL
3554 layer->setPrimaryDisplayOnly();
3555 }
3556
3557 layer->setInfo(windowType, ownerUid);
3558
3559 result = addClientLayer(client, *handle, *gbp, layer, *parent);
3560 if (result != NO_ERROR) {
3561 return result;
3562 }
3563 mInterceptor->saveSurfaceCreation(layer);
3564
3565 setTransactionFlags(eTransactionNeeded);
3566 return result;
3567 }
3568
getUniqueLayerName(const String8 & name)3569 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
3570 {
3571 bool matchFound = true;
3572 uint32_t dupeCounter = 0;
3573
3574 // Tack on our counter whether there is a hit or not, so everyone gets a tag
3575 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
3576
3577 // Loop over layers until we're sure there is no matching name
3578 while (matchFound) {
3579 matchFound = false;
3580 mDrawingState.traverseInZOrder([&](Layer* layer) {
3581 if (layer->getName() == uniqueName) {
3582 matchFound = true;
3583 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
3584 }
3585 });
3586 }
3587
3588 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
3589
3590 return uniqueName;
3591 }
3592
createBufferLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,PixelFormat & format,sp<IBinder> * handle,sp<IGraphicBufferProducer> * gbp,sp<Layer> * outLayer)3593 status_t SurfaceFlinger::createBufferLayer(const sp<Client>& client,
3594 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
3595 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
3596 {
3597 // initialize the surfaces
3598 switch (format) {
3599 case PIXEL_FORMAT_TRANSPARENT:
3600 case PIXEL_FORMAT_TRANSLUCENT:
3601 format = PIXEL_FORMAT_RGBA_8888;
3602 break;
3603 case PIXEL_FORMAT_OPAQUE:
3604 format = PIXEL_FORMAT_RGBX_8888;
3605 break;
3606 }
3607
3608 sp<BufferLayer> layer = new BufferLayer(this, client, name, w, h, flags);
3609 status_t err = layer->setBuffers(w, h, format, flags);
3610 if (err == NO_ERROR) {
3611 *handle = layer->getHandle();
3612 *gbp = layer->getProducer();
3613 *outLayer = layer;
3614 }
3615
3616 ALOGE_IF(err, "createBufferLayer() failed (%s)", strerror(-err));
3617 return err;
3618 }
3619
createColorLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,sp<IBinder> * handle,sp<Layer> * outLayer)3620 status_t SurfaceFlinger::createColorLayer(const sp<Client>& client,
3621 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
3622 sp<IBinder>* handle, sp<Layer>* outLayer)
3623 {
3624 *outLayer = new ColorLayer(this, client, name, w, h, flags);
3625 *handle = (*outLayer)->getHandle();
3626 return NO_ERROR;
3627 }
3628
onLayerRemoved(const sp<Client> & client,const sp<IBinder> & handle)3629 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
3630 {
3631 // called by a client when it wants to remove a Layer
3632 status_t err = NO_ERROR;
3633 sp<Layer> l(client->getLayerUser(handle));
3634 if (l != nullptr) {
3635 mInterceptor->saveSurfaceDeletion(l);
3636 err = removeLayer(l);
3637 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
3638 "error removing layer=%p (%s)", l.get(), strerror(-err));
3639 }
3640 return err;
3641 }
3642
onLayerDestroyed(const wp<Layer> & layer)3643 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
3644 {
3645 // called by ~LayerCleaner() when all references to the IBinder (handle)
3646 // are gone
3647 sp<Layer> l = layer.promote();
3648 if (l == nullptr) {
3649 // The layer has already been removed, carry on
3650 return NO_ERROR;
3651 }
3652 // If we have a parent, then we can continue to live as long as it does.
3653 return removeLayer(l, true);
3654 }
3655
3656 // ---------------------------------------------------------------------------
3657
onInitializeDisplays()3658 void SurfaceFlinger::onInitializeDisplays() {
3659 // reset screen orientation and use primary layer stack
3660 Vector<ComposerState> state;
3661 Vector<DisplayState> displays;
3662 DisplayState d;
3663 d.what = DisplayState::eDisplayProjectionChanged |
3664 DisplayState::eLayerStackChanged;
3665 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
3666 d.layerStack = 0;
3667 d.orientation = DisplayState::eOrientationDefault;
3668 d.frame.makeInvalid();
3669 d.viewport.makeInvalid();
3670 d.width = 0;
3671 d.height = 0;
3672 displays.add(d);
3673 setTransactionState(state, displays, 0);
3674 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL,
3675 /*stateLockHeld*/ false);
3676
3677 const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3678 const nsecs_t period = activeConfig->getVsyncPeriod();
3679 mAnimFrameTracker.setDisplayRefreshPeriod(period);
3680
3681 // Use phase of 0 since phase is not known.
3682 // Use latency of 0, which will snap to the ideal latency.
3683 setCompositorTimingSnapped(0, period, 0);
3684 }
3685
initializeDisplays()3686 void SurfaceFlinger::initializeDisplays() {
3687 class MessageScreenInitialized : public MessageBase {
3688 SurfaceFlinger* flinger;
3689 public:
3690 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
3691 virtual bool handler() {
3692 flinger->onInitializeDisplays();
3693 return true;
3694 }
3695 };
3696 sp<MessageBase> msg = new MessageScreenInitialized(this);
3697 postMessageAsync(msg); // we may be called from main thread, use async message
3698 }
3699
setPowerModeInternal(const sp<DisplayDevice> & hw,int mode,bool stateLockHeld)3700 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
3701 int mode, bool stateLockHeld) {
3702 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
3703 this);
3704 int32_t type = hw->getDisplayType();
3705 int currentMode = hw->getPowerMode();
3706
3707 if (mode == currentMode) {
3708 return;
3709 }
3710
3711 hw->setPowerMode(mode);
3712 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
3713 ALOGW("Trying to set power mode for virtual display");
3714 return;
3715 }
3716
3717 if (mInterceptor->isEnabled()) {
3718 ConditionalLock lock(mStateLock, !stateLockHeld);
3719 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
3720 if (idx < 0) {
3721 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
3722 return;
3723 }
3724 mInterceptor->savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
3725 }
3726
3727 if (currentMode == HWC_POWER_MODE_OFF) {
3728 // Turn on the display
3729 getHwComposer().setPowerMode(type, mode);
3730 if (type == DisplayDevice::DISPLAY_PRIMARY &&
3731 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
3732 // FIXME: eventthread only knows about the main display right now
3733 mEventThread->onScreenAcquired();
3734 resyncToHardwareVsync(true);
3735 }
3736
3737 mVisibleRegionsDirty = true;
3738 mHasPoweredOff = true;
3739 repaintEverything();
3740
3741 struct sched_param param = {0};
3742 param.sched_priority = 1;
3743 if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
3744 ALOGW("Couldn't set SCHED_FIFO on display on");
3745 }
3746 } else if (mode == HWC_POWER_MODE_OFF) {
3747 // Turn off the display
3748 struct sched_param param = {0};
3749 if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) {
3750 ALOGW("Couldn't set SCHED_OTHER on display off");
3751 }
3752
3753 if (type == DisplayDevice::DISPLAY_PRIMARY &&
3754 currentMode != HWC_POWER_MODE_DOZE_SUSPEND) {
3755 disableHardwareVsync(true); // also cancels any in-progress resync
3756
3757 // FIXME: eventthread only knows about the main display right now
3758 mEventThread->onScreenReleased();
3759 }
3760
3761 getHwComposer().setPowerMode(type, mode);
3762 mVisibleRegionsDirty = true;
3763 // from this point on, SF will stop drawing on this display
3764 } else if (mode == HWC_POWER_MODE_DOZE ||
3765 mode == HWC_POWER_MODE_NORMAL) {
3766 // Update display while dozing
3767 getHwComposer().setPowerMode(type, mode);
3768 if (type == DisplayDevice::DISPLAY_PRIMARY &&
3769 currentMode == HWC_POWER_MODE_DOZE_SUSPEND) {
3770 // FIXME: eventthread only knows about the main display right now
3771 mEventThread->onScreenAcquired();
3772 resyncToHardwareVsync(true);
3773 }
3774 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
3775 // Leave display going to doze
3776 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3777 disableHardwareVsync(true); // also cancels any in-progress resync
3778 // FIXME: eventthread only knows about the main display right now
3779 mEventThread->onScreenReleased();
3780 }
3781 getHwComposer().setPowerMode(type, mode);
3782 } else {
3783 ALOGE("Attempting to set unknown power mode: %d\n", mode);
3784 getHwComposer().setPowerMode(type, mode);
3785 }
3786 ALOGD("Finished set power mode=%d, type=%d", mode, hw->getDisplayType());
3787 }
3788
setPowerMode(const sp<IBinder> & display,int mode)3789 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
3790 class MessageSetPowerMode: public MessageBase {
3791 SurfaceFlinger& mFlinger;
3792 sp<IBinder> mDisplay;
3793 int mMode;
3794 public:
3795 MessageSetPowerMode(SurfaceFlinger& flinger,
3796 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
3797 mDisplay(disp) { mMode = mode; }
3798 virtual bool handler() {
3799 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
3800 if (hw == nullptr) {
3801 ALOGE("Attempt to set power mode = %d for null display %p",
3802 mMode, mDisplay.get());
3803 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
3804 ALOGW("Attempt to set power mode = %d for virtual display",
3805 mMode);
3806 } else {
3807 mFlinger.setPowerModeInternal(
3808 hw, mMode, /*stateLockHeld*/ false);
3809 }
3810 return true;
3811 }
3812 };
3813 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
3814 postMessageSync(msg);
3815 }
3816
3817 // ---------------------------------------------------------------------------
3818
doDump(int fd,const Vector<String16> & args,bool asProto)3819 status_t SurfaceFlinger::doDump(int fd, const Vector<String16>& args, bool asProto)
3820 NO_THREAD_SAFETY_ANALYSIS {
3821 String8 result;
3822
3823 IPCThreadState* ipc = IPCThreadState::self();
3824 const int pid = ipc->getCallingPid();
3825 const int uid = ipc->getCallingUid();
3826
3827 if ((uid != AID_SHELL) &&
3828 !PermissionCache::checkPermission(sDump, pid, uid)) {
3829 result.appendFormat("Permission Denial: "
3830 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3831 } else {
3832 // Try to get the main lock, but give up after one second
3833 // (this would indicate SF is stuck, but we want to be able to
3834 // print something in dumpsys).
3835 status_t err = mStateLock.timedLock(s2ns(1));
3836 bool locked = (err == NO_ERROR);
3837 if (!locked) {
3838 result.appendFormat(
3839 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3840 "dumping anyways (no locks held)\n", strerror(-err), err);
3841 }
3842
3843 bool dumpAll = true;
3844 size_t index = 0;
3845 size_t numArgs = args.size();
3846
3847 if (numArgs) {
3848 if ((index < numArgs) &&
3849 (args[index] == String16("--list"))) {
3850 index++;
3851 listLayersLocked(args, index, result);
3852 dumpAll = false;
3853 }
3854
3855 if ((index < numArgs) &&
3856 (args[index] == String16("--latency"))) {
3857 index++;
3858 dumpStatsLocked(args, index, result);
3859 dumpAll = false;
3860 }
3861
3862 if ((index < numArgs) &&
3863 (args[index] == String16("--latency-clear"))) {
3864 index++;
3865 clearStatsLocked(args, index, result);
3866 dumpAll = false;
3867 }
3868
3869 if ((index < numArgs) &&
3870 (args[index] == String16("--dispsync"))) {
3871 index++;
3872 mPrimaryDispSync.dump(result);
3873 dumpAll = false;
3874 }
3875
3876 if ((index < numArgs) &&
3877 (args[index] == String16("--static-screen"))) {
3878 index++;
3879 dumpStaticScreenStats(result);
3880 dumpAll = false;
3881 }
3882
3883 if ((index < numArgs) &&
3884 (args[index] == String16("--frame-events"))) {
3885 index++;
3886 dumpFrameEventsLocked(result);
3887 dumpAll = false;
3888 }
3889
3890 if ((index < numArgs) && (args[index] == String16("--wide-color"))) {
3891 index++;
3892 dumpWideColorInfo(result);
3893 dumpAll = false;
3894 }
3895
3896 if ((index < numArgs) &&
3897 (args[index] == String16("--enable-layer-stats"))) {
3898 index++;
3899 mLayerStats.enable();
3900 dumpAll = false;
3901 }
3902
3903 if ((index < numArgs) &&
3904 (args[index] == String16("--disable-layer-stats"))) {
3905 index++;
3906 mLayerStats.disable();
3907 dumpAll = false;
3908 }
3909
3910 if ((index < numArgs) &&
3911 (args[index] == String16("--clear-layer-stats"))) {
3912 index++;
3913 mLayerStats.clear();
3914 dumpAll = false;
3915 }
3916
3917 if ((index < numArgs) &&
3918 (args[index] == String16("--dump-layer-stats"))) {
3919 index++;
3920 mLayerStats.dump(result);
3921 dumpAll = false;
3922 }
3923
3924 if ((index < numArgs) && (args[index] == String16("--timestats"))) {
3925 index++;
3926 mTimeStats.parseArgs(asProto, args, index, result);
3927 dumpAll = false;
3928 }
3929 }
3930
3931 if (dumpAll) {
3932 if (asProto) {
3933 LayersProto layersProto = dumpProtoInfo(LayerVector::StateSet::Current);
3934 result.append(layersProto.SerializeAsString().c_str(), layersProto.ByteSize());
3935 } else {
3936 dumpAllLocked(args, index, result);
3937 }
3938 }
3939
3940 if (locked) {
3941 mStateLock.unlock();
3942 }
3943 }
3944 write(fd, result.string(), result.size());
3945 return NO_ERROR;
3946 }
3947
listLayersLocked(const Vector<String16> &,size_t &,String8 & result) const3948 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3949 size_t& /* index */, String8& result) const
3950 {
3951 mCurrentState.traverseInZOrder([&](Layer* layer) {
3952 result.appendFormat("%s\n", layer->getName().string());
3953 });
3954 }
3955
dumpStatsLocked(const Vector<String16> & args,size_t & index,String8 & result) const3956 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3957 String8& result) const
3958 {
3959 String8 name;
3960 if (index < args.size()) {
3961 name = String8(args[index]);
3962 index++;
3963 }
3964
3965 const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3966 const nsecs_t period = activeConfig->getVsyncPeriod();
3967 result.appendFormat("%" PRId64 "\n", period);
3968
3969 if (name.isEmpty()) {
3970 mAnimFrameTracker.dumpStats(result);
3971 } else {
3972 mCurrentState.traverseInZOrder([&](Layer* layer) {
3973 if (name == layer->getName()) {
3974 layer->dumpFrameStats(result);
3975 }
3976 });
3977 }
3978 }
3979
clearStatsLocked(const Vector<String16> & args,size_t & index,String8 &)3980 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3981 String8& /* result */)
3982 {
3983 String8 name;
3984 if (index < args.size()) {
3985 name = String8(args[index]);
3986 index++;
3987 }
3988
3989 mCurrentState.traverseInZOrder([&](Layer* layer) {
3990 if (name.isEmpty() || (name == layer->getName())) {
3991 layer->clearFrameStats();
3992 }
3993 });
3994
3995 mAnimFrameTracker.clearStats();
3996 }
3997
3998 // This should only be called from the main thread. Otherwise it would need
3999 // the lock and should use mCurrentState rather than mDrawingState.
logFrameStats()4000 void SurfaceFlinger::logFrameStats() {
4001 mDrawingState.traverseInZOrder([&](Layer* layer) {
4002 layer->logFrameStats();
4003 });
4004
4005 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
4006 }
4007
appendSfConfigString(String8 & result) const4008 void SurfaceFlinger::appendSfConfigString(String8& result) const
4009 {
4010 result.append(" [sf");
4011
4012 if (isLayerTripleBufferingDisabled())
4013 result.append(" DISABLE_TRIPLE_BUFFERING");
4014
4015 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64 , dispSyncPresentTimeOffset);
4016 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
4017 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
4018 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
4019 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
4020 maxFrameBufferAcquiredBuffers);
4021 result.append("]");
4022 }
4023
dumpStaticScreenStats(String8 & result) const4024 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
4025 {
4026 result.appendFormat("Static screen stats:\n");
4027 for (size_t b = 0; b < SurfaceFlingerBE::NUM_BUCKETS - 1; ++b) {
4028 float bucketTimeSec = getBE().mFrameBuckets[b] / 1e9;
4029 float percent = 100.0f *
4030 static_cast<float>(getBE().mFrameBuckets[b]) / getBE().mTotalTime;
4031 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
4032 b + 1, bucketTimeSec, percent);
4033 }
4034 float bucketTimeSec = getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] / 1e9;
4035 float percent = 100.0f *
4036 static_cast<float>(getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1]) / getBE().mTotalTime;
4037 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
4038 SurfaceFlingerBE::NUM_BUCKETS - 1, bucketTimeSec, percent);
4039 }
4040
recordBufferingStats(const char * layerName,std::vector<OccupancyTracker::Segment> && history)4041 void SurfaceFlinger::recordBufferingStats(const char* layerName,
4042 std::vector<OccupancyTracker::Segment>&& history) {
4043 Mutex::Autolock lock(getBE().mBufferingStatsMutex);
4044 auto& stats = getBE().mBufferingStats[layerName];
4045 for (const auto& segment : history) {
4046 if (!segment.usedThirdBuffer) {
4047 stats.twoBufferTime += segment.totalTime;
4048 }
4049 if (segment.occupancyAverage < 1.0f) {
4050 stats.doubleBufferedTime += segment.totalTime;
4051 } else if (segment.occupancyAverage < 2.0f) {
4052 stats.tripleBufferedTime += segment.totalTime;
4053 }
4054 ++stats.numSegments;
4055 stats.totalTime += segment.totalTime;
4056 }
4057 }
4058
dumpFrameEventsLocked(String8 & result)4059 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
4060 result.appendFormat("Layer frame timestamps:\n");
4061
4062 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
4063 const size_t count = currentLayers.size();
4064 for (size_t i=0 ; i<count ; i++) {
4065 currentLayers[i]->dumpFrameEvents(result);
4066 }
4067 }
4068
dumpBufferingStats(String8 & result) const4069 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
4070 result.append("Buffering stats:\n");
4071 result.append(" [Layer name] <Active time> <Two buffer> "
4072 "<Double buffered> <Triple buffered>\n");
4073 Mutex::Autolock lock(getBE().mBufferingStatsMutex);
4074 typedef std::tuple<std::string, float, float, float> BufferTuple;
4075 std::map<float, BufferTuple, std::greater<float>> sorted;
4076 for (const auto& statsPair : getBE().mBufferingStats) {
4077 const char* name = statsPair.first.c_str();
4078 const SurfaceFlingerBE::BufferingStats& stats = statsPair.second;
4079 if (stats.numSegments == 0) {
4080 continue;
4081 }
4082 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
4083 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
4084 stats.totalTime;
4085 float doubleBufferRatio = static_cast<float>(
4086 stats.doubleBufferedTime) / stats.totalTime;
4087 float tripleBufferRatio = static_cast<float>(
4088 stats.tripleBufferedTime) / stats.totalTime;
4089 sorted.insert({activeTime, {name, twoBufferRatio,
4090 doubleBufferRatio, tripleBufferRatio}});
4091 }
4092 for (const auto& sortedPair : sorted) {
4093 float activeTime = sortedPair.first;
4094 const BufferTuple& values = sortedPair.second;
4095 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
4096 std::get<0>(values).c_str(), activeTime,
4097 std::get<1>(values), std::get<2>(values),
4098 std::get<3>(values));
4099 }
4100 result.append("\n");
4101 }
4102
dumpWideColorInfo(String8 & result) const4103 void SurfaceFlinger::dumpWideColorInfo(String8& result) const {
4104 result.appendFormat("hasWideColorDisplay: %d\n", hasWideColorDisplay);
4105 result.appendFormat("DisplayColorSetting: %s\n",
4106 decodeDisplayColorSetting(mDisplayColorSetting).c_str());
4107
4108 // TODO: print out if wide-color mode is active or not
4109
4110 for (size_t d = 0; d < mDisplays.size(); d++) {
4111 const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
4112 int32_t hwcId = displayDevice->getHwcDisplayId();
4113 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
4114 continue;
4115 }
4116
4117 result.appendFormat("Display %d color modes:\n", hwcId);
4118 std::vector<ColorMode> modes = getHwComposer().getColorModes(hwcId);
4119 for (auto&& mode : modes) {
4120 result.appendFormat(" %s (%d)\n", decodeColorMode(mode).c_str(), mode);
4121 }
4122
4123 ColorMode currentMode = displayDevice->getActiveColorMode();
4124 result.appendFormat(" Current color mode: %s (%d)\n",
4125 decodeColorMode(currentMode).c_str(), currentMode);
4126 }
4127 result.append("\n");
4128 }
4129
dumpProtoInfo(LayerVector::StateSet stateSet) const4130 LayersProto SurfaceFlinger::dumpProtoInfo(LayerVector::StateSet stateSet) const {
4131 LayersProto layersProto;
4132 const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
4133 const State& state = useDrawing ? mDrawingState : mCurrentState;
4134 state.traverseInZOrder([&](Layer* layer) {
4135 LayerProto* layerProto = layersProto.add_layers();
4136 layer->writeToProto(layerProto, stateSet);
4137 });
4138
4139 return layersProto;
4140 }
4141
dumpVisibleLayersProtoInfo(int32_t hwcId) const4142 LayersProto SurfaceFlinger::dumpVisibleLayersProtoInfo(int32_t hwcId) const {
4143 LayersProto layersProto;
4144 const sp<DisplayDevice>& displayDevice(mDisplays[hwcId]);
4145
4146 SizeProto* resolution = layersProto.mutable_resolution();
4147 resolution->set_w(displayDevice->getWidth());
4148 resolution->set_h(displayDevice->getHeight());
4149
4150 layersProto.set_color_mode(decodeColorMode(displayDevice->getActiveColorMode()));
4151 layersProto.set_color_transform(decodeColorTransform(displayDevice->getColorTransform()));
4152 layersProto.set_global_transform(
4153 static_cast<int32_t>(displayDevice->getOrientationTransform()));
4154
4155 mDrawingState.traverseInZOrder([&](Layer* layer) {
4156 if (!layer->visibleRegion.isEmpty() && layer->getBE().mHwcLayers.count(hwcId)) {
4157 LayerProto* layerProto = layersProto.add_layers();
4158 layer->writeToProto(layerProto, hwcId);
4159 }
4160 });
4161
4162 return layersProto;
4163 }
4164
dumpAllLocked(const Vector<String16> & args,size_t & index,String8 & result) const4165 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
4166 String8& result) const
4167 {
4168 bool colorize = false;
4169 if (index < args.size()
4170 && (args[index] == String16("--color"))) {
4171 colorize = true;
4172 index++;
4173 }
4174
4175 Colorizer colorizer(colorize);
4176
4177 // figure out if we're stuck somewhere
4178 const nsecs_t now = systemTime();
4179 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
4180 const nsecs_t inTransaction(mDebugInTransaction);
4181 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
4182 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
4183
4184 /*
4185 * Dump library configuration.
4186 */
4187
4188 colorizer.bold(result);
4189 result.append("Build configuration:");
4190 colorizer.reset(result);
4191 appendSfConfigString(result);
4192 appendUiConfigString(result);
4193 appendGuiConfigString(result);
4194 result.append("\n");
4195
4196 result.append("\nWide-Color information:\n");
4197 dumpWideColorInfo(result);
4198
4199 colorizer.bold(result);
4200 result.append("Sync configuration: ");
4201 colorizer.reset(result);
4202 result.append(SyncFeatures::getInstance().toString());
4203 result.append("\n");
4204
4205 const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
4206
4207 colorizer.bold(result);
4208 result.append("DispSync configuration: ");
4209 colorizer.reset(result);
4210 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, early sf phase %" PRId64
4211 " ns, present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
4212 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, mVsyncModulator.getEarlyPhaseOffset(),
4213 dispSyncPresentTimeOffset, activeConfig->getVsyncPeriod());
4214 result.append("\n");
4215
4216 // Dump static screen stats
4217 result.append("\n");
4218 dumpStaticScreenStats(result);
4219 result.append("\n");
4220
4221 dumpBufferingStats(result);
4222
4223 /*
4224 * Dump the visible layer list
4225 */
4226 colorizer.bold(result);
4227 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
4228 result.appendFormat("GraphicBufferProducers: %zu, max %zu\n",
4229 mGraphicBufferProducerList.size(), mMaxGraphicBufferProducerListSize);
4230 colorizer.reset(result);
4231
4232 LayersProto layersProto = dumpProtoInfo(LayerVector::StateSet::Current);
4233 auto layerTree = LayerProtoParser::generateLayerTree(layersProto);
4234 result.append(LayerProtoParser::layersToString(std::move(layerTree)).c_str());
4235 result.append("\n");
4236
4237 /*
4238 * Dump Display state
4239 */
4240
4241 colorizer.bold(result);
4242 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
4243 colorizer.reset(result);
4244 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
4245 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
4246 hw->dump(result);
4247 }
4248 result.append("\n");
4249
4250 /*
4251 * Dump SurfaceFlinger global state
4252 */
4253
4254 colorizer.bold(result);
4255 result.append("SurfaceFlinger global state:\n");
4256 colorizer.reset(result);
4257
4258 HWComposer& hwc(getHwComposer());
4259 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
4260
4261 getBE().mRenderEngine->dump(result);
4262
4263 if (hw) {
4264 hw->undefinedRegion.dump(result, "undefinedRegion");
4265 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
4266 hw->getOrientation(), hw->isDisplayOn());
4267 }
4268 result.appendFormat(
4269 " last eglSwapBuffers() time: %f us\n"
4270 " last transaction time : %f us\n"
4271 " transaction-flags : %08x\n"
4272 " refresh-rate : %f fps\n"
4273 " x-dpi : %f\n"
4274 " y-dpi : %f\n"
4275 " gpu_to_cpu_unsupported : %d\n"
4276 ,
4277 mLastSwapBufferTime/1000.0,
4278 mLastTransactionTime/1000.0,
4279 mTransactionFlags,
4280 1e9 / activeConfig->getVsyncPeriod(),
4281 activeConfig->getDpiX(),
4282 activeConfig->getDpiY(),
4283 !mGpuToCpuSupported);
4284
4285 result.appendFormat(" eglSwapBuffers time: %f us\n",
4286 inSwapBuffersDuration/1000.0);
4287
4288 result.appendFormat(" transaction time: %f us\n",
4289 inTransactionDuration/1000.0);
4290
4291 /*
4292 * VSYNC state
4293 */
4294 mEventThread->dump(result);
4295 result.append("\n");
4296
4297 /*
4298 * HWC layer minidump
4299 */
4300 for (size_t d = 0; d < mDisplays.size(); d++) {
4301 const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
4302 int32_t hwcId = displayDevice->getHwcDisplayId();
4303 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
4304 continue;
4305 }
4306
4307 result.appendFormat("Display %d HWC layers:\n", hwcId);
4308 Layer::miniDumpHeader(result);
4309 mCurrentState.traverseInZOrder([&](Layer* layer) {
4310 layer->miniDump(result, hwcId);
4311 });
4312 result.append("\n");
4313 }
4314
4315 /*
4316 * Dump HWComposer state
4317 */
4318 colorizer.bold(result);
4319 result.append("h/w composer state:\n");
4320 colorizer.reset(result);
4321 bool hwcDisabled = mDebugDisableHWC || mDebugRegion;
4322 result.appendFormat(" h/w composer %s\n",
4323 hwcDisabled ? "disabled" : "enabled");
4324 hwc.dump(result);
4325
4326 /*
4327 * Dump gralloc state
4328 */
4329 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
4330 alloc.dump(result);
4331
4332 /*
4333 * Dump VrFlinger state if in use.
4334 */
4335 if (mVrFlingerRequestsDisplay && mVrFlinger) {
4336 result.append("VrFlinger state:\n");
4337 result.append(mVrFlinger->Dump().c_str());
4338 result.append("\n");
4339 }
4340 }
4341
4342 const Vector< sp<Layer> >&
getLayerSortedByZForHwcDisplay(int id)4343 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
4344 // Note: mStateLock is held here
4345 wp<IBinder> dpy;
4346 for (size_t i=0 ; i<mDisplays.size() ; i++) {
4347 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
4348 dpy = mDisplays.keyAt(i);
4349 break;
4350 }
4351 }
4352 if (dpy == nullptr) {
4353 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
4354 // Just use the primary display so we have something to return
4355 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
4356 }
4357 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
4358 }
4359
startDdmConnection()4360 bool SurfaceFlinger::startDdmConnection()
4361 {
4362 void* libddmconnection_dso =
4363 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
4364 if (!libddmconnection_dso) {
4365 return false;
4366 }
4367 void (*DdmConnection_start)(const char* name);
4368 DdmConnection_start =
4369 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
4370 if (!DdmConnection_start) {
4371 dlclose(libddmconnection_dso);
4372 return false;
4373 }
4374 (*DdmConnection_start)(getServiceName());
4375 return true;
4376 }
4377
updateColorMatrixLocked()4378 void SurfaceFlinger::updateColorMatrixLocked() {
4379 mat4 colorMatrix;
4380 if (mGlobalSaturationFactor != 1.0f) {
4381 // Rec.709 luma coefficients
4382 float3 luminance{0.213f, 0.715f, 0.072f};
4383 luminance *= 1.0f - mGlobalSaturationFactor;
4384 mat4 saturationMatrix = mat4(
4385 vec4{luminance.r + mGlobalSaturationFactor, luminance.r, luminance.r, 0.0f},
4386 vec4{luminance.g, luminance.g + mGlobalSaturationFactor, luminance.g, 0.0f},
4387 vec4{luminance.b, luminance.b, luminance.b + mGlobalSaturationFactor, 0.0f},
4388 vec4{0.0f, 0.0f, 0.0f, 1.0f}
4389 );
4390 colorMatrix = mClientColorMatrix * saturationMatrix * mDaltonizer();
4391 } else {
4392 colorMatrix = mClientColorMatrix * mDaltonizer();
4393 }
4394
4395 if (mCurrentState.colorMatrix != colorMatrix) {
4396 mCurrentState.colorMatrix = colorMatrix;
4397 mCurrentState.colorMatrixChanged = true;
4398 setTransactionFlags(eTransactionNeeded);
4399 }
4400 }
4401
CheckTransactCodeCredentials(uint32_t code)4402 status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
4403 switch (code) {
4404 case CREATE_CONNECTION:
4405 case CREATE_DISPLAY:
4406 case BOOT_FINISHED:
4407 case CLEAR_ANIMATION_FRAME_STATS:
4408 case GET_ANIMATION_FRAME_STATS:
4409 case SET_POWER_MODE:
4410 case GET_HDR_CAPABILITIES:
4411 case ENABLE_VSYNC_INJECTIONS:
4412 case INJECT_VSYNC:
4413 {
4414 // codes that require permission check
4415 IPCThreadState* ipc = IPCThreadState::self();
4416 const int pid = ipc->getCallingPid();
4417 const int uid = ipc->getCallingUid();
4418 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
4419 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
4420 ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
4421 return PERMISSION_DENIED;
4422 }
4423 break;
4424 }
4425 /*
4426 * Calling setTransactionState is safe, because you need to have been
4427 * granted a reference to Client* and Handle* to do anything with it.
4428 *
4429 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
4430 */
4431 case SET_TRANSACTION_STATE:
4432 case CREATE_SCOPED_CONNECTION:
4433 {
4434 return OK;
4435 }
4436 case CAPTURE_SCREEN:
4437 {
4438 // codes that require permission check
4439 IPCThreadState* ipc = IPCThreadState::self();
4440 const int pid = ipc->getCallingPid();
4441 const int uid = ipc->getCallingUid();
4442 if ((uid != AID_GRAPHICS) &&
4443 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
4444 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
4445 return PERMISSION_DENIED;
4446 }
4447 break;
4448 }
4449 case CAPTURE_LAYERS: {
4450 IPCThreadState* ipc = IPCThreadState::self();
4451 const int pid = ipc->getCallingPid();
4452 const int uid = ipc->getCallingUid();
4453 if ((uid != AID_GRAPHICS) &&
4454 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
4455 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
4456 return PERMISSION_DENIED;
4457 }
4458 break;
4459 }
4460 }
4461 return OK;
4462 }
4463
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)4464 status_t SurfaceFlinger::onTransact(
4465 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
4466 {
4467 status_t credentialCheck = CheckTransactCodeCredentials(code);
4468 if (credentialCheck != OK) {
4469 return credentialCheck;
4470 }
4471
4472 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
4473 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
4474 CHECK_INTERFACE(ISurfaceComposer, data, reply);
4475 IPCThreadState* ipc = IPCThreadState::self();
4476 const int uid = ipc->getCallingUid();
4477 if (CC_UNLIKELY(uid != AID_SYSTEM
4478 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
4479 const int pid = ipc->getCallingPid();
4480 ALOGE("Permission Denial: "
4481 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
4482 return PERMISSION_DENIED;
4483 }
4484 int n;
4485 switch (code) {
4486 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
4487 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
4488 return NO_ERROR;
4489 case 1002: // SHOW_UPDATES
4490 n = data.readInt32();
4491 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
4492 invalidateHwcGeometry();
4493 repaintEverything();
4494 return NO_ERROR;
4495 case 1004:{ // repaint everything
4496 repaintEverything();
4497 return NO_ERROR;
4498 }
4499 case 1005:{ // force transaction
4500 Mutex::Autolock _l(mStateLock);
4501 setTransactionFlags(
4502 eTransactionNeeded|
4503 eDisplayTransactionNeeded|
4504 eTraversalNeeded);
4505 return NO_ERROR;
4506 }
4507 case 1006:{ // send empty update
4508 signalRefresh();
4509 return NO_ERROR;
4510 }
4511 case 1008: // toggle use of hw composer
4512 n = data.readInt32();
4513 mDebugDisableHWC = n ? 1 : 0;
4514 invalidateHwcGeometry();
4515 repaintEverything();
4516 return NO_ERROR;
4517 case 1009: // toggle use of transform hint
4518 n = data.readInt32();
4519 mDebugDisableTransformHint = n ? 1 : 0;
4520 invalidateHwcGeometry();
4521 repaintEverything();
4522 return NO_ERROR;
4523 case 1010: // interrogate.
4524 reply->writeInt32(0);
4525 reply->writeInt32(0);
4526 reply->writeInt32(mDebugRegion);
4527 reply->writeInt32(0);
4528 reply->writeInt32(mDebugDisableHWC);
4529 return NO_ERROR;
4530 case 1013: {
4531 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
4532 reply->writeInt32(hw->getPageFlipCount());
4533 return NO_ERROR;
4534 }
4535 case 1014: {
4536 Mutex::Autolock _l(mStateLock);
4537 // daltonize
4538 n = data.readInt32();
4539 switch (n % 10) {
4540 case 1:
4541 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
4542 break;
4543 case 2:
4544 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
4545 break;
4546 case 3:
4547 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
4548 break;
4549 default:
4550 mDaltonizer.setType(ColorBlindnessType::None);
4551 break;
4552 }
4553 if (n >= 10) {
4554 mDaltonizer.setMode(ColorBlindnessMode::Correction);
4555 } else {
4556 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
4557 }
4558
4559 updateColorMatrixLocked();
4560 return NO_ERROR;
4561 }
4562 case 1015: {
4563 Mutex::Autolock _l(mStateLock);
4564 // apply a color matrix
4565 n = data.readInt32();
4566 if (n) {
4567 // color matrix is sent as a column-major mat4 matrix
4568 for (size_t i = 0 ; i < 4; i++) {
4569 for (size_t j = 0; j < 4; j++) {
4570 mClientColorMatrix[i][j] = data.readFloat();
4571 }
4572 }
4573 } else {
4574 mClientColorMatrix = mat4();
4575 }
4576
4577 // Check that supplied matrix's last row is {0,0,0,1} so we can avoid
4578 // the division by w in the fragment shader
4579 float4 lastRow(transpose(mClientColorMatrix)[3]);
4580 if (any(greaterThan(abs(lastRow - float4{0, 0, 0, 1}), float4{1e-4f}))) {
4581 ALOGE("The color transform's last row must be (0, 0, 0, 1)");
4582 }
4583
4584 updateColorMatrixLocked();
4585 return NO_ERROR;
4586 }
4587 // This is an experimental interface
4588 // Needs to be shifted to proper binder interface when we productize
4589 case 1016: {
4590 n = data.readInt32();
4591 mPrimaryDispSync.setRefreshSkipCount(n);
4592 return NO_ERROR;
4593 }
4594 case 1017: {
4595 n = data.readInt32();
4596 mForceFullDamage = static_cast<bool>(n);
4597 return NO_ERROR;
4598 }
4599 case 1018: { // Modify Choreographer's phase offset
4600 n = data.readInt32();
4601 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4602 return NO_ERROR;
4603 }
4604 case 1019: { // Modify SurfaceFlinger's phase offset
4605 n = data.readInt32();
4606 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4607 return NO_ERROR;
4608 }
4609 case 1020: { // Layer updates interceptor
4610 n = data.readInt32();
4611 if (n) {
4612 ALOGV("Interceptor enabled");
4613 mInterceptor->enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
4614 }
4615 else{
4616 ALOGV("Interceptor disabled");
4617 mInterceptor->disable();
4618 }
4619 return NO_ERROR;
4620 }
4621 case 1021: { // Disable HWC virtual displays
4622 n = data.readInt32();
4623 mUseHwcVirtualDisplays = !n;
4624 return NO_ERROR;
4625 }
4626 case 1022: { // Set saturation boost
4627 Mutex::Autolock _l(mStateLock);
4628 mGlobalSaturationFactor = std::max(0.0f, std::min(data.readFloat(), 2.0f));
4629
4630 updateColorMatrixLocked();
4631 return NO_ERROR;
4632 }
4633 case 1023: { // Set native mode
4634 mDisplayColorSetting = static_cast<DisplayColorSetting>(data.readInt32());
4635 invalidateHwcGeometry();
4636 repaintEverything();
4637 return NO_ERROR;
4638 }
4639 case 1024: { // Is wide color gamut rendering/color management supported?
4640 reply->writeBool(hasWideColorDisplay);
4641 return NO_ERROR;
4642 }
4643 case 1025: { // Set layer tracing
4644 n = data.readInt32();
4645 if (n) {
4646 ALOGV("LayerTracing enabled");
4647 mTracing.enable();
4648 doTracing("tracing.enable");
4649 reply->writeInt32(NO_ERROR);
4650 } else {
4651 ALOGV("LayerTracing disabled");
4652 status_t err = mTracing.disable();
4653 reply->writeInt32(err);
4654 }
4655 return NO_ERROR;
4656 }
4657 case 1026: { // Get layer tracing status
4658 reply->writeBool(mTracing.isEnabled());
4659 return NO_ERROR;
4660 }
4661 // Is a DisplayColorSetting supported?
4662 case 1027: {
4663 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
4664 if (!hw) {
4665 return NAME_NOT_FOUND;
4666 }
4667
4668 DisplayColorSetting setting = static_cast<DisplayColorSetting>(data.readInt32());
4669 switch (setting) {
4670 case DisplayColorSetting::MANAGED:
4671 reply->writeBool(hasWideColorDisplay);
4672 break;
4673 case DisplayColorSetting::UNMANAGED:
4674 reply->writeBool(true);
4675 break;
4676 case DisplayColorSetting::ENHANCED:
4677 reply->writeBool(hw->hasRenderIntent(RenderIntent::ENHANCE));
4678 break;
4679 default: // vendor display color setting
4680 reply->writeBool(hw->hasRenderIntent(static_cast<RenderIntent>(setting)));
4681 break;
4682 }
4683 return NO_ERROR;
4684 }
4685 }
4686 }
4687 return err;
4688 }
4689
repaintEverything()4690 void SurfaceFlinger::repaintEverything() {
4691 android_atomic_or(1, &mRepaintEverything);
4692 signalTransaction();
4693 }
4694
4695 // A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
4696 class WindowDisconnector {
4697 public:
WindowDisconnector(ANativeWindow * window,int api)4698 WindowDisconnector(ANativeWindow* window, int api) : mWindow(window), mApi(api) {}
~WindowDisconnector()4699 ~WindowDisconnector() {
4700 native_window_api_disconnect(mWindow, mApi);
4701 }
4702
4703 private:
4704 ANativeWindow* mWindow;
4705 const int mApi;
4706 };
4707
captureScreen(const sp<IBinder> & display,sp<GraphicBuffer> * outBuffer,Rect sourceCrop,uint32_t reqWidth,uint32_t reqHeight,int32_t minLayerZ,int32_t maxLayerZ,bool useIdentityTransform,ISurfaceComposer::Rotation rotation)4708 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display, sp<GraphicBuffer>* outBuffer,
4709 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
4710 int32_t minLayerZ, int32_t maxLayerZ,
4711 bool useIdentityTransform,
4712 ISurfaceComposer::Rotation rotation) {
4713 ATRACE_CALL();
4714
4715 if (CC_UNLIKELY(display == 0)) return BAD_VALUE;
4716
4717 const sp<const DisplayDevice> device(getDisplayDeviceLocked(display));
4718 if (CC_UNLIKELY(device == 0)) return BAD_VALUE;
4719
4720 DisplayRenderArea renderArea(device, sourceCrop, reqHeight, reqWidth, rotation);
4721
4722 auto traverseLayers = std::bind(std::mem_fn(&SurfaceFlinger::traverseLayersInDisplay), this,
4723 device, minLayerZ, maxLayerZ, std::placeholders::_1);
4724 return captureScreenCommon(renderArea, traverseLayers, outBuffer, useIdentityTransform);
4725 }
4726
captureLayers(const sp<IBinder> & layerHandleBinder,sp<GraphicBuffer> * outBuffer,const Rect & sourceCrop,float frameScale,bool childrenOnly)4727 status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder,
4728 sp<GraphicBuffer>* outBuffer, const Rect& sourceCrop,
4729 float frameScale, bool childrenOnly) {
4730 ATRACE_CALL();
4731
4732 class LayerRenderArea : public RenderArea {
4733 public:
4734 LayerRenderArea(SurfaceFlinger* flinger, const sp<Layer>& layer, const Rect crop,
4735 int32_t reqWidth, int32_t reqHeight, bool childrenOnly)
4736 : RenderArea(reqHeight, reqWidth, CaptureFill::CLEAR),
4737 mLayer(layer),
4738 mCrop(crop),
4739 mFlinger(flinger),
4740 mChildrenOnly(childrenOnly) {}
4741 const Transform& getTransform() const override { return mTransform; }
4742 Rect getBounds() const override {
4743 const Layer::State& layerState(mLayer->getDrawingState());
4744 return Rect(layerState.active.w, layerState.active.h);
4745 }
4746 int getHeight() const override { return mLayer->getDrawingState().active.h; }
4747 int getWidth() const override { return mLayer->getDrawingState().active.w; }
4748 bool isSecure() const override { return false; }
4749 bool needsFiltering() const override { return false; }
4750 Rect getSourceCrop() const override {
4751 if (mCrop.isEmpty()) {
4752 return getBounds();
4753 } else {
4754 return mCrop;
4755 }
4756 }
4757 class ReparentForDrawing {
4758 public:
4759 const sp<Layer>& oldParent;
4760 const sp<Layer>& newParent;
4761
4762 ReparentForDrawing(const sp<Layer>& oldParent, const sp<Layer>& newParent)
4763 : oldParent(oldParent), newParent(newParent) {
4764 oldParent->setChildrenDrawingParent(newParent);
4765 }
4766 ~ReparentForDrawing() { oldParent->setChildrenDrawingParent(oldParent); }
4767 };
4768
4769 void render(std::function<void()> drawLayers) override {
4770 if (!mChildrenOnly) {
4771 mTransform = mLayer->getTransform().inverse();
4772 drawLayers();
4773 } else {
4774 Rect bounds = getBounds();
4775 screenshotParentLayer =
4776 new ContainerLayer(mFlinger, nullptr, String8("Screenshot Parent"),
4777 bounds.getWidth(), bounds.getHeight(), 0);
4778
4779 ReparentForDrawing reparent(mLayer, screenshotParentLayer);
4780 drawLayers();
4781 }
4782 }
4783
4784 private:
4785 const sp<Layer> mLayer;
4786 const Rect mCrop;
4787
4788 // In the "childrenOnly" case we reparent the children to a screenshot
4789 // layer which has no properties set and which does not draw.
4790 sp<ContainerLayer> screenshotParentLayer;
4791 Transform mTransform;
4792
4793 SurfaceFlinger* mFlinger;
4794 const bool mChildrenOnly;
4795 };
4796
4797 auto layerHandle = reinterpret_cast<Layer::Handle*>(layerHandleBinder.get());
4798 auto parent = layerHandle->owner.promote();
4799
4800 if (parent == nullptr || parent->isPendingRemoval()) {
4801 ALOGE("captureLayers called with a removed parent");
4802 return NAME_NOT_FOUND;
4803 }
4804
4805 const int uid = IPCThreadState::self()->getCallingUid();
4806 const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM;
4807 if (!forSystem && parent->getCurrentState().flags & layer_state_t::eLayerSecure) {
4808 ALOGW("Attempting to capture secure layer: PERMISSION_DENIED");
4809 return PERMISSION_DENIED;
4810 }
4811
4812 Rect crop(sourceCrop);
4813 if (sourceCrop.width() <= 0) {
4814 crop.left = 0;
4815 crop.right = parent->getCurrentState().active.w;
4816 }
4817
4818 if (sourceCrop.height() <= 0) {
4819 crop.top = 0;
4820 crop.bottom = parent->getCurrentState().active.h;
4821 }
4822
4823 int32_t reqWidth = crop.width() * frameScale;
4824 int32_t reqHeight = crop.height() * frameScale;
4825
4826 LayerRenderArea renderArea(this, parent, crop, reqWidth, reqHeight, childrenOnly);
4827
4828 auto traverseLayers = [parent, childrenOnly](const LayerVector::Visitor& visitor) {
4829 parent->traverseChildrenInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4830 if (!layer->isVisible()) {
4831 return;
4832 } else if (childrenOnly && layer == parent.get()) {
4833 return;
4834 }
4835 visitor(layer);
4836 });
4837 };
4838 return captureScreenCommon(renderArea, traverseLayers, outBuffer, false);
4839 }
4840
captureScreenCommon(RenderArea & renderArea,TraverseLayersFunction traverseLayers,sp<GraphicBuffer> * outBuffer,bool useIdentityTransform)4841 status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea,
4842 TraverseLayersFunction traverseLayers,
4843 sp<GraphicBuffer>* outBuffer,
4844 bool useIdentityTransform) {
4845 ATRACE_CALL();
4846
4847 renderArea.updateDimensions(mPrimaryDisplayOrientation);
4848
4849 const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
4850 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
4851 *outBuffer = new GraphicBuffer(renderArea.getReqWidth(), renderArea.getReqHeight(),
4852 HAL_PIXEL_FORMAT_RGBA_8888, 1, usage, "screenshot");
4853
4854 // This mutex protects syncFd and captureResult for communication of the return values from the
4855 // main thread back to this Binder thread
4856 std::mutex captureMutex;
4857 std::condition_variable captureCondition;
4858 std::unique_lock<std::mutex> captureLock(captureMutex);
4859 int syncFd = -1;
4860 std::optional<status_t> captureResult;
4861
4862 const int uid = IPCThreadState::self()->getCallingUid();
4863 const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM;
4864
4865 sp<LambdaMessage> message = new LambdaMessage([&]() {
4866 // If there is a refresh pending, bug out early and tell the binder thread to try again
4867 // after the refresh.
4868 if (mRefreshPending) {
4869 ATRACE_NAME("Skipping screenshot for now");
4870 std::unique_lock<std::mutex> captureLock(captureMutex);
4871 captureResult = std::make_optional<status_t>(EAGAIN);
4872 captureCondition.notify_one();
4873 return;
4874 }
4875
4876 status_t result = NO_ERROR;
4877 int fd = -1;
4878 {
4879 Mutex::Autolock _l(mStateLock);
4880 renderArea.render([&]() {
4881 result = captureScreenImplLocked(renderArea, traverseLayers, (*outBuffer).get(),
4882 useIdentityTransform, forSystem, &fd);
4883 });
4884 }
4885
4886 {
4887 std::unique_lock<std::mutex> captureLock(captureMutex);
4888 syncFd = fd;
4889 captureResult = std::make_optional<status_t>(result);
4890 captureCondition.notify_one();
4891 }
4892 });
4893
4894 status_t result = postMessageAsync(message);
4895 if (result == NO_ERROR) {
4896 captureCondition.wait(captureLock, [&]() { return captureResult; });
4897 while (*captureResult == EAGAIN) {
4898 captureResult.reset();
4899 result = postMessageAsync(message);
4900 if (result != NO_ERROR) {
4901 return result;
4902 }
4903 captureCondition.wait(captureLock, [&]() { return captureResult; });
4904 }
4905 result = *captureResult;
4906 }
4907
4908 if (result == NO_ERROR) {
4909 sync_wait(syncFd, -1);
4910 close(syncFd);
4911 }
4912
4913 return result;
4914 }
4915
renderScreenImplLocked(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,bool yswap,bool useIdentityTransform)4916 void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
4917 TraverseLayersFunction traverseLayers, bool yswap,
4918 bool useIdentityTransform) {
4919 ATRACE_CALL();
4920
4921 auto& engine(getRenderEngine());
4922
4923 // get screen geometry
4924 const auto raWidth = renderArea.getWidth();
4925 const auto raHeight = renderArea.getHeight();
4926
4927 const auto reqWidth = renderArea.getReqWidth();
4928 const auto reqHeight = renderArea.getReqHeight();
4929 Rect sourceCrop = renderArea.getSourceCrop();
4930
4931 bool filtering = false;
4932 if (mPrimaryDisplayOrientation & DisplayState::eOrientationSwapMask) {
4933 filtering = static_cast<int32_t>(reqWidth) != raHeight ||
4934 static_cast<int32_t>(reqHeight) != raWidth;
4935 } else {
4936 filtering = static_cast<int32_t>(reqWidth) != raWidth ||
4937 static_cast<int32_t>(reqHeight) != raHeight;
4938 }
4939
4940 // if a default or invalid sourceCrop is passed in, set reasonable values
4941 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 || !sourceCrop.isValid()) {
4942 sourceCrop.setLeftTop(Point(0, 0));
4943 sourceCrop.setRightBottom(Point(raWidth, raHeight));
4944 } else if (mPrimaryDisplayOrientation != DisplayState::eOrientationDefault) {
4945 Transform tr;
4946 uint32_t flags = 0x00;
4947 switch (mPrimaryDisplayOrientation) {
4948 case DisplayState::eOrientation90:
4949 flags = Transform::ROT_90;
4950 break;
4951 case DisplayState::eOrientation180:
4952 flags = Transform::ROT_180;
4953 break;
4954 case DisplayState::eOrientation270:
4955 flags = Transform::ROT_270;
4956 break;
4957 }
4958 tr.set(flags, raWidth, raHeight);
4959 sourceCrop = tr.transform(sourceCrop);
4960 }
4961
4962 // ensure that sourceCrop is inside screen
4963 if (sourceCrop.left < 0) {
4964 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
4965 }
4966 if (sourceCrop.right > raWidth) {
4967 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, raWidth);
4968 }
4969 if (sourceCrop.top < 0) {
4970 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
4971 }
4972 if (sourceCrop.bottom > raHeight) {
4973 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, raHeight);
4974 }
4975
4976 // assume ColorMode::SRGB / RenderIntent::COLORIMETRIC
4977 engine.setOutputDataSpace(Dataspace::SRGB);
4978 engine.setDisplayMaxLuminance(DisplayDevice::sDefaultMaxLumiance);
4979
4980 // make sure to clear all GL error flags
4981 engine.checkErrors();
4982
4983 Transform::orientation_flags rotation = renderArea.getRotationFlags();
4984 if (mPrimaryDisplayOrientation != DisplayState::eOrientationDefault) {
4985 // convert hw orientation into flag presentation
4986 // here inverse transform needed
4987 uint8_t hw_rot_90 = 0x00;
4988 uint8_t hw_flip_hv = 0x00;
4989 switch (mPrimaryDisplayOrientation) {
4990 case DisplayState::eOrientation90:
4991 hw_rot_90 = Transform::ROT_90;
4992 hw_flip_hv = Transform::ROT_180;
4993 break;
4994 case DisplayState::eOrientation180:
4995 hw_flip_hv = Transform::ROT_180;
4996 break;
4997 case DisplayState::eOrientation270:
4998 hw_rot_90 = Transform::ROT_90;
4999 break;
5000 }
5001
5002 // transform flags operation
5003 // 1) flip H V if both have ROT_90 flag
5004 // 2) XOR these flags
5005 uint8_t rotation_rot_90 = rotation & Transform::ROT_90;
5006 uint8_t rotation_flip_hv = rotation & Transform::ROT_180;
5007 if (rotation_rot_90 & hw_rot_90) {
5008 rotation_flip_hv = (~rotation_flip_hv) & Transform::ROT_180;
5009 }
5010 rotation = static_cast<Transform::orientation_flags>
5011 ((rotation_rot_90 ^ hw_rot_90) | (rotation_flip_hv ^ hw_flip_hv));
5012 }
5013
5014 // set-up our viewport
5015 engine.setViewportAndProjection(reqWidth, reqHeight, sourceCrop, raHeight, yswap,
5016 rotation);
5017 engine.disableTexturing();
5018
5019 const float alpha = RenderArea::getCaptureFillValue(renderArea.getCaptureFill());
5020 // redraw the screen entirely...
5021 engine.clearWithColor(0, 0, 0, alpha);
5022
5023 traverseLayers([&](Layer* layer) {
5024 if (filtering) layer->setFiltering(true);
5025 layer->draw(renderArea, useIdentityTransform);
5026 if (filtering) layer->setFiltering(false);
5027 });
5028 }
5029
captureScreenImplLocked(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,ANativeWindowBuffer * buffer,bool useIdentityTransform,bool forSystem,int * outSyncFd)5030 status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea,
5031 TraverseLayersFunction traverseLayers,
5032 ANativeWindowBuffer* buffer,
5033 bool useIdentityTransform,
5034 bool forSystem,
5035 int* outSyncFd) {
5036 ATRACE_CALL();
5037
5038 bool secureLayerIsVisible = false;
5039
5040 traverseLayers([&](Layer* layer) {
5041 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() && layer->isSecure());
5042 });
5043
5044 // We allow the system server to take screenshots of secure layers for
5045 // use in situations like the Screen-rotation animation and place
5046 // the impetus on WindowManager to not persist them.
5047 if (secureLayerIsVisible && !forSystem) {
5048 ALOGW("FB is protected: PERMISSION_DENIED");
5049 return PERMISSION_DENIED;
5050 }
5051
5052 // this binds the given EGLImage as a framebuffer for the
5053 // duration of this scope.
5054 RE::BindNativeBufferAsFramebuffer bufferBond(getRenderEngine(), buffer);
5055 if (bufferBond.getStatus() != NO_ERROR) {
5056 ALOGE("got ANWB binding error while taking screenshot");
5057 return INVALID_OPERATION;
5058 }
5059
5060 // this will in fact render into our dequeued buffer
5061 // via an FBO, which means we didn't have to create
5062 // an EGLSurface and therefore we're not
5063 // dependent on the context's EGLConfig.
5064 renderScreenImplLocked(renderArea, traverseLayers, true, useIdentityTransform);
5065
5066 if (DEBUG_SCREENSHOTS) {
5067 getRenderEngine().finish();
5068 *outSyncFd = -1;
5069
5070 const auto reqWidth = renderArea.getReqWidth();
5071 const auto reqHeight = renderArea.getReqHeight();
5072
5073 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
5074 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
5075 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels, traverseLayers);
5076 delete [] pixels;
5077 } else {
5078 base::unique_fd syncFd = getRenderEngine().flush();
5079 if (syncFd < 0) {
5080 getRenderEngine().finish();
5081 }
5082 *outSyncFd = syncFd.release();
5083 }
5084
5085 return NO_ERROR;
5086 }
5087
checkScreenshot(size_t w,size_t s,size_t h,void const * vaddr,TraverseLayersFunction traverseLayers)5088 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
5089 TraverseLayersFunction traverseLayers) {
5090 if (DEBUG_SCREENSHOTS) {
5091 for (size_t y = 0; y < h; y++) {
5092 uint32_t const* p = (uint32_t const*)vaddr + y * s;
5093 for (size_t x = 0; x < w; x++) {
5094 if (p[x] != 0xFF000000) return;
5095 }
5096 }
5097 ALOGE("*** we just took a black screenshot ***");
5098
5099 size_t i = 0;
5100 traverseLayers([&](Layer* layer) {
5101 const Layer::State& state(layer->getDrawingState());
5102 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f",
5103 layer->isVisible() ? '+' : '-', i, layer->getName().string(),
5104 layer->getLayerStack(), state.z, layer->isVisible(), state.flags,
5105 static_cast<float>(state.color.a));
5106 i++;
5107 });
5108 }
5109 }
5110
5111 // ---------------------------------------------------------------------------
5112
traverseInZOrder(const LayerVector::Visitor & visitor) const5113 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
5114 layersSortedByZ.traverseInZOrder(stateSet, visitor);
5115 }
5116
traverseInReverseZOrder(const LayerVector::Visitor & visitor) const5117 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
5118 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
5119 }
5120
traverseLayersInDisplay(const sp<const DisplayDevice> & hw,int32_t minLayerZ,int32_t maxLayerZ,const LayerVector::Visitor & visitor)5121 void SurfaceFlinger::traverseLayersInDisplay(const sp<const DisplayDevice>& hw, int32_t minLayerZ,
5122 int32_t maxLayerZ,
5123 const LayerVector::Visitor& visitor) {
5124 // We loop through the first level of layers without traversing,
5125 // as we need to interpret min/max layer Z in the top level Z space.
5126 for (const auto& layer : mDrawingState.layersSortedByZ) {
5127 if (!layer->belongsToDisplay(hw->getLayerStack(), false)) {
5128 continue;
5129 }
5130 const Layer::State& state(layer->getDrawingState());
5131 // relative layers are traversed in Layer::traverseInZOrder
5132 if (state.zOrderRelativeOf != nullptr || state.z < minLayerZ || state.z > maxLayerZ) {
5133 continue;
5134 }
5135 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
5136 if (!layer->belongsToDisplay(hw->getLayerStack(), false)) {
5137 return;
5138 }
5139 if (!layer->isVisible()) {
5140 return;
5141 }
5142 visitor(layer);
5143 });
5144 }
5145 }
5146
5147 }; // namespace android
5148
5149
5150 #if defined(__gl_h_)
5151 #error "don't include gl/gl.h in this file"
5152 #endif
5153
5154 #if defined(__gl2_h_)
5155 #error "don't include gl2/gl2.h in this file"
5156 #endif
5157