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