• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // #define LOG_NDEBUG 0
18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
19 
20 #include <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)1187 status_t SurfaceFlinger::getLayerDebugInfo(std::vector<LayerDebugInfo>* outLayers)
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     outLayers->clear();
1199     postMessageSync(new LambdaMessage([&]() {
1200             mDrawingState.traverseInZOrder([&](Layer* layer) {
1201             outLayers->push_back(layer->getLayerDebugInfo());
1202         });
1203 
1204     }));
1205     return NO_ERROR;
1206 }
1207 
1208 // ----------------------------------------------------------------------------
1209 
createDisplayEventConnection(ISurfaceComposer::VsyncSource vsyncSource)1210 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
1211         ISurfaceComposer::VsyncSource vsyncSource) {
1212     if (vsyncSource == eVsyncSourceSurfaceFlinger) {
1213         return mSFEventThread->createEventConnection();
1214     } else {
1215         return mEventThread->createEventConnection();
1216     }
1217 }
1218 
1219 // ----------------------------------------------------------------------------
1220 
waitForEvent()1221 void SurfaceFlinger::waitForEvent() {
1222     mEventQueue->waitMessage();
1223 }
1224 
signalTransaction()1225 void SurfaceFlinger::signalTransaction() {
1226     mEventQueue->invalidate();
1227 }
1228 
signalLayerUpdate()1229 void SurfaceFlinger::signalLayerUpdate() {
1230     mEventQueue->invalidate();
1231 }
1232 
signalRefresh()1233 void SurfaceFlinger::signalRefresh() {
1234     mRefreshPending = true;
1235     mEventQueue->refresh();
1236 }
1237 
postMessageAsync(const sp<MessageBase> & msg,nsecs_t reltime,uint32_t)1238 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
1239         nsecs_t reltime, uint32_t /* flags */) {
1240     return mEventQueue->postMessage(msg, reltime);
1241 }
1242 
postMessageSync(const sp<MessageBase> & msg,nsecs_t reltime,uint32_t)1243 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
1244         nsecs_t reltime, uint32_t /* flags */) {
1245     status_t res = mEventQueue->postMessage(msg, reltime);
1246     if (res == NO_ERROR) {
1247         msg->wait();
1248     }
1249     return res;
1250 }
1251 
run()1252 void SurfaceFlinger::run() {
1253     do {
1254         waitForEvent();
1255     } while (true);
1256 }
1257 
enableHardwareVsync()1258 void SurfaceFlinger::enableHardwareVsync() {
1259     Mutex::Autolock _l(mHWVsyncLock);
1260     if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
1261         mPrimaryDispSync.beginResync();
1262         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1263         mEventControlThread->setVsyncEnabled(true);
1264         mPrimaryHWVsyncEnabled = true;
1265     }
1266 }
1267 
resyncToHardwareVsync(bool makeAvailable)1268 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
1269     Mutex::Autolock _l(mHWVsyncLock);
1270 
1271     if (makeAvailable) {
1272         mHWVsyncAvailable = true;
1273     } else if (!mHWVsyncAvailable) {
1274         // Hardware vsync is not currently available, so abort the resync
1275         // attempt for now
1276         return;
1277     }
1278 
1279     const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
1280     const nsecs_t period = activeConfig->getVsyncPeriod();
1281 
1282     mPrimaryDispSync.reset();
1283     mPrimaryDispSync.setPeriod(period);
1284 
1285     if (!mPrimaryHWVsyncEnabled) {
1286         mPrimaryDispSync.beginResync();
1287         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1288         mEventControlThread->setVsyncEnabled(true);
1289         mPrimaryHWVsyncEnabled = true;
1290     }
1291 }
1292 
disableHardwareVsync(bool makeUnavailable)1293 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1294     Mutex::Autolock _l(mHWVsyncLock);
1295     if (mPrimaryHWVsyncEnabled) {
1296         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1297         mEventControlThread->setVsyncEnabled(false);
1298         mPrimaryDispSync.endResync();
1299         mPrimaryHWVsyncEnabled = false;
1300     }
1301     if (makeUnavailable) {
1302         mHWVsyncAvailable = false;
1303     }
1304 }
1305 
resyncWithRateLimit()1306 void SurfaceFlinger::resyncWithRateLimit() {
1307     static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1308 
1309     // No explicit locking is needed here since EventThread holds a lock while calling this method
1310     static nsecs_t sLastResyncAttempted = 0;
1311     const nsecs_t now = systemTime();
1312     if (now - sLastResyncAttempted > kIgnoreDelay) {
1313         resyncToHardwareVsync(false);
1314     }
1315     sLastResyncAttempted = now;
1316 }
1317 
onVsyncReceived(int32_t sequenceId,hwc2_display_t displayId,int64_t timestamp)1318 void SurfaceFlinger::onVsyncReceived(int32_t sequenceId,
1319         hwc2_display_t displayId, int64_t timestamp) {
1320     Mutex::Autolock lock(mStateLock);
1321     // Ignore any vsyncs from a previous hardware composer.
1322     if (sequenceId != getBE().mComposerSequenceId) {
1323         return;
1324     }
1325 
1326     int32_t type;
1327     if (!getBE().mHwc->onVsync(displayId, timestamp, &type)) {
1328         return;
1329     }
1330 
1331     bool needsHwVsync = false;
1332 
1333     { // Scope for the lock
1334         Mutex::Autolock _l(mHWVsyncLock);
1335         if (type == DisplayDevice::DISPLAY_PRIMARY && mPrimaryHWVsyncEnabled) {
1336             needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1337         }
1338     }
1339 
1340     if (needsHwVsync) {
1341         enableHardwareVsync();
1342     } else {
1343         disableHardwareVsync(false);
1344     }
1345 }
1346 
getCompositorTiming(CompositorTiming * compositorTiming)1347 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1348     std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1349     *compositorTiming = getBE().mCompositorTiming;
1350 }
1351 
onHotplugReceived(int32_t sequenceId,hwc2_display_t display,HWC2::Connection connection)1352 void SurfaceFlinger::onHotplugReceived(int32_t sequenceId, hwc2_display_t display,
1353                                        HWC2::Connection connection) {
1354     ALOGV("onHotplugReceived(%d, %" PRIu64 ", %s)", sequenceId, display,
1355           connection == HWC2::Connection::Connected ? "connected" : "disconnected");
1356 
1357     // Ignore events that do not have the right sequenceId.
1358     if (sequenceId != getBE().mComposerSequenceId) {
1359         return;
1360     }
1361 
1362     // Only lock if we're not on the main thread. This function is normally
1363     // called on a hwbinder thread, but for the primary display it's called on
1364     // the main thread with the state lock already held, so don't attempt to
1365     // acquire it here.
1366     ConditionalLock lock(mStateLock, std::this_thread::get_id() != mMainThreadId);
1367 
1368     mPendingHotplugEvents.emplace_back(HotplugEvent{display, connection});
1369 
1370     if (std::this_thread::get_id() == mMainThreadId) {
1371         // Process all pending hot plug events immediately if we are on the main thread.
1372         processDisplayHotplugEventsLocked();
1373     }
1374 
1375     setTransactionFlags(eDisplayTransactionNeeded);
1376 }
1377 
onRefreshReceived(int sequenceId,hwc2_display_t)1378 void SurfaceFlinger::onRefreshReceived(int sequenceId,
1379                                        hwc2_display_t /*display*/) {
1380     Mutex::Autolock lock(mStateLock);
1381     if (sequenceId != getBE().mComposerSequenceId) {
1382         return;
1383     }
1384     repaintEverything();
1385 }
1386 
setVsyncEnabled(int disp,int enabled)1387 void SurfaceFlinger::setVsyncEnabled(int disp, int enabled) {
1388     ATRACE_CALL();
1389     Mutex::Autolock lock(mStateLock);
1390     getHwComposer().setVsyncEnabled(disp,
1391             enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable);
1392 }
1393 
1394 // Note: it is assumed the caller holds |mStateLock| when this is called
resetDisplayState()1395 void SurfaceFlinger::resetDisplayState() {
1396     disableHardwareVsync(true);
1397     // Clear the drawing state so that the logic inside of
1398     // handleTransactionLocked will fire. It will determine the delta between
1399     // mCurrentState and mDrawingState and re-apply all changes when we make the
1400     // transition.
1401     mDrawingState.displays.clear();
1402     getRenderEngine().resetCurrentSurface();
1403     mDisplays.clear();
1404 }
1405 
updateVrFlinger()1406 void SurfaceFlinger::updateVrFlinger() {
1407     if (!mVrFlinger)
1408         return;
1409     bool vrFlingerRequestsDisplay = mVrFlingerRequestsDisplay;
1410     if (vrFlingerRequestsDisplay == getBE().mHwc->isUsingVrComposer()) {
1411         return;
1412     }
1413 
1414     if (vrFlingerRequestsDisplay && !getBE().mHwc->getComposer()->isRemote()) {
1415         ALOGE("Vr flinger is only supported for remote hardware composer"
1416               " service connections. Ignoring request to transition to vr"
1417               " flinger.");
1418         mVrFlingerRequestsDisplay = false;
1419         return;
1420     }
1421 
1422     Mutex::Autolock _l(mStateLock);
1423 
1424     int currentDisplayPowerMode = getDisplayDeviceLocked(
1425             mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY])->getPowerMode();
1426 
1427     if (!vrFlingerRequestsDisplay) {
1428         mVrFlinger->SeizeDisplayOwnership();
1429     }
1430 
1431     resetDisplayState();
1432     getBE().mHwc.reset(); // Delete the current instance before creating the new one
1433     getBE().mHwc.reset(new HWComposer(std::make_unique<Hwc2::impl::Composer>(
1434             vrFlingerRequestsDisplay ? "vr" : getBE().mHwcServiceName)));
1435     getBE().mHwc->registerCallback(this, ++getBE().mComposerSequenceId);
1436 
1437     LOG_ALWAYS_FATAL_IF(!getBE().mHwc->getComposer()->isRemote(),
1438                         "Switched to non-remote hardware composer");
1439 
1440     if (vrFlingerRequestsDisplay) {
1441         mVrFlinger->GrantDisplayOwnership();
1442     } else {
1443         enableHardwareVsync();
1444     }
1445 
1446     mVisibleRegionsDirty = true;
1447     invalidateHwcGeometry();
1448 
1449     // Re-enable default display.
1450     sp<DisplayDevice> hw(getDisplayDeviceLocked(
1451             mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]));
1452     setPowerModeInternal(hw, currentDisplayPowerMode, /*stateLockHeld*/ true);
1453 
1454     // Reset the timing values to account for the period of the swapped in HWC
1455     const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
1456     const nsecs_t period = activeConfig->getVsyncPeriod();
1457     mAnimFrameTracker.setDisplayRefreshPeriod(period);
1458 
1459     // Use phase of 0 since phase is not known.
1460     // Use latency of 0, which will snap to the ideal latency.
1461     setCompositorTimingSnapped(0, period, 0);
1462 
1463     android_atomic_or(1, &mRepaintEverything);
1464     setTransactionFlags(eDisplayTransactionNeeded);
1465 }
1466 
onMessageReceived(int32_t what)1467 void SurfaceFlinger::onMessageReceived(int32_t what) {
1468     ATRACE_CALL();
1469     switch (what) {
1470         case MessageQueue::INVALIDATE: {
1471             bool frameMissed = !mHadClientComposition &&
1472                     mPreviousPresentFence != Fence::NO_FENCE &&
1473                     (mPreviousPresentFence->getSignalTime() ==
1474                             Fence::SIGNAL_TIME_PENDING);
1475             ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));
1476             if (frameMissed) {
1477                 mTimeStats.incrementMissedFrames();
1478                 if (mPropagateBackpressure) {
1479                     signalLayerUpdate();
1480                     break;
1481                 }
1482             }
1483 
1484             // Now that we're going to make it to the handleMessageTransaction()
1485             // call below it's safe to call updateVrFlinger(), which will
1486             // potentially trigger a display handoff.
1487             updateVrFlinger();
1488 
1489             bool refreshNeeded = handleMessageTransaction();
1490             refreshNeeded |= handleMessageInvalidate();
1491             refreshNeeded |= mRepaintEverything;
1492             if (refreshNeeded) {
1493                 // Signal a refresh if a transaction modified the window state,
1494                 // a new buffer was latched, or if HWC has requested a full
1495                 // repaint
1496                 signalRefresh();
1497             }
1498             break;
1499         }
1500         case MessageQueue::REFRESH: {
1501             handleMessageRefresh();
1502             break;
1503         }
1504     }
1505 }
1506 
handleMessageTransaction()1507 bool SurfaceFlinger::handleMessageTransaction() {
1508     uint32_t transactionFlags = peekTransactionFlags();
1509     if (transactionFlags) {
1510         handleTransaction(transactionFlags);
1511         return true;
1512     }
1513     return false;
1514 }
1515 
handleMessageInvalidate()1516 bool SurfaceFlinger::handleMessageInvalidate() {
1517     ATRACE_CALL();
1518     return handlePageFlip();
1519 }
1520 
handleMessageRefresh()1521 void SurfaceFlinger::handleMessageRefresh() {
1522     ATRACE_CALL();
1523 
1524     mRefreshPending = false;
1525 
1526     nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1527 
1528     preComposition(refreshStartTime);
1529     rebuildLayerStacks();
1530     setUpHWComposer();
1531     doDebugFlashRegions();
1532     doTracing("handleRefresh");
1533     logLayerStats();
1534     doComposition();
1535     postComposition(refreshStartTime);
1536 
1537     mPreviousPresentFence = getBE().mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1538 
1539     mHadClientComposition = false;
1540     for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1541         const sp<DisplayDevice>& displayDevice = mDisplays[displayId];
1542         mHadClientComposition = mHadClientComposition ||
1543                 getBE().mHwc->hasClientComposition(displayDevice->getHwcDisplayId());
1544     }
1545     mVsyncModulator.onRefreshed(mHadClientComposition);
1546 
1547     mLayersWithQueuedFrames.clear();
1548 }
1549 
doDebugFlashRegions()1550 void SurfaceFlinger::doDebugFlashRegions()
1551 {
1552     // is debugging enabled
1553     if (CC_LIKELY(!mDebugRegion))
1554         return;
1555 
1556     const bool repaintEverything = mRepaintEverything;
1557     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1558         const sp<DisplayDevice>& hw(mDisplays[dpy]);
1559         if (hw->isDisplayOn()) {
1560             // transform the dirty region into this screen's coordinate space
1561             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1562             if (!dirtyRegion.isEmpty()) {
1563                 // redraw the whole screen
1564                 doComposeSurfaces(hw);
1565 
1566                 // and draw the dirty region
1567                 const int32_t height = hw->getHeight();
1568                 auto& engine(getRenderEngine());
1569                 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1570 
1571                 hw->swapBuffers(getHwComposer());
1572             }
1573         }
1574     }
1575 
1576     postFramebuffer();
1577 
1578     if (mDebugRegion > 1) {
1579         usleep(mDebugRegion * 1000);
1580     }
1581 
1582     for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1583         auto& displayDevice = mDisplays[displayId];
1584         if (!displayDevice->isDisplayOn()) {
1585             continue;
1586         }
1587 
1588         status_t result = displayDevice->prepareFrame(*getBE().mHwc);
1589         ALOGE_IF(result != NO_ERROR,
1590                  "prepareFrame for display %zd failed:"
1591                  " %d (%s)",
1592                  displayId, result, strerror(-result));
1593     }
1594 }
1595 
doTracing(const char * where)1596 void SurfaceFlinger::doTracing(const char* where) {
1597     ATRACE_CALL();
1598     ATRACE_NAME(where);
1599     if (CC_UNLIKELY(mTracing.isEnabled())) {
1600         mTracing.traceLayers(where, dumpProtoInfo(LayerVector::StateSet::Drawing));
1601     }
1602 }
1603 
logLayerStats()1604 void SurfaceFlinger::logLayerStats() {
1605     ATRACE_CALL();
1606     if (CC_UNLIKELY(mLayerStats.isEnabled())) {
1607         int32_t hwcId = -1;
1608         for (size_t dpy = 0; dpy < mDisplays.size(); ++dpy) {
1609             const sp<const DisplayDevice>& displayDevice(mDisplays[dpy]);
1610             if (displayDevice->isPrimary()) {
1611                 hwcId = displayDevice->getHwcDisplayId();
1612                 break;
1613             }
1614         }
1615         if (hwcId < 0) {
1616             ALOGE("LayerStats: Hmmm, no primary display?");
1617             return;
1618         }
1619         mLayerStats.logLayerStats(dumpVisibleLayersProtoInfo(hwcId));
1620     }
1621 }
1622 
preComposition(nsecs_t refreshStartTime)1623 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
1624 {
1625     ATRACE_CALL();
1626     ALOGV("preComposition");
1627 
1628     bool needExtraInvalidate = false;
1629     mDrawingState.traverseInZOrder([&](Layer* layer) {
1630         if (layer->onPreComposition(refreshStartTime)) {
1631             needExtraInvalidate = true;
1632         }
1633     });
1634 
1635     if (needExtraInvalidate) {
1636         signalLayerUpdate();
1637     }
1638 }
1639 
updateCompositorTiming(nsecs_t vsyncPhase,nsecs_t vsyncInterval,nsecs_t compositeTime,std::shared_ptr<FenceTime> & presentFenceTime)1640 void SurfaceFlinger::updateCompositorTiming(
1641         nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1642         std::shared_ptr<FenceTime>& presentFenceTime) {
1643     // Update queue of past composite+present times and determine the
1644     // most recently known composite to present latency.
1645     getBE().mCompositePresentTimes.push({compositeTime, presentFenceTime});
1646     nsecs_t compositeToPresentLatency = -1;
1647     while (!getBE().mCompositePresentTimes.empty()) {
1648         SurfaceFlingerBE::CompositePresentTime& cpt = getBE().mCompositePresentTimes.front();
1649         // Cached values should have been updated before calling this method,
1650         // which helps avoid duplicate syscalls.
1651         nsecs_t displayTime = cpt.display->getCachedSignalTime();
1652         if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1653             break;
1654         }
1655         compositeToPresentLatency = displayTime - cpt.composite;
1656         getBE().mCompositePresentTimes.pop();
1657     }
1658 
1659     // Don't let mCompositePresentTimes grow unbounded, just in case.
1660     while (getBE().mCompositePresentTimes.size() > 16) {
1661         getBE().mCompositePresentTimes.pop();
1662     }
1663 
1664     setCompositorTimingSnapped(
1665             vsyncPhase, vsyncInterval, compositeToPresentLatency);
1666 }
1667 
setCompositorTimingSnapped(nsecs_t vsyncPhase,nsecs_t vsyncInterval,nsecs_t compositeToPresentLatency)1668 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1669         nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
1670     // Integer division and modulo round toward 0 not -inf, so we need to
1671     // treat negative and positive offsets differently.
1672     nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
1673             (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1674             ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1675 
1676     // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1677     if (idealLatency <= 0) {
1678         idealLatency = vsyncInterval;
1679     }
1680 
1681     // Snap the latency to a value that removes scheduling jitter from the
1682     // composition and present times, which often have >1ms of jitter.
1683     // Reducing jitter is important if an app attempts to extrapolate
1684     // something (such as user input) to an accurate diasplay time.
1685     // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1686     // with (presentLatency % interval).
1687     nsecs_t bias = vsyncInterval / 2;
1688     int64_t extraVsyncs =
1689             (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1690     nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1691             idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
1692 
1693     std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1694     getBE().mCompositorTiming.deadline = vsyncPhase - idealLatency;
1695     getBE().mCompositorTiming.interval = vsyncInterval;
1696     getBE().mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1697 }
1698 
postComposition(nsecs_t refreshStartTime)1699 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1700 {
1701     ATRACE_CALL();
1702     ALOGV("postComposition");
1703 
1704     // Release any buffers which were replaced this frame
1705     nsecs_t dequeueReadyTime = systemTime();
1706     for (auto& layer : mLayersWithQueuedFrames) {
1707         layer->releasePendingBuffer(dequeueReadyTime);
1708     }
1709 
1710     // |mStateLock| not needed as we are on the main thread
1711     const sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
1712 
1713     getBE().mGlCompositionDoneTimeline.updateSignalTimes();
1714     std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1715     if (hw && getBE().mHwc->hasClientComposition(HWC_DISPLAY_PRIMARY)) {
1716         glCompositionDoneFenceTime =
1717                 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1718         getBE().mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1719     } else {
1720         glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1721     }
1722 
1723     getBE().mDisplayTimeline.updateSignalTimes();
1724     sp<Fence> presentFence = getBE().mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1725     auto presentFenceTime = std::make_shared<FenceTime>(presentFence);
1726     getBE().mDisplayTimeline.push(presentFenceTime);
1727 
1728     nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1729     nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1730 
1731     // We use the refreshStartTime which might be sampled a little later than
1732     // when we started doing work for this frame, but that should be okay
1733     // since updateCompositorTiming has snapping logic.
1734     updateCompositorTiming(
1735         vsyncPhase, vsyncInterval, refreshStartTime, presentFenceTime);
1736     CompositorTiming compositorTiming;
1737     {
1738         std::lock_guard<std::mutex> lock(getBE().mCompositorTimingLock);
1739         compositorTiming = getBE().mCompositorTiming;
1740     }
1741 
1742     mDrawingState.traverseInZOrder([&](Layer* layer) {
1743         bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
1744                 presentFenceTime, compositorTiming);
1745         if (frameLatched) {
1746             recordBufferingStats(layer->getName().string(),
1747                     layer->getOccupancyHistory(false));
1748         }
1749     });
1750 
1751     if (presentFenceTime->isValid()) {
1752         if (mPrimaryDispSync.addPresentFence(presentFenceTime)) {
1753             enableHardwareVsync();
1754         } else {
1755             disableHardwareVsync(false);
1756         }
1757     }
1758 
1759     if (!hasSyncFramework) {
1760         if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY) && hw->isDisplayOn()) {
1761             enableHardwareVsync();
1762         }
1763     }
1764 
1765     if (mAnimCompositionPending) {
1766         mAnimCompositionPending = false;
1767 
1768         if (presentFenceTime->isValid()) {
1769             mAnimFrameTracker.setActualPresentFence(
1770                     std::move(presentFenceTime));
1771         } else if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY)) {
1772             // The HWC doesn't support present fences, so use the refresh
1773             // timestamp instead.
1774             nsecs_t presentTime =
1775                     getBE().mHwc->getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1776             mAnimFrameTracker.setActualPresentTime(presentTime);
1777         }
1778         mAnimFrameTracker.advanceFrame();
1779     }
1780 
1781     mTimeStats.incrementTotalFrames();
1782     if (mHadClientComposition) {
1783         mTimeStats.incrementClientCompositionFrames();
1784     }
1785 
1786     if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY) &&
1787             hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1788         return;
1789     }
1790 
1791     nsecs_t currentTime = systemTime();
1792     if (mHasPoweredOff) {
1793         mHasPoweredOff = false;
1794     } else {
1795         nsecs_t elapsedTime = currentTime - getBE().mLastSwapTime;
1796         size_t numPeriods = static_cast<size_t>(elapsedTime / vsyncInterval);
1797         if (numPeriods < SurfaceFlingerBE::NUM_BUCKETS - 1) {
1798             getBE().mFrameBuckets[numPeriods] += elapsedTime;
1799         } else {
1800             getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] += elapsedTime;
1801         }
1802         getBE().mTotalTime += elapsedTime;
1803     }
1804     getBE().mLastSwapTime = currentTime;
1805 }
1806 
rebuildLayerStacks()1807 void SurfaceFlinger::rebuildLayerStacks() {
1808     ATRACE_CALL();
1809     ALOGV("rebuildLayerStacks");
1810 
1811     // rebuild the visible layer list per screen
1812     if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1813         ATRACE_NAME("rebuildLayerStacks VR Dirty");
1814         mVisibleRegionsDirty = false;
1815         invalidateHwcGeometry();
1816 
1817         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1818             Region opaqueRegion;
1819             Region dirtyRegion;
1820             Vector<sp<Layer>> layersSortedByZ;
1821             Vector<sp<Layer>> layersNeedingFences;
1822             const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);
1823             const Transform& tr(displayDevice->getTransform());
1824             const Rect bounds(displayDevice->getBounds());
1825             if (displayDevice->isDisplayOn()) {
1826                 computeVisibleRegions(displayDevice, dirtyRegion, opaqueRegion);
1827 
1828                 mDrawingState.traverseInZOrder([&](Layer* layer) {
1829                     bool hwcLayerDestroyed = false;
1830                     if (layer->belongsToDisplay(displayDevice->getLayerStack(),
1831                                 displayDevice->isPrimary())) {
1832                         Region drawRegion(tr.transform(
1833                                 layer->visibleNonTransparentRegion));
1834                         drawRegion.andSelf(bounds);
1835                         if (!drawRegion.isEmpty()) {
1836                             layersSortedByZ.add(layer);
1837                         } else {
1838                             // Clear out the HWC layer if this layer was
1839                             // previously visible, but no longer is
1840                             hwcLayerDestroyed = layer->destroyHwcLayer(
1841                                     displayDevice->getHwcDisplayId());
1842                         }
1843                     } else {
1844                         // WM changes displayDevice->layerStack upon sleep/awake.
1845                         // Here we make sure we delete the HWC layers even if
1846                         // WM changed their layer stack.
1847                         hwcLayerDestroyed = layer->destroyHwcLayer(
1848                                 displayDevice->getHwcDisplayId());
1849                     }
1850 
1851                     // If a layer is not going to get a release fence because
1852                     // it is invisible, but it is also going to release its
1853                     // old buffer, add it to the list of layers needing
1854                     // fences.
1855                     if (hwcLayerDestroyed) {
1856                         auto found = std::find(mLayersWithQueuedFrames.cbegin(),
1857                                 mLayersWithQueuedFrames.cend(), layer);
1858                         if (found != mLayersWithQueuedFrames.cend()) {
1859                             layersNeedingFences.add(layer);
1860                         }
1861                     }
1862                 });
1863             }
1864             displayDevice->setVisibleLayersSortedByZ(layersSortedByZ);
1865             displayDevice->setLayersNeedingFences(layersNeedingFences);
1866             displayDevice->undefinedRegion.set(bounds);
1867             displayDevice->undefinedRegion.subtractSelf(
1868                     tr.transform(opaqueRegion));
1869             displayDevice->dirtyRegion.orSelf(dirtyRegion);
1870         }
1871     }
1872 }
1873 
1874 // Returns a data space that fits all visible layers.  The returned data space
1875 // can only be one of
1876 //  - Dataspace::SRGB (use legacy dataspace and let HWC saturate when colors are enhanced)
1877 //  - Dataspace::DISPLAY_P3
1878 // The returned HDR data space is one of
1879 //  - Dataspace::UNKNOWN
1880 //  - Dataspace::BT2020_HLG
1881 //  - Dataspace::BT2020_PQ
getBestDataspace(const sp<const DisplayDevice> & displayDevice,Dataspace * outHdrDataSpace) const1882 Dataspace SurfaceFlinger::getBestDataspace(
1883     const sp<const DisplayDevice>& displayDevice, Dataspace* outHdrDataSpace) const {
1884     Dataspace bestDataSpace = Dataspace::SRGB;
1885     *outHdrDataSpace = Dataspace::UNKNOWN;
1886 
1887     for (const auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1888         switch (layer->getDataSpace()) {
1889             case Dataspace::V0_SCRGB:
1890             case Dataspace::V0_SCRGB_LINEAR:
1891             case Dataspace::DISPLAY_P3:
1892                 bestDataSpace = Dataspace::DISPLAY_P3;
1893                 break;
1894             case Dataspace::BT2020_PQ:
1895             case Dataspace::BT2020_ITU_PQ:
1896                 *outHdrDataSpace = Dataspace::BT2020_PQ;
1897                 break;
1898             case Dataspace::BT2020_HLG:
1899             case Dataspace::BT2020_ITU_HLG:
1900                 // When there's mixed PQ content and HLG content, we set the HDR
1901                 // data space to be BT2020_PQ and convert HLG to PQ.
1902                 if (*outHdrDataSpace == Dataspace::UNKNOWN) {
1903                     *outHdrDataSpace = Dataspace::BT2020_HLG;
1904                 }
1905                 break;
1906             default:
1907                 break;
1908         }
1909     }
1910 
1911     return bestDataSpace;
1912 }
1913 
1914 // Pick the ColorMode / Dataspace for the display device.
pickColorMode(const sp<DisplayDevice> & displayDevice,ColorMode * outMode,Dataspace * outDataSpace,RenderIntent * outRenderIntent) const1915 void SurfaceFlinger::pickColorMode(const sp<DisplayDevice>& displayDevice,
1916                                    ColorMode* outMode, Dataspace* outDataSpace,
1917                                    RenderIntent* outRenderIntent) const {
1918     if (mDisplayColorSetting == DisplayColorSetting::UNMANAGED) {
1919         *outMode = ColorMode::NATIVE;
1920         *outDataSpace = Dataspace::UNKNOWN;
1921         *outRenderIntent = RenderIntent::COLORIMETRIC;
1922         return;
1923     }
1924 
1925     Dataspace hdrDataSpace;
1926     Dataspace bestDataSpace = getBestDataspace(displayDevice, &hdrDataSpace);
1927 
1928     // respect hdrDataSpace only when there is no legacy HDR support
1929     const bool isHdr = hdrDataSpace != Dataspace::UNKNOWN &&
1930         !displayDevice->hasLegacyHdrSupport(hdrDataSpace);
1931     if (isHdr) {
1932         bestDataSpace = hdrDataSpace;
1933     }
1934 
1935     RenderIntent intent;
1936     switch (mDisplayColorSetting) {
1937         case DisplayColorSetting::MANAGED:
1938         case DisplayColorSetting::UNMANAGED:
1939             intent = isHdr ? RenderIntent::TONE_MAP_COLORIMETRIC : RenderIntent::COLORIMETRIC;
1940             break;
1941         case DisplayColorSetting::ENHANCED:
1942             intent = isHdr ? RenderIntent::TONE_MAP_ENHANCE : RenderIntent::ENHANCE;
1943             break;
1944         default: // vendor display color setting
1945             intent = static_cast<RenderIntent>(mDisplayColorSetting);
1946             break;
1947     }
1948 
1949     displayDevice->getBestColorMode(bestDataSpace, intent, outDataSpace, outMode, outRenderIntent);
1950 }
1951 
setUpHWComposer()1952 void SurfaceFlinger::setUpHWComposer() {
1953     ATRACE_CALL();
1954     ALOGV("setUpHWComposer");
1955 
1956     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1957         bool dirty = !mDisplays[dpy]->getDirtyRegion(mRepaintEverything).isEmpty();
1958         bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1959         bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1960 
1961         // If nothing has changed (!dirty), don't recompose.
1962         // If something changed, but we don't currently have any visible layers,
1963         //   and didn't when we last did a composition, then skip it this time.
1964         // The second rule does two things:
1965         // - When all layers are removed from a display, we'll emit one black
1966         //   frame, then nothing more until we get new layers.
1967         // - When a display is created with a private layer stack, we won't
1968         //   emit any black frames until a layer is added to the layer stack.
1969         bool mustRecompose = dirty && !(empty && wasEmpty);
1970 
1971         ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1972                 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1973                 mustRecompose ? "doing" : "skipping",
1974                 dirty ? "+" : "-",
1975                 empty ? "+" : "-",
1976                 wasEmpty ? "+" : "-");
1977 
1978         mDisplays[dpy]->beginFrame(mustRecompose);
1979 
1980         if (mustRecompose) {
1981             mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1982         }
1983     }
1984 
1985     // build the h/w work list
1986     if (CC_UNLIKELY(mGeometryInvalid)) {
1987         mGeometryInvalid = false;
1988         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1989             sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
1990             const auto hwcId = displayDevice->getHwcDisplayId();
1991             if (hwcId >= 0) {
1992                 const Vector<sp<Layer>>& currentLayers(
1993                         displayDevice->getVisibleLayersSortedByZ());
1994                 for (size_t i = 0; i < currentLayers.size(); i++) {
1995                     const auto& layer = currentLayers[i];
1996                     if (!layer->hasHwcLayer(hwcId)) {
1997                         if (!layer->createHwcLayer(getBE().mHwc.get(), hwcId)) {
1998                             layer->forceClientComposition(hwcId);
1999                             continue;
2000                         }
2001                     }
2002 
2003                     layer->setGeometry(displayDevice, i);
2004                     if (mDebugDisableHWC || mDebugRegion) {
2005                         layer->forceClientComposition(hwcId);
2006                     }
2007                 }
2008             }
2009         }
2010     }
2011 
2012     // Set the per-frame data
2013     for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2014         auto& displayDevice = mDisplays[displayId];
2015         const auto hwcId = displayDevice->getHwcDisplayId();
2016 
2017         if (hwcId < 0) {
2018             continue;
2019         }
2020         if (mDrawingState.colorMatrixChanged) {
2021             displayDevice->setColorTransform(mDrawingState.colorMatrix);
2022             status_t result = getBE().mHwc->setColorTransform(hwcId, mDrawingState.colorMatrix);
2023             ALOGE_IF(result != NO_ERROR, "Failed to set color transform on "
2024                     "display %zd: %d", displayId, result);
2025         }
2026         for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2027             if (layer->isHdrY410()) {
2028                 layer->forceClientComposition(hwcId);
2029             } else if ((layer->getDataSpace() == Dataspace::BT2020_PQ ||
2030                         layer->getDataSpace() == Dataspace::BT2020_ITU_PQ) &&
2031                     !displayDevice->hasHDR10Support()) {
2032                 layer->forceClientComposition(hwcId);
2033             } else if ((layer->getDataSpace() == Dataspace::BT2020_HLG ||
2034                         layer->getDataSpace() == Dataspace::BT2020_ITU_HLG) &&
2035                     !displayDevice->hasHLGSupport()) {
2036                 layer->forceClientComposition(hwcId);
2037             }
2038 
2039             if (layer->getForceClientComposition(hwcId)) {
2040                 ALOGV("[%s] Requesting Client composition", layer->getName().string());
2041                 layer->setCompositionType(hwcId, HWC2::Composition::Client);
2042                 continue;
2043             }
2044 
2045             layer->setPerFrameData(displayDevice);
2046         }
2047 
2048         if (hasWideColorDisplay) {
2049             ColorMode colorMode;
2050             Dataspace dataSpace;
2051             RenderIntent renderIntent;
2052             pickColorMode(displayDevice, &colorMode, &dataSpace, &renderIntent);
2053             setActiveColorModeInternal(displayDevice, colorMode, dataSpace, renderIntent);
2054         }
2055     }
2056 
2057     mDrawingState.colorMatrixChanged = false;
2058 
2059     for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2060         auto& displayDevice = mDisplays[displayId];
2061         if (!displayDevice->isDisplayOn()) {
2062             continue;
2063         }
2064 
2065         status_t result = displayDevice->prepareFrame(*getBE().mHwc);
2066         ALOGE_IF(result != NO_ERROR, "prepareFrame for display %zd failed:"
2067                 " %d (%s)", displayId, result, strerror(-result));
2068     }
2069 }
2070 
doComposition()2071 void SurfaceFlinger::doComposition() {
2072     ATRACE_CALL();
2073     ALOGV("doComposition");
2074 
2075     const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
2076     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2077         const sp<DisplayDevice>& hw(mDisplays[dpy]);
2078         if (hw->isDisplayOn()) {
2079             // transform the dirty region into this screen's coordinate space
2080             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
2081 
2082             // repaint the framebuffer (if needed)
2083             doDisplayComposition(hw, dirtyRegion);
2084 
2085             hw->dirtyRegion.clear();
2086             hw->flip();
2087         }
2088     }
2089     postFramebuffer();
2090 }
2091 
postFramebuffer()2092 void SurfaceFlinger::postFramebuffer()
2093 {
2094     ATRACE_CALL();
2095     ALOGV("postFramebuffer");
2096 
2097     const nsecs_t now = systemTime();
2098     mDebugInSwapBuffers = now;
2099 
2100     for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2101         auto& displayDevice = mDisplays[displayId];
2102         if (!displayDevice->isDisplayOn()) {
2103             continue;
2104         }
2105         const auto hwcId = displayDevice->getHwcDisplayId();
2106         if (hwcId >= 0) {
2107             getBE().mHwc->presentAndGetReleaseFences(hwcId);
2108         }
2109         displayDevice->onSwapBuffersCompleted();
2110         displayDevice->makeCurrent();
2111         for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2112             // The layer buffer from the previous frame (if any) is released
2113             // by HWC only when the release fence from this frame (if any) is
2114             // signaled.  Always get the release fence from HWC first.
2115             auto hwcLayer = layer->getHwcLayer(hwcId);
2116             sp<Fence> releaseFence = getBE().mHwc->getLayerReleaseFence(hwcId, hwcLayer);
2117 
2118             // If the layer was client composited in the previous frame, we
2119             // need to merge with the previous client target acquire fence.
2120             // Since we do not track that, always merge with the current
2121             // client target acquire fence when it is available, even though
2122             // this is suboptimal.
2123             if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) {
2124                 releaseFence = Fence::merge("LayerRelease", releaseFence,
2125                         displayDevice->getClientTargetAcquireFence());
2126             }
2127 
2128             layer->onLayerDisplayed(releaseFence);
2129         }
2130 
2131         // We've got a list of layers needing fences, that are disjoint with
2132         // displayDevice->getVisibleLayersSortedByZ.  The best we can do is to
2133         // supply them with the present fence.
2134         if (!displayDevice->getLayersNeedingFences().isEmpty()) {
2135             sp<Fence> presentFence = getBE().mHwc->getPresentFence(hwcId);
2136             for (auto& layer : displayDevice->getLayersNeedingFences()) {
2137                 layer->onLayerDisplayed(presentFence);
2138             }
2139         }
2140 
2141         if (hwcId >= 0) {
2142             getBE().mHwc->clearReleaseFences(hwcId);
2143         }
2144     }
2145 
2146     mLastSwapBufferTime = systemTime() - now;
2147     mDebugInSwapBuffers = 0;
2148 
2149     // |mStateLock| not needed as we are on the main thread
2150     if (getBE().mHwc->isConnected(HWC_DISPLAY_PRIMARY)) {
2151         uint32_t flipCount = getDefaultDisplayDeviceLocked()->getPageFlipCount();
2152         if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
2153             logFrameStats();
2154         }
2155     }
2156 }
2157 
handleTransaction(uint32_t transactionFlags)2158 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
2159 {
2160     ATRACE_CALL();
2161 
2162     // here we keep a copy of the drawing state (that is the state that's
2163     // going to be overwritten by handleTransactionLocked()) outside of
2164     // mStateLock so that the side-effects of the State assignment
2165     // don't happen with mStateLock held (which can cause deadlocks).
2166     State drawingState(mDrawingState);
2167 
2168     Mutex::Autolock _l(mStateLock);
2169     const nsecs_t now = systemTime();
2170     mDebugInTransaction = now;
2171 
2172     // Here we're guaranteed that some transaction flags are set
2173     // so we can call handleTransactionLocked() unconditionally.
2174     // We call getTransactionFlags(), which will also clear the flags,
2175     // with mStateLock held to guarantee that mCurrentState won't change
2176     // until the transaction is committed.
2177 
2178     mVsyncModulator.onTransactionHandled();
2179     transactionFlags = getTransactionFlags(eTransactionMask);
2180     handleTransactionLocked(transactionFlags);
2181 
2182     mLastTransactionTime = systemTime() - now;
2183     mDebugInTransaction = 0;
2184     invalidateHwcGeometry();
2185     // here the transaction has been committed
2186 }
2187 
determineDisplayType(hwc2_display_t display,HWC2::Connection connection) const2188 DisplayDevice::DisplayType SurfaceFlinger::determineDisplayType(hwc2_display_t display,
2189                                                                 HWC2::Connection connection) const {
2190     // Figure out whether the event is for the primary display or an
2191     // external display by matching the Hwc display id against one for a
2192     // connected display. If we did not find a match, we then check what
2193     // displays are not already connected to determine the type. If we don't
2194     // have a connected primary display, we assume the new display is meant to
2195     // be the primary display, and then if we don't have an external display,
2196     // we assume it is that.
2197     const auto primaryDisplayId =
2198             getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_PRIMARY);
2199     const auto externalDisplayId =
2200             getBE().mHwc->getHwcDisplayId(DisplayDevice::DISPLAY_EXTERNAL);
2201     if (primaryDisplayId && primaryDisplayId == display) {
2202         return DisplayDevice::DISPLAY_PRIMARY;
2203     } else if (externalDisplayId && externalDisplayId == display) {
2204         return  DisplayDevice::DISPLAY_EXTERNAL;
2205     } else if (connection == HWC2::Connection::Connected && !primaryDisplayId) {
2206         return DisplayDevice::DISPLAY_PRIMARY;
2207     } else if (connection == HWC2::Connection::Connected && !externalDisplayId) {
2208         return DisplayDevice::DISPLAY_EXTERNAL;
2209     }
2210 
2211     return DisplayDevice::DISPLAY_ID_INVALID;
2212 }
2213 
processDisplayHotplugEventsLocked()2214 void SurfaceFlinger::processDisplayHotplugEventsLocked() {
2215     for (const auto& event : mPendingHotplugEvents) {
2216         auto displayType = determineDisplayType(event.display, event.connection);
2217         if (displayType == DisplayDevice::DISPLAY_ID_INVALID) {
2218             ALOGW("Unable to determine the display type for display %" PRIu64, event.display);
2219             continue;
2220         }
2221 
2222         if (getBE().mHwc->isUsingVrComposer() && displayType == DisplayDevice::DISPLAY_EXTERNAL) {
2223             ALOGE("External displays are not supported by the vr hardware composer.");
2224             continue;
2225         }
2226 
2227         getBE().mHwc->onHotplug(event.display, displayType, event.connection);
2228 
2229         if (event.connection == HWC2::Connection::Connected) {
2230             if (!mBuiltinDisplays[displayType].get()) {
2231                 ALOGV("Creating built in display %d", displayType);
2232                 mBuiltinDisplays[displayType] = new BBinder();
2233                 // All non-virtual displays are currently considered secure.
2234                 DisplayDeviceState info(displayType, true);
2235                 info.displayName = displayType == DisplayDevice::DISPLAY_PRIMARY ?
2236                         "Built-in Screen" : "External Screen";
2237                 mCurrentState.displays.add(mBuiltinDisplays[displayType], info);
2238                 mInterceptor->saveDisplayCreation(info);
2239             }
2240         } else {
2241             ALOGV("Removing built in display %d", displayType);
2242 
2243             ssize_t idx = mCurrentState.displays.indexOfKey(mBuiltinDisplays[displayType]);
2244             if (idx >= 0) {
2245                 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
2246                 mInterceptor->saveDisplayDeletion(info.displayId);
2247                 mCurrentState.displays.removeItemsAt(idx);
2248             }
2249             mBuiltinDisplays[displayType].clear();
2250         }
2251 
2252         processDisplayChangesLocked();
2253     }
2254 
2255     mPendingHotplugEvents.clear();
2256 }
2257 
setupNewDisplayDeviceInternal(const wp<IBinder> & display,int hwcId,const DisplayDeviceState & state,const sp<DisplaySurface> & dispSurface,const sp<IGraphicBufferProducer> & producer)2258 sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal(
2259         const wp<IBinder>& display, int hwcId, const DisplayDeviceState& state,
2260         const sp<DisplaySurface>& dispSurface, const sp<IGraphicBufferProducer>& producer) {
2261     bool hasWideColorGamut = false;
2262     std::unordered_map<ColorMode, std::vector<RenderIntent>> hwcColorModes;
2263 
2264     if (hasWideColorDisplay) {
2265         std::vector<ColorMode> modes = getHwComposer().getColorModes(hwcId);
2266         for (ColorMode colorMode : modes) {
2267             switch (colorMode) {
2268                 case ColorMode::DISPLAY_P3:
2269                 case ColorMode::ADOBE_RGB:
2270                 case ColorMode::DCI_P3:
2271                     hasWideColorGamut = true;
2272                     break;
2273                 default:
2274                     break;
2275             }
2276 
2277             std::vector<RenderIntent> renderIntents = getHwComposer().getRenderIntents(hwcId,
2278                                                                                        colorMode);
2279             hwcColorModes.emplace(colorMode, renderIntents);
2280         }
2281     }
2282 
2283     HdrCapabilities hdrCapabilities;
2284     getHwComposer().getHdrCapabilities(hwcId, &hdrCapabilities);
2285 
2286     auto nativeWindowSurface = mCreateNativeWindowSurface(producer);
2287     auto nativeWindow = nativeWindowSurface->getNativeWindow();
2288 
2289     /*
2290      * Create our display's surface
2291      */
2292     std::unique_ptr<RE::Surface> renderSurface = getRenderEngine().createSurface();
2293     renderSurface->setCritical(state.type == DisplayDevice::DISPLAY_PRIMARY);
2294     renderSurface->setAsync(state.type >= DisplayDevice::DISPLAY_VIRTUAL);
2295     renderSurface->setNativeWindow(nativeWindow.get());
2296     const int displayWidth = renderSurface->queryWidth();
2297     const int displayHeight = renderSurface->queryHeight();
2298 
2299     // Make sure that composition can never be stalled by a virtual display
2300     // consumer that isn't processing buffers fast enough. We have to do this
2301     // in two places:
2302     // * Here, in case the display is composed entirely by HWC.
2303     // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the
2304     //   window's swap interval in eglMakeCurrent, so they'll override the
2305     //   interval we set here.
2306     if (state.type >= DisplayDevice::DISPLAY_VIRTUAL) {
2307         nativeWindow->setSwapInterval(nativeWindow.get(), 0);
2308     }
2309 
2310     // virtual displays are always considered enabled
2311     auto initialPowerMode = (state.type >= DisplayDevice::DISPLAY_VIRTUAL) ? HWC_POWER_MODE_NORMAL
2312                                                                            : HWC_POWER_MODE_OFF;
2313 
2314     sp<DisplayDevice> hw =
2315             new DisplayDevice(this, state.type, hwcId, state.isSecure, display, nativeWindow,
2316                               dispSurface, std::move(renderSurface), displayWidth, displayHeight,
2317                               hasWideColorGamut, hdrCapabilities,
2318                               getHwComposer().getSupportedPerFrameMetadata(hwcId),
2319                               hwcColorModes, initialPowerMode);
2320 
2321     if (maxFrameBufferAcquiredBuffers >= 3) {
2322         nativeWindowSurface->preallocateBuffers();
2323     }
2324 
2325     ColorMode defaultColorMode = ColorMode::NATIVE;
2326     Dataspace defaultDataSpace = Dataspace::UNKNOWN;
2327     if (hasWideColorGamut) {
2328         defaultColorMode = ColorMode::SRGB;
2329         defaultDataSpace = Dataspace::SRGB;
2330     }
2331     setActiveColorModeInternal(hw, defaultColorMode, defaultDataSpace,
2332                                RenderIntent::COLORIMETRIC);
2333     if (state.type < DisplayDevice::DISPLAY_VIRTUAL) {
2334         hw->setActiveConfig(getHwComposer().getActiveConfigIndex(state.type));
2335     }
2336     hw->setLayerStack(state.layerStack);
2337     hw->setProjection(state.orientation, state.viewport, state.frame);
2338     hw->setDisplayName(state.displayName);
2339 
2340     return hw;
2341 }
2342 
processDisplayChangesLocked()2343 void SurfaceFlinger::processDisplayChangesLocked() {
2344     // here we take advantage of Vector's copy-on-write semantics to
2345     // improve performance by skipping the transaction entirely when
2346     // know that the lists are identical
2347     const KeyedVector<wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
2348     const KeyedVector<wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
2349     if (!curr.isIdenticalTo(draw)) {
2350         mVisibleRegionsDirty = true;
2351         const size_t cc = curr.size();
2352         size_t dc = draw.size();
2353 
2354         // find the displays that were removed
2355         // (ie: in drawing state but not in current state)
2356         // also handle displays that changed
2357         // (ie: displays that are in both lists)
2358         for (size_t i = 0; i < dc;) {
2359             const ssize_t j = curr.indexOfKey(draw.keyAt(i));
2360             if (j < 0) {
2361                 // in drawing state but not in current state
2362                 // Call makeCurrent() on the primary display so we can
2363                 // be sure that nothing associated with this display
2364                 // is current.
2365                 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
2366                 if (defaultDisplay != nullptr) defaultDisplay->makeCurrent();
2367                 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
2368                 if (hw != nullptr) hw->disconnect(getHwComposer());
2369                 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
2370                     mEventThread->onHotplugReceived(draw[i].type, false);
2371                 mDisplays.removeItem(draw.keyAt(i));
2372             } else {
2373                 // this display is in both lists. see if something changed.
2374                 const DisplayDeviceState& state(curr[j]);
2375                 const wp<IBinder>& display(curr.keyAt(j));
2376                 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
2377                 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
2378                 if (state_binder != draw_binder) {
2379                     // changing the surface is like destroying and
2380                     // recreating the DisplayDevice, so we just remove it
2381                     // from the drawing state, so that it get re-added
2382                     // below.
2383                     sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
2384                     if (hw != nullptr) hw->disconnect(getHwComposer());
2385                     mDisplays.removeItem(display);
2386                     mDrawingState.displays.removeItemsAt(i);
2387                     dc--;
2388                     // at this point we must loop to the next item
2389                     continue;
2390                 }
2391 
2392                 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
2393                 if (disp != nullptr) {
2394                     if (state.layerStack != draw[i].layerStack) {
2395                         disp->setLayerStack(state.layerStack);
2396                     }
2397                     if ((state.orientation != draw[i].orientation) ||
2398                         (state.viewport != draw[i].viewport) || (state.frame != draw[i].frame)) {
2399                         disp->setProjection(state.orientation, state.viewport, state.frame);
2400                     }
2401                     if (state.width != draw[i].width || state.height != draw[i].height) {
2402                         disp->setDisplaySize(state.width, state.height);
2403                     }
2404                 }
2405             }
2406             ++i;
2407         }
2408 
2409         // find displays that were added
2410         // (ie: in current state but not in drawing state)
2411         for (size_t i = 0; i < cc; i++) {
2412             if (draw.indexOfKey(curr.keyAt(i)) < 0) {
2413                 const DisplayDeviceState& state(curr[i]);
2414 
2415                 sp<DisplaySurface> dispSurface;
2416                 sp<IGraphicBufferProducer> producer;
2417                 sp<IGraphicBufferProducer> bqProducer;
2418                 sp<IGraphicBufferConsumer> bqConsumer;
2419                 mCreateBufferQueue(&bqProducer, &bqConsumer, false);
2420 
2421                 int32_t hwcId = -1;
2422                 if (state.isVirtualDisplay()) {
2423                     // Virtual displays without a surface are dormant:
2424                     // they have external state (layer stack, projection,
2425                     // etc.) but no internal state (i.e. a DisplayDevice).
2426                     if (state.surface != nullptr) {
2427                         // Allow VR composer to use virtual displays.
2428                         if (mUseHwcVirtualDisplays || getBE().mHwc->isUsingVrComposer()) {
2429                             int width = 0;
2430                             int status = state.surface->query(NATIVE_WINDOW_WIDTH, &width);
2431                             ALOGE_IF(status != NO_ERROR, "Unable to query width (%d)", status);
2432                             int height = 0;
2433                             status = state.surface->query(NATIVE_WINDOW_HEIGHT, &height);
2434                             ALOGE_IF(status != NO_ERROR, "Unable to query height (%d)", status);
2435                             int intFormat = 0;
2436                             status = state.surface->query(NATIVE_WINDOW_FORMAT, &intFormat);
2437                             ALOGE_IF(status != NO_ERROR, "Unable to query format (%d)", status);
2438                             auto format = static_cast<ui::PixelFormat>(intFormat);
2439 
2440                             getBE().mHwc->allocateVirtualDisplay(width, height, &format, &hwcId);
2441                         }
2442 
2443                         // TODO: Plumb requested format back up to consumer
2444 
2445                         sp<VirtualDisplaySurface> vds =
2446                                 new VirtualDisplaySurface(*getBE().mHwc, hwcId, state.surface,
2447                                                           bqProducer, bqConsumer,
2448                                                           state.displayName);
2449 
2450                         dispSurface = vds;
2451                         producer = vds;
2452                     }
2453                 } else {
2454                     ALOGE_IF(state.surface != nullptr,
2455                              "adding a supported display, but rendering "
2456                              "surface is provided (%p), ignoring it",
2457                              state.surface.get());
2458 
2459                     hwcId = state.type;
2460                     dispSurface = new FramebufferSurface(*getBE().mHwc, hwcId, bqConsumer);
2461                     producer = bqProducer;
2462                 }
2463 
2464                 const wp<IBinder>& display(curr.keyAt(i));
2465                 if (dispSurface != nullptr) {
2466                     mDisplays.add(display,
2467                                   setupNewDisplayDeviceInternal(display, hwcId, state, dispSurface,
2468                                                                 producer));
2469                     if (!state.isVirtualDisplay()) {
2470                         mEventThread->onHotplugReceived(state.type, true);
2471                     }
2472                 }
2473             }
2474         }
2475     }
2476 
2477     mDrawingState.displays = mCurrentState.displays;
2478 }
2479 
handleTransactionLocked(uint32_t transactionFlags)2480 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
2481 {
2482     // Notify all layers of available frames
2483     mCurrentState.traverseInZOrder([](Layer* layer) {
2484         layer->notifyAvailableFrames();
2485     });
2486 
2487     /*
2488      * Traversal of the children
2489      * (perform the transaction for each of them if needed)
2490      */
2491 
2492     if (transactionFlags & eTraversalNeeded) {
2493         mCurrentState.traverseInZOrder([&](Layer* layer) {
2494             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
2495             if (!trFlags) return;
2496 
2497             const uint32_t flags = layer->doTransaction(0);
2498             if (flags & Layer::eVisibleRegion)
2499                 mVisibleRegionsDirty = true;
2500         });
2501     }
2502 
2503     /*
2504      * Perform display own transactions if needed
2505      */
2506 
2507     if (transactionFlags & eDisplayTransactionNeeded) {
2508         processDisplayChangesLocked();
2509         processDisplayHotplugEventsLocked();
2510     }
2511 
2512     if (transactionFlags & (eDisplayLayerStackChanged|eDisplayTransactionNeeded)) {
2513         // The transform hint might have changed for some layers
2514         // (either because a display has changed, or because a layer
2515         // as changed).
2516         //
2517         // Walk through all the layers in currentLayers,
2518         // and update their transform hint.
2519         //
2520         // If a layer is visible only on a single display, then that
2521         // display is used to calculate the hint, otherwise we use the
2522         // default display.
2523         //
2524         // NOTE: we do this here, rather than in rebuildLayerStacks() so that
2525         // the hint is set before we acquire a buffer from the surface texture.
2526         //
2527         // NOTE: layer transactions have taken place already, so we use their
2528         // drawing state. However, SurfaceFlinger's own transaction has not
2529         // happened yet, so we must use the current state layer list
2530         // (soon to become the drawing state list).
2531         //
2532         sp<const DisplayDevice> disp;
2533         uint32_t currentlayerStack = 0;
2534         bool first = true;
2535         mCurrentState.traverseInZOrder([&](Layer* layer) {
2536             // NOTE: we rely on the fact that layers are sorted by
2537             // layerStack first (so we don't have to traverse the list
2538             // of displays for every layer).
2539             uint32_t layerStack = layer->getLayerStack();
2540             if (first || currentlayerStack != layerStack) {
2541                 currentlayerStack = layerStack;
2542                 // figure out if this layerstack is mirrored
2543                 // (more than one display) if so, pick the default display,
2544                 // if not, pick the only display it's on.
2545                 disp.clear();
2546                 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2547                     sp<const DisplayDevice> hw(mDisplays[dpy]);
2548                     if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) {
2549                         if (disp == nullptr) {
2550                             disp = std::move(hw);
2551                         } else {
2552                             disp = nullptr;
2553                             break;
2554                         }
2555                     }
2556                 }
2557             }
2558 
2559             if (disp == nullptr) {
2560                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
2561                 // redraw after transform hint changes. See bug 8508397.
2562 
2563                 // could be null when this layer is using a layerStack
2564                 // that is not visible on any display. Also can occur at
2565                 // screen off/on times.
2566                 disp = getDefaultDisplayDeviceLocked();
2567             }
2568 
2569             // disp can be null if there is no display available at all to get
2570             // the transform hint from.
2571             if (disp != nullptr) {
2572                 layer->updateTransformHint(disp);
2573             }
2574 
2575             first = false;
2576         });
2577     }
2578 
2579 
2580     /*
2581      * Perform our own transaction if needed
2582      */
2583 
2584     if (mLayersAdded) {
2585         mLayersAdded = false;
2586         // Layers have been added.
2587         mVisibleRegionsDirty = true;
2588     }
2589 
2590     // some layers might have been removed, so
2591     // we need to update the regions they're exposing.
2592     if (mLayersRemoved) {
2593         mLayersRemoved = false;
2594         mVisibleRegionsDirty = true;
2595         mDrawingState.traverseInZOrder([&](Layer* layer) {
2596             if (mLayersPendingRemoval.indexOf(layer) >= 0) {
2597                 // this layer is not visible anymore
2598                 // TODO: we could traverse the tree from front to back and
2599                 //       compute the actual visible region
2600                 // TODO: we could cache the transformed region
2601                 Region visibleReg;
2602                 visibleReg.set(layer->computeScreenBounds());
2603                 invalidateLayerStack(layer, visibleReg);
2604             }
2605         });
2606     }
2607 
2608     commitTransaction();
2609 
2610     updateCursorAsync();
2611 }
2612 
updateCursorAsync()2613 void SurfaceFlinger::updateCursorAsync()
2614 {
2615     for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2616         auto& displayDevice = mDisplays[displayId];
2617         if (displayDevice->getHwcDisplayId() < 0) {
2618             continue;
2619         }
2620 
2621         for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2622             layer->updateCursorPosition(displayDevice);
2623         }
2624     }
2625 }
2626 
commitTransaction()2627 void SurfaceFlinger::commitTransaction()
2628 {
2629     if (!mLayersPendingRemoval.isEmpty()) {
2630         // Notify removed layers now that they can't be drawn from
2631         for (const auto& l : mLayersPendingRemoval) {
2632             recordBufferingStats(l->getName().string(),
2633                     l->getOccupancyHistory(true));
2634             l->onRemoved();
2635         }
2636         mLayersPendingRemoval.clear();
2637     }
2638 
2639     // If this transaction is part of a window animation then the next frame
2640     // we composite should be considered an animation as well.
2641     mAnimCompositionPending = mAnimTransactionPending;
2642 
2643     mDrawingState = mCurrentState;
2644     // clear the "changed" flags in current state
2645     mCurrentState.colorMatrixChanged = false;
2646 
2647     mDrawingState.traverseInZOrder([](Layer* layer) {
2648         layer->commitChildList();
2649     });
2650     mTransactionPending = false;
2651     mAnimTransactionPending = false;
2652     mTransactionCV.broadcast();
2653 }
2654 
computeVisibleRegions(const sp<const DisplayDevice> & displayDevice,Region & outDirtyRegion,Region & outOpaqueRegion)2655 void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
2656         Region& outDirtyRegion, Region& outOpaqueRegion)
2657 {
2658     ATRACE_CALL();
2659     ALOGV("computeVisibleRegions");
2660 
2661     Region aboveOpaqueLayers;
2662     Region aboveCoveredLayers;
2663     Region dirty;
2664 
2665     outDirtyRegion.clear();
2666 
2667     mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
2668         // start with the whole surface at its current location
2669         const Layer::State& s(layer->getDrawingState());
2670 
2671         // only consider the layers on the given layer stack
2672         if (!layer->belongsToDisplay(displayDevice->getLayerStack(), displayDevice->isPrimary()))
2673             return;
2674 
2675         /*
2676          * opaqueRegion: area of a surface that is fully opaque.
2677          */
2678         Region opaqueRegion;
2679 
2680         /*
2681          * visibleRegion: area of a surface that is visible on screen
2682          * and not fully transparent. This is essentially the layer's
2683          * footprint minus the opaque regions above it.
2684          * Areas covered by a translucent surface are considered visible.
2685          */
2686         Region visibleRegion;
2687 
2688         /*
2689          * coveredRegion: area of a surface that is covered by all
2690          * visible regions above it (which includes the translucent areas).
2691          */
2692         Region coveredRegion;
2693 
2694         /*
2695          * transparentRegion: area of a surface that is hinted to be completely
2696          * transparent. This is only used to tell when the layer has no visible
2697          * non-transparent regions and can be removed from the layer list. It
2698          * does not affect the visibleRegion of this layer or any layers
2699          * beneath it. The hint may not be correct if apps don't respect the
2700          * SurfaceView restrictions (which, sadly, some don't).
2701          */
2702         Region transparentRegion;
2703 
2704 
2705         // handle hidden surfaces by setting the visible region to empty
2706         if (CC_LIKELY(layer->isVisible())) {
2707             const bool translucent = !layer->isOpaque(s);
2708             Rect bounds(layer->computeScreenBounds());
2709             visibleRegion.set(bounds);
2710             Transform tr = layer->getTransform();
2711             if (!visibleRegion.isEmpty()) {
2712                 // Remove the transparent area from the visible region
2713                 if (translucent) {
2714                     if (tr.preserveRects()) {
2715                         // transform the transparent region
2716                         transparentRegion = tr.transform(s.activeTransparentRegion);
2717                     } else {
2718                         // transformation too complex, can't do the
2719                         // transparent region optimization.
2720                         transparentRegion.clear();
2721                     }
2722                 }
2723 
2724                 // compute the opaque region
2725                 const int32_t layerOrientation = tr.getOrientation();
2726                 if (layer->getAlpha() == 1.0f && !translucent &&
2727                         ((layerOrientation & Transform::ROT_INVALID) == false)) {
2728                     // the opaque region is the layer's footprint
2729                     opaqueRegion = visibleRegion;
2730                 }
2731             }
2732         }
2733 
2734         if (visibleRegion.isEmpty()) {
2735             layer->clearVisibilityRegions();
2736             return;
2737         }
2738 
2739         // Clip the covered region to the visible region
2740         coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2741 
2742         // Update aboveCoveredLayers for next (lower) layer
2743         aboveCoveredLayers.orSelf(visibleRegion);
2744 
2745         // subtract the opaque region covered by the layers above us
2746         visibleRegion.subtractSelf(aboveOpaqueLayers);
2747 
2748         // compute this layer's dirty region
2749         if (layer->contentDirty) {
2750             // we need to invalidate the whole region
2751             dirty = visibleRegion;
2752             // as well, as the old visible region
2753             dirty.orSelf(layer->visibleRegion);
2754             layer->contentDirty = false;
2755         } else {
2756             /* compute the exposed region:
2757              *   the exposed region consists of two components:
2758              *   1) what's VISIBLE now and was COVERED before
2759              *   2) what's EXPOSED now less what was EXPOSED before
2760              *
2761              * note that (1) is conservative, we start with the whole
2762              * visible region but only keep what used to be covered by
2763              * something -- which mean it may have been exposed.
2764              *
2765              * (2) handles areas that were not covered by anything but got
2766              * exposed because of a resize.
2767              */
2768             const Region newExposed = visibleRegion - coveredRegion;
2769             const Region oldVisibleRegion = layer->visibleRegion;
2770             const Region oldCoveredRegion = layer->coveredRegion;
2771             const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2772             dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2773         }
2774         dirty.subtractSelf(aboveOpaqueLayers);
2775 
2776         // accumulate to the screen dirty region
2777         outDirtyRegion.orSelf(dirty);
2778 
2779         // Update aboveOpaqueLayers for next (lower) layer
2780         aboveOpaqueLayers.orSelf(opaqueRegion);
2781 
2782         // Store the visible region in screen space
2783         layer->setVisibleRegion(visibleRegion);
2784         layer->setCoveredRegion(coveredRegion);
2785         layer->setVisibleNonTransparentRegion(
2786                 visibleRegion.subtract(transparentRegion));
2787     });
2788 
2789     outOpaqueRegion = aboveOpaqueLayers;
2790 }
2791 
invalidateLayerStack(const sp<const Layer> & layer,const Region & dirty)2792 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2793     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2794         const sp<DisplayDevice>& hw(mDisplays[dpy]);
2795         if (layer->belongsToDisplay(hw->getLayerStack(), hw->isPrimary())) {
2796             hw->dirtyRegion.orSelf(dirty);
2797         }
2798     }
2799 }
2800 
handlePageFlip()2801 bool SurfaceFlinger::handlePageFlip()
2802 {
2803     ALOGV("handlePageFlip");
2804 
2805     nsecs_t latchTime = systemTime();
2806 
2807     bool visibleRegions = false;
2808     bool frameQueued = false;
2809     bool newDataLatched = false;
2810 
2811     // Store the set of layers that need updates. This set must not change as
2812     // buffers are being latched, as this could result in a deadlock.
2813     // Example: Two producers share the same command stream and:
2814     // 1.) Layer 0 is latched
2815     // 2.) Layer 0 gets a new frame
2816     // 2.) Layer 1 gets a new frame
2817     // 3.) Layer 1 is latched.
2818     // Display is now waiting on Layer 1's frame, which is behind layer 0's
2819     // second frame. But layer 0's second frame could be waiting on display.
2820     mDrawingState.traverseInZOrder([&](Layer* layer) {
2821         if (layer->hasQueuedFrame()) {
2822             frameQueued = true;
2823             if (layer->shouldPresentNow(mPrimaryDispSync)) {
2824                 mLayersWithQueuedFrames.push_back(layer);
2825             } else {
2826                 layer->useEmptyDamage();
2827             }
2828         } else {
2829             layer->useEmptyDamage();
2830         }
2831     });
2832 
2833     for (auto& layer : mLayersWithQueuedFrames) {
2834         const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
2835         layer->useSurfaceDamage();
2836         invalidateLayerStack(layer, dirty);
2837         if (layer->isBufferLatched()) {
2838             newDataLatched = true;
2839         }
2840     }
2841 
2842     mVisibleRegionsDirty |= visibleRegions;
2843 
2844     // If we will need to wake up at some time in the future to deal with a
2845     // queued frame that shouldn't be displayed during this vsync period, wake
2846     // up during the next vsync period to check again.
2847     if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {
2848         signalLayerUpdate();
2849     }
2850 
2851     // Only continue with the refresh if there is actually new work to do
2852     return !mLayersWithQueuedFrames.empty() && newDataLatched;
2853 }
2854 
invalidateHwcGeometry()2855 void SurfaceFlinger::invalidateHwcGeometry()
2856 {
2857     mGeometryInvalid = true;
2858 }
2859 
2860 
doDisplayComposition(const sp<const DisplayDevice> & displayDevice,const Region & inDirtyRegion)2861 void SurfaceFlinger::doDisplayComposition(
2862         const sp<const DisplayDevice>& displayDevice,
2863         const Region& inDirtyRegion)
2864 {
2865     // We only need to actually compose the display if:
2866     // 1) It is being handled by hardware composer, which may need this to
2867     //    keep its virtual display state machine in sync, or
2868     // 2) There is work to be done (the dirty region isn't empty)
2869     bool isHwcDisplay = displayDevice->getHwcDisplayId() >= 0;
2870     if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2871         ALOGV("Skipping display composition");
2872         return;
2873     }
2874 
2875     ALOGV("doDisplayComposition");
2876     if (!doComposeSurfaces(displayDevice)) return;
2877 
2878     // swap buffers (presentation)
2879     displayDevice->swapBuffers(getHwComposer());
2880 }
2881 
doComposeSurfaces(const sp<const DisplayDevice> & displayDevice)2882 bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& displayDevice)
2883 {
2884     ALOGV("doComposeSurfaces");
2885 
2886     const Region bounds(displayDevice->bounds());
2887     const DisplayRenderArea renderArea(displayDevice);
2888     const auto hwcId = displayDevice->getHwcDisplayId();
2889     const bool hasClientComposition = getBE().mHwc->hasClientComposition(hwcId);
2890     ATRACE_INT("hasClientComposition", hasClientComposition);
2891 
2892     bool applyColorMatrix = false;
2893     bool needsLegacyColorMatrix = false;
2894     bool legacyColorMatrixApplied = false;
2895 
2896     if (hasClientComposition) {
2897         ALOGV("hasClientComposition");
2898 
2899         Dataspace outputDataspace = Dataspace::UNKNOWN;
2900         if (displayDevice->hasWideColorGamut()) {
2901             outputDataspace = displayDevice->getCompositionDataSpace();
2902         }
2903         getBE().mRenderEngine->setOutputDataSpace(outputDataspace);
2904         getBE().mRenderEngine->setDisplayMaxLuminance(
2905                 displayDevice->getHdrCapabilities().getDesiredMaxLuminance());
2906 
2907         const bool hasDeviceComposition = getBE().mHwc->hasDeviceComposition(hwcId);
2908         const bool skipClientColorTransform = getBE().mHwc->hasCapability(
2909             HWC2::Capability::SkipClientColorTransform);
2910 
2911         applyColorMatrix = !hasDeviceComposition && !skipClientColorTransform;
2912         if (applyColorMatrix) {
2913             getRenderEngine().setupColorTransform(mDrawingState.colorMatrix);
2914         }
2915 
2916         needsLegacyColorMatrix =
2917             (displayDevice->getActiveRenderIntent() >= RenderIntent::ENHANCE &&
2918              outputDataspace != Dataspace::UNKNOWN &&
2919              outputDataspace != Dataspace::SRGB);
2920 
2921         if (!displayDevice->makeCurrent()) {
2922             ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2923                   displayDevice->getDisplayName().string());
2924             getRenderEngine().resetCurrentSurface();
2925 
2926             // |mStateLock| not needed as we are on the main thread
2927             if(!getDefaultDisplayDeviceLocked()->makeCurrent()) {
2928               ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2929             }
2930             return false;
2931         }
2932 
2933         // Never touch the framebuffer if we don't have any framebuffer layers
2934         if (hasDeviceComposition) {
2935             // when using overlays, we assume a fully transparent framebuffer
2936             // NOTE: we could reduce how much we need to clear, for instance
2937             // remove where there are opaque FB layers. however, on some
2938             // GPUs doing a "clean slate" clear might be more efficient.
2939             // We'll revisit later if needed.
2940             getBE().mRenderEngine->clearWithColor(0, 0, 0, 0);
2941         } else {
2942             // we start with the whole screen area and remove the scissor part
2943             // we're left with the letterbox region
2944             // (common case is that letterbox ends-up being empty)
2945             const Region letterbox(bounds.subtract(displayDevice->getScissor()));
2946 
2947             // compute the area to clear
2948             Region region(displayDevice->undefinedRegion.merge(letterbox));
2949 
2950             // screen is already cleared here
2951             if (!region.isEmpty()) {
2952                 // can happen with SurfaceView
2953                 drawWormhole(displayDevice, region);
2954             }
2955         }
2956 
2957         if (displayDevice->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2958             // just to be on the safe side, we don't set the
2959             // scissor on the main display. It should never be needed
2960             // anyways (though in theory it could since the API allows it).
2961             const Rect& bounds(displayDevice->getBounds());
2962             const Rect& scissor(displayDevice->getScissor());
2963             if (scissor != bounds) {
2964                 // scissor doesn't match the screen's dimensions, so we
2965                 // need to clear everything outside of it and enable
2966                 // the GL scissor so we don't draw anything where we shouldn't
2967 
2968                 // enable scissor for this frame
2969                 const uint32_t height = displayDevice->getHeight();
2970                 getBE().mRenderEngine->setScissor(scissor.left, height - scissor.bottom,
2971                         scissor.getWidth(), scissor.getHeight());
2972             }
2973         }
2974     }
2975 
2976     /*
2977      * and then, render the layers targeted at the framebuffer
2978      */
2979 
2980     ALOGV("Rendering client layers");
2981     const Transform& displayTransform = displayDevice->getTransform();
2982     bool firstLayer = true;
2983     for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2984         const Region clip(bounds.intersect(
2985                 displayTransform.transform(layer->visibleRegion)));
2986         ALOGV("Layer: %s", layer->getName().string());
2987         ALOGV("  Composition type: %s",
2988                 to_string(layer->getCompositionType(hwcId)).c_str());
2989         if (!clip.isEmpty()) {
2990             switch (layer->getCompositionType(hwcId)) {
2991                 case HWC2::Composition::Cursor:
2992                 case HWC2::Composition::Device:
2993                 case HWC2::Composition::Sideband:
2994                 case HWC2::Composition::SolidColor: {
2995                     const Layer::State& state(layer->getDrawingState());
2996                     if (layer->getClearClientTarget(hwcId) && !firstLayer &&
2997                             layer->isOpaque(state) && (state.color.a == 1.0f)
2998                             && hasClientComposition) {
2999                         // never clear the very first layer since we're
3000                         // guaranteed the FB is already cleared
3001                         layer->clearWithOpenGL(renderArea);
3002                     }
3003                     break;
3004                 }
3005                 case HWC2::Composition::Client: {
3006                     // switch color matrices lazily
3007                     if (layer->isLegacyDataSpace() && needsLegacyColorMatrix) {
3008                         if (!legacyColorMatrixApplied) {
3009                             getRenderEngine().setSaturationMatrix(mLegacySrgbSaturationMatrix);
3010                             legacyColorMatrixApplied = true;
3011                         }
3012                     } else if (legacyColorMatrixApplied) {
3013                         getRenderEngine().setSaturationMatrix(mat4());
3014                         legacyColorMatrixApplied = false;
3015                     }
3016 
3017                     layer->draw(renderArea, clip);
3018                     break;
3019                 }
3020                 default:
3021                     break;
3022             }
3023         } else {
3024             ALOGV("  Skipping for empty clip");
3025         }
3026         firstLayer = false;
3027     }
3028 
3029     if (applyColorMatrix) {
3030         getRenderEngine().setupColorTransform(mat4());
3031     }
3032     if (needsLegacyColorMatrix && legacyColorMatrixApplied) {
3033         getRenderEngine().setSaturationMatrix(mat4());
3034     }
3035 
3036     // disable scissor at the end of the frame
3037     getBE().mRenderEngine->disableScissor();
3038     return true;
3039 }
3040 
drawWormhole(const sp<const DisplayDevice> & displayDevice,const Region & region) const3041 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& displayDevice, const Region& region) const {
3042     const int32_t height = displayDevice->getHeight();
3043     auto& engine(getRenderEngine());
3044     engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
3045 }
3046 
addClientLayer(const sp<Client> & client,const sp<IBinder> & handle,const sp<IGraphicBufferProducer> & gbc,const sp<Layer> & lbc,const sp<IBinder> & parentHandle,const sp<Layer> & parentLayer)3047 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, const sp<IBinder>& handle,
3048                                         const sp<IGraphicBufferProducer>& gbc, const sp<Layer>& lbc,
3049                                         const sp<IBinder>& parentHandle,
3050                                         const sp<Layer>& parentLayer) {
3051     // add this layer to the current state list
3052     {
3053         Mutex::Autolock _l(mStateLock);
3054         sp<Layer> parent;
3055 
3056         if (parentHandle != nullptr) {
3057             parent = fromHandle(parentHandle);
3058             if (parent == nullptr) {
3059                 return NAME_NOT_FOUND;
3060             }
3061         } else {
3062             parent = parentLayer;
3063         }
3064 
3065         if (mNumLayers >= MAX_LAYERS) {
3066             ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers,
3067                   MAX_LAYERS);
3068             return NO_MEMORY;
3069         }
3070 
3071         auto [itr, inserted] = mLayersByLocalBinderToken.emplace(handle->localBinder(), lbc);
3072         if (!inserted) {
3073           ALOGE("-----------ERROR REGISTERING HANDLE, layer pair: handle is already a key");
3074         }
3075         if (parent == nullptr) {
3076             mCurrentState.layersSortedByZ.add(lbc);
3077         } else {
3078             if (parent->isPendingRemoval()) {
3079                 ALOGE("addClientLayer called with a removed parent");
3080                 return NAME_NOT_FOUND;
3081             }
3082             parent->addChild(lbc);
3083         }
3084 
3085         if (gbc != nullptr) {
3086             mGraphicBufferProducerList.insert(IInterface::asBinder(gbc).get());
3087             LOG_ALWAYS_FATAL_IF(mGraphicBufferProducerList.size() >
3088                                         mMaxGraphicBufferProducerListSize,
3089                                 "Suspected IGBP leak: %zu IGBPs (%zu max), %zu Layers",
3090                                 mGraphicBufferProducerList.size(),
3091                                 mMaxGraphicBufferProducerListSize, mNumLayers);
3092         }
3093         mLayersAdded = true;
3094         mNumLayers++;
3095     }
3096 
3097     // attach this layer to the client
3098     client->attachLayer(handle, lbc);
3099 
3100     return NO_ERROR;
3101 }
3102 
removeLayerFromMap(const wp<Layer> & layer)3103 status_t SurfaceFlinger::removeLayerFromMap(const wp<Layer>& layer) {
3104     auto it = mLayersByLocalBinderToken.begin();
3105     while (it != mLayersByLocalBinderToken.end()) {
3106         if (it->second == layer) {
3107             it = mLayersByLocalBinderToken.erase(it);
3108             break;
3109         } else {
3110             it++;
3111         }
3112     }
3113     if (it == mLayersByLocalBinderToken.end()) {
3114         ALOGE("Failed to remove layer from mapping - could not find matching layer");
3115         return BAD_VALUE;
3116     }
3117     return NO_ERROR;
3118 }
3119 
removeLayer(const sp<Layer> & layer,bool topLevelOnly)3120 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
3121     Mutex::Autolock _l(mStateLock);
3122     return removeLayerLocked(mStateLock, layer, topLevelOnly);
3123 }
3124 
removeLayerLocked(const Mutex &,const sp<Layer> & layer,bool topLevelOnly)3125 status_t SurfaceFlinger::removeLayerLocked(const Mutex&, const sp<Layer>& layer,
3126                                            bool topLevelOnly) {
3127     if (layer->isPendingRemoval()) {
3128         return NO_ERROR;
3129     }
3130 
3131     const auto& p = layer->getParent();
3132     ssize_t index;
3133     if (p != nullptr) {
3134         if (topLevelOnly) {
3135             return NO_ERROR;
3136         }
3137 
3138         sp<Layer> ancestor = p;
3139         while (ancestor->getParent() != nullptr) {
3140             ancestor = ancestor->getParent();
3141         }
3142         if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
3143             ALOGE("removeLayer called with a layer whose parent has been removed");
3144             return NAME_NOT_FOUND;
3145         }
3146 
3147         index = p->removeChild(layer);
3148     } else {
3149         index = mCurrentState.layersSortedByZ.remove(layer);
3150     }
3151 
3152     // As a matter of normal operation, the LayerCleaner will produce a second
3153     // attempt to remove the surface. The Layer will be kept alive in mDrawingState
3154     // so we will succeed in promoting it, but it's already been removed
3155     // from mCurrentState. As long as we can find it in mDrawingState we have no problem
3156     // otherwise something has gone wrong and we are leaking the layer.
3157     if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
3158         ALOGE("Failed to find layer (%s) in layer parent (%s).",
3159                 layer->getName().string(),
3160                 (p != nullptr) ? p->getName().string() : "no-parent");
3161         return BAD_VALUE;
3162     } else if (index < 0) {
3163         return NO_ERROR;
3164     }
3165 
3166     layer->onRemovedFromCurrentState();
3167     mLayersPendingRemoval.add(layer);
3168     mLayersRemoved = true;
3169     mNumLayers -= 1 + layer->getChildrenCount();
3170     setTransactionFlags(eTransactionNeeded);
3171     return NO_ERROR;
3172 }
3173 
peekTransactionFlags()3174 uint32_t SurfaceFlinger::peekTransactionFlags() {
3175     return android_atomic_release_load(&mTransactionFlags);
3176 }
3177 
getTransactionFlags(uint32_t flags)3178 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
3179     return android_atomic_and(~flags, &mTransactionFlags) & flags;
3180 }
3181 
setTransactionFlags(uint32_t flags)3182 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
3183     return setTransactionFlags(flags, VSyncModulator::TransactionStart::NORMAL);
3184 }
3185 
setTransactionFlags(uint32_t flags,VSyncModulator::TransactionStart transactionStart)3186 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags,
3187         VSyncModulator::TransactionStart transactionStart) {
3188     uint32_t old = android_atomic_or(flags, &mTransactionFlags);
3189     mVsyncModulator.setTransactionStart(transactionStart);
3190     if ((old & flags)==0) { // wake the server up
3191         signalTransaction();
3192     }
3193     return old;
3194 }
3195 
containsAnyInvalidClientState(const Vector<ComposerState> & states)3196 bool SurfaceFlinger::containsAnyInvalidClientState(const Vector<ComposerState>& states) {
3197     for (const ComposerState& state : states) {
3198         // Here we need to check that the interface we're given is indeed
3199         // one of our own. A malicious client could give us a nullptr
3200         // IInterface, or one of its own or even one of our own but a
3201         // different type. All these situations would cause us to crash.
3202         if (state.client == nullptr) {
3203             return true;
3204         }
3205 
3206         sp<IBinder> binder = IInterface::asBinder(state.client);
3207         if (binder == nullptr) {
3208             return true;
3209         }
3210 
3211         if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) == nullptr) {
3212             return true;
3213         }
3214     }
3215     return false;
3216 }
3217 
setTransactionState(const Vector<ComposerState> & states,const Vector<DisplayState> & displays,uint32_t flags)3218 void SurfaceFlinger::setTransactionState(
3219         const Vector<ComposerState>& states,
3220         const Vector<DisplayState>& displays,
3221         uint32_t flags)
3222 {
3223     ATRACE_CALL();
3224     Mutex::Autolock _l(mStateLock);
3225     uint32_t transactionFlags = 0;
3226 
3227     if (containsAnyInvalidClientState(states)) {
3228         return;
3229     }
3230 
3231     if (flags & eAnimation) {
3232         // For window updates that are part of an animation we must wait for
3233         // previous animation "frames" to be handled.
3234         while (mAnimTransactionPending) {
3235             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3236             if (CC_UNLIKELY(err != NO_ERROR)) {
3237                 // just in case something goes wrong in SF, return to the
3238                 // caller after a few seconds.
3239                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
3240                         "waiting for previous animation frame");
3241                 mAnimTransactionPending = false;
3242                 break;
3243             }
3244         }
3245     }
3246 
3247     for (const DisplayState& display : displays) {
3248         transactionFlags |= setDisplayStateLocked(display);
3249     }
3250 
3251     for (const ComposerState& state : states) {
3252         transactionFlags |= setClientStateLocked(state);
3253     }
3254 
3255     // Iterate through all layers again to determine if any need to be destroyed. Marking layers
3256     // as destroyed should only occur after setting all other states. This is to allow for a
3257     // child re-parent to happen before marking its original parent as destroyed (which would
3258     // then mark the child as destroyed).
3259     for (const ComposerState& state : states) {
3260         setDestroyStateLocked(state);
3261     }
3262 
3263     // If a synchronous transaction is explicitly requested without any changes, force a transaction
3264     // anyway. This can be used as a flush mechanism for previous async transactions.
3265     // Empty animation transaction can be used to simulate back-pressure, so also force a
3266     // transaction for empty animation transactions.
3267     if (transactionFlags == 0 &&
3268             ((flags & eSynchronous) || (flags & eAnimation))) {
3269         transactionFlags = eTransactionNeeded;
3270     }
3271 
3272     if (transactionFlags) {
3273         if (mInterceptor->isEnabled()) {
3274             mInterceptor->saveTransaction(states, mCurrentState.displays, displays, flags);
3275         }
3276 
3277         // this triggers the transaction
3278         const auto start = (flags & eEarlyWakeup)
3279                 ? VSyncModulator::TransactionStart::EARLY
3280                 : VSyncModulator::TransactionStart::NORMAL;
3281         setTransactionFlags(transactionFlags, start);
3282 
3283         // if this is a synchronous transaction, wait for it to take effect
3284         // before returning.
3285         if (flags & eSynchronous) {
3286             mTransactionPending = true;
3287         }
3288         if (flags & eAnimation) {
3289             mAnimTransactionPending = true;
3290         }
3291         while (mTransactionPending) {
3292             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
3293             if (CC_UNLIKELY(err != NO_ERROR)) {
3294                 // just in case something goes wrong in SF, return to the
3295                 // called after a few seconds.
3296                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
3297                 mTransactionPending = false;
3298                 break;
3299             }
3300         }
3301     }
3302 }
3303 
setDisplayStateLocked(const DisplayState & s)3304 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
3305 {
3306     ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
3307     if (dpyIdx < 0)
3308         return 0;
3309 
3310     uint32_t flags = 0;
3311     DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
3312     if (disp.isValid()) {
3313         const uint32_t what = s.what;
3314         if (what & DisplayState::eSurfaceChanged) {
3315             if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
3316                 disp.surface = s.surface;
3317                 flags |= eDisplayTransactionNeeded;
3318             }
3319         }
3320         if (what & DisplayState::eLayerStackChanged) {
3321             if (disp.layerStack != s.layerStack) {
3322                 disp.layerStack = s.layerStack;
3323                 flags |= eDisplayTransactionNeeded;
3324             }
3325         }
3326         if (what & DisplayState::eDisplayProjectionChanged) {
3327             if (disp.orientation != s.orientation) {
3328                 disp.orientation = s.orientation;
3329                 flags |= eDisplayTransactionNeeded;
3330             }
3331             if (disp.frame != s.frame) {
3332                 disp.frame = s.frame;
3333                 flags |= eDisplayTransactionNeeded;
3334             }
3335             if (disp.viewport != s.viewport) {
3336                 disp.viewport = s.viewport;
3337                 flags |= eDisplayTransactionNeeded;
3338             }
3339         }
3340         if (what & DisplayState::eDisplaySizeChanged) {
3341             if (disp.width != s.width) {
3342                 disp.width = s.width;
3343                 flags |= eDisplayTransactionNeeded;
3344             }
3345             if (disp.height != s.height) {
3346                 disp.height = s.height;
3347                 flags |= eDisplayTransactionNeeded;
3348             }
3349         }
3350     }
3351     return flags;
3352 }
3353 
setClientStateLocked(const ComposerState & composerState)3354 uint32_t SurfaceFlinger::setClientStateLocked(const ComposerState& composerState) {
3355     const layer_state_t& s = composerState.state;
3356     sp<Client> client(static_cast<Client*>(composerState.client.get()));
3357 
3358     sp<Layer> layer = fromHandle(s.surface);
3359     if (layer == nullptr || !(client->isAttached(s.surface))) {
3360         return 0;
3361     }
3362 
3363     if (layer->isPendingRemoval()) {
3364         ALOGW("Attempting to set client state on removed layer: %s", layer->getName().string());
3365         return 0;
3366     }
3367 
3368     uint32_t flags = 0;
3369 
3370     const uint32_t what = s.what;
3371     bool geometryAppliesWithResize =
3372             what & layer_state_t::eGeometryAppliesWithResize;
3373 
3374     // If we are deferring transaction, make sure to push the pending state, as otherwise the
3375     // pending state will also be deferred.
3376     if (what & layer_state_t::eDeferTransaction) {
3377         layer->pushPendingState();
3378     }
3379 
3380     if (what & layer_state_t::ePositionChanged) {
3381         if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
3382             flags |= eTraversalNeeded;
3383         }
3384     }
3385     if (what & layer_state_t::eLayerChanged) {
3386         // NOTE: index needs to be calculated before we update the state
3387         const auto& p = layer->getParent();
3388         if (p == nullptr) {
3389             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3390             if (layer->setLayer(s.z) && idx >= 0) {
3391                 mCurrentState.layersSortedByZ.removeAt(idx);
3392                 mCurrentState.layersSortedByZ.add(layer);
3393                 // we need traversal (state changed)
3394                 // AND transaction (list changed)
3395                 flags |= eTransactionNeeded|eTraversalNeeded;
3396             }
3397         } else {
3398             if (p->setChildLayer(layer, s.z)) {
3399                 flags |= eTransactionNeeded|eTraversalNeeded;
3400             }
3401         }
3402     }
3403     if (what & layer_state_t::eRelativeLayerChanged) {
3404         // NOTE: index needs to be calculated before we update the state
3405         const auto& p = layer->getParent();
3406         if (p == nullptr) {
3407             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3408             if (layer->setRelativeLayer(s.relativeLayerHandle, s.z) && idx >= 0) {
3409                 mCurrentState.layersSortedByZ.removeAt(idx);
3410                 mCurrentState.layersSortedByZ.add(layer);
3411                 // we need traversal (state changed)
3412                 // AND transaction (list changed)
3413                 flags |= eTransactionNeeded|eTraversalNeeded;
3414             }
3415         } else {
3416             if (p->setChildRelativeLayer(layer, s.relativeLayerHandle, s.z)) {
3417                 flags |= eTransactionNeeded|eTraversalNeeded;
3418             }
3419         }
3420     }
3421     if (what & layer_state_t::eSizeChanged) {
3422         if (layer->setSize(s.w, s.h)) {
3423             flags |= eTraversalNeeded;
3424         }
3425     }
3426     if (what & layer_state_t::eAlphaChanged) {
3427         if (layer->setAlpha(s.alpha))
3428             flags |= eTraversalNeeded;
3429     }
3430     if (what & layer_state_t::eColorChanged) {
3431         if (layer->setColor(s.color))
3432             flags |= eTraversalNeeded;
3433     }
3434     if (what & layer_state_t::eMatrixChanged) {
3435         if (layer->setMatrix(s.matrix))
3436             flags |= eTraversalNeeded;
3437     }
3438     if (what & layer_state_t::eTransparentRegionChanged) {
3439         if (layer->setTransparentRegionHint(s.transparentRegion))
3440             flags |= eTraversalNeeded;
3441     }
3442     if (what & layer_state_t::eFlagsChanged) {
3443         if (layer->setFlags(s.flags, s.mask))
3444             flags |= eTraversalNeeded;
3445     }
3446     if (what & layer_state_t::eCropChanged) {
3447         if (layer->setCrop(s.crop, !geometryAppliesWithResize))
3448             flags |= eTraversalNeeded;
3449     }
3450     if (what & layer_state_t::eFinalCropChanged) {
3451         if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
3452             flags |= eTraversalNeeded;
3453     }
3454     if (what & layer_state_t::eLayerStackChanged) {
3455         ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3456         // We only allow setting layer stacks for top level layers,
3457         // everything else inherits layer stack from its parent.
3458         if (layer->hasParent()) {
3459             ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
3460                     layer->getName().string());
3461         } else if (idx < 0) {
3462             ALOGE("Attempt to set layer stack on layer without parent (%s) that "
3463                     "that also does not appear in the top level layer list. Something"
3464                     " has gone wrong.", layer->getName().string());
3465         } else if (layer->setLayerStack(s.layerStack)) {
3466             mCurrentState.layersSortedByZ.removeAt(idx);
3467             mCurrentState.layersSortedByZ.add(layer);
3468             // we need traversal (state changed)
3469             // AND transaction (list changed)
3470             flags |= eTransactionNeeded|eTraversalNeeded|eDisplayLayerStackChanged;
3471         }
3472     }
3473     if (what & layer_state_t::eDeferTransaction) {
3474         if (s.barrierHandle != nullptr) {
3475             layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
3476         } else if (s.barrierGbp != nullptr) {
3477             const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
3478             if (authenticateSurfaceTextureLocked(gbp)) {
3479                 const auto& otherLayer =
3480                     (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
3481                 layer->deferTransactionUntil(otherLayer, s.frameNumber);
3482             } else {
3483                 ALOGE("Attempt to defer transaction to to an"
3484                         " unrecognized GraphicBufferProducer");
3485             }
3486         }
3487         // We don't trigger a traversal here because if no other state is
3488         // changed, we don't want this to cause any more work
3489     }
3490     if (what & layer_state_t::eReparent) {
3491         bool hadParent = layer->hasParent();
3492         if (layer->reparent(s.parentHandleForChild)) {
3493             if (!hadParent) {
3494                 mCurrentState.layersSortedByZ.remove(layer);
3495             }
3496             flags |= eTransactionNeeded|eTraversalNeeded;
3497         }
3498     }
3499     if (what & layer_state_t::eReparentChildren) {
3500         if (layer->reparentChildren(s.reparentHandle)) {
3501             flags |= eTransactionNeeded|eTraversalNeeded;
3502         }
3503     }
3504     if (what & layer_state_t::eDetachChildren) {
3505         layer->detachChildren();
3506     }
3507     if (what & layer_state_t::eOverrideScalingModeChanged) {
3508         layer->setOverrideScalingMode(s.overrideScalingMode);
3509         // We don't trigger a traversal here because if no other state is
3510         // changed, we don't want this to cause any more work
3511     }
3512     return flags;
3513 }
3514 
setDestroyStateLocked(const ComposerState & composerState)3515 void SurfaceFlinger::setDestroyStateLocked(const ComposerState& composerState) {
3516     const layer_state_t& state = composerState.state;
3517     sp<Client> client(static_cast<Client*>(composerState.client.get()));
3518 
3519     sp<Layer> layer = fromHandle(state.surface);
3520     if (layer == nullptr || !(client->isAttached(state.surface))) {
3521         return;
3522     }
3523 
3524     if (layer->isPendingRemoval()) {
3525         ALOGW("Attempting to destroy on removed layer: %s", layer->getName().string());
3526         return;
3527     }
3528 
3529     if (state.what & layer_state_t::eDestroySurface) {
3530         removeLayerLocked(mStateLock, layer);
3531     }
3532 }
3533 
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,const sp<IBinder> & parentHandle,const sp<Layer> & parentLayer)3534 status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& client, uint32_t w,
3535                                      uint32_t h, PixelFormat format, uint32_t flags,
3536                                      int32_t windowType, int32_t ownerUid, sp<IBinder>* handle,
3537                                      sp<IGraphicBufferProducer>* gbp,
3538                                      const sp<IBinder>& parentHandle,
3539                                      const sp<Layer>& parentLayer) {
3540     if (int32_t(w|h) < 0) {
3541         ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
3542                 int(w), int(h));
3543         return BAD_VALUE;
3544     }
3545 
3546     status_t result = NO_ERROR;
3547 
3548     sp<Layer> layer;
3549 
3550     String8 uniqueName = getUniqueLayerName(name);
3551 
3552     switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
3553         case ISurfaceComposerClient::eFXSurfaceNormal:
3554             result = createBufferLayer(client,
3555                     uniqueName, w, h, flags, format,
3556                     handle, gbp, &layer);
3557 
3558             break;
3559         case ISurfaceComposerClient::eFXSurfaceColor:
3560             result = createColorLayer(client,
3561                     uniqueName, w, h, flags,
3562                     handle, &layer);
3563             break;
3564         default:
3565             result = BAD_VALUE;
3566             break;
3567     }
3568 
3569     if (result != NO_ERROR) {
3570         return result;
3571     }
3572 
3573     // window type is WINDOW_TYPE_DONT_SCREENSHOT from SurfaceControl.java
3574     // TODO b/64227542
3575     if (windowType == 441731) {
3576         windowType = 2024; // TYPE_NAVIGATION_BAR_PANEL
3577         layer->setPrimaryDisplayOnly();
3578     }
3579 
3580     layer->setInfo(windowType, ownerUid);
3581 
3582     result = addClientLayer(client, *handle, *gbp, layer, parentHandle, parentLayer);
3583     if (result != NO_ERROR) {
3584         return result;
3585     }
3586     mInterceptor->saveSurfaceCreation(layer);
3587 
3588     setTransactionFlags(eTransactionNeeded);
3589     return result;
3590 }
3591 
getUniqueLayerName(const String8 & name)3592 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
3593 {
3594     bool matchFound = true;
3595     uint32_t dupeCounter = 0;
3596 
3597     // Tack on our counter whether there is a hit or not, so everyone gets a tag
3598     String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
3599 
3600     // Loop over layers until we're sure there is no matching name
3601     while (matchFound) {
3602         matchFound = false;
3603         mDrawingState.traverseInZOrder([&](Layer* layer) {
3604             if (layer->getName() == uniqueName) {
3605                 matchFound = true;
3606                 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
3607             }
3608         });
3609     }
3610 
3611     ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
3612 
3613     return uniqueName;
3614 }
3615 
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)3616 status_t SurfaceFlinger::createBufferLayer(const sp<Client>& client,
3617         const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
3618         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
3619 {
3620     // initialize the surfaces
3621     switch (format) {
3622     case PIXEL_FORMAT_TRANSPARENT:
3623     case PIXEL_FORMAT_TRANSLUCENT:
3624         format = PIXEL_FORMAT_RGBA_8888;
3625         break;
3626     case PIXEL_FORMAT_OPAQUE:
3627         format = PIXEL_FORMAT_RGBX_8888;
3628         break;
3629     }
3630 
3631     sp<BufferLayer> layer = new BufferLayer(this, client, name, w, h, flags);
3632     status_t err = layer->setBuffers(w, h, format, flags);
3633     if (err == NO_ERROR) {
3634         *handle = layer->getHandle();
3635         *gbp = layer->getProducer();
3636         *outLayer = layer;
3637     }
3638 
3639     ALOGE_IF(err, "createBufferLayer() failed (%s)", strerror(-err));
3640     return err;
3641 }
3642 
createColorLayer(const sp<Client> & client,const String8 & name,uint32_t w,uint32_t h,uint32_t flags,sp<IBinder> * handle,sp<Layer> * outLayer)3643 status_t SurfaceFlinger::createColorLayer(const sp<Client>& client,
3644         const String8& name, uint32_t w, uint32_t h, uint32_t flags,
3645         sp<IBinder>* handle, sp<Layer>* outLayer)
3646 {
3647     *outLayer = new ColorLayer(this, client, name, w, h, flags);
3648     *handle = (*outLayer)->getHandle();
3649     return NO_ERROR;
3650 }
3651 
clearLayerFrameStats(const sp<const Client> & client,const sp<IBinder> & handle)3652 status_t SurfaceFlinger::clearLayerFrameStats(const sp<const Client>& client, const sp<IBinder>& handle) {
3653     Mutex::Autolock _l(mStateLock);
3654     sp<Layer> layer = fromHandle(handle);
3655     if (layer == nullptr || !(client->isAttached(handle))) {
3656         return NAME_NOT_FOUND;
3657     }
3658     layer->clearFrameStats();
3659     return NO_ERROR;
3660 }
3661 
getLayerFrameStats(const sp<const Client> & client,const sp<IBinder> & handle,FrameStats * outStats)3662 status_t SurfaceFlinger::getLayerFrameStats(const sp<const Client>& client, const sp<IBinder>& handle, FrameStats* outStats) {
3663     Mutex::Autolock _l(mStateLock);
3664     sp<Layer> layer = fromHandle(handle);
3665     if (layer == nullptr || !(client->isAttached(handle))) {
3666         return NAME_NOT_FOUND;
3667     }
3668     layer->getFrameStats(outStats);
3669     return NO_ERROR;
3670 }
3671 
onLayerRemoved(const sp<Client> & client,const sp<IBinder> & handle)3672 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
3673 {
3674     Mutex::Autolock _l(mStateLock);
3675     // called by a client when it wants to remove a Layer
3676     status_t err = NO_ERROR;
3677     sp<Layer> l = fromHandle(handle);
3678     if (l != nullptr && client->isAttached(handle)) {
3679         mInterceptor->saveSurfaceDeletion(l);
3680         err = removeLayerLocked(mStateLock, l);
3681         ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
3682                 "error removing layer=%p (%s)", l.get(), strerror(-err));
3683     }
3684     return err;
3685 }
3686 
onLayerDestroyed(const wp<Layer> & layer)3687 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
3688 {
3689     Mutex::Autolock _l(mStateLock);
3690     // called by ~LayerCleaner() when all references to the IBinder (handle)
3691     // are gone
3692     sp<Layer> l = layer.promote();
3693     if (l == nullptr) {
3694         removeLayerFromMap(layer);
3695         // The layer has already been removed, carry on
3696         return NO_ERROR;
3697     }
3698     removeLayerFromMap(layer);
3699     // If we have a parent, then we can continue to live as long as it does.
3700     return removeLayerLocked(mStateLock, l, true);
3701 }
3702 
3703 // ---------------------------------------------------------------------------
3704 
onInitializeDisplays()3705 void SurfaceFlinger::onInitializeDisplays() {
3706     // reset screen orientation and use primary layer stack
3707     Vector<ComposerState> state;
3708     Vector<DisplayState> displays;
3709     DisplayState d;
3710     d.what = DisplayState::eDisplayProjectionChanged |
3711              DisplayState::eLayerStackChanged;
3712     d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
3713     d.layerStack = 0;
3714     d.orientation = DisplayState::eOrientationDefault;
3715     d.frame.makeInvalid();
3716     d.viewport.makeInvalid();
3717     d.width = 0;
3718     d.height = 0;
3719     displays.add(d);
3720     setTransactionState(state, displays, 0);
3721     setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL,
3722                          /*stateLockHeld*/ false);
3723 
3724     const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3725     const nsecs_t period = activeConfig->getVsyncPeriod();
3726     mAnimFrameTracker.setDisplayRefreshPeriod(period);
3727 
3728     // Use phase of 0 since phase is not known.
3729     // Use latency of 0, which will snap to the ideal latency.
3730     setCompositorTimingSnapped(0, period, 0);
3731 }
3732 
initializeDisplays()3733 void SurfaceFlinger::initializeDisplays() {
3734     class MessageScreenInitialized : public MessageBase {
3735         SurfaceFlinger* flinger;
3736     public:
3737         explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
3738         virtual bool handler() {
3739             flinger->onInitializeDisplays();
3740             return true;
3741         }
3742     };
3743     sp<MessageBase> msg = new MessageScreenInitialized(this);
3744     postMessageAsync(msg);  // we may be called from main thread, use async message
3745 }
3746 
setPowerModeInternal(const sp<DisplayDevice> & hw,int mode,bool stateLockHeld)3747 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
3748              int mode, bool stateLockHeld) {
3749     ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
3750             this);
3751     int32_t type = hw->getDisplayType();
3752     int currentMode = hw->getPowerMode();
3753 
3754     if (mode == currentMode) {
3755         return;
3756     }
3757 
3758     hw->setPowerMode(mode);
3759     if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
3760         ALOGW("Trying to set power mode for virtual display");
3761         return;
3762     }
3763 
3764     if (mInterceptor->isEnabled()) {
3765         ConditionalLock lock(mStateLock, !stateLockHeld);
3766         ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
3767         if (idx < 0) {
3768             ALOGW("Surface Interceptor SavePowerMode: invalid display token");
3769             return;
3770         }
3771         mInterceptor->savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
3772     }
3773 
3774     if (currentMode == HWC_POWER_MODE_OFF) {
3775         // Turn on the display
3776         getHwComposer().setPowerMode(type, mode);
3777         if (type == DisplayDevice::DISPLAY_PRIMARY &&
3778             mode != HWC_POWER_MODE_DOZE_SUSPEND) {
3779             // FIXME: eventthread only knows about the main display right now
3780             mEventThread->onScreenAcquired();
3781             resyncToHardwareVsync(true);
3782         }
3783 
3784         mVisibleRegionsDirty = true;
3785         mHasPoweredOff = true;
3786         repaintEverything();
3787 
3788         struct sched_param param = {0};
3789         param.sched_priority = 1;
3790         if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
3791             ALOGW("Couldn't set SCHED_FIFO on display on");
3792         }
3793     } else if (mode == HWC_POWER_MODE_OFF) {
3794         // Turn off the display
3795         struct sched_param param = {0};
3796         if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
3797             ALOGW("Couldn't set SCHED_OTHER on display off");
3798         }
3799 
3800         if (type == DisplayDevice::DISPLAY_PRIMARY &&
3801             currentMode != HWC_POWER_MODE_DOZE_SUSPEND) {
3802             disableHardwareVsync(true); // also cancels any in-progress resync
3803 
3804             // FIXME: eventthread only knows about the main display right now
3805             mEventThread->onScreenReleased();
3806         }
3807 
3808         getHwComposer().setPowerMode(type, mode);
3809         mVisibleRegionsDirty = true;
3810         // from this point on, SF will stop drawing on this display
3811     } else if (mode == HWC_POWER_MODE_DOZE ||
3812                mode == HWC_POWER_MODE_NORMAL) {
3813         // Update display while dozing
3814         getHwComposer().setPowerMode(type, mode);
3815         if (type == DisplayDevice::DISPLAY_PRIMARY &&
3816             currentMode == HWC_POWER_MODE_DOZE_SUSPEND) {
3817             // FIXME: eventthread only knows about the main display right now
3818             mEventThread->onScreenAcquired();
3819             resyncToHardwareVsync(true);
3820         }
3821     } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
3822         // Leave display going to doze
3823         if (type == DisplayDevice::DISPLAY_PRIMARY) {
3824             disableHardwareVsync(true); // also cancels any in-progress resync
3825             // FIXME: eventthread only knows about the main display right now
3826             mEventThread->onScreenReleased();
3827         }
3828         getHwComposer().setPowerMode(type, mode);
3829     } else {
3830         ALOGE("Attempting to set unknown power mode: %d\n", mode);
3831         getHwComposer().setPowerMode(type, mode);
3832     }
3833     ALOGD("Finished set power mode=%d, type=%d", mode, hw->getDisplayType());
3834 }
3835 
setPowerMode(const sp<IBinder> & display,int mode)3836 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
3837     class MessageSetPowerMode: public MessageBase {
3838         SurfaceFlinger& mFlinger;
3839         sp<IBinder> mDisplay;
3840         int mMode;
3841     public:
3842         MessageSetPowerMode(SurfaceFlinger& flinger,
3843                 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
3844                     mDisplay(disp) { mMode = mode; }
3845         virtual bool handler() {
3846             sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
3847             if (hw == nullptr) {
3848                 ALOGE("Attempt to set power mode = %d for null display %p",
3849                         mMode, mDisplay.get());
3850             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
3851                 ALOGW("Attempt to set power mode = %d for virtual display",
3852                         mMode);
3853             } else {
3854                 mFlinger.setPowerModeInternal(
3855                         hw, mMode, /*stateLockHeld*/ false);
3856             }
3857             return true;
3858         }
3859     };
3860     sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
3861     postMessageSync(msg);
3862 }
3863 
3864 // ---------------------------------------------------------------------------
3865 
doDump(int fd,const Vector<String16> & args,bool asProto)3866 status_t SurfaceFlinger::doDump(int fd, const Vector<String16>& args, bool asProto)
3867         NO_THREAD_SAFETY_ANALYSIS {
3868     String8 result;
3869 
3870     IPCThreadState* ipc = IPCThreadState::self();
3871     const int pid = ipc->getCallingPid();
3872     const int uid = ipc->getCallingUid();
3873 
3874     if ((uid != AID_SHELL) &&
3875             !PermissionCache::checkPermission(sDump, pid, uid)) {
3876         result.appendFormat("Permission Denial: "
3877                 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3878     } else {
3879         // Try to get the main lock, but give up after one second
3880         // (this would indicate SF is stuck, but we want to be able to
3881         // print something in dumpsys).
3882         status_t err = mStateLock.timedLock(s2ns(1));
3883         bool locked = (err == NO_ERROR);
3884         if (!locked) {
3885             result.appendFormat(
3886                     "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3887                     "dumping anyways (no locks held)\n", strerror(-err), err);
3888         }
3889 
3890         bool dumpAll = true;
3891         size_t index = 0;
3892         size_t numArgs = args.size();
3893 
3894         if (numArgs) {
3895             if ((index < numArgs) &&
3896                     (args[index] == String16("--list"))) {
3897                 index++;
3898                 listLayersLocked(args, index, result);
3899                 dumpAll = false;
3900             }
3901 
3902             if ((index < numArgs) &&
3903                     (args[index] == String16("--latency"))) {
3904                 index++;
3905                 dumpStatsLocked(args, index, result);
3906                 dumpAll = false;
3907             }
3908 
3909             if ((index < numArgs) &&
3910                     (args[index] == String16("--latency-clear"))) {
3911                 index++;
3912                 clearStatsLocked(args, index, result);
3913                 dumpAll = false;
3914             }
3915 
3916             if ((index < numArgs) &&
3917                     (args[index] == String16("--dispsync"))) {
3918                 index++;
3919                 mPrimaryDispSync.dump(result);
3920                 dumpAll = false;
3921             }
3922 
3923             if ((index < numArgs) &&
3924                     (args[index] == String16("--static-screen"))) {
3925                 index++;
3926                 dumpStaticScreenStats(result);
3927                 dumpAll = false;
3928             }
3929 
3930             if ((index < numArgs) &&
3931                     (args[index] == String16("--frame-events"))) {
3932                 index++;
3933                 dumpFrameEventsLocked(result);
3934                 dumpAll = false;
3935             }
3936 
3937             if ((index < numArgs) && (args[index] == String16("--wide-color"))) {
3938                 index++;
3939                 dumpWideColorInfo(result);
3940                 dumpAll = false;
3941             }
3942 
3943             if ((index < numArgs) &&
3944                 (args[index] == String16("--enable-layer-stats"))) {
3945                 index++;
3946                 mLayerStats.enable();
3947                 dumpAll = false;
3948             }
3949 
3950             if ((index < numArgs) &&
3951                 (args[index] == String16("--disable-layer-stats"))) {
3952                 index++;
3953                 mLayerStats.disable();
3954                 dumpAll = false;
3955             }
3956 
3957             if ((index < numArgs) &&
3958                 (args[index] == String16("--clear-layer-stats"))) {
3959                 index++;
3960                 mLayerStats.clear();
3961                 dumpAll = false;
3962             }
3963 
3964             if ((index < numArgs) &&
3965                 (args[index] == String16("--dump-layer-stats"))) {
3966                 index++;
3967                 mLayerStats.dump(result);
3968                 dumpAll = false;
3969             }
3970 
3971             if ((index < numArgs) && (args[index] == String16("--timestats"))) {
3972                 index++;
3973                 mTimeStats.parseArgs(asProto, args, index, result);
3974                 dumpAll = false;
3975             }
3976         }
3977 
3978         if (dumpAll) {
3979             if (asProto) {
3980                 LayersProto layersProto = dumpProtoInfo(LayerVector::StateSet::Current);
3981                 result.append(layersProto.SerializeAsString().c_str(), layersProto.ByteSize());
3982             } else {
3983                 dumpAllLocked(args, index, result);
3984             }
3985         }
3986 
3987         if (locked) {
3988             mStateLock.unlock();
3989         }
3990     }
3991     write(fd, result.string(), result.size());
3992     return NO_ERROR;
3993 }
3994 
listLayersLocked(const Vector<String16> &,size_t &,String8 & result) const3995 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3996         size_t& /* index */, String8& result) const
3997 {
3998     mCurrentState.traverseInZOrder([&](Layer* layer) {
3999         result.appendFormat("%s\n", layer->getName().string());
4000     });
4001 }
4002 
dumpStatsLocked(const Vector<String16> & args,size_t & index,String8 & result) const4003 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
4004         String8& result) const
4005 {
4006     String8 name;
4007     if (index < args.size()) {
4008         name = String8(args[index]);
4009         index++;
4010     }
4011 
4012     const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
4013     const nsecs_t period = activeConfig->getVsyncPeriod();
4014     result.appendFormat("%" PRId64 "\n", period);
4015 
4016     if (name.isEmpty()) {
4017         mAnimFrameTracker.dumpStats(result);
4018     } else {
4019         mCurrentState.traverseInZOrder([&](Layer* layer) {
4020             if (name == layer->getName()) {
4021                 layer->dumpFrameStats(result);
4022             }
4023         });
4024     }
4025 }
4026 
clearStatsLocked(const Vector<String16> & args,size_t & index,String8 &)4027 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
4028         String8& /* result */)
4029 {
4030     String8 name;
4031     if (index < args.size()) {
4032         name = String8(args[index]);
4033         index++;
4034     }
4035 
4036     mCurrentState.traverseInZOrder([&](Layer* layer) {
4037         if (name.isEmpty() || (name == layer->getName())) {
4038             layer->clearFrameStats();
4039         }
4040     });
4041 
4042     mAnimFrameTracker.clearStats();
4043 }
4044 
4045 // This should only be called from the main thread.  Otherwise it would need
4046 // the lock and should use mCurrentState rather than mDrawingState.
logFrameStats()4047 void SurfaceFlinger::logFrameStats() {
4048     mDrawingState.traverseInZOrder([&](Layer* layer) {
4049         layer->logFrameStats();
4050     });
4051 
4052     mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
4053 }
4054 
appendSfConfigString(String8 & result) const4055 void SurfaceFlinger::appendSfConfigString(String8& result) const
4056 {
4057     result.append(" [sf");
4058 
4059     if (isLayerTripleBufferingDisabled())
4060         result.append(" DISABLE_TRIPLE_BUFFERING");
4061 
4062     result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64 , dispSyncPresentTimeOffset);
4063     result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
4064     result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
4065     result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
4066     result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
4067                         maxFrameBufferAcquiredBuffers);
4068     result.append("]");
4069 }
4070 
dumpStaticScreenStats(String8 & result) const4071 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
4072 {
4073     result.appendFormat("Static screen stats:\n");
4074     for (size_t b = 0; b < SurfaceFlingerBE::NUM_BUCKETS - 1; ++b) {
4075         float bucketTimeSec = getBE().mFrameBuckets[b] / 1e9;
4076         float percent = 100.0f *
4077                 static_cast<float>(getBE().mFrameBuckets[b]) / getBE().mTotalTime;
4078         result.appendFormat("  < %zd frames: %.3f s (%.1f%%)\n",
4079                 b + 1, bucketTimeSec, percent);
4080     }
4081     float bucketTimeSec = getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1] / 1e9;
4082     float percent = 100.0f *
4083             static_cast<float>(getBE().mFrameBuckets[SurfaceFlingerBE::NUM_BUCKETS - 1]) / getBE().mTotalTime;
4084     result.appendFormat("  %zd+ frames: %.3f s (%.1f%%)\n",
4085             SurfaceFlingerBE::NUM_BUCKETS - 1, bucketTimeSec, percent);
4086 }
4087 
recordBufferingStats(const char * layerName,std::vector<OccupancyTracker::Segment> && history)4088 void SurfaceFlinger::recordBufferingStats(const char* layerName,
4089         std::vector<OccupancyTracker::Segment>&& history) {
4090     Mutex::Autolock lock(getBE().mBufferingStatsMutex);
4091     auto& stats = getBE().mBufferingStats[layerName];
4092     for (const auto& segment : history) {
4093         if (!segment.usedThirdBuffer) {
4094             stats.twoBufferTime += segment.totalTime;
4095         }
4096         if (segment.occupancyAverage < 1.0f) {
4097             stats.doubleBufferedTime += segment.totalTime;
4098         } else if (segment.occupancyAverage < 2.0f) {
4099             stats.tripleBufferedTime += segment.totalTime;
4100         }
4101         ++stats.numSegments;
4102         stats.totalTime += segment.totalTime;
4103     }
4104 }
4105 
dumpFrameEventsLocked(String8 & result)4106 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
4107     result.appendFormat("Layer frame timestamps:\n");
4108 
4109     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
4110     const size_t count = currentLayers.size();
4111     for (size_t i=0 ; i<count ; i++) {
4112         currentLayers[i]->dumpFrameEvents(result);
4113     }
4114 }
4115 
dumpBufferingStats(String8 & result) const4116 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
4117     result.append("Buffering stats:\n");
4118     result.append("  [Layer name] <Active time> <Two buffer> "
4119             "<Double buffered> <Triple buffered>\n");
4120     Mutex::Autolock lock(getBE().mBufferingStatsMutex);
4121     typedef std::tuple<std::string, float, float, float> BufferTuple;
4122     std::map<float, BufferTuple, std::greater<float>> sorted;
4123     for (const auto& statsPair : getBE().mBufferingStats) {
4124         const char* name = statsPair.first.c_str();
4125         const SurfaceFlingerBE::BufferingStats& stats = statsPair.second;
4126         if (stats.numSegments == 0) {
4127             continue;
4128         }
4129         float activeTime = ns2ms(stats.totalTime) / 1000.0f;
4130         float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
4131                 stats.totalTime;
4132         float doubleBufferRatio = static_cast<float>(
4133                 stats.doubleBufferedTime) / stats.totalTime;
4134         float tripleBufferRatio = static_cast<float>(
4135                 stats.tripleBufferedTime) / stats.totalTime;
4136         sorted.insert({activeTime, {name, twoBufferRatio,
4137                 doubleBufferRatio, tripleBufferRatio}});
4138     }
4139     for (const auto& sortedPair : sorted) {
4140         float activeTime = sortedPair.first;
4141         const BufferTuple& values = sortedPair.second;
4142         result.appendFormat("  [%s] %.2f %.3f %.3f %.3f\n",
4143                 std::get<0>(values).c_str(), activeTime,
4144                 std::get<1>(values), std::get<2>(values),
4145                 std::get<3>(values));
4146     }
4147     result.append("\n");
4148 }
4149 
dumpWideColorInfo(String8 & result) const4150 void SurfaceFlinger::dumpWideColorInfo(String8& result) const {
4151     result.appendFormat("hasWideColorDisplay: %d\n", hasWideColorDisplay);
4152     result.appendFormat("DisplayColorSetting: %s\n",
4153             decodeDisplayColorSetting(mDisplayColorSetting).c_str());
4154 
4155     // TODO: print out if wide-color mode is active or not
4156 
4157     for (size_t d = 0; d < mDisplays.size(); d++) {
4158         const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
4159         int32_t hwcId = displayDevice->getHwcDisplayId();
4160         if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
4161             continue;
4162         }
4163 
4164         result.appendFormat("Display %d color modes:\n", hwcId);
4165         std::vector<ColorMode> modes = getHwComposer().getColorModes(hwcId);
4166         for (auto&& mode : modes) {
4167             result.appendFormat("    %s (%d)\n", decodeColorMode(mode).c_str(), mode);
4168         }
4169 
4170         ColorMode currentMode = displayDevice->getActiveColorMode();
4171         result.appendFormat("    Current color mode: %s (%d)\n",
4172                             decodeColorMode(currentMode).c_str(), currentMode);
4173     }
4174     result.append("\n");
4175 }
4176 
dumpProtoInfo(LayerVector::StateSet stateSet) const4177 LayersProto SurfaceFlinger::dumpProtoInfo(LayerVector::StateSet stateSet) const {
4178     LayersProto layersProto;
4179     const bool useDrawing = stateSet == LayerVector::StateSet::Drawing;
4180     const State& state = useDrawing ? mDrawingState : mCurrentState;
4181     state.traverseInZOrder([&](Layer* layer) {
4182         LayerProto* layerProto = layersProto.add_layers();
4183         layer->writeToProto(layerProto, stateSet);
4184     });
4185 
4186     return layersProto;
4187 }
4188 
dumpVisibleLayersProtoInfo(int32_t hwcId) const4189 LayersProto SurfaceFlinger::dumpVisibleLayersProtoInfo(int32_t hwcId) const {
4190     LayersProto layersProto;
4191     const sp<DisplayDevice>& displayDevice(mDisplays[hwcId]);
4192 
4193     SizeProto* resolution = layersProto.mutable_resolution();
4194     resolution->set_w(displayDevice->getWidth());
4195     resolution->set_h(displayDevice->getHeight());
4196 
4197     layersProto.set_color_mode(decodeColorMode(displayDevice->getActiveColorMode()));
4198     layersProto.set_color_transform(decodeColorTransform(displayDevice->getColorTransform()));
4199     layersProto.set_global_transform(
4200             static_cast<int32_t>(displayDevice->getOrientationTransform()));
4201 
4202     mDrawingState.traverseInZOrder([&](Layer* layer) {
4203         if (!layer->visibleRegion.isEmpty() && layer->getBE().mHwcLayers.count(hwcId)) {
4204             LayerProto* layerProto = layersProto.add_layers();
4205             layer->writeToProto(layerProto, hwcId);
4206         }
4207     });
4208 
4209     return layersProto;
4210 }
4211 
dumpAllLocked(const Vector<String16> & args,size_t & index,String8 & result) const4212 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
4213         String8& result) const
4214 {
4215     bool colorize = false;
4216     if (index < args.size()
4217             && (args[index] == String16("--color"))) {
4218         colorize = true;
4219         index++;
4220     }
4221 
4222     Colorizer colorizer(colorize);
4223 
4224     // figure out if we're stuck somewhere
4225     const nsecs_t now = systemTime();
4226     const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
4227     const nsecs_t inTransaction(mDebugInTransaction);
4228     nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
4229     nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
4230 
4231     /*
4232      * Dump library configuration.
4233      */
4234 
4235     colorizer.bold(result);
4236     result.append("Build configuration:");
4237     colorizer.reset(result);
4238     appendSfConfigString(result);
4239     appendUiConfigString(result);
4240     appendGuiConfigString(result);
4241     result.append("\n");
4242 
4243     result.append("\nWide-Color information:\n");
4244     dumpWideColorInfo(result);
4245 
4246     colorizer.bold(result);
4247     result.append("Sync configuration: ");
4248     colorizer.reset(result);
4249     result.append(SyncFeatures::getInstance().toString());
4250     result.append("\n");
4251 
4252     const auto& activeConfig = getBE().mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
4253 
4254     colorizer.bold(result);
4255     result.append("DispSync configuration: ");
4256     colorizer.reset(result);
4257     result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, early sf phase %" PRId64
4258         " ns, present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
4259         vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, mVsyncModulator.getEarlyPhaseOffset(),
4260         dispSyncPresentTimeOffset, activeConfig->getVsyncPeriod());
4261     result.append("\n");
4262 
4263     // Dump static screen stats
4264     result.append("\n");
4265     dumpStaticScreenStats(result);
4266     result.append("\n");
4267 
4268     dumpBufferingStats(result);
4269 
4270     /*
4271      * Dump the visible layer list
4272      */
4273     colorizer.bold(result);
4274     result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
4275     result.appendFormat("GraphicBufferProducers: %zu, max %zu\n",
4276                         mGraphicBufferProducerList.size(), mMaxGraphicBufferProducerListSize);
4277     colorizer.reset(result);
4278 
4279     LayersProto layersProto = dumpProtoInfo(LayerVector::StateSet::Current);
4280     auto layerTree = LayerProtoParser::generateLayerTree(layersProto);
4281     result.append(LayerProtoParser::layersToString(std::move(layerTree)).c_str());
4282     result.append("\n");
4283 
4284     /*
4285      * Dump Display state
4286      */
4287 
4288     colorizer.bold(result);
4289     result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
4290     colorizer.reset(result);
4291     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
4292         const sp<const DisplayDevice>& hw(mDisplays[dpy]);
4293         hw->dump(result);
4294     }
4295     result.append("\n");
4296 
4297     /*
4298      * Dump SurfaceFlinger global state
4299      */
4300 
4301     colorizer.bold(result);
4302     result.append("SurfaceFlinger global state:\n");
4303     colorizer.reset(result);
4304 
4305     HWComposer& hwc(getHwComposer());
4306     sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
4307 
4308     getBE().mRenderEngine->dump(result);
4309 
4310     if (hw) {
4311         hw->undefinedRegion.dump(result, "undefinedRegion");
4312         result.appendFormat("  orientation=%d, isDisplayOn=%d\n",
4313                 hw->getOrientation(), hw->isDisplayOn());
4314     }
4315     result.appendFormat(
4316             "  last eglSwapBuffers() time: %f us\n"
4317             "  last transaction time     : %f us\n"
4318             "  transaction-flags         : %08x\n"
4319             "  refresh-rate              : %f fps\n"
4320             "  x-dpi                     : %f\n"
4321             "  y-dpi                     : %f\n"
4322             "  gpu_to_cpu_unsupported    : %d\n"
4323             ,
4324             mLastSwapBufferTime/1000.0,
4325             mLastTransactionTime/1000.0,
4326             mTransactionFlags,
4327             1e9 / activeConfig->getVsyncPeriod(),
4328             activeConfig->getDpiX(),
4329             activeConfig->getDpiY(),
4330             !mGpuToCpuSupported);
4331 
4332     result.appendFormat("  eglSwapBuffers time: %f us\n",
4333             inSwapBuffersDuration/1000.0);
4334 
4335     result.appendFormat("  transaction time: %f us\n",
4336             inTransactionDuration/1000.0);
4337 
4338     /*
4339      * VSYNC state
4340      */
4341     mEventThread->dump(result);
4342     result.append("\n");
4343 
4344     /*
4345      * HWC layer minidump
4346      */
4347     for (size_t d = 0; d < mDisplays.size(); d++) {
4348         const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
4349         int32_t hwcId = displayDevice->getHwcDisplayId();
4350         if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
4351             continue;
4352         }
4353 
4354         result.appendFormat("Display %d HWC layers:\n", hwcId);
4355         Layer::miniDumpHeader(result);
4356         mCurrentState.traverseInZOrder([&](Layer* layer) {
4357             layer->miniDump(result, hwcId);
4358         });
4359         result.append("\n");
4360     }
4361 
4362     /*
4363      * Dump HWComposer state
4364      */
4365     colorizer.bold(result);
4366     result.append("h/w composer state:\n");
4367     colorizer.reset(result);
4368     bool hwcDisabled = mDebugDisableHWC || mDebugRegion;
4369     result.appendFormat("  h/w composer %s\n",
4370             hwcDisabled ? "disabled" : "enabled");
4371     hwc.dump(result);
4372 
4373     /*
4374      * Dump gralloc state
4375      */
4376     const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
4377     alloc.dump(result);
4378 
4379     /*
4380      * Dump VrFlinger state if in use.
4381      */
4382     if (mVrFlingerRequestsDisplay && mVrFlinger) {
4383         result.append("VrFlinger state:\n");
4384         result.append(mVrFlinger->Dump().c_str());
4385         result.append("\n");
4386     }
4387 }
4388 
4389 const Vector< sp<Layer> >&
getLayerSortedByZForHwcDisplay(int id)4390 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
4391     // Note: mStateLock is held here
4392     wp<IBinder> dpy;
4393     for (size_t i=0 ; i<mDisplays.size() ; i++) {
4394         if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
4395             dpy = mDisplays.keyAt(i);
4396             break;
4397         }
4398     }
4399     if (dpy == nullptr) {
4400         ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
4401         // Just use the primary display so we have something to return
4402         dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
4403     }
4404     return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
4405 }
4406 
startDdmConnection()4407 bool SurfaceFlinger::startDdmConnection()
4408 {
4409     void* libddmconnection_dso =
4410             dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
4411     if (!libddmconnection_dso) {
4412         return false;
4413     }
4414     void (*DdmConnection_start)(const char* name);
4415     DdmConnection_start =
4416             (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
4417     if (!DdmConnection_start) {
4418         dlclose(libddmconnection_dso);
4419         return false;
4420     }
4421     (*DdmConnection_start)(getServiceName());
4422     return true;
4423 }
4424 
updateColorMatrixLocked()4425 void SurfaceFlinger::updateColorMatrixLocked() {
4426     mat4 colorMatrix;
4427     if (mGlobalSaturationFactor != 1.0f) {
4428         // Rec.709 luma coefficients
4429         float3 luminance{0.213f, 0.715f, 0.072f};
4430         luminance *= 1.0f - mGlobalSaturationFactor;
4431         mat4 saturationMatrix = mat4(
4432             vec4{luminance.r + mGlobalSaturationFactor, luminance.r, luminance.r, 0.0f},
4433             vec4{luminance.g, luminance.g + mGlobalSaturationFactor, luminance.g, 0.0f},
4434             vec4{luminance.b, luminance.b, luminance.b + mGlobalSaturationFactor, 0.0f},
4435             vec4{0.0f, 0.0f, 0.0f, 1.0f}
4436         );
4437         colorMatrix = mClientColorMatrix * saturationMatrix * mDaltonizer();
4438     } else {
4439         colorMatrix = mClientColorMatrix * mDaltonizer();
4440     }
4441 
4442     if (mCurrentState.colorMatrix != colorMatrix) {
4443         mCurrentState.colorMatrix = colorMatrix;
4444         mCurrentState.colorMatrixChanged = true;
4445         setTransactionFlags(eTransactionNeeded);
4446     }
4447 }
4448 
CheckTransactCodeCredentials(uint32_t code)4449 status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
4450     switch (code) {
4451         case CREATE_CONNECTION:
4452         case CREATE_DISPLAY:
4453         case BOOT_FINISHED:
4454         case CLEAR_ANIMATION_FRAME_STATS:
4455         case GET_ANIMATION_FRAME_STATS:
4456         case SET_POWER_MODE:
4457         case GET_HDR_CAPABILITIES:
4458         case ENABLE_VSYNC_INJECTIONS:
4459         case INJECT_VSYNC:
4460         {
4461             // codes that require permission check
4462             IPCThreadState* ipc = IPCThreadState::self();
4463             const int pid = ipc->getCallingPid();
4464             const int uid = ipc->getCallingUid();
4465             if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
4466                     !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
4467                 ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
4468                 return PERMISSION_DENIED;
4469             }
4470             break;
4471         }
4472         /*
4473          * Calling setTransactionState is safe, because you need to have been
4474          * granted a reference to Client* and Handle* to do anything with it.
4475          *
4476          * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
4477          */
4478         case SET_TRANSACTION_STATE:
4479         case CREATE_SCOPED_CONNECTION:
4480         {
4481             return OK;
4482         }
4483         case CAPTURE_SCREEN:
4484         {
4485             // codes that require permission check
4486             IPCThreadState* ipc = IPCThreadState::self();
4487             const int pid = ipc->getCallingPid();
4488             const int uid = ipc->getCallingUid();
4489             if ((uid != AID_GRAPHICS) &&
4490                     !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
4491                 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
4492                 return PERMISSION_DENIED;
4493             }
4494             break;
4495         }
4496         case CAPTURE_LAYERS: {
4497             IPCThreadState* ipc = IPCThreadState::self();
4498             const int pid = ipc->getCallingPid();
4499             const int uid = ipc->getCallingUid();
4500             if ((uid != AID_GRAPHICS) &&
4501                 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
4502                 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
4503                 return PERMISSION_DENIED;
4504             }
4505             break;
4506         }
4507     }
4508     return OK;
4509 }
4510 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)4511 status_t SurfaceFlinger::onTransact(
4512     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
4513 {
4514     status_t credentialCheck = CheckTransactCodeCredentials(code);
4515     if (credentialCheck != OK) {
4516         return credentialCheck;
4517     }
4518 
4519     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
4520     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
4521         CHECK_INTERFACE(ISurfaceComposer, data, reply);
4522         IPCThreadState* ipc = IPCThreadState::self();
4523         const int uid = ipc->getCallingUid();
4524         if (CC_UNLIKELY(uid != AID_SYSTEM
4525                 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
4526             const int pid = ipc->getCallingPid();
4527             ALOGE("Permission Denial: "
4528                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
4529             return PERMISSION_DENIED;
4530         }
4531         int n;
4532         switch (code) {
4533             case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
4534             case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
4535                 return NO_ERROR;
4536             case 1002:  // SHOW_UPDATES
4537                 n = data.readInt32();
4538                 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
4539                 invalidateHwcGeometry();
4540                 repaintEverything();
4541                 return NO_ERROR;
4542             case 1004:{ // repaint everything
4543                 repaintEverything();
4544                 return NO_ERROR;
4545             }
4546             case 1005:{ // force transaction
4547                 Mutex::Autolock _l(mStateLock);
4548                 setTransactionFlags(
4549                         eTransactionNeeded|
4550                         eDisplayTransactionNeeded|
4551                         eTraversalNeeded);
4552                 return NO_ERROR;
4553             }
4554             case 1006:{ // send empty update
4555                 signalRefresh();
4556                 return NO_ERROR;
4557             }
4558             case 1008:  // toggle use of hw composer
4559                 n = data.readInt32();
4560                 mDebugDisableHWC = n ? 1 : 0;
4561                 invalidateHwcGeometry();
4562                 repaintEverything();
4563                 return NO_ERROR;
4564             case 1009:  // toggle use of transform hint
4565                 n = data.readInt32();
4566                 mDebugDisableTransformHint = n ? 1 : 0;
4567                 invalidateHwcGeometry();
4568                 repaintEverything();
4569                 return NO_ERROR;
4570             case 1010:  // interrogate.
4571                 reply->writeInt32(0);
4572                 reply->writeInt32(0);
4573                 reply->writeInt32(mDebugRegion);
4574                 reply->writeInt32(0);
4575                 reply->writeInt32(mDebugDisableHWC);
4576                 return NO_ERROR;
4577             case 1013: {
4578                 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
4579                 reply->writeInt32(hw->getPageFlipCount());
4580                 return NO_ERROR;
4581             }
4582             case 1014: {
4583                 Mutex::Autolock _l(mStateLock);
4584                 // daltonize
4585                 n = data.readInt32();
4586                 switch (n % 10) {
4587                     case 1:
4588                         mDaltonizer.setType(ColorBlindnessType::Protanomaly);
4589                         break;
4590                     case 2:
4591                         mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
4592                         break;
4593                     case 3:
4594                         mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
4595                         break;
4596                     default:
4597                         mDaltonizer.setType(ColorBlindnessType::None);
4598                         break;
4599                 }
4600                 if (n >= 10) {
4601                     mDaltonizer.setMode(ColorBlindnessMode::Correction);
4602                 } else {
4603                     mDaltonizer.setMode(ColorBlindnessMode::Simulation);
4604                 }
4605 
4606                 updateColorMatrixLocked();
4607                 return NO_ERROR;
4608             }
4609             case 1015: {
4610                 Mutex::Autolock _l(mStateLock);
4611                 // apply a color matrix
4612                 n = data.readInt32();
4613                 if (n) {
4614                     // color matrix is sent as a column-major mat4 matrix
4615                     for (size_t i = 0 ; i < 4; i++) {
4616                         for (size_t j = 0; j < 4; j++) {
4617                             mClientColorMatrix[i][j] = data.readFloat();
4618                         }
4619                     }
4620                 } else {
4621                     mClientColorMatrix = mat4();
4622                 }
4623 
4624                 // Check that supplied matrix's last row is {0,0,0,1} so we can avoid
4625                 // the division by w in the fragment shader
4626                 float4 lastRow(transpose(mClientColorMatrix)[3]);
4627                 if (any(greaterThan(abs(lastRow - float4{0, 0, 0, 1}), float4{1e-4f}))) {
4628                     ALOGE("The color transform's last row must be (0, 0, 0, 1)");
4629                 }
4630 
4631                 updateColorMatrixLocked();
4632                 return NO_ERROR;
4633             }
4634             // This is an experimental interface
4635             // Needs to be shifted to proper binder interface when we productize
4636             case 1016: {
4637                 n = data.readInt32();
4638                 mPrimaryDispSync.setRefreshSkipCount(n);
4639                 return NO_ERROR;
4640             }
4641             case 1017: {
4642                 n = data.readInt32();
4643                 mForceFullDamage = static_cast<bool>(n);
4644                 return NO_ERROR;
4645             }
4646             case 1018: { // Modify Choreographer's phase offset
4647                 n = data.readInt32();
4648                 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4649                 return NO_ERROR;
4650             }
4651             case 1019: { // Modify SurfaceFlinger's phase offset
4652                 n = data.readInt32();
4653                 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4654                 return NO_ERROR;
4655             }
4656             case 1020: { // Layer updates interceptor
4657                 n = data.readInt32();
4658                 if (n) {
4659                     ALOGV("Interceptor enabled");
4660                     mInterceptor->enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
4661                 }
4662                 else{
4663                     ALOGV("Interceptor disabled");
4664                     mInterceptor->disable();
4665                 }
4666                 return NO_ERROR;
4667             }
4668             case 1021: { // Disable HWC virtual displays
4669                 n = data.readInt32();
4670                 mUseHwcVirtualDisplays = !n;
4671                 return NO_ERROR;
4672             }
4673             case 1022: { // Set saturation boost
4674                 Mutex::Autolock _l(mStateLock);
4675                 mGlobalSaturationFactor = std::max(0.0f, std::min(data.readFloat(), 2.0f));
4676 
4677                 updateColorMatrixLocked();
4678                 return NO_ERROR;
4679             }
4680             case 1023: { // Set native mode
4681                 mDisplayColorSetting = static_cast<DisplayColorSetting>(data.readInt32());
4682                 invalidateHwcGeometry();
4683                 repaintEverything();
4684                 return NO_ERROR;
4685             }
4686             case 1024: { // Is wide color gamut rendering/color management supported?
4687                 reply->writeBool(hasWideColorDisplay);
4688                 return NO_ERROR;
4689             }
4690             case 1025: { // Set layer tracing
4691                 n = data.readInt32();
4692                 if (n) {
4693                     ALOGV("LayerTracing enabled");
4694                     mTracing.enable();
4695                     doTracing("tracing.enable");
4696                     reply->writeInt32(NO_ERROR);
4697                 } else {
4698                     ALOGV("LayerTracing disabled");
4699                     status_t err = mTracing.disable();
4700                     reply->writeInt32(err);
4701                 }
4702                 return NO_ERROR;
4703             }
4704             case 1026: { // Get layer tracing status
4705                 reply->writeBool(mTracing.isEnabled());
4706                 return NO_ERROR;
4707             }
4708             // Is a DisplayColorSetting supported?
4709             case 1027: {
4710                 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
4711                 if (!hw) {
4712                     return NAME_NOT_FOUND;
4713                 }
4714 
4715                 DisplayColorSetting setting = static_cast<DisplayColorSetting>(data.readInt32());
4716                 switch (setting) {
4717                     case DisplayColorSetting::MANAGED:
4718                         reply->writeBool(hasWideColorDisplay);
4719                         break;
4720                     case DisplayColorSetting::UNMANAGED:
4721                         reply->writeBool(true);
4722                         break;
4723                     case DisplayColorSetting::ENHANCED:
4724                         reply->writeBool(hw->hasRenderIntent(RenderIntent::ENHANCE));
4725                         break;
4726                     default: // vendor display color setting
4727                         reply->writeBool(hw->hasRenderIntent(static_cast<RenderIntent>(setting)));
4728                         break;
4729                 }
4730                 return NO_ERROR;
4731             }
4732         }
4733     }
4734     return err;
4735 }
4736 
repaintEverything()4737 void SurfaceFlinger::repaintEverything() {
4738     android_atomic_or(1, &mRepaintEverything);
4739     signalTransaction();
4740 }
4741 
4742 // A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
4743 class WindowDisconnector {
4744 public:
WindowDisconnector(ANativeWindow * window,int api)4745     WindowDisconnector(ANativeWindow* window, int api) : mWindow(window), mApi(api) {}
~WindowDisconnector()4746     ~WindowDisconnector() {
4747         native_window_api_disconnect(mWindow, mApi);
4748     }
4749 
4750 private:
4751     ANativeWindow* mWindow;
4752     const int mApi;
4753 };
4754 
captureScreen(const sp<IBinder> & display,sp<GraphicBuffer> * outBuffer,bool & outCapturedSecureLayers,Rect sourceCrop,uint32_t reqWidth,uint32_t reqHeight,int32_t minLayerZ,int32_t maxLayerZ,bool useIdentityTransform,ISurfaceComposer::Rotation rotation,bool captureSecureLayers)4755 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
4756                                        sp<GraphicBuffer>* outBuffer, bool& outCapturedSecureLayers,
4757                                        Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
4758                                        int32_t minLayerZ, int32_t maxLayerZ,
4759                                        bool useIdentityTransform,
4760                                        ISurfaceComposer::Rotation rotation,
4761                                        bool captureSecureLayers) {
4762     ATRACE_CALL();
4763 
4764     if (CC_UNLIKELY(display == 0)) return BAD_VALUE;
4765 
4766     const sp<const DisplayDevice> device(getDisplayDeviceLocked(display));
4767     if (CC_UNLIKELY(device == 0)) return BAD_VALUE;
4768 
4769     const Rect& dispScissor = device->getScissor();
4770     if (!dispScissor.isEmpty()) {
4771         sourceCrop.set(dispScissor);
4772         // adb shell screencap will default reqWidth and reqHeight to zeros.
4773         if (reqWidth == 0 || reqHeight == 0) {
4774             reqWidth = uint32_t(device->getViewport().width());
4775             reqHeight = uint32_t(device->getViewport().height());
4776         }
4777     }
4778 
4779     DisplayRenderArea renderArea(device, sourceCrop, reqHeight, reqWidth, rotation,
4780                                  captureSecureLayers);
4781 
4782     auto traverseLayers = std::bind(std::mem_fn(&SurfaceFlinger::traverseLayersInDisplay), this,
4783                                     device, minLayerZ, maxLayerZ, std::placeholders::_1);
4784     return captureScreenCommon(renderArea, traverseLayers, outBuffer, useIdentityTransform,
4785                                outCapturedSecureLayers);
4786 }
4787 
captureLayers(const sp<IBinder> & layerHandleBinder,sp<GraphicBuffer> * outBuffer,const Rect & sourceCrop,float frameScale,bool childrenOnly)4788 status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder,
4789                                        sp<GraphicBuffer>* outBuffer, const Rect& sourceCrop,
4790                                        float frameScale, bool childrenOnly) {
4791     ATRACE_CALL();
4792 
4793     class LayerRenderArea : public RenderArea {
4794     public:
4795         LayerRenderArea(SurfaceFlinger* flinger, const sp<Layer>& layer, const Rect crop,
4796                         int32_t reqWidth, int32_t reqHeight, bool childrenOnly)
4797               : RenderArea(reqHeight, reqWidth, CaptureFill::CLEAR),
4798                 mLayer(layer),
4799                 mCrop(crop),
4800                 mFlinger(flinger),
4801                 mChildrenOnly(childrenOnly) {}
4802         const Transform& getTransform() const override { return mTransform; }
4803         Rect getBounds() const override {
4804             const Layer::State& layerState(mLayer->getDrawingState());
4805             return Rect(layerState.active.w, layerState.active.h);
4806         }
4807         int getHeight() const override { return mLayer->getDrawingState().active.h; }
4808         int getWidth() const override { return mLayer->getDrawingState().active.w; }
4809         bool isSecure() const override { return false; }
4810         bool needsFiltering() const override { return false; }
4811         Rect getSourceCrop() const override {
4812             if (mCrop.isEmpty()) {
4813                 return getBounds();
4814             } else {
4815                 return mCrop;
4816             }
4817         }
4818         class ReparentForDrawing {
4819         public:
4820             const sp<Layer>& oldParent;
4821             const sp<Layer>& newParent;
4822 
4823             ReparentForDrawing(const sp<Layer>& oldParent, const sp<Layer>& newParent)
4824                   : oldParent(oldParent), newParent(newParent) {
4825                 oldParent->setChildrenDrawingParent(newParent);
4826             }
4827             ~ReparentForDrawing() { oldParent->setChildrenDrawingParent(oldParent); }
4828         };
4829 
4830         void render(std::function<void()> drawLayers) override {
4831             if (!mChildrenOnly) {
4832                 mTransform = mLayer->getTransform().inverse();
4833                 drawLayers();
4834             } else {
4835                 Rect bounds = getBounds();
4836                 screenshotParentLayer =
4837                         new ContainerLayer(mFlinger, nullptr, String8("Screenshot Parent"),
4838                                            bounds.getWidth(), bounds.getHeight(), 0);
4839 
4840                 ReparentForDrawing reparent(mLayer, screenshotParentLayer);
4841                 drawLayers();
4842             }
4843         }
4844 
4845     private:
4846         const sp<Layer> mLayer;
4847         const Rect mCrop;
4848 
4849         // In the "childrenOnly" case we reparent the children to a screenshot
4850         // layer which has no properties set and which does not draw.
4851         sp<ContainerLayer> screenshotParentLayer;
4852         Transform mTransform;
4853 
4854         SurfaceFlinger* mFlinger;
4855         const bool mChildrenOnly;
4856     };
4857 
4858     int reqWidth = 0;
4859     int reqHeight = 0;
4860     sp<Layer> parent;
4861     Rect crop(sourceCrop);
4862 
4863     {
4864         Mutex::Autolock _l(mStateLock);
4865 
4866         parent = fromHandle(layerHandleBinder);
4867         if (parent == nullptr || parent->isPendingRemoval()) {
4868             ALOGE("captureLayers called with an invalid or removed parent");
4869             return NAME_NOT_FOUND;
4870         }
4871 
4872         const int uid = IPCThreadState::self()->getCallingUid();
4873         const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM;
4874         if (!forSystem && parent->getCurrentState().flags & layer_state_t::eLayerSecure) {
4875             ALOGW("Attempting to capture secure layer: PERMISSION_DENIED");
4876             return PERMISSION_DENIED;
4877         }
4878 
4879         if (sourceCrop.width() <= 0) {
4880             crop.left = 0;
4881             crop.right = parent->getCurrentState().active.w;
4882         }
4883 
4884         if (sourceCrop.height() <= 0) {
4885             crop.top = 0;
4886             crop.bottom = parent->getCurrentState().active.h;
4887         }
4888 
4889         reqWidth = crop.width() * frameScale;
4890         reqHeight = crop.height() * frameScale;
4891     } // mStateLock
4892 
4893     LayerRenderArea renderArea(this, parent, crop, reqWidth, reqHeight, childrenOnly);
4894 
4895     auto traverseLayers = [parent, childrenOnly](const LayerVector::Visitor& visitor) {
4896         parent->traverseChildrenInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4897             if (!layer->isVisible()) {
4898                 return;
4899             } else if (childrenOnly && layer == parent.get()) {
4900                 return;
4901             }
4902             visitor(layer);
4903         });
4904     };
4905     bool outCapturedSecureLayers = false;
4906     return captureScreenCommon(renderArea, traverseLayers, outBuffer, false,
4907                                outCapturedSecureLayers);
4908 }
4909 
captureScreenCommon(RenderArea & renderArea,TraverseLayersFunction traverseLayers,sp<GraphicBuffer> * outBuffer,bool useIdentityTransform,bool & outCapturedSecureLayers)4910 status_t SurfaceFlinger::captureScreenCommon(RenderArea& renderArea,
4911                                              TraverseLayersFunction traverseLayers,
4912                                              sp<GraphicBuffer>* outBuffer,
4913                                              bool useIdentityTransform,
4914                                              bool& outCapturedSecureLayers) {
4915     ATRACE_CALL();
4916 
4917     renderArea.updateDimensions(mPrimaryDisplayOrientation);
4918 
4919     const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
4920             GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
4921     *outBuffer = new GraphicBuffer(renderArea.getReqWidth(), renderArea.getReqHeight(),
4922                                    HAL_PIXEL_FORMAT_RGBA_8888, 1, usage, "screenshot");
4923 
4924     // This mutex protects syncFd and captureResult for communication of the return values from the
4925     // main thread back to this Binder thread
4926     std::mutex captureMutex;
4927     std::condition_variable captureCondition;
4928     std::unique_lock<std::mutex> captureLock(captureMutex);
4929     int syncFd = -1;
4930     std::optional<status_t> captureResult;
4931 
4932     const int uid = IPCThreadState::self()->getCallingUid();
4933     const bool forSystem = uid == AID_GRAPHICS || uid == AID_SYSTEM;
4934 
4935     sp<LambdaMessage> message = new LambdaMessage([&]() {
4936         // If there is a refresh pending, bug out early and tell the binder thread to try again
4937         // after the refresh.
4938         if (mRefreshPending) {
4939             ATRACE_NAME("Skipping screenshot for now");
4940             std::unique_lock<std::mutex> captureLock(captureMutex);
4941             captureResult = std::make_optional<status_t>(EAGAIN);
4942             captureCondition.notify_one();
4943             return;
4944         }
4945 
4946         status_t result = NO_ERROR;
4947         int fd = -1;
4948         {
4949             Mutex::Autolock _l(mStateLock);
4950             renderArea.render([&]() {
4951                 result = captureScreenImplLocked(renderArea, traverseLayers, (*outBuffer).get(),
4952                                                  useIdentityTransform, forSystem, &fd,
4953                                                  outCapturedSecureLayers);
4954             });
4955         }
4956 
4957         {
4958             std::unique_lock<std::mutex> captureLock(captureMutex);
4959             syncFd = fd;
4960             captureResult = std::make_optional<status_t>(result);
4961             captureCondition.notify_one();
4962         }
4963     });
4964 
4965     status_t result = postMessageAsync(message);
4966     if (result == NO_ERROR) {
4967         captureCondition.wait(captureLock, [&]() { return captureResult; });
4968         while (*captureResult == EAGAIN) {
4969             captureResult.reset();
4970             result = postMessageAsync(message);
4971             if (result != NO_ERROR) {
4972                 return result;
4973             }
4974             captureCondition.wait(captureLock, [&]() { return captureResult; });
4975         }
4976         result = *captureResult;
4977     }
4978 
4979     if (result == NO_ERROR) {
4980         sync_wait(syncFd, -1);
4981         close(syncFd);
4982     }
4983 
4984     return result;
4985 }
4986 
renderScreenImplLocked(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,bool yswap,bool useIdentityTransform)4987 void SurfaceFlinger::renderScreenImplLocked(const RenderArea& renderArea,
4988                                             TraverseLayersFunction traverseLayers, bool yswap,
4989                                             bool useIdentityTransform) {
4990     ATRACE_CALL();
4991 
4992     auto& engine(getRenderEngine());
4993 
4994     // get screen geometry
4995     const auto raWidth = renderArea.getWidth();
4996     const auto raHeight = renderArea.getHeight();
4997 
4998     const auto reqWidth = renderArea.getReqWidth();
4999     const auto reqHeight = renderArea.getReqHeight();
5000     Rect sourceCrop = renderArea.getSourceCrop();
5001 
5002     bool filtering = false;
5003     if (mPrimaryDisplayOrientation & DisplayState::eOrientationSwapMask) {
5004         filtering = static_cast<int32_t>(reqWidth) != raHeight ||
5005                 static_cast<int32_t>(reqHeight) != raWidth;
5006     } else {
5007         filtering = static_cast<int32_t>(reqWidth) != raWidth ||
5008                 static_cast<int32_t>(reqHeight) != raHeight;
5009     }
5010 
5011     // if a default or invalid sourceCrop is passed in, set reasonable values
5012     if (sourceCrop.width() == 0 || sourceCrop.height() == 0 || !sourceCrop.isValid()) {
5013         sourceCrop.setLeftTop(Point(0, 0));
5014         sourceCrop.setRightBottom(Point(raWidth, raHeight));
5015     } else if (mPrimaryDisplayOrientation != DisplayState::eOrientationDefault) {
5016         Transform tr;
5017         uint32_t flags = 0x00;
5018         switch (mPrimaryDisplayOrientation) {
5019             case DisplayState::eOrientation90:
5020                 flags = Transform::ROT_90;
5021                 break;
5022             case DisplayState::eOrientation180:
5023                 flags = Transform::ROT_180;
5024                 break;
5025             case DisplayState::eOrientation270:
5026                 flags = Transform::ROT_270;
5027                 break;
5028         }
5029         tr.set(flags, raWidth, raHeight);
5030         sourceCrop = tr.transform(sourceCrop);
5031     }
5032 
5033     // ensure that sourceCrop is inside screen
5034     if (sourceCrop.left < 0) {
5035         ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
5036     }
5037     if (sourceCrop.right > raWidth) {
5038         ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, raWidth);
5039     }
5040     if (sourceCrop.top < 0) {
5041         ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
5042     }
5043     if (sourceCrop.bottom > raHeight) {
5044         ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, raHeight);
5045     }
5046 
5047     // assume ColorMode::SRGB / RenderIntent::COLORIMETRIC
5048     engine.setOutputDataSpace(Dataspace::SRGB);
5049     engine.setDisplayMaxLuminance(DisplayDevice::sDefaultMaxLumiance);
5050 
5051     // make sure to clear all GL error flags
5052     engine.checkErrors();
5053 
5054     Transform::orientation_flags rotation = renderArea.getRotationFlags();
5055     if (mPrimaryDisplayOrientation != DisplayState::eOrientationDefault) {
5056         // convert hw orientation into flag presentation
5057         // here inverse transform needed
5058         uint8_t hw_rot_90  = 0x00;
5059         uint8_t hw_flip_hv = 0x00;
5060         switch (mPrimaryDisplayOrientation) {
5061             case DisplayState::eOrientation90:
5062                 hw_rot_90 = Transform::ROT_90;
5063                 hw_flip_hv = Transform::ROT_180;
5064                 break;
5065             case DisplayState::eOrientation180:
5066                 hw_flip_hv = Transform::ROT_180;
5067                 break;
5068             case DisplayState::eOrientation270:
5069                 hw_rot_90  = Transform::ROT_90;
5070                 break;
5071         }
5072 
5073         // transform flags operation
5074         // 1) flip H V if both have ROT_90 flag
5075         // 2) XOR these flags
5076         uint8_t rotation_rot_90  = rotation & Transform::ROT_90;
5077         uint8_t rotation_flip_hv = rotation & Transform::ROT_180;
5078         if (rotation_rot_90 & hw_rot_90) {
5079             rotation_flip_hv = (~rotation_flip_hv) & Transform::ROT_180;
5080         }
5081         rotation = static_cast<Transform::orientation_flags>
5082                    ((rotation_rot_90 ^ hw_rot_90) | (rotation_flip_hv ^ hw_flip_hv));
5083     }
5084 
5085     // set-up our viewport
5086     engine.setViewportAndProjection(reqWidth, reqHeight, sourceCrop, raHeight, yswap,
5087                                     rotation);
5088     engine.disableTexturing();
5089 
5090     const float alpha = RenderArea::getCaptureFillValue(renderArea.getCaptureFill());
5091     // redraw the screen entirely...
5092     engine.clearWithColor(0, 0, 0, alpha);
5093 
5094     traverseLayers([&](Layer* layer) {
5095         if (filtering) layer->setFiltering(true);
5096         layer->draw(renderArea, useIdentityTransform);
5097         if (filtering) layer->setFiltering(false);
5098     });
5099 }
5100 
captureScreenImplLocked(const RenderArea & renderArea,TraverseLayersFunction traverseLayers,ANativeWindowBuffer * buffer,bool useIdentityTransform,bool forSystem,int * outSyncFd,bool & outCapturedSecureLayers)5101 status_t SurfaceFlinger::captureScreenImplLocked(const RenderArea& renderArea,
5102                                                  TraverseLayersFunction traverseLayers,
5103                                                  ANativeWindowBuffer* buffer,
5104                                                  bool useIdentityTransform, bool forSystem,
5105                                                  int* outSyncFd, bool& outCapturedSecureLayers) {
5106     ATRACE_CALL();
5107 
5108     traverseLayers([&](Layer* layer) {
5109         outCapturedSecureLayers =
5110                 outCapturedSecureLayers || (layer->isVisible() && layer->isSecure());
5111     });
5112 
5113     // We allow the system server to take screenshots of secure layers for
5114     // use in situations like the Screen-rotation animation and place
5115     // the impetus on WindowManager to not persist them.
5116     if (outCapturedSecureLayers && !forSystem) {
5117         ALOGW("FB is protected: PERMISSION_DENIED");
5118         return PERMISSION_DENIED;
5119     }
5120 
5121     // this binds the given EGLImage as a framebuffer for the
5122     // duration of this scope.
5123     RE::BindNativeBufferAsFramebuffer bufferBond(getRenderEngine(), buffer);
5124     if (bufferBond.getStatus() != NO_ERROR) {
5125         ALOGE("got ANWB binding error while taking screenshot");
5126         return INVALID_OPERATION;
5127     }
5128 
5129     // this will in fact render into our dequeued buffer
5130     // via an FBO, which means we didn't have to create
5131     // an EGLSurface and therefore we're not
5132     // dependent on the context's EGLConfig.
5133     renderScreenImplLocked(renderArea, traverseLayers, true, useIdentityTransform);
5134 
5135     if (DEBUG_SCREENSHOTS) {
5136         getRenderEngine().finish();
5137         *outSyncFd = -1;
5138 
5139         const auto reqWidth = renderArea.getReqWidth();
5140         const auto reqHeight = renderArea.getReqHeight();
5141 
5142         uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
5143         getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
5144         checkScreenshot(reqWidth, reqHeight, reqWidth, pixels, traverseLayers);
5145         delete [] pixels;
5146     } else {
5147         base::unique_fd syncFd = getRenderEngine().flush();
5148         if (syncFd < 0) {
5149             getRenderEngine().finish();
5150         }
5151         *outSyncFd = syncFd.release();
5152     }
5153 
5154     return NO_ERROR;
5155 }
5156 
checkScreenshot(size_t w,size_t s,size_t h,void const * vaddr,TraverseLayersFunction traverseLayers)5157 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
5158                                      TraverseLayersFunction traverseLayers) {
5159     if (DEBUG_SCREENSHOTS) {
5160         for (size_t y = 0; y < h; y++) {
5161             uint32_t const* p = (uint32_t const*)vaddr + y * s;
5162             for (size_t x = 0; x < w; x++) {
5163                 if (p[x] != 0xFF000000) return;
5164             }
5165         }
5166         ALOGE("*** we just took a black screenshot ***");
5167 
5168         size_t i = 0;
5169         traverseLayers([&](Layer* layer) {
5170             const Layer::State& state(layer->getDrawingState());
5171             ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f",
5172                   layer->isVisible() ? '+' : '-', i, layer->getName().string(),
5173                   layer->getLayerStack(), state.z, layer->isVisible(), state.flags,
5174                   static_cast<float>(state.color.a));
5175             i++;
5176         });
5177     }
5178 }
5179 
5180 // ---------------------------------------------------------------------------
5181 
traverseInZOrder(const LayerVector::Visitor & visitor) const5182 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
5183     layersSortedByZ.traverseInZOrder(stateSet, visitor);
5184 }
5185 
traverseInReverseZOrder(const LayerVector::Visitor & visitor) const5186 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
5187     layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
5188 }
5189 
traverseLayersInDisplay(const sp<const DisplayDevice> & hw,int32_t minLayerZ,int32_t maxLayerZ,const LayerVector::Visitor & visitor)5190 void SurfaceFlinger::traverseLayersInDisplay(const sp<const DisplayDevice>& hw, int32_t minLayerZ,
5191                                              int32_t maxLayerZ,
5192                                              const LayerVector::Visitor& visitor) {
5193     // We loop through the first level of layers without traversing,
5194     // as we need to interpret min/max layer Z in the top level Z space.
5195     for (const auto& layer : mDrawingState.layersSortedByZ) {
5196         if (!layer->belongsToDisplay(hw->getLayerStack(), false)) {
5197             continue;
5198         }
5199         const Layer::State& state(layer->getDrawingState());
5200         // relative layers are traversed in Layer::traverseInZOrder
5201         if (state.zOrderRelativeOf != nullptr || state.z < minLayerZ || state.z > maxLayerZ) {
5202             continue;
5203         }
5204         layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
5205             if (!layer->belongsToDisplay(hw->getLayerStack(), false)) {
5206                 return;
5207             }
5208             if (!layer->isVisible()) {
5209                 return;
5210             }
5211             visitor(layer);
5212         });
5213     }
5214 }
5215 
fromHandle(const sp<IBinder> & handle)5216 sp<Layer> SurfaceFlinger::fromHandle(const sp<IBinder>& handle) {
5217     if (!handle) return nullptr;
5218 
5219     BBinder *b = handle->localBinder();
5220     if (b == nullptr) {
5221         return nullptr;
5222     }
5223     auto it = mLayersByLocalBinderToken.find(b);
5224     if (it != mLayersByLocalBinderToken.end()) {
5225         auto ret = it->second.promote();
5226         return ret;
5227     }
5228     return nullptr;
5229 }
5230 
5231 } // namespace android
5232 
5233 #if defined(__gl_h_)
5234 #error "don't include gl/gl.h in this file"
5235 #endif
5236 
5237 #if defined(__gl2_h_)
5238 #error "don't include gl2/gl2.h in this file"
5239 #endif
5240