2 * Copyright (C) 2007 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 // #define LOG_NDEBUG 0
18 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
21 #include <sys/types.h>
28 #include <stdatomic.h>
33 #include <cutils/properties.h>
36 #include <binder/IPCThreadState.h>
37 #include <binder/IServiceManager.h>
38 #include <binder/PermissionCache.h>
40 #include <dvr/vr_flinger.h>
42 #include <ui/DebugUtils.h>
43 #include <ui/DisplayInfo.h>
44 #include <ui/DisplayStatInfo.h>
46 #include <gui/BufferQueue.h>
47 #include <gui/GuiConfig.h>
48 #include <gui/IDisplayEventConnection.h>
49 #include <gui/Surface.h>
51 #include <ui/GraphicBufferAllocator.h>
52 #include <ui/PixelFormat.h>
53 #include <ui/UiConfig.h>
55 #include <utils/misc.h>
56 #include <utils/String8.h>
57 #include <utils/String16.h>
58 #include <utils/StopWatch.h>
59 #include <utils/Timers.h>
60 #include <utils/Trace.h>
62 #include <private/android_filesystem_config.h>
63 #include <private/gui/SyncFeatures.h>
67 #include "Colorizer.h"
68 #include "DdmConnection.h"
69 #include "DisplayDevice.h"
71 #include "EventControlThread.h"
72 #include "EventThread.h"
74 #include "LayerVector.h"
76 #include "MonitoredProducer.h"
77 #include "SurfaceFlinger.h"
79 #include "DisplayHardware/FramebufferSurface.h"
80 #include "DisplayHardware/HWComposer.h"
81 #include "DisplayHardware/VirtualDisplaySurface.h"
83 #include "Effects/Daltonizer.h"
85 #include "RenderEngine/RenderEngine.h"
86 #include <cutils/compiler.h>
88 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
89 #include <configstore/Utils.h>
91 #define DISPLAY_COUNT 1
94 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
97 #define DEBUG_SCREENSHOTS false
99 EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
104 using namespace android::hardware::configstore;
105 using namespace android::hardware::configstore::V1_0;
107 // ---------------------------------------------------------------------------
109 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
110 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
111 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
112 const String16 sDump("android.permission.DUMP");
114 // ---------------------------------------------------------------------------
115 int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
116 int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
117 bool SurfaceFlinger::useContextPriority;
118 int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
119 bool SurfaceFlinger::useHwcForRgbToYuv;
120 uint64_t SurfaceFlinger::maxVirtualDisplaySize;
121 bool SurfaceFlinger::hasSyncFramework;
122 bool SurfaceFlinger::useVrFlinger;
123 int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
124 bool SurfaceFlinger::hasWideColorDisplay;
126 SurfaceFlinger::SurfaceFlinger()
127 : BnSurfaceComposer(),
128 mTransactionFlags(0),
129 mTransactionPending(false),
130 mAnimTransactionPending(false),
131 mLayersRemoved(false),
133 mRepaintEverything(0),
137 mRenderEngine(nullptr),
138 mBootTime(systemTime()),
140 mVisibleRegionsDirty(false),
141 mGeometryInvalid(false),
142 mAnimCompositionPending(false),
146 mDebugDisableTransformHint(0),
147 mDebugInSwapBuffers(0),
148 mLastSwapBufferTime(0),
149 mDebugInTransaction(0),
150 mLastTransactionTime(0),
151 mBootFinished(false),
152 mForceFullDamage(false),
154 mPrimaryDispSync("PrimaryDispSync"),
155 mPrimaryHWVsyncEnabled(false),
156 mHWVsyncAvailable(false),
157 mHasColorMatrix(false),
158 mHasPoweredOff(false),
163 mVrFlingerRequestsDisplay(false)
165 ALOGI("SurfaceFlinger is starting");
167 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
168 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
170 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
171 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
173 hasSyncFramework = getBool< ISurfaceFlingerConfigs,
174 &ISurfaceFlingerConfigs::hasSyncFramework>(true);
176 useContextPriority = getBool< ISurfaceFlingerConfigs,
177 &ISurfaceFlingerConfigs::useContextPriority>(false);
179 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
180 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
182 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
183 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
185 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
186 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
188 // Vr flinger is only enabled on Daydream ready devices.
189 useVrFlinger = getBool< ISurfaceFlingerConfigs,
190 &ISurfaceFlingerConfigs::useVrFlinger>(false);
192 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
193 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
195 hasWideColorDisplay =
196 getBool<ISurfaceFlingerConfigs, &ISurfaceFlingerConfigs::hasWideColorDisplay>(false);
198 mPrimaryDispSync.init(hasSyncFramework, dispSyncPresentTimeOffset);
200 // debugging stuff...
201 char value[PROPERTY_VALUE_MAX];
203 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
204 mGpuToCpuSupported = !atoi(value);
206 property_get("debug.sf.showupdates", value, "0");
207 mDebugRegion = atoi(value);
209 property_get("debug.sf.ddms", value, "0");
210 mDebugDDMS = atoi(value);
212 if (!startDdmConnection()) {
213 // start failed, and DDMS debugging not enabled
217 ALOGI_IF(mDebugRegion, "showupdates enabled");
218 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
220 property_get("debug.sf.disable_backpressure", value, "0");
221 mPropagateBackpressure = !atoi(value);
222 ALOGI_IF(!mPropagateBackpressure, "Disabling backpressure propagation");
224 property_get("debug.sf.enable_hwc_vds", value, "0");
225 mUseHwcVirtualDisplays = atoi(value);
226 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
228 property_get("ro.sf.disable_triple_buffer", value, "1");
229 mLayerTripleBufferingDisabled = atoi(value);
230 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
232 // We should be reading 'persist.sys.sf.color_saturation' here
233 // but since /data may be encrypted, we need to wait until after vold
234 // comes online to attempt to read the property. The property is
235 // instead read after the boot animation
238 void SurfaceFlinger::onFirstRef()
240 mEventQueue.init(this);
243 SurfaceFlinger::~SurfaceFlinger()
245 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
246 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
247 eglTerminate(display);
250 void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
252 // the window manager died on us. prepare its eulogy.
254 // restore initial conditions (default device unblank, etc)
255 initializeDisplays();
257 // restart the boot-animation
261 static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
262 status_t err = client->initCheck();
263 if (err == NO_ERROR) {
269 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
270 return initClient(new Client(this));
273 sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
274 const sp<IGraphicBufferProducer>& gbp) {
275 if (authenticateSurfaceTexture(gbp) == false) {
278 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
279 if (layer == nullptr) {
283 return initClient(new Client(this, layer));
286 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
289 class DisplayToken : public BBinder {
290 sp<SurfaceFlinger> flinger;
291 virtual ~DisplayToken() {
292 // no more references, this display must be terminated
293 Mutex::Autolock _l(flinger->mStateLock);
294 flinger->mCurrentState.displays.removeItem(this);
295 flinger->setTransactionFlags(eDisplayTransactionNeeded);
298 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
303 sp<BBinder> token = new DisplayToken(this);
305 Mutex::Autolock _l(mStateLock);
306 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
307 info.displayName = displayName;
308 mCurrentState.displays.add(token, info);
309 mInterceptor.saveDisplayCreation(info);
313 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
314 Mutex::Autolock _l(mStateLock);
316 ssize_t idx = mCurrentState.displays.indexOfKey(display);
318 ALOGW("destroyDisplay: invalid display token");
322 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
323 if (!info.isVirtualDisplay()) {
324 ALOGE("destroyDisplay called for non-virtual display");
327 mInterceptor.saveDisplayDeletion(info.displayId);
328 mCurrentState.displays.removeItemsAt(idx);
329 setTransactionFlags(eDisplayTransactionNeeded);
332 void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
333 ALOGV("createBuiltinDisplayLocked(%d)", type);
334 ALOGW_IF(mBuiltinDisplays[type],
335 "Overwriting display token for display type %d", type);
336 mBuiltinDisplays[type] = new BBinder();
337 // All non-virtual displays are currently considered secure.
338 DisplayDeviceState info(type, true);
339 mCurrentState.displays.add(mBuiltinDisplays[type], info);
340 mInterceptor.saveDisplayCreation(info);
343 sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
344 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
345 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
348 return mBuiltinDisplays[id];
351 void SurfaceFlinger::bootFinished()
353 if (mStartPropertySetThread->join() != NO_ERROR) {
354 ALOGE("Join StartPropertySetThread failed!");
356 const nsecs_t now = systemTime();
357 const nsecs_t duration = now - mBootTime;
358 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
360 // wait patiently for the window manager death
361 const String16 name("window");
362 sp<IBinder> window(defaultServiceManager()->getService(name));
364 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
368 mVrFlinger->OnBootFinished();
371 // stop boot animation
372 // formerly we would just kill the process, but we now ask it to exit so it
373 // can choose where to stop the animation.
374 property_set("service.bootanim.exit", "1");
376 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
377 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
378 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
380 sp<LambdaMessage> bootFinished = new LambdaMessage([&]() {
381 mBootFinished = true;
383 readPersistentProperties();
386 sp<DisplayDevice> hw(getDisplayDevice(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]));
387 if (hw->getWideColorSupport()) {
388 hw->setCompositionDataSpace(HAL_DATASPACE_V0_SRGB);
389 setActiveColorModeInternal(hw, HAL_COLOR_MODE_SRGB);
393 postMessageAsync(bootFinished);
396 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
397 class MessageDestroyGLTexture : public MessageBase {
398 RenderEngine& engine;
401 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
402 : engine(engine), texture(texture) {
404 virtual bool handler() {
405 engine.deleteTextures(1, &texture);
409 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
412 class DispSyncSource : public VSyncSource, private DispSync::Callback {
414 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
418 mTraceVsync(traceVsync),
419 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
420 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
425 mPhaseOffset(phaseOffset),
428 virtual ~DispSyncSource() {}
430 virtual void setVSyncEnabled(bool enable) {
431 Mutex::Autolock lock(mVsyncMutex);
433 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
434 static_cast<DispSync::Callback*>(this));
435 if (err != NO_ERROR) {
436 ALOGE("error registering vsync callback: %s (%d)",
437 strerror(-err), err);
439 //ATRACE_INT(mVsyncOnLabel.string(), 1);
441 status_t err = mDispSync->removeEventListener(
442 static_cast<DispSync::Callback*>(this));
443 if (err != NO_ERROR) {
444 ALOGE("error unregistering vsync callback: %s (%d)",
445 strerror(-err), err);
447 //ATRACE_INT(mVsyncOnLabel.string(), 0);
452 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
453 Mutex::Autolock lock(mCallbackMutex);
454 mCallback = callback;
457 virtual void setPhaseOffset(nsecs_t phaseOffset) {
458 Mutex::Autolock lock(mVsyncMutex);
460 // Normalize phaseOffset to [0, period)
461 auto period = mDispSync->getPeriod();
462 phaseOffset %= period;
463 if (phaseOffset < 0) {
464 // If we're here, then phaseOffset is in (-period, 0). After this
465 // operation, it will be in (0, period)
466 phaseOffset += period;
468 mPhaseOffset = phaseOffset;
470 // If we're not enabled, we don't need to mess with the listeners
475 // Remove the listener with the old offset
476 status_t err = mDispSync->removeEventListener(
477 static_cast<DispSync::Callback*>(this));
478 if (err != NO_ERROR) {
479 ALOGE("error unregistering vsync callback: %s (%d)",
480 strerror(-err), err);
483 // Add a listener with the new offset
484 err = mDispSync->addEventListener(mName, mPhaseOffset,
485 static_cast<DispSync::Callback*>(this));
486 if (err != NO_ERROR) {
487 ALOGE("error registering vsync callback: %s (%d)",
488 strerror(-err), err);
493 virtual void onDispSyncEvent(nsecs_t when) {
494 sp<VSyncSource::Callback> callback;
496 Mutex::Autolock lock(mCallbackMutex);
497 callback = mCallback;
500 mValue = (mValue + 1) % 2;
501 ATRACE_INT(mVsyncEventLabel.string(), mValue);
505 if (callback != NULL) {
506 callback->onVSyncEvent(when);
510 const char* const mName;
514 const bool mTraceVsync;
515 const String8 mVsyncOnLabel;
516 const String8 mVsyncEventLabel;
520 Mutex mCallbackMutex; // Protects the following
521 sp<VSyncSource::Callback> mCallback;
523 Mutex mVsyncMutex; // Protects the following
524 nsecs_t mPhaseOffset;
528 class InjectVSyncSource : public VSyncSource {
530 InjectVSyncSource() {}
532 virtual ~InjectVSyncSource() {}
534 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
535 std::lock_guard<std::mutex> lock(mCallbackMutex);
536 mCallback = callback;
539 virtual void onInjectSyncEvent(nsecs_t when) {
540 std::lock_guard<std::mutex> lock(mCallbackMutex);
541 mCallback->onVSyncEvent(when);
544 virtual void setVSyncEnabled(bool) {}
545 virtual void setPhaseOffset(nsecs_t) {}
548 std::mutex mCallbackMutex; // Protects the following
549 sp<VSyncSource::Callback> mCallback;
552 // Do not call property_set on main thread which will be blocked by init
553 // Use StartPropertySetThread instead.
554 void SurfaceFlinger::init() {
555 ALOGI( "SurfaceFlinger's main thread ready to run. "
556 "Initializing graphics H/W...");
558 ALOGI("Phase offset NS: %" PRId64 "", vsyncPhaseOffsetNs);
561 Mutex::Autolock _l(mStateLock);
563 // initialize EGL for the default display
564 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
565 eglInitialize(mEGLDisplay, NULL, NULL);
567 // start the EventThread
568 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
569 vsyncPhaseOffsetNs, true, "app");
570 mEventThread = new EventThread(vsyncSrc, *this, false);
571 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
572 sfVsyncPhaseOffsetNs, true, "sf");
573 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
574 mEventQueue.setEventThread(mSFEventThread);
576 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
577 struct sched_param param = {0};
578 param.sched_priority = 2;
579 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) {
580 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
582 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, ¶m) != 0) {
583 ALOGE("Couldn't set SCHED_FIFO for EventThread");
586 // Get a RenderEngine for the given display / config (can't fail)
587 mRenderEngine = RenderEngine::create(mEGLDisplay,
588 HAL_PIXEL_FORMAT_RGBA_8888,
589 hasWideColorDisplay ? RenderEngine::WIDE_COLOR_SUPPORT : 0);
592 // Drop the state lock while we initialize the hardware composer. We drop
593 // the lock because on creation, it will call back into SurfaceFlinger to
594 // initialize the primary display.
595 LOG_ALWAYS_FATAL_IF(mVrFlingerRequestsDisplay,
596 "Starting with vr flinger active is not currently supported.");
597 mRealHwc = new HWComposer(false);
599 mHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this));
601 Mutex::Autolock _l(mStateLock);
604 auto vrFlingerRequestDisplayCallback = [this] (bool requestDisplay) {
605 ALOGI("VR request display mode: requestDisplay=%d", requestDisplay);
606 mVrFlingerRequestsDisplay = requestDisplay;
609 mVrFlinger = dvr::VrFlinger::Create(mHwc->getComposer(),
610 vrFlingerRequestDisplayCallback);
612 ALOGE("Failed to start vrflinger");
616 // retrieve the EGL context that was selected/created
617 mEGLContext = mRenderEngine->getEGLContext();
619 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
620 "couldn't create EGLContext");
622 // make the GLContext current so that we can create textures when creating
623 // Layers (which may happens before we render something)
624 getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
626 mEventControlThread = new EventControlThread(this);
627 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
629 // initialize our drawing state
630 mDrawingState = mCurrentState;
632 // set initial conditions (e.g. unblank default device)
633 initializeDisplays();
635 mRenderEngine->primeCache();
637 // Inform native graphics APIs whether the present timestamp is supported:
638 if (getHwComposer().hasCapability(
639 HWC2::Capability::PresentFenceIsNotReliable)) {
640 mStartPropertySetThread = new StartPropertySetThread(false);
642 mStartPropertySetThread = new StartPropertySetThread(true);
645 if (mStartPropertySetThread->Start() != NO_ERROR) {
646 ALOGE("Run StartPropertySetThread failed!");
649 ALOGV("Done initializing");
652 void SurfaceFlinger::readPersistentProperties() {
653 char value[PROPERTY_VALUE_MAX];
655 property_get("persist.sys.sf.color_saturation", value, "1.0");
656 mSaturation = atof(value);
657 ALOGV("Saturation is set to %.2f", mSaturation);
660 void SurfaceFlinger::startBootAnim() {
661 // Start boot animation service by setting a property mailbox
662 // if property setting thread is already running, Start() will be just a NOP
663 mStartPropertySetThread->Start();
664 // Wait until property was set
665 if (mStartPropertySetThread->join() != NO_ERROR) {
666 ALOGE("Join StartPropertySetThread failed!");
670 size_t SurfaceFlinger::getMaxTextureSize() const {
671 return mRenderEngine->getMaxTextureSize();
674 size_t SurfaceFlinger::getMaxViewportDims() const {
675 return mRenderEngine->getMaxViewportDims();
678 // ----------------------------------------------------------------------------
680 bool SurfaceFlinger::authenticateSurfaceTexture(
681 const sp<IGraphicBufferProducer>& bufferProducer) const {
682 Mutex::Autolock _l(mStateLock);
683 return authenticateSurfaceTextureLocked(bufferProducer);
686 bool SurfaceFlinger::authenticateSurfaceTextureLocked(
687 const sp<IGraphicBufferProducer>& bufferProducer) const {
688 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
689 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
692 status_t SurfaceFlinger::getSupportedFrameTimestamps(
693 std::vector<FrameEvent>* outSupported) const {
695 FrameEvent::REQUESTED_PRESENT,
698 FrameEvent::FIRST_REFRESH_START,
699 FrameEvent::LAST_REFRESH_START,
700 FrameEvent::GPU_COMPOSITION_DONE,
701 FrameEvent::DEQUEUE_READY,
704 if (!getHwComposer().hasCapability(
705 HWC2::Capability::PresentFenceIsNotReliable)) {
706 outSupported->push_back(FrameEvent::DISPLAY_PRESENT);
711 status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
712 Vector<DisplayInfo>* configs) {
713 if ((configs == NULL) || (display.get() == NULL)) {
718 return NAME_NOT_FOUND;
720 int32_t type = NAME_NOT_FOUND;
721 for (int i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
722 if (display == mBuiltinDisplays[i]) {
732 // TODO: Not sure if display density should handled by SF any longer
734 static int getDensityFromProperty(char const* propName) {
735 char property[PROPERTY_VALUE_MAX];
737 if (property_get(propName, property, NULL) > 0) {
738 density = atoi(property);
743 static int getEmuDensity() {
744 return getDensityFromProperty("qemu.sf.lcd_density"); }
745 static int getBuildDensity() {
746 return getDensityFromProperty("ro.sf.lcd_density"); }
751 for (const auto& hwConfig : getHwComposer().getConfigs(type)) {
752 DisplayInfo info = DisplayInfo();
754 float xdpi = hwConfig->getDpiX();
755 float ydpi = hwConfig->getDpiY();
757 if (type == DisplayDevice::DISPLAY_PRIMARY) {
758 // The density of the device is provided by a build property
759 float density = Density::getBuildDensity() / 160.0f;
761 // the build doesn't provide a density -- this is wrong!
763 ALOGE("ro.sf.lcd_density must be defined as a build property");
764 density = xdpi / 160.0f;
766 if (Density::getEmuDensity()) {
767 // if "qemu.sf.lcd_density" is specified, it overrides everything
768 xdpi = ydpi = density = Density::getEmuDensity();
771 info.density = density;
773 // TODO: this needs to go away (currently needed only by webkit)
774 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
775 info.orientation = hw->getOrientation();
777 // TODO: where should this value come from?
778 static const int TV_DENSITY = 213;
779 info.density = TV_DENSITY / 160.0f;
780 info.orientation = 0;
783 info.w = hwConfig->getWidth();
784 info.h = hwConfig->getHeight();
787 info.fps = 1e9 / hwConfig->getVsyncPeriod();
788 info.appVsyncOffset = vsyncPhaseOffsetNs;
790 // This is how far in advance a buffer must be queued for
791 // presentation at a given time. If you want a buffer to appear
792 // on the screen at time N, you must submit the buffer before
793 // (N - presentationDeadline).
795 // Normally it's one full refresh period (to give SF a chance to
796 // latch the buffer), but this can be reduced by configuring a
797 // DispSync offset. Any additional delays introduced by the hardware
798 // composer or panel must be accounted for here.
800 // We add an additional 1ms to allow for processing time and
801 // differences between the ideal and actual refresh rate.
802 info.presentationDeadline = hwConfig->getVsyncPeriod() -
803 sfVsyncPhaseOffsetNs + 1000000;
805 // All non-virtual displays are currently considered secure.
808 configs->push_back(info);
814 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
815 DisplayStatInfo* stats) {
820 // FIXME for now we always return stats for the primary display
821 memset(stats, 0, sizeof(*stats));
822 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
823 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
827 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
828 if (display == NULL) {
829 ALOGE("%s : display is NULL", __func__);
833 sp<const DisplayDevice> device(getDisplayDevice(display));
834 if (device != NULL) {
835 return device->getActiveConfig();
841 void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
842 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
844 int32_t type = hw->getDisplayType();
845 int currentMode = hw->getActiveConfig();
847 if (mode == currentMode) {
848 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
852 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
853 ALOGW("Trying to set config for virtual display");
857 hw->setActiveConfig(mode);
858 getHwComposer().setActiveConfig(type, mode);
861 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
862 class MessageSetActiveConfig: public MessageBase {
863 SurfaceFlinger& mFlinger;
864 sp<IBinder> mDisplay;
867 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
869 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
870 virtual bool handler() {
871 Vector<DisplayInfo> configs;
872 mFlinger.getDisplayConfigs(mDisplay, &configs);
873 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
874 ALOGE("Attempt to set active config = %d for display with %zu configs",
875 mMode, configs.size());
878 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
880 ALOGE("Attempt to set active config = %d for null display %p",
881 mMode, mDisplay.get());
882 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
883 ALOGW("Attempt to set active config = %d for virtual display",
886 mFlinger.setActiveConfigInternal(hw, mMode);
891 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
892 postMessageSync(msg);
895 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
896 Vector<android_color_mode_t>* outColorModes) {
897 if ((outColorModes == nullptr) || (display.get() == nullptr)) {
901 if (!display.get()) {
902 return NAME_NOT_FOUND;
905 int32_t type = NAME_NOT_FOUND;
906 for (int i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
907 if (display == mBuiltinDisplays[i]) {
917 std::vector<android_color_mode_t> modes = getHwComposer().getColorModes(type);
918 outColorModes->clear();
919 std::copy(modes.cbegin(), modes.cend(), std::back_inserter(*outColorModes));
924 android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
925 sp<const DisplayDevice> device(getDisplayDevice(display));
926 if (device != nullptr) {
927 return device->getActiveColorMode();
929 return static_cast<android_color_mode_t>(BAD_VALUE);
932 void SurfaceFlinger::setActiveColorModeInternal(const sp<DisplayDevice>& hw,
933 android_color_mode_t mode) {
934 int32_t type = hw->getDisplayType();
935 android_color_mode_t currentMode = hw->getActiveColorMode();
937 if (mode == currentMode) {
941 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
942 ALOGW("Trying to set config for virtual display");
946 ALOGD("Set active color mode: %s (%d), type=%d", decodeColorMode(mode).c_str(), mode,
947 hw->getDisplayType());
949 hw->setActiveColorMode(mode);
950 getHwComposer().setActiveColorMode(type, mode);
954 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
955 android_color_mode_t colorMode) {
956 class MessageSetActiveColorMode: public MessageBase {
957 SurfaceFlinger& mFlinger;
958 sp<IBinder> mDisplay;
959 android_color_mode_t mMode;
961 MessageSetActiveColorMode(SurfaceFlinger& flinger, const sp<IBinder>& disp,
962 android_color_mode_t mode) :
963 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
964 virtual bool handler() {
965 Vector<android_color_mode_t> modes;
966 mFlinger.getDisplayColorModes(mDisplay, &modes);
967 bool exists = std::find(std::begin(modes), std::end(modes), mMode) != std::end(modes);
968 if (mMode < 0 || !exists) {
969 ALOGE("Attempt to set invalid active color mode %s (%d) for display %p",
970 decodeColorMode(mMode).c_str(), mMode, mDisplay.get());
973 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
975 ALOGE("Attempt to set active color mode %s (%d) for null display %p",
976 decodeColorMode(mMode).c_str(), mMode, mDisplay.get());
977 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
978 ALOGW("Attempt to set active color mode %s %d for virtual display",
979 decodeColorMode(mMode).c_str(), mMode);
981 mFlinger.setActiveColorModeInternal(hw, mMode);
986 sp<MessageBase> msg = new MessageSetActiveColorMode(*this, display, colorMode);
987 postMessageSync(msg);
991 status_t SurfaceFlinger::clearAnimationFrameStats() {
992 Mutex::Autolock _l(mStateLock);
993 mAnimFrameTracker.clearStats();
997 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
998 Mutex::Autolock _l(mStateLock);
999 mAnimFrameTracker.getStats(outStats);
1003 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& display,
1004 HdrCapabilities* outCapabilities) const {
1005 Mutex::Autolock _l(mStateLock);
1007 sp<const DisplayDevice> displayDevice(getDisplayDeviceLocked(display));
1008 if (displayDevice == nullptr) {
1009 ALOGE("getHdrCapabilities: Invalid display %p", displayDevice.get());
1013 std::unique_ptr<HdrCapabilities> capabilities =
1014 mHwc->getHdrCapabilities(displayDevice->getHwcDisplayId());
1016 std::swap(*outCapabilities, *capabilities);
1024 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
1025 if (enable == mInjectVSyncs) {
1030 mInjectVSyncs = enable;
1031 ALOGV("VSync Injections enabled");
1032 if (mVSyncInjector.get() == nullptr) {
1033 mVSyncInjector = new InjectVSyncSource();
1034 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
1036 mEventQueue.setEventThread(mInjectorEventThread);
1038 mInjectVSyncs = enable;
1039 ALOGV("VSync Injections disabled");
1040 mEventQueue.setEventThread(mSFEventThread);
1041 mVSyncInjector.clear();
1046 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
1047 if (!mInjectVSyncs) {
1048 ALOGE("VSync Injections not enabled");
1051 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
1052 ALOGV("Injecting VSync inside SurfaceFlinger");
1053 mVSyncInjector->onInjectSyncEvent(when);
1058 // ----------------------------------------------------------------------------
1060 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
1061 ISurfaceComposer::VsyncSource vsyncSource) {
1062 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
1063 return mSFEventThread->createEventConnection();
1065 return mEventThread->createEventConnection();
1069 // ----------------------------------------------------------------------------
1071 void SurfaceFlinger::waitForEvent() {
1072 mEventQueue.waitMessage();
1075 void SurfaceFlinger::signalTransaction() {
1076 mEventQueue.invalidate();
1079 void SurfaceFlinger::signalLayerUpdate() {
1080 mEventQueue.invalidate();
1083 void SurfaceFlinger::signalRefresh() {
1084 mRefreshPending = true;
1085 mEventQueue.refresh();
1088 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
1089 nsecs_t reltime, uint32_t /* flags */) {
1090 return mEventQueue.postMessage(msg, reltime);
1093 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
1094 nsecs_t reltime, uint32_t /* flags */) {
1095 status_t res = mEventQueue.postMessage(msg, reltime);
1096 if (res == NO_ERROR) {
1102 void SurfaceFlinger::run() {
1108 void SurfaceFlinger::enableHardwareVsync() {
1109 Mutex::Autolock _l(mHWVsyncLock);
1110 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
1111 mPrimaryDispSync.beginResync();
1112 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1113 mEventControlThread->setVsyncEnabled(true);
1114 mPrimaryHWVsyncEnabled = true;
1118 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
1119 Mutex::Autolock _l(mHWVsyncLock);
1121 if (makeAvailable) {
1122 mHWVsyncAvailable = true;
1123 } else if (!mHWVsyncAvailable) {
1124 // Hardware vsync is not currently available, so abort the resync
1129 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
1130 const nsecs_t period = activeConfig->getVsyncPeriod();
1132 mPrimaryDispSync.reset();
1133 mPrimaryDispSync.setPeriod(period);
1135 if (!mPrimaryHWVsyncEnabled) {
1136 mPrimaryDispSync.beginResync();
1137 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1138 mEventControlThread->setVsyncEnabled(true);
1139 mPrimaryHWVsyncEnabled = true;
1143 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1144 Mutex::Autolock _l(mHWVsyncLock);
1145 if (mPrimaryHWVsyncEnabled) {
1146 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1147 mEventControlThread->setVsyncEnabled(false);
1148 mPrimaryDispSync.endResync();
1149 mPrimaryHWVsyncEnabled = false;
1151 if (makeUnavailable) {
1152 mHWVsyncAvailable = false;
1156 void SurfaceFlinger::resyncWithRateLimit() {
1157 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1159 // No explicit locking is needed here since EventThread holds a lock while calling this method
1160 static nsecs_t sLastResyncAttempted = 0;
1161 const nsecs_t now = systemTime();
1162 if (now - sLastResyncAttempted > kIgnoreDelay) {
1163 resyncToHardwareVsync(false);
1165 sLastResyncAttempted = now;
1168 void SurfaceFlinger::onVSyncReceived(HWComposer* composer, int32_t type,
1169 nsecs_t timestamp) {
1170 Mutex::Autolock lock(mStateLock);
1171 // Ignore any vsyncs from the non-active hardware composer.
1172 if (composer != mHwc) {
1176 bool needsHwVsync = false;
1178 { // Scope for the lock
1179 Mutex::Autolock _l(mHWVsyncLock);
1180 if (type == 0 && mPrimaryHWVsyncEnabled) {
1181 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1186 enableHardwareVsync();
1188 disableHardwareVsync(false);
1192 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1193 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1194 *compositorTiming = mCompositorTiming;
1197 void SurfaceFlinger::createDefaultDisplayDevice() {
1198 const int32_t type = DisplayDevice::DISPLAY_PRIMARY;
1199 wp<IBinder> token = mBuiltinDisplays[type];
1201 // All non-virtual displays are currently considered secure.
1202 const bool isSecure = true;
1204 sp<IGraphicBufferProducer> producer;
1205 sp<IGraphicBufferConsumer> consumer;
1206 BufferQueue::createBufferQueue(&producer, &consumer);
1208 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, type, consumer);
1210 bool hasWideColorModes = false;
1211 std::vector<android_color_mode_t> modes = getHwComposer().getColorModes(type);
1212 for (android_color_mode_t colorMode : modes) {
1213 switch (colorMode) {
1214 case HAL_COLOR_MODE_DISPLAY_P3:
1215 case HAL_COLOR_MODE_ADOBE_RGB:
1216 case HAL_COLOR_MODE_DCI_P3:
1217 hasWideColorModes = true;
1223 sp<DisplayDevice> hw = new DisplayDevice(this, DisplayDevice::DISPLAY_PRIMARY, type, isSecure,
1224 token, fbs, producer, mRenderEngine->getEGLConfig(),
1225 hasWideColorModes && hasWideColorDisplay);
1226 mDisplays.add(token, hw);
1227 setActiveColorModeInternal(hw, HAL_COLOR_MODE_NATIVE);
1228 hw->setCompositionDataSpace(HAL_DATASPACE_UNKNOWN);
1231 void SurfaceFlinger::onHotplugReceived(HWComposer* composer, int32_t disp, bool connected) {
1232 ALOGV("onHotplugReceived(%d, %s)", disp, connected ? "true" : "false");
1234 if (composer->isUsingVrComposer()) {
1235 // We handle initializing the primary display device for the VR
1236 // window manager hwc explicitly at the time of transition.
1237 if (disp != DisplayDevice::DISPLAY_PRIMARY) {
1238 ALOGE("External displays are not supported by the vr hardware composer.");
1243 if (disp == DisplayDevice::DISPLAY_PRIMARY) {
1244 Mutex::Autolock lock(mStateLock);
1245 createBuiltinDisplayLocked(DisplayDevice::DISPLAY_PRIMARY);
1246 createDefaultDisplayDevice();
1248 auto type = DisplayDevice::DISPLAY_EXTERNAL;
1249 Mutex::Autolock _l(mStateLock);
1251 createBuiltinDisplayLocked(type);
1253 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1254 mBuiltinDisplays[type].clear();
1256 setTransactionFlags(eDisplayTransactionNeeded);
1258 // Defer EventThread notification until SF has updated mDisplays.
1262 void SurfaceFlinger::onInvalidateReceived(HWComposer* composer) {
1263 Mutex::Autolock lock(mStateLock);
1264 if (composer == mHwc) {
1265 repaintEverything();
1267 // This isn't from our current hardware composer. If it's a callback
1268 // from the real composer, forward the refresh request to vr
1269 // flinger. Otherwise ignore it.
1270 if (!composer->isUsingVrComposer()) {
1271 mVrFlinger->OnHardwareComposerRefresh();
1276 void SurfaceFlinger::setVsyncEnabled(int disp, int enabled) {
1278 getHwComposer().setVsyncEnabled(disp,
1279 enabled ? HWC2::Vsync::Enable : HWC2::Vsync::Disable);
1282 // Note: it is assumed the caller holds |mStateLock| when this is called
1283 void SurfaceFlinger::resetHwcLocked() {
1284 disableHardwareVsync(true);
1285 clearHwcLayers(mDrawingState.layersSortedByZ);
1286 clearHwcLayers(mCurrentState.layersSortedByZ);
1287 for (size_t disp = 0; disp < mDisplays.size(); ++disp) {
1288 clearHwcLayers(mDisplays[disp]->getVisibleLayersSortedByZ());
1290 // Clear the drawing state so that the logic inside of
1291 // handleTransactionLocked will fire. It will determine the delta between
1292 // mCurrentState and mDrawingState and re-apply all changes when we make the
1294 mDrawingState.displays.clear();
1295 // Release virtual display hwcId during vr mode transition.
1296 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1297 const sp<DisplayDevice>& displayDevice = mDisplays[displayId];
1298 if (displayDevice->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL) {
1299 displayDevice->disconnect(getHwComposer());
1305 void SurfaceFlinger::updateVrFlinger() {
1308 bool vrFlingerRequestsDisplay = mVrFlingerRequestsDisplay;
1309 if (vrFlingerRequestsDisplay == mHwc->isUsingVrComposer()) {
1313 if (vrFlingerRequestsDisplay && !mVrHwc) {
1314 // Construct new HWComposer without holding any locks.
1315 mVrHwc = new HWComposer(true);
1317 // Set up the event handlers. This step is neccessary to initialize the internal state of
1318 // the hardware composer object properly. Our callbacks are designed such that if they are
1319 // triggered between now and the point where the display is properly re-initialized, they
1320 // will not have any effect, so this is safe to do here, before the lock is aquired.
1321 mVrHwc->setEventHandler(static_cast<HWComposer::EventHandler*>(this));
1322 ALOGV("Vr HWC created");
1325 Mutex::Autolock _l(mStateLock);
1327 if (vrFlingerRequestsDisplay) {
1331 mVrFlinger->GrantDisplayOwnership();
1334 mVrFlinger->SeizeDisplayOwnership();
1339 enableHardwareVsync();
1342 mVisibleRegionsDirty = true;
1343 invalidateHwcGeometry();
1345 // Explicitly re-initialize the primary display. This is because some other
1346 // parts of this class rely on the primary display always being available.
1347 createDefaultDisplayDevice();
1349 // Re-enable default display.
1350 sp<LambdaMessage> requestMessage = new LambdaMessage([&]() {
1351 sp<DisplayDevice> hw(getDisplayDevice(mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY]));
1352 setPowerModeInternal(hw, HWC_POWER_MODE_NORMAL);
1354 // Reset the timing values to account for the period of the swapped in HWC
1355 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
1356 const nsecs_t period = activeConfig->getVsyncPeriod();
1357 mAnimFrameTracker.setDisplayRefreshPeriod(period);
1359 // Use phase of 0 since phase is not known.
1360 // Use latency of 0, which will snap to the ideal latency.
1361 setCompositorTimingSnapped(0, period, 0);
1363 postMessageAsync(requestMessage);
1365 android_atomic_or(1, &mRepaintEverything);
1366 setTransactionFlags(eDisplayTransactionNeeded);
1369 void SurfaceFlinger::onMessageReceived(int32_t what) {
1372 case MessageQueue::INVALIDATE: {
1373 bool frameMissed = !mHadClientComposition &&
1374 mPreviousPresentFence != Fence::NO_FENCE &&
1375 (mPreviousPresentFence->getSignalTime() ==
1376 Fence::SIGNAL_TIME_PENDING);
1377 ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));
1378 if (mPropagateBackpressure && frameMissed) {
1379 ALOGD("Backpressure trigger, skipping transaction & refresh!");
1380 signalLayerUpdate();
1384 // Now that we're going to make it to the handleMessageTransaction()
1385 // call below it's safe to call updateVrFlinger(), which will
1386 // potentially trigger a display handoff.
1389 bool refreshNeeded = handleMessageTransaction();
1390 refreshNeeded |= handleMessageInvalidate();
1391 refreshNeeded |= mRepaintEverything;
1392 if (refreshNeeded) {
1393 // Signal a refresh if a transaction modified the window state,
1394 // a new buffer was latched, or if HWC has requested a full
1400 case MessageQueue::REFRESH: {
1401 handleMessageRefresh();
1407 bool SurfaceFlinger::handleMessageTransaction() {
1408 uint32_t transactionFlags = peekTransactionFlags();
1409 if (transactionFlags) {
1410 handleTransaction(transactionFlags);
1416 bool SurfaceFlinger::handleMessageInvalidate() {
1418 return handlePageFlip();
1421 void SurfaceFlinger::handleMessageRefresh() {
1424 mRefreshPending = false;
1426 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1428 preComposition(refreshStartTime);
1429 rebuildLayerStacks();
1431 doDebugFlashRegions();
1433 postComposition(refreshStartTime);
1435 mPreviousPresentFence = mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1437 mHadClientComposition = false;
1438 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1439 const sp<DisplayDevice>& displayDevice = mDisplays[displayId];
1440 mHadClientComposition = mHadClientComposition ||
1441 mHwc->hasClientComposition(displayDevice->getHwcDisplayId());
1444 mLayersWithQueuedFrames.clear();
1447 void SurfaceFlinger::doDebugFlashRegions()
1449 // is debugging enabled
1450 if (CC_LIKELY(!mDebugRegion))
1453 const bool repaintEverything = mRepaintEverything;
1454 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1455 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1456 if (hw->isDisplayOn()) {
1457 // transform the dirty region into this screen's coordinate space
1458 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1459 if (!dirtyRegion.isEmpty()) {
1460 // redraw the whole screen
1461 doComposeSurfaces(hw, Region(hw->bounds()));
1463 // and draw the dirty region
1464 const int32_t height = hw->getHeight();
1465 RenderEngine& engine(getRenderEngine());
1466 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1468 hw->swapBuffers(getHwComposer());
1475 if (mDebugRegion > 1) {
1476 usleep(mDebugRegion * 1000);
1479 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1480 auto& displayDevice = mDisplays[displayId];
1481 if (!displayDevice->isDisplayOn()) {
1485 status_t result = displayDevice->prepareFrame(*mHwc);
1486 ALOGE_IF(result != NO_ERROR, "prepareFrame for display %zd failed:"
1487 " %d (%s)", displayId, result, strerror(-result));
1491 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
1494 ALOGV("preComposition");
1496 bool needExtraInvalidate = false;
1497 mDrawingState.traverseInZOrder([&](Layer* layer) {
1498 if (layer->onPreComposition(refreshStartTime)) {
1499 needExtraInvalidate = true;
1503 if (needExtraInvalidate) {
1504 signalLayerUpdate();
1508 void SurfaceFlinger::updateCompositorTiming(
1509 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1510 std::shared_ptr<FenceTime>& presentFenceTime) {
1511 // Update queue of past composite+present times and determine the
1512 // most recently known composite to present latency.
1513 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1514 nsecs_t compositeToPresentLatency = -1;
1515 while (!mCompositePresentTimes.empty()) {
1516 CompositePresentTime& cpt = mCompositePresentTimes.front();
1517 // Cached values should have been updated before calling this method,
1518 // which helps avoid duplicate syscalls.
1519 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1520 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1523 compositeToPresentLatency = displayTime - cpt.composite;
1524 mCompositePresentTimes.pop();
1527 // Don't let mCompositePresentTimes grow unbounded, just in case.
1528 while (mCompositePresentTimes.size() > 16) {
1529 mCompositePresentTimes.pop();
1532 setCompositorTimingSnapped(
1533 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1536 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1537 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
1538 // Integer division and modulo round toward 0 not -inf, so we need to
1539 // treat negative and positive offsets differently.
1540 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
1541 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1542 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1544 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1545 if (idealLatency <= 0) {
1546 idealLatency = vsyncInterval;
1549 // Snap the latency to a value that removes scheduling jitter from the
1550 // composition and present times, which often have >1ms of jitter.
1551 // Reducing jitter is important if an app attempts to extrapolate
1552 // something (such as user input) to an accurate diasplay time.
1553 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1554 // with (presentLatency % interval).
1555 nsecs_t bias = vsyncInterval / 2;
1556 int64_t extraVsyncs =
1557 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1558 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1559 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
1561 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1562 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1563 mCompositorTiming.interval = vsyncInterval;
1564 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1567 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1570 ALOGV("postComposition");
1572 // Release any buffers which were replaced this frame
1573 nsecs_t dequeueReadyTime = systemTime();
1574 for (auto& layer : mLayersWithQueuedFrames) {
1575 layer->releasePendingBuffer(dequeueReadyTime);
1578 // |mStateLock| not needed as we are on the main thread
1579 const sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
1581 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1582 if (mHwc->hasClientComposition(HWC_DISPLAY_PRIMARY)) {
1583 glCompositionDoneFenceTime =
1584 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1585 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1587 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1589 mGlCompositionDoneTimeline.updateSignalTimes();
1591 sp<Fence> presentFence = mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1592 auto presentFenceTime = std::make_shared<FenceTime>(presentFence);
1593 mDisplayTimeline.push(presentFenceTime);
1594 mDisplayTimeline.updateSignalTimes();
1596 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1597 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1599 // We use the refreshStartTime which might be sampled a little later than
1600 // when we started doing work for this frame, but that should be okay
1601 // since updateCompositorTiming has snapping logic.
1602 updateCompositorTiming(
1603 vsyncPhase, vsyncInterval, refreshStartTime, presentFenceTime);
1604 CompositorTiming compositorTiming;
1606 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1607 compositorTiming = mCompositorTiming;
1610 mDrawingState.traverseInZOrder([&](Layer* layer) {
1611 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
1612 presentFenceTime, compositorTiming);
1614 recordBufferingStats(layer->getName().string(),
1615 layer->getOccupancyHistory(false));
1619 if (presentFence->isValid()) {
1620 if (mPrimaryDispSync.addPresentFence(presentFence)) {
1621 enableHardwareVsync();
1623 disableHardwareVsync(false);
1627 if (!hasSyncFramework) {
1628 if (hw->isDisplayOn()) {
1629 enableHardwareVsync();
1633 if (mAnimCompositionPending) {
1634 mAnimCompositionPending = false;
1636 if (presentFenceTime->isValid()) {
1637 mAnimFrameTracker.setActualPresentFence(
1638 std::move(presentFenceTime));
1640 // The HWC doesn't support present fences, so use the refresh
1641 // timestamp instead.
1642 nsecs_t presentTime =
1643 mHwc->getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1644 mAnimFrameTracker.setActualPresentTime(presentTime);
1646 mAnimFrameTracker.advanceFrame();
1649 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1653 nsecs_t currentTime = systemTime();
1654 if (mHasPoweredOff) {
1655 mHasPoweredOff = false;
1657 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1658 size_t numPeriods = static_cast<size_t>(elapsedTime / vsyncInterval);
1659 if (numPeriods < NUM_BUCKETS - 1) {
1660 mFrameBuckets[numPeriods] += elapsedTime;
1662 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1664 mTotalTime += elapsedTime;
1666 mLastSwapTime = currentTime;
1669 void SurfaceFlinger::rebuildLayerStacks() {
1671 ALOGV("rebuildLayerStacks");
1673 // rebuild the visible layer list per screen
1674 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1676 mVisibleRegionsDirty = false;
1677 invalidateHwcGeometry();
1679 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1680 Region opaqueRegion;
1682 Vector<sp<Layer>> layersSortedByZ;
1683 const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);
1684 const Transform& tr(displayDevice->getTransform());
1685 const Rect bounds(displayDevice->getBounds());
1686 if (displayDevice->isDisplayOn()) {
1687 computeVisibleRegions(
1688 displayDevice->getLayerStack(), dirtyRegion,
1691 mDrawingState.traverseInZOrder([&](Layer* layer) {
1692 if (layer->getLayerStack() == displayDevice->getLayerStack()) {
1693 Region drawRegion(tr.transform(
1694 layer->visibleNonTransparentRegion));
1695 drawRegion.andSelf(bounds);
1696 if (!drawRegion.isEmpty()) {
1697 layersSortedByZ.add(layer);
1699 // Clear out the HWC layer if this layer was
1700 // previously visible, but no longer is
1701 layer->setHwcLayer(displayDevice->getHwcDisplayId(),
1705 // WM changes displayDevice->layerStack upon sleep/awake.
1706 // Here we make sure we delete the HWC layers even if
1707 // WM changed their layer stack.
1708 layer->setHwcLayer(displayDevice->getHwcDisplayId(),
1713 displayDevice->setVisibleLayersSortedByZ(layersSortedByZ);
1714 displayDevice->undefinedRegion.set(bounds);
1715 displayDevice->undefinedRegion.subtractSelf(
1716 tr.transform(opaqueRegion));
1717 displayDevice->dirtyRegion.orSelf(dirtyRegion);
1722 mat4 SurfaceFlinger::computeSaturationMatrix() const {
1723 if (mSaturation == 1.0f) {
1727 // Rec.709 luma coefficients
1728 float3 luminance{0.213f, 0.715f, 0.072f};
1729 luminance *= 1.0f - mSaturation;
1731 vec4{luminance.r + mSaturation, luminance.r, luminance.r, 0.0f},
1732 vec4{luminance.g, luminance.g + mSaturation, luminance.g, 0.0f},
1733 vec4{luminance.b, luminance.b, luminance.b + mSaturation, 0.0f},
1734 vec4{0.0f, 0.0f, 0.0f, 1.0f}
1738 // pickColorMode translates a given dataspace into the best available color mode.
1739 // Currently only support sRGB and Display-P3.
1740 android_color_mode SurfaceFlinger::pickColorMode(android_dataspace dataSpace) const {
1741 switch (dataSpace) {
1742 // treat Unknown as regular SRGB buffer, since that's what the rest of the
1744 case HAL_DATASPACE_UNKNOWN:
1745 case HAL_DATASPACE_SRGB:
1746 case HAL_DATASPACE_V0_SRGB:
1747 return HAL_COLOR_MODE_SRGB;
1750 case HAL_DATASPACE_DISPLAY_P3:
1751 return HAL_COLOR_MODE_DISPLAY_P3;
1755 // TODO (courtneygo): Do we want to assert an error here?
1756 ALOGE("No color mode mapping for %s (%#x)", dataspaceDetails(dataSpace).c_str(),
1758 return HAL_COLOR_MODE_SRGB;
1763 android_dataspace SurfaceFlinger::bestTargetDataSpace(
1764 android_dataspace a, android_dataspace b) const {
1765 // Only support sRGB and Display-P3 right now.
1766 if (a == HAL_DATASPACE_DISPLAY_P3 || b == HAL_DATASPACE_DISPLAY_P3) {
1767 return HAL_DATASPACE_DISPLAY_P3;
1769 if (a == HAL_DATASPACE_V0_SCRGB_LINEAR || b == HAL_DATASPACE_V0_SCRGB_LINEAR) {
1770 return HAL_DATASPACE_DISPLAY_P3;
1772 if (a == HAL_DATASPACE_V0_SCRGB || b == HAL_DATASPACE_V0_SCRGB) {
1773 return HAL_DATASPACE_DISPLAY_P3;
1776 return HAL_DATASPACE_V0_SRGB;
1779 void SurfaceFlinger::setUpHWComposer() {
1781 ALOGV("setUpHWComposer");
1783 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1784 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1785 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1786 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1788 // If nothing has changed (!dirty), don't recompose.
1789 // If something changed, but we don't currently have any visible layers,
1790 // and didn't when we last did a composition, then skip it this time.
1791 // The second rule does two things:
1792 // - When all layers are removed from a display, we'll emit one black
1793 // frame, then nothing more until we get new layers.
1794 // - When a display is created with a private layer stack, we won't
1795 // emit any black frames until a layer is added to the layer stack.
1796 bool mustRecompose = dirty && !(empty && wasEmpty);
1798 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1799 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1800 mustRecompose ? "doing" : "skipping",
1803 wasEmpty ? "+" : "-");
1805 mDisplays[dpy]->beginFrame(mustRecompose);
1807 if (mustRecompose) {
1808 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1812 // build the h/w work list
1813 if (CC_UNLIKELY(mGeometryInvalid)) {
1814 mGeometryInvalid = false;
1815 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1816 sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
1817 const auto hwcId = displayDevice->getHwcDisplayId();
1819 const Vector<sp<Layer>>& currentLayers(
1820 displayDevice->getVisibleLayersSortedByZ());
1821 for (size_t i = 0; i < currentLayers.size(); i++) {
1822 const auto& layer = currentLayers[i];
1823 if (!layer->hasHwcLayer(hwcId)) {
1824 auto hwcLayer = mHwc->createLayer(hwcId);
1826 layer->setHwcLayer(hwcId, std::move(hwcLayer));
1828 layer->forceClientComposition(hwcId);
1833 layer->setGeometry(displayDevice, i);
1834 if (mDebugDisableHWC || mDebugRegion) {
1835 layer->forceClientComposition(hwcId);
1843 mat4 colorMatrix = mColorMatrix * computeSaturationMatrix() * mDaltonizer();
1845 // Set the per-frame data
1846 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1847 auto& displayDevice = mDisplays[displayId];
1848 const auto hwcId = displayDevice->getHwcDisplayId();
1853 if (colorMatrix != mPreviousColorMatrix) {
1854 status_t result = mHwc->setColorTransform(hwcId, colorMatrix);
1855 ALOGE_IF(result != NO_ERROR, "Failed to set color transform on "
1856 "display %zd: %d", displayId, result);
1858 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1859 layer->setPerFrameData(displayDevice);
1862 if (hasWideColorDisplay) {
1863 android_color_mode newColorMode;
1864 android_dataspace newDataSpace = HAL_DATASPACE_V0_SRGB;
1866 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1867 newDataSpace = bestTargetDataSpace(layer->getDataSpace(), newDataSpace);
1868 ALOGV("layer: %s, dataspace: %s (%#x), newDataSpace: %s (%#x)",
1869 layer->getName().string(), dataspaceDetails(layer->getDataSpace()).c_str(),
1870 layer->getDataSpace(), dataspaceDetails(newDataSpace).c_str(), newDataSpace);
1872 newColorMode = pickColorMode(newDataSpace);
1874 // We want the color mode of the boot animation to match that of the bootloader
1875 // To achieve this we suppress color mode changes until after the boot animation
1876 if (mBootFinished) {
1877 setActiveColorModeInternal(displayDevice, newColorMode);
1878 displayDevice->setCompositionDataSpace(newDataSpace);
1883 mPreviousColorMatrix = colorMatrix;
1885 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1886 auto& displayDevice = mDisplays[displayId];
1887 if (!displayDevice->isDisplayOn()) {
1891 status_t result = displayDevice->prepareFrame(*mHwc);
1892 ALOGE_IF(result != NO_ERROR, "prepareFrame for display %zd failed:"
1893 " %d (%s)", displayId, result, strerror(-result));
1897 void SurfaceFlinger::doComposition() {
1899 ALOGV("doComposition");
1901 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1902 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1903 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1904 if (hw->isDisplayOn()) {
1905 // transform the dirty region into this screen's coordinate space
1906 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1908 // repaint the framebuffer (if needed)
1909 doDisplayComposition(hw, dirtyRegion);
1911 hw->dirtyRegion.clear();
1912 hw->flip(hw->swapRegion);
1913 hw->swapRegion.clear();
1919 void SurfaceFlinger::postFramebuffer()
1922 ALOGV("postFramebuffer");
1924 const nsecs_t now = systemTime();
1925 mDebugInSwapBuffers = now;
1927 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1928 auto& displayDevice = mDisplays[displayId];
1929 if (!displayDevice->isDisplayOn()) {
1932 const auto hwcId = displayDevice->getHwcDisplayId();
1934 mHwc->presentAndGetReleaseFences(hwcId);
1936 displayDevice->onSwapBuffersCompleted();
1937 displayDevice->makeCurrent(mEGLDisplay, mEGLContext);
1938 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1939 sp<Fence> releaseFence = Fence::NO_FENCE;
1940 if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) {
1941 releaseFence = displayDevice->getClientTargetAcquireFence();
1943 auto hwcLayer = layer->getHwcLayer(hwcId);
1944 releaseFence = mHwc->getLayerReleaseFence(hwcId, hwcLayer);
1946 layer->onLayerDisplayed(releaseFence);
1949 mHwc->clearReleaseFences(hwcId);
1953 mLastSwapBufferTime = systemTime() - now;
1954 mDebugInSwapBuffers = 0;
1956 // |mStateLock| not needed as we are on the main thread
1957 uint32_t flipCount = getDefaultDisplayDeviceLocked()->getPageFlipCount();
1958 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1963 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1967 // here we keep a copy of the drawing state (that is the state that's
1968 // going to be overwritten by handleTransactionLocked()) outside of
1969 // mStateLock so that the side-effects of the State assignment
1970 // don't happen with mStateLock held (which can cause deadlocks).
1971 State drawingState(mDrawingState);
1973 Mutex::Autolock _l(mStateLock);
1974 const nsecs_t now = systemTime();
1975 mDebugInTransaction = now;
1977 // Here we're guaranteed that some transaction flags are set
1978 // so we can call handleTransactionLocked() unconditionally.
1979 // We call getTransactionFlags(), which will also clear the flags,
1980 // with mStateLock held to guarantee that mCurrentState won't change
1981 // until the transaction is committed.
1983 transactionFlags = getTransactionFlags(eTransactionMask);
1984 handleTransactionLocked(transactionFlags);
1986 mLastTransactionTime = systemTime() - now;
1987 mDebugInTransaction = 0;
1988 invalidateHwcGeometry();
1989 // here the transaction has been committed
1992 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1994 // Notify all layers of available frames
1995 mCurrentState.traverseInZOrder([](Layer* layer) {
1996 layer->notifyAvailableFrames();
2000 * Traversal of the children
2001 * (perform the transaction for each of them if needed)
2004 if (transactionFlags & eTraversalNeeded) {
2005 mCurrentState.traverseInZOrder([&](Layer* layer) {
2006 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
2007 if (!trFlags) return;
2009 const uint32_t flags = layer->doTransaction(0);
2010 if (flags & Layer::eVisibleRegion)
2011 mVisibleRegionsDirty = true;
2016 * Perform display own transactions if needed
2019 if (transactionFlags & eDisplayTransactionNeeded) {
2020 // here we take advantage of Vector's copy-on-write semantics to
2021 // improve performance by skipping the transaction entirely when
2022 // know that the lists are identical
2023 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
2024 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
2025 if (!curr.isIdenticalTo(draw)) {
2026 mVisibleRegionsDirty = true;
2027 const size_t cc = curr.size();
2028 size_t dc = draw.size();
2030 // find the displays that were removed
2031 // (ie: in drawing state but not in current state)
2032 // also handle displays that changed
2033 // (ie: displays that are in both lists)
2034 for (size_t i=0 ; i<dc ; i++) {
2035 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
2037 // in drawing state but not in current state
2038 if (!draw[i].isMainDisplay()) {
2039 // Call makeCurrent() on the primary display so we can
2040 // be sure that nothing associated with this display
2042 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
2043 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
2044 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
2046 hw->disconnect(getHwComposer());
2047 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
2048 mEventThread->onHotplugReceived(draw[i].type, false);
2049 mDisplays.removeItem(draw.keyAt(i));
2051 ALOGW("trying to remove the main display");
2054 // this display is in both lists. see if something changed.
2055 const DisplayDeviceState& state(curr[j]);
2056 const wp<IBinder>& display(curr.keyAt(j));
2057 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
2058 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
2059 if (state_binder != draw_binder) {
2060 // changing the surface is like destroying and
2061 // recreating the DisplayDevice, so we just remove it
2062 // from the drawing state, so that it get re-added
2064 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
2066 hw->disconnect(getHwComposer());
2067 mDisplays.removeItem(display);
2068 mDrawingState.displays.removeItemsAt(i);
2070 // at this point we must loop to the next item
2074 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
2076 if (state.layerStack != draw[i].layerStack) {
2077 disp->setLayerStack(state.layerStack);
2079 if ((state.orientation != draw[i].orientation)
2080 || (state.viewport != draw[i].viewport)
2081 || (state.frame != draw[i].frame))
2083 disp->setProjection(state.orientation,
2084 state.viewport, state.frame);
2086 if (state.width != draw[i].width || state.height != draw[i].height) {
2087 disp->setDisplaySize(state.width, state.height);
2093 // find displays that were added
2094 // (ie: in current state but not in drawing state)
2095 for (size_t i=0 ; i<cc ; i++) {
2096 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
2097 const DisplayDeviceState& state(curr[i]);
2099 sp<DisplaySurface> dispSurface;
2100 sp<IGraphicBufferProducer> producer;
2101 sp<IGraphicBufferProducer> bqProducer;
2102 sp<IGraphicBufferConsumer> bqConsumer;
2103 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
2106 if (state.isVirtualDisplay()) {
2107 // Virtual displays without a surface are dormant:
2108 // they have external state (layer stack, projection,
2109 // etc.) but no internal state (i.e. a DisplayDevice).
2110 if (state.surface != NULL) {
2112 // Allow VR composer to use virtual displays.
2113 if (mUseHwcVirtualDisplays || mHwc == mVrHwc) {
2115 int status = state.surface->query(
2116 NATIVE_WINDOW_WIDTH, &width);
2117 ALOGE_IF(status != NO_ERROR,
2118 "Unable to query width (%d)", status);
2120 status = state.surface->query(
2121 NATIVE_WINDOW_HEIGHT, &height);
2122 ALOGE_IF(status != NO_ERROR,
2123 "Unable to query height (%d)", status);
2125 status = state.surface->query(
2126 NATIVE_WINDOW_FORMAT, &intFormat);
2127 ALOGE_IF(status != NO_ERROR,
2128 "Unable to query format (%d)", status);
2129 auto format = static_cast<android_pixel_format_t>(
2132 mHwc->allocateVirtualDisplay(width, height, &format,
2136 // TODO: Plumb requested format back up to consumer
2138 sp<VirtualDisplaySurface> vds =
2139 new VirtualDisplaySurface(*mHwc,
2140 hwcId, state.surface, bqProducer,
2141 bqConsumer, state.displayName);
2147 ALOGE_IF(state.surface!=NULL,
2148 "adding a supported display, but rendering "
2149 "surface is provided (%p), ignoring it",
2150 state.surface.get());
2153 dispSurface = new FramebufferSurface(*mHwc, hwcId, bqConsumer);
2154 producer = bqProducer;
2157 const wp<IBinder>& display(curr.keyAt(i));
2158 if (dispSurface != NULL) {
2159 sp<DisplayDevice> hw =
2160 new DisplayDevice(this, state.type, hwcId, state.isSecure, display,
2161 dispSurface, producer,
2162 mRenderEngine->getEGLConfig(),
2163 hasWideColorDisplay);
2164 hw->setLayerStack(state.layerStack);
2165 hw->setProjection(state.orientation,
2166 state.viewport, state.frame);
2167 hw->setDisplayName(state.displayName);
2168 mDisplays.add(display, hw);
2169 if (!state.isVirtualDisplay()) {
2170 mEventThread->onHotplugReceived(state.type, true);
2178 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
2179 // The transform hint might have changed for some layers
2180 // (either because a display has changed, or because a layer
2183 // Walk through all the layers in currentLayers,
2184 // and update their transform hint.
2186 // If a layer is visible only on a single display, then that
2187 // display is used to calculate the hint, otherwise we use the
2190 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
2191 // the hint is set before we acquire a buffer from the surface texture.
2193 // NOTE: layer transactions have taken place already, so we use their
2194 // drawing state. However, SurfaceFlinger's own transaction has not
2195 // happened yet, so we must use the current state layer list
2196 // (soon to become the drawing state list).
2198 sp<const DisplayDevice> disp;
2199 uint32_t currentlayerStack = 0;
2201 mCurrentState.traverseInZOrder([&](Layer* layer) {
2202 // NOTE: we rely on the fact that layers are sorted by
2203 // layerStack first (so we don't have to traverse the list
2204 // of displays for every layer).
2205 uint32_t layerStack = layer->getLayerStack();
2206 if (first || currentlayerStack != layerStack) {
2207 currentlayerStack = layerStack;
2208 // figure out if this layerstack is mirrored
2209 // (more than one display) if so, pick the default display,
2210 // if not, pick the only display it's on.
2212 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2213 sp<const DisplayDevice> hw(mDisplays[dpy]);
2214 if (hw->getLayerStack() == currentlayerStack) {
2225 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
2226 // redraw after transform hint changes. See bug 8508397.
2228 // could be null when this layer is using a layerStack
2229 // that is not visible on any display. Also can occur at
2230 // screen off/on times.
2231 disp = getDefaultDisplayDeviceLocked();
2233 layer->updateTransformHint(disp);
2241 * Perform our own transaction if needed
2245 mLayersAdded = false;
2246 // Layers have been added.
2247 mVisibleRegionsDirty = true;
2250 // some layers might have been removed, so
2251 // we need to update the regions they're exposing.
2252 if (mLayersRemoved) {
2253 mLayersRemoved = false;
2254 mVisibleRegionsDirty = true;
2255 mDrawingState.traverseInZOrder([&](Layer* layer) {
2256 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
2257 // this layer is not visible anymore
2258 // TODO: we could traverse the tree from front to back and
2259 // compute the actual visible region
2260 // TODO: we could cache the transformed region
2262 visibleReg.set(layer->computeScreenBounds());
2263 invalidateLayerStack(layer->getLayerStack(), visibleReg);
2268 commitTransaction();
2270 updateCursorAsync();
2273 void SurfaceFlinger::updateCursorAsync()
2275 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2276 auto& displayDevice = mDisplays[displayId];
2277 if (displayDevice->getHwcDisplayId() < 0) {
2281 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2282 layer->updateCursorPosition(displayDevice);
2287 void SurfaceFlinger::commitTransaction()
2289 if (!mLayersPendingRemoval.isEmpty()) {
2290 // Notify removed layers now that they can't be drawn from
2291 for (const auto& l : mLayersPendingRemoval) {
2292 recordBufferingStats(l->getName().string(),
2293 l->getOccupancyHistory(true));
2296 mLayersPendingRemoval.clear();
2299 // If this transaction is part of a window animation then the next frame
2300 // we composite should be considered an animation as well.
2301 mAnimCompositionPending = mAnimTransactionPending;
2303 mDrawingState = mCurrentState;
2304 mDrawingState.traverseInZOrder([](Layer* layer) {
2305 layer->commitChildList();
2307 mTransactionPending = false;
2308 mAnimTransactionPending = false;
2309 mTransactionCV.broadcast();
2312 void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
2313 Region& outDirtyRegion, Region& outOpaqueRegion)
2316 ALOGV("computeVisibleRegions");
2318 Region aboveOpaqueLayers;
2319 Region aboveCoveredLayers;
2322 outDirtyRegion.clear();
2324 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
2325 // start with the whole surface at its current location
2326 const Layer::State& s(layer->getDrawingState());
2328 // only consider the layers on the given layer stack
2329 if (layer->getLayerStack() != layerStack)
2333 * opaqueRegion: area of a surface that is fully opaque.
2335 Region opaqueRegion;
2338 * visibleRegion: area of a surface that is visible on screen
2339 * and not fully transparent. This is essentially the layer's
2340 * footprint minus the opaque regions above it.
2341 * Areas covered by a translucent surface are considered visible.
2343 Region visibleRegion;
2346 * coveredRegion: area of a surface that is covered by all
2347 * visible regions above it (which includes the translucent areas).
2349 Region coveredRegion;
2352 * transparentRegion: area of a surface that is hinted to be completely
2353 * transparent. This is only used to tell when the layer has no visible
2354 * non-transparent regions and can be removed from the layer list. It
2355 * does not affect the visibleRegion of this layer or any layers
2356 * beneath it. The hint may not be correct if apps don't respect the
2357 * SurfaceView restrictions (which, sadly, some don't).
2359 Region transparentRegion;
2362 // handle hidden surfaces by setting the visible region to empty
2363 if (CC_LIKELY(layer->isVisible())) {
2364 const bool translucent = !layer->isOpaque(s);
2365 Rect bounds(layer->computeScreenBounds());
2366 visibleRegion.set(bounds);
2367 Transform tr = layer->getTransform();
2368 if (!visibleRegion.isEmpty()) {
2369 // Remove the transparent area from the visible region
2371 if (tr.preserveRects()) {
2372 // transform the transparent region
2373 transparentRegion = tr.transform(s.activeTransparentRegion);
2375 // transformation too complex, can't do the
2376 // transparent region optimization.
2377 transparentRegion.clear();
2381 // compute the opaque region
2382 const int32_t layerOrientation = tr.getOrientation();
2383 if (s.alpha == 1.0f && !translucent &&
2384 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2385 // the opaque region is the layer's footprint
2386 opaqueRegion = visibleRegion;
2391 // Clip the covered region to the visible region
2392 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2394 // Update aboveCoveredLayers for next (lower) layer
2395 aboveCoveredLayers.orSelf(visibleRegion);
2397 // subtract the opaque region covered by the layers above us
2398 visibleRegion.subtractSelf(aboveOpaqueLayers);
2400 // compute this layer's dirty region
2401 if (layer->contentDirty) {
2402 // we need to invalidate the whole region
2403 dirty = visibleRegion;
2404 // as well, as the old visible region
2405 dirty.orSelf(layer->visibleRegion);
2406 layer->contentDirty = false;
2408 /* compute the exposed region:
2409 * the exposed region consists of two components:
2410 * 1) what's VISIBLE now and was COVERED before
2411 * 2) what's EXPOSED now less what was EXPOSED before
2413 * note that (1) is conservative, we start with the whole
2414 * visible region but only keep what used to be covered by
2415 * something -- which mean it may have been exposed.
2417 * (2) handles areas that were not covered by anything but got
2418 * exposed because of a resize.
2420 const Region newExposed = visibleRegion - coveredRegion;
2421 const Region oldVisibleRegion = layer->visibleRegion;
2422 const Region oldCoveredRegion = layer->coveredRegion;
2423 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2424 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2426 dirty.subtractSelf(aboveOpaqueLayers);
2428 // accumulate to the screen dirty region
2429 outDirtyRegion.orSelf(dirty);
2431 // Update aboveOpaqueLayers for next (lower) layer
2432 aboveOpaqueLayers.orSelf(opaqueRegion);
2434 // Store the visible region in screen space
2435 layer->setVisibleRegion(visibleRegion);
2436 layer->setCoveredRegion(coveredRegion);
2437 layer->setVisibleNonTransparentRegion(
2438 visibleRegion.subtract(transparentRegion));
2441 outOpaqueRegion = aboveOpaqueLayers;
2444 void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2445 const Region& dirty) {
2446 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2447 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2448 if (hw->getLayerStack() == layerStack) {
2449 hw->dirtyRegion.orSelf(dirty);
2454 bool SurfaceFlinger::handlePageFlip()
2456 ALOGV("handlePageFlip");
2458 nsecs_t latchTime = systemTime();
2460 bool visibleRegions = false;
2461 bool frameQueued = false;
2462 bool newDataLatched = false;
2464 // Store the set of layers that need updates. This set must not change as
2465 // buffers are being latched, as this could result in a deadlock.
2466 // Example: Two producers share the same command stream and:
2467 // 1.) Layer 0 is latched
2468 // 2.) Layer 0 gets a new frame
2469 // 2.) Layer 1 gets a new frame
2470 // 3.) Layer 1 is latched.
2471 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2472 // second frame. But layer 0's second frame could be waiting on display.
2473 mDrawingState.traverseInZOrder([&](Layer* layer) {
2474 if (layer->hasQueuedFrame()) {
2476 if (layer->shouldPresentNow(mPrimaryDispSync)) {
2477 mLayersWithQueuedFrames.push_back(layer);
2479 layer->useEmptyDamage();
2482 layer->useEmptyDamage();
2486 for (auto& layer : mLayersWithQueuedFrames) {
2487 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
2488 layer->useSurfaceDamage();
2489 invalidateLayerStack(layer->getLayerStack(), dirty);
2490 if (layer->isBufferLatched()) {
2491 newDataLatched = true;
2495 mVisibleRegionsDirty |= visibleRegions;
2497 // If we will need to wake up at some time in the future to deal with a
2498 // queued frame that shouldn't be displayed during this vsync period, wake
2499 // up during the next vsync period to check again.
2500 if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {
2501 signalLayerUpdate();
2504 // Only continue with the refresh if there is actually new work to do
2505 return !mLayersWithQueuedFrames.empty() && newDataLatched;
2508 void SurfaceFlinger::invalidateHwcGeometry()
2510 mGeometryInvalid = true;
2514 void SurfaceFlinger::doDisplayComposition(
2515 const sp<const DisplayDevice>& displayDevice,
2516 const Region& inDirtyRegion)
2518 // We only need to actually compose the display if:
2519 // 1) It is being handled by hardware composer, which may need this to
2520 // keep its virtual display state machine in sync, or
2521 // 2) There is work to be done (the dirty region isn't empty)
2522 bool isHwcDisplay = displayDevice->getHwcDisplayId() >= 0;
2523 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2524 ALOGV("Skipping display composition");
2528 ALOGV("doDisplayComposition");
2530 Region dirtyRegion(inDirtyRegion);
2532 // compute the invalid region
2533 displayDevice->swapRegion.orSelf(dirtyRegion);
2535 uint32_t flags = displayDevice->getFlags();
2536 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2537 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2538 // takes a rectangle, we must make sure to update that whole
2539 // rectangle in that case
2540 dirtyRegion.set(displayDevice->swapRegion.bounds());
2542 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2543 // We need to redraw the rectangle that will be updated
2544 // (pushed to the framebuffer).
2545 // This is needed because PARTIAL_UPDATES only takes one
2546 // rectangle instead of a region (see DisplayDevice::flip())
2547 dirtyRegion.set(displayDevice->swapRegion.bounds());
2549 // we need to redraw everything (the whole screen)
2550 dirtyRegion.set(displayDevice->bounds());
2551 displayDevice->swapRegion = dirtyRegion;
2555 if (!doComposeSurfaces(displayDevice, dirtyRegion)) return;
2557 // update the swap region and clear the dirty region
2558 displayDevice->swapRegion.orSelf(dirtyRegion);
2560 // swap buffers (presentation)
2561 displayDevice->swapBuffers(getHwComposer());
2564 bool SurfaceFlinger::doComposeSurfaces(
2565 const sp<const DisplayDevice>& displayDevice, const Region& dirty)
2567 ALOGV("doComposeSurfaces");
2569 const auto hwcId = displayDevice->getHwcDisplayId();
2571 mat4 oldColorMatrix;
2572 const bool applyColorMatrix = !mHwc->hasDeviceComposition(hwcId) &&
2573 !mHwc->hasCapability(HWC2::Capability::SkipClientColorTransform);
2574 if (applyColorMatrix) {
2575 mat4 colorMatrix = mColorMatrix * mDaltonizer();
2576 oldColorMatrix = getRenderEngine().setupColorTransform(colorMatrix);
2579 bool hasClientComposition = mHwc->hasClientComposition(hwcId);
2580 if (hasClientComposition) {
2581 ALOGV("hasClientComposition");
2584 mRenderEngine->setWideColor(displayDevice->getWideColorSupport());
2585 mRenderEngine->setColorMode(displayDevice->getActiveColorMode());
2587 if (!displayDevice->makeCurrent(mEGLDisplay, mEGLContext)) {
2588 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2589 displayDevice->getDisplayName().string());
2590 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2592 // |mStateLock| not needed as we are on the main thread
2593 if(!getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext)) {
2594 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2599 // Never touch the framebuffer if we don't have any framebuffer layers
2600 const bool hasDeviceComposition = mHwc->hasDeviceComposition(hwcId);
2601 if (hasDeviceComposition) {
2602 // when using overlays, we assume a fully transparent framebuffer
2603 // NOTE: we could reduce how much we need to clear, for instance
2604 // remove where there are opaque FB layers. however, on some
2605 // GPUs doing a "clean slate" clear might be more efficient.
2606 // We'll revisit later if needed.
2607 mRenderEngine->clearWithColor(0, 0, 0, 0);
2609 // we start with the whole screen area
2610 const Region bounds(displayDevice->getBounds());
2612 // we remove the scissor part
2613 // we're left with the letterbox region
2614 // (common case is that letterbox ends-up being empty)
2615 const Region letterbox(bounds.subtract(displayDevice->getScissor()));
2617 // compute the area to clear
2618 Region region(displayDevice->undefinedRegion.merge(letterbox));
2620 // but limit it to the dirty region
2621 region.andSelf(dirty);
2623 // screen is already cleared here
2624 if (!region.isEmpty()) {
2625 // can happen with SurfaceView
2626 drawWormhole(displayDevice, region);
2630 if (displayDevice->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2631 // just to be on the safe side, we don't set the
2632 // scissor on the main display. It should never be needed
2633 // anyways (though in theory it could since the API allows it).
2634 const Rect& bounds(displayDevice->getBounds());
2635 const Rect& scissor(displayDevice->getScissor());
2636 if (scissor != bounds) {
2637 // scissor doesn't match the screen's dimensions, so we
2638 // need to clear everything outside of it and enable
2639 // the GL scissor so we don't draw anything where we shouldn't
2641 // enable scissor for this frame
2642 const uint32_t height = displayDevice->getHeight();
2643 mRenderEngine->setScissor(scissor.left, height - scissor.bottom,
2644 scissor.getWidth(), scissor.getHeight());
2650 * and then, render the layers targeted at the framebuffer
2653 ALOGV("Rendering client layers");
2654 const Transform& displayTransform = displayDevice->getTransform();
2656 // we're using h/w composer
2657 bool firstLayer = true;
2658 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2659 const Region clip(dirty.intersect(
2660 displayTransform.transform(layer->visibleRegion)));
2661 ALOGV("Layer: %s", layer->getName().string());
2662 ALOGV(" Composition type: %s",
2663 to_string(layer->getCompositionType(hwcId)).c_str());
2664 if (!clip.isEmpty()) {
2665 switch (layer->getCompositionType(hwcId)) {
2666 case HWC2::Composition::Cursor:
2667 case HWC2::Composition::Device:
2668 case HWC2::Composition::Sideband:
2669 case HWC2::Composition::SolidColor: {
2670 const Layer::State& state(layer->getDrawingState());
2671 if (layer->getClearClientTarget(hwcId) && !firstLayer &&
2672 layer->isOpaque(state) && (state.alpha == 1.0f)
2673 && hasClientComposition) {
2674 // never clear the very first layer since we're
2675 // guaranteed the FB is already cleared
2676 layer->clearWithOpenGL(displayDevice);
2680 case HWC2::Composition::Client: {
2681 layer->draw(displayDevice, clip);
2688 ALOGV(" Skipping for empty clip");
2693 // we're not using h/w composer
2694 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2695 const Region clip(dirty.intersect(
2696 displayTransform.transform(layer->visibleRegion)));
2697 if (!clip.isEmpty()) {
2698 layer->draw(displayDevice, clip);
2703 if (applyColorMatrix) {
2704 getRenderEngine().setupColorTransform(oldColorMatrix);
2707 // disable scissor at the end of the frame
2708 mRenderEngine->disableScissor();
2712 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& displayDevice, const Region& region) const {
2713 const int32_t height = displayDevice->getHeight();
2714 RenderEngine& engine(getRenderEngine());
2715 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2718 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2719 const sp<IBinder>& handle,
2720 const sp<IGraphicBufferProducer>& gbc,
2721 const sp<Layer>& lbc,
2722 const sp<Layer>& parent)
2724 // add this layer to the current state list
2726 Mutex::Autolock _l(mStateLock);
2727 if (mNumLayers >= MAX_LAYERS) {
2728 ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers,
2732 if (parent == nullptr) {
2733 mCurrentState.layersSortedByZ.add(lbc);
2735 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2736 ALOGE("addClientLayer called with a removed parent");
2737 return NAME_NOT_FOUND;
2739 parent->addChild(lbc);
2742 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2743 mLayersAdded = true;
2747 // attach this layer to the client
2748 client->attachLayer(handle, lbc);
2753 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
2754 Mutex::Autolock _l(mStateLock);
2756 const auto& p = layer->getParent();
2763 sp<Layer> ancestor = p;
2764 while (ancestor->getParent() != nullptr) {
2765 ancestor = ancestor->getParent();
2767 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2768 ALOGE("removeLayer called with a layer whose parent has been removed");
2769 return NAME_NOT_FOUND;
2772 index = p->removeChild(layer);
2774 index = mCurrentState.layersSortedByZ.remove(layer);
2777 // As a matter of normal operation, the LayerCleaner will produce a second
2778 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2779 // so we will succeed in promoting it, but it's already been removed
2780 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2781 // otherwise something has gone wrong and we are leaking the layer.
2782 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
2783 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2784 layer->getName().string(),
2785 (p != nullptr) ? p->getName().string() : "no-parent");
2787 } else if (index < 0) {
2791 mLayersPendingRemoval.add(layer);
2792 mLayersRemoved = true;
2793 mNumLayers -= 1 + layer->getChildrenCount();
2794 setTransactionFlags(eTransactionNeeded);
2798 uint32_t SurfaceFlinger::peekTransactionFlags() {
2799 return android_atomic_release_load(&mTransactionFlags);
2802 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2803 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2806 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2807 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2808 if ((old & flags)==0) { // wake the server up
2809 signalTransaction();
2814 void SurfaceFlinger::setTransactionState(
2815 const Vector<ComposerState>& state,
2816 const Vector<DisplayState>& displays,
2820 Mutex::Autolock _l(mStateLock);
2821 uint32_t transactionFlags = 0;
2823 if (flags & eAnimation) {
2824 // For window updates that are part of an animation we must wait for
2825 // previous animation "frames" to be handled.
2826 while (mAnimTransactionPending) {
2827 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2828 if (CC_UNLIKELY(err != NO_ERROR)) {
2829 // just in case something goes wrong in SF, return to the
2830 // caller after a few seconds.
2831 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2832 "waiting for previous animation frame");
2833 mAnimTransactionPending = false;
2839 size_t count = displays.size();
2840 for (size_t i=0 ; i<count ; i++) {
2841 const DisplayState& s(displays[i]);
2842 transactionFlags |= setDisplayStateLocked(s);
2845 count = state.size();
2846 for (size_t i=0 ; i<count ; i++) {
2847 const ComposerState& s(state[i]);
2848 // Here we need to check that the interface we're given is indeed
2849 // one of our own. A malicious client could give us a NULL
2850 // IInterface, or one of its own or even one of our own but a
2851 // different type. All these situations would cause us to crash.
2853 // NOTE: it would be better to use RTTI as we could directly check
2854 // that we have a Client*. however, RTTI is disabled in Android.
2855 if (s.client != NULL) {
2856 sp<IBinder> binder = IInterface::asBinder(s.client);
2857 if (binder != NULL) {
2858 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
2859 sp<Client> client( static_cast<Client *>(s.client.get()) );
2860 transactionFlags |= setClientStateLocked(client, s.state);
2866 // If a synchronous transaction is explicitly requested without any changes,
2867 // force a transaction anyway. This can be used as a flush mechanism for
2868 // previous async transactions.
2869 if (transactionFlags == 0 && (flags & eSynchronous)) {
2870 transactionFlags = eTransactionNeeded;
2873 if (transactionFlags) {
2874 if (mInterceptor.isEnabled()) {
2875 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2878 // this triggers the transaction
2879 setTransactionFlags(transactionFlags);
2881 // if this is a synchronous transaction, wait for it to take effect
2882 // before returning.
2883 if (flags & eSynchronous) {
2884 mTransactionPending = true;
2886 if (flags & eAnimation) {
2887 mAnimTransactionPending = true;
2889 while (mTransactionPending) {
2890 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2891 if (CC_UNLIKELY(err != NO_ERROR)) {
2892 // just in case something goes wrong in SF, return to the
2893 // called after a few seconds.
2894 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2895 mTransactionPending = false;
2902 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2904 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2909 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2910 if (disp.isValid()) {
2911 const uint32_t what = s.what;
2912 if (what & DisplayState::eSurfaceChanged) {
2913 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2914 disp.surface = s.surface;
2915 flags |= eDisplayTransactionNeeded;
2918 if (what & DisplayState::eLayerStackChanged) {
2919 if (disp.layerStack != s.layerStack) {
2920 disp.layerStack = s.layerStack;
2921 flags |= eDisplayTransactionNeeded;
2924 if (what & DisplayState::eDisplayProjectionChanged) {
2925 if (disp.orientation != s.orientation) {
2926 disp.orientation = s.orientation;
2927 flags |= eDisplayTransactionNeeded;
2929 if (disp.frame != s.frame) {
2930 disp.frame = s.frame;
2931 flags |= eDisplayTransactionNeeded;
2933 if (disp.viewport != s.viewport) {
2934 disp.viewport = s.viewport;
2935 flags |= eDisplayTransactionNeeded;
2938 if (what & DisplayState::eDisplaySizeChanged) {
2939 if (disp.width != s.width) {
2940 disp.width = s.width;
2941 flags |= eDisplayTransactionNeeded;
2943 if (disp.height != s.height) {
2944 disp.height = s.height;
2945 flags |= eDisplayTransactionNeeded;
2952 uint32_t SurfaceFlinger::setClientStateLocked(
2953 const sp<Client>& client,
2954 const layer_state_t& s)
2957 sp<Layer> layer(client->getLayerUser(s.surface));
2959 const uint32_t what = s.what;
2960 bool geometryAppliesWithResize =
2961 what & layer_state_t::eGeometryAppliesWithResize;
2962 if (what & layer_state_t::ePositionChanged) {
2963 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2964 flags |= eTraversalNeeded;
2967 if (what & layer_state_t::eLayerChanged) {
2968 // NOTE: index needs to be calculated before we update the state
2969 const auto& p = layer->getParent();
2971 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2972 if (layer->setLayer(s.z) && idx >= 0) {
2973 mCurrentState.layersSortedByZ.removeAt(idx);
2974 mCurrentState.layersSortedByZ.add(layer);
2975 // we need traversal (state changed)
2976 // AND transaction (list changed)
2977 flags |= eTransactionNeeded|eTraversalNeeded;
2980 if (p->setChildLayer(layer, s.z)) {
2981 flags |= eTransactionNeeded|eTraversalNeeded;
2985 if (what & layer_state_t::eRelativeLayerChanged) {
2986 if (layer->setRelativeLayer(s.relativeLayerHandle, s.z)) {
2987 flags |= eTransactionNeeded|eTraversalNeeded;
2990 if (what & layer_state_t::eSizeChanged) {
2991 if (layer->setSize(s.w, s.h)) {
2992 flags |= eTraversalNeeded;
2995 if (what & layer_state_t::eAlphaChanged) {
2996 if (layer->setAlpha(s.alpha))
2997 flags |= eTraversalNeeded;
2999 if (what & layer_state_t::eMatrixChanged) {
3000 if (layer->setMatrix(s.matrix))
3001 flags |= eTraversalNeeded;
3003 if (what & layer_state_t::eTransparentRegionChanged) {
3004 if (layer->setTransparentRegionHint(s.transparentRegion))
3005 flags |= eTraversalNeeded;
3007 if (what & layer_state_t::eFlagsChanged) {
3008 if (layer->setFlags(s.flags, s.mask))
3009 flags |= eTraversalNeeded;
3011 if (what & layer_state_t::eCropChanged) {
3012 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
3013 flags |= eTraversalNeeded;
3015 if (what & layer_state_t::eFinalCropChanged) {
3016 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
3017 flags |= eTraversalNeeded;
3019 if (what & layer_state_t::eLayerStackChanged) {
3020 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3021 // We only allow setting layer stacks for top level layers,
3022 // everything else inherits layer stack from its parent.
3023 if (layer->hasParent()) {
3024 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
3025 layer->getName().string());
3026 } else if (idx < 0) {
3027 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
3028 "that also does not appear in the top level layer list. Something"
3029 " has gone wrong.", layer->getName().string());
3030 } else if (layer->setLayerStack(s.layerStack)) {
3031 mCurrentState.layersSortedByZ.removeAt(idx);
3032 mCurrentState.layersSortedByZ.add(layer);
3033 // we need traversal (state changed)
3034 // AND transaction (list changed)
3035 flags |= eTransactionNeeded|eTraversalNeeded;
3038 if (what & layer_state_t::eDeferTransaction) {
3039 if (s.barrierHandle != nullptr) {
3040 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
3041 } else if (s.barrierGbp != nullptr) {
3042 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
3043 if (authenticateSurfaceTextureLocked(gbp)) {
3044 const auto& otherLayer =
3045 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
3046 layer->deferTransactionUntil(otherLayer, s.frameNumber);
3048 ALOGE("Attempt to defer transaction to to an"
3049 " unrecognized GraphicBufferProducer");
3052 // We don't trigger a traversal here because if no other state is
3053 // changed, we don't want this to cause any more work
3055 if (what & layer_state_t::eReparentChildren) {
3056 if (layer->reparentChildren(s.reparentHandle)) {
3057 flags |= eTransactionNeeded|eTraversalNeeded;
3060 if (what & layer_state_t::eDetachChildren) {
3061 layer->detachChildren();
3063 if (what & layer_state_t::eOverrideScalingModeChanged) {
3064 layer->setOverrideScalingMode(s.overrideScalingMode);
3065 // We don't trigger a traversal here because if no other state is
3066 // changed, we don't want this to cause any more work
3072 status_t SurfaceFlinger::createLayer(
3073 const String8& name,
3074 const sp<Client>& client,
3075 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
3076 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
3077 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
3079 if (int32_t(w|h) < 0) {
3080 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
3085 status_t result = NO_ERROR;
3089 String8 uniqueName = getUniqueLayerName(name);
3091 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
3092 case ISurfaceComposerClient::eFXSurfaceNormal:
3093 result = createNormalLayer(client,
3094 uniqueName, w, h, flags, format,
3095 handle, gbp, &layer);
3097 case ISurfaceComposerClient::eFXSurfaceDim:
3098 result = createDimLayer(client,
3099 uniqueName, w, h, flags,
3100 handle, gbp, &layer);
3107 if (result != NO_ERROR) {
3111 layer->setInfo(windowType, ownerUid);
3113 result = addClientLayer(client, *handle, *gbp, layer, *parent);
3114 if (result != NO_ERROR) {
3117 mInterceptor.saveSurfaceCreation(layer);
3119 setTransactionFlags(eTransactionNeeded);
3123 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
3125 bool matchFound = true;
3126 uint32_t dupeCounter = 0;
3128 // Tack on our counter whether there is a hit or not, so everyone gets a tag
3129 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
3131 // Loop over layers until we're sure there is no matching name
3132 while (matchFound) {
3134 mDrawingState.traverseInZOrder([&](Layer* layer) {
3135 if (layer->getName() == uniqueName) {
3137 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
3142 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
3147 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
3148 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
3149 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
3151 // initialize the surfaces
3153 case PIXEL_FORMAT_TRANSPARENT:
3154 case PIXEL_FORMAT_TRANSLUCENT:
3155 format = PIXEL_FORMAT_RGBA_8888;
3157 case PIXEL_FORMAT_OPAQUE:
3158 format = PIXEL_FORMAT_RGBX_8888;
3162 *outLayer = new Layer(this, client, name, w, h, flags);
3163 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
3164 if (err == NO_ERROR) {
3165 *handle = (*outLayer)->getHandle();
3166 *gbp = (*outLayer)->getProducer();
3169 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
3173 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
3174 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
3175 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
3177 *outLayer = new LayerDim(this, client, name, w, h, flags);
3178 *handle = (*outLayer)->getHandle();
3179 *gbp = (*outLayer)->getProducer();
3183 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
3185 // called by a client when it wants to remove a Layer
3186 status_t err = NO_ERROR;
3187 sp<Layer> l(client->getLayerUser(handle));
3189 mInterceptor.saveSurfaceDeletion(l);
3190 err = removeLayer(l);
3191 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
3192 "error removing layer=%p (%s)", l.get(), strerror(-err));
3197 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
3199 // called by ~LayerCleaner() when all references to the IBinder (handle)
3201 sp<Layer> l = layer.promote();
3203 // The layer has already been removed, carry on
3206 // If we have a parent, then we can continue to live as long as it does.
3207 return removeLayer(l, true);
3210 // ---------------------------------------------------------------------------
3212 void SurfaceFlinger::onInitializeDisplays() {
3213 // reset screen orientation and use primary layer stack
3214 Vector<ComposerState> state;
3215 Vector<DisplayState> displays;
3217 d.what = DisplayState::eDisplayProjectionChanged |
3218 DisplayState::eLayerStackChanged;
3219 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
3221 d.orientation = DisplayState::eOrientationDefault;
3222 d.frame.makeInvalid();
3223 d.viewport.makeInvalid();
3227 setTransactionState(state, displays, 0);
3228 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
3230 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3231 const nsecs_t period = activeConfig->getVsyncPeriod();
3232 mAnimFrameTracker.setDisplayRefreshPeriod(period);
3234 // Use phase of 0 since phase is not known.
3235 // Use latency of 0, which will snap to the ideal latency.
3236 setCompositorTimingSnapped(0, period, 0);
3239 void SurfaceFlinger::initializeDisplays() {
3240 class MessageScreenInitialized : public MessageBase {
3241 SurfaceFlinger* flinger;
3243 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
3244 virtual bool handler() {
3245 flinger->onInitializeDisplays();
3249 sp<MessageBase> msg = new MessageScreenInitialized(this);
3250 postMessageAsync(msg); // we may be called from main thread, use async message
3253 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
3255 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
3257 int32_t type = hw->getDisplayType();
3258 int currentMode = hw->getPowerMode();
3260 if (mode == currentMode) {
3264 hw->setPowerMode(mode);
3265 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
3266 ALOGW("Trying to set power mode for virtual display");
3270 if (mInterceptor.isEnabled()) {
3271 Mutex::Autolock _l(mStateLock);
3272 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
3274 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
3277 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
3280 if (currentMode == HWC_POWER_MODE_OFF) {
3281 // Turn on the display
3282 getHwComposer().setPowerMode(type, mode);
3283 if (type == DisplayDevice::DISPLAY_PRIMARY &&
3284 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
3285 // FIXME: eventthread only knows about the main display right now
3286 mEventThread->onScreenAcquired();
3287 resyncToHardwareVsync(true);
3290 mVisibleRegionsDirty = true;
3291 mHasPoweredOff = true;
3292 repaintEverything();
3294 struct sched_param param = {0};
3295 param.sched_priority = 1;
3296 if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
3297 ALOGW("Couldn't set SCHED_FIFO on display on");
3299 } else if (mode == HWC_POWER_MODE_OFF) {
3300 // Turn off the display
3301 struct sched_param param = {0};
3302 if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) {
3303 ALOGW("Couldn't set SCHED_OTHER on display off");
3306 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3307 disableHardwareVsync(true); // also cancels any in-progress resync
3309 // FIXME: eventthread only knows about the main display right now
3310 mEventThread->onScreenReleased();
3313 getHwComposer().setPowerMode(type, mode);
3314 mVisibleRegionsDirty = true;
3315 // from this point on, SF will stop drawing on this display
3316 } else if (mode == HWC_POWER_MODE_DOZE ||
3317 mode == HWC_POWER_MODE_NORMAL) {
3318 // Update display while dozing
3319 getHwComposer().setPowerMode(type, mode);
3320 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3321 // FIXME: eventthread only knows about the main display right now
3322 mEventThread->onScreenAcquired();
3323 resyncToHardwareVsync(true);
3325 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
3326 // Leave display going to doze
3327 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3328 disableHardwareVsync(true); // also cancels any in-progress resync
3329 // FIXME: eventthread only knows about the main display right now
3330 mEventThread->onScreenReleased();
3332 getHwComposer().setPowerMode(type, mode);
3334 ALOGE("Attempting to set unknown power mode: %d\n", mode);
3335 getHwComposer().setPowerMode(type, mode);
3339 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
3340 class MessageSetPowerMode: public MessageBase {
3341 SurfaceFlinger& mFlinger;
3342 sp<IBinder> mDisplay;
3345 MessageSetPowerMode(SurfaceFlinger& flinger,
3346 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
3347 mDisplay(disp) { mMode = mode; }
3348 virtual bool handler() {
3349 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
3351 ALOGE("Attempt to set power mode = %d for null display %p",
3352 mMode, mDisplay.get());
3353 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
3354 ALOGW("Attempt to set power mode = %d for virtual display",
3357 mFlinger.setPowerModeInternal(hw, mMode);
3362 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
3363 postMessageSync(msg);
3366 // ---------------------------------------------------------------------------
3368 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
3372 IPCThreadState* ipc = IPCThreadState::self();
3373 const int pid = ipc->getCallingPid();
3374 const int uid = ipc->getCallingUid();
3375 if ((uid != AID_SHELL) &&
3376 !PermissionCache::checkPermission(sDump, pid, uid)) {
3377 result.appendFormat("Permission Denial: "
3378 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3380 // Try to get the main lock, but give up after one second
3381 // (this would indicate SF is stuck, but we want to be able to
3382 // print something in dumpsys).
3383 status_t err = mStateLock.timedLock(s2ns(1));
3384 bool locked = (err == NO_ERROR);
3386 result.appendFormat(
3387 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3388 "dumping anyways (no locks held)\n", strerror(-err), err);
3391 bool dumpAll = true;
3393 size_t numArgs = args.size();
3395 if ((index < numArgs) &&
3396 (args[index] == String16("--list"))) {
3398 listLayersLocked(args, index, result);
3402 if ((index < numArgs) &&
3403 (args[index] == String16("--latency"))) {
3405 dumpStatsLocked(args, index, result);
3409 if ((index < numArgs) &&
3410 (args[index] == String16("--latency-clear"))) {
3412 clearStatsLocked(args, index, result);
3416 if ((index < numArgs) &&
3417 (args[index] == String16("--dispsync"))) {
3419 mPrimaryDispSync.dump(result);
3423 if ((index < numArgs) &&
3424 (args[index] == String16("--static-screen"))) {
3426 dumpStaticScreenStats(result);
3430 if ((index < numArgs) &&
3431 (args[index] == String16("--frame-events"))) {
3433 dumpFrameEventsLocked(result);
3437 if ((index < numArgs) && (args[index] == String16("--wide-color"))) {
3439 dumpWideColorInfo(result);
3445 dumpAllLocked(args, index, result);
3449 mStateLock.unlock();
3452 write(fd, result.string(), result.size());
3456 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3457 size_t& /* index */, String8& result) const
3459 mCurrentState.traverseInZOrder([&](Layer* layer) {
3460 result.appendFormat("%s\n", layer->getName().string());
3464 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3465 String8& result) const
3468 if (index < args.size()) {
3469 name = String8(args[index]);
3473 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3474 const nsecs_t period = activeConfig->getVsyncPeriod();
3475 result.appendFormat("%" PRId64 "\n", period);
3477 if (name.isEmpty()) {
3478 mAnimFrameTracker.dumpStats(result);
3480 mCurrentState.traverseInZOrder([&](Layer* layer) {
3481 if (name == layer->getName()) {
3482 layer->dumpFrameStats(result);
3488 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3489 String8& /* result */)
3492 if (index < args.size()) {
3493 name = String8(args[index]);
3497 mCurrentState.traverseInZOrder([&](Layer* layer) {
3498 if (name.isEmpty() || (name == layer->getName())) {
3499 layer->clearFrameStats();
3503 mAnimFrameTracker.clearStats();
3506 // This should only be called from the main thread. Otherwise it would need
3507 // the lock and should use mCurrentState rather than mDrawingState.
3508 void SurfaceFlinger::logFrameStats() {
3509 mDrawingState.traverseInZOrder([&](Layer* layer) {
3510 layer->logFrameStats();
3513 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3516 void SurfaceFlinger::appendSfConfigString(String8& result) const
3518 result.append(" [sf");
3519 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3521 if (isLayerTripleBufferingDisabled())
3522 result.append(" DISABLE_TRIPLE_BUFFERING");
3524 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64 , dispSyncPresentTimeOffset);
3525 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
3526 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
3527 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
3528 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3529 maxFrameBufferAcquiredBuffers);
3533 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3535 result.appendFormat("Static screen stats:\n");
3536 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3537 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3538 float percent = 100.0f *
3539 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3540 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3541 b + 1, bucketTimeSec, percent);
3543 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3544 float percent = 100.0f *
3545 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3546 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3547 NUM_BUCKETS - 1, bucketTimeSec, percent);
3550 void SurfaceFlinger::recordBufferingStats(const char* layerName,
3551 std::vector<OccupancyTracker::Segment>&& history) {
3552 Mutex::Autolock lock(mBufferingStatsMutex);
3553 auto& stats = mBufferingStats[layerName];
3554 for (const auto& segment : history) {
3555 if (!segment.usedThirdBuffer) {
3556 stats.twoBufferTime += segment.totalTime;
3558 if (segment.occupancyAverage < 1.0f) {
3559 stats.doubleBufferedTime += segment.totalTime;
3560 } else if (segment.occupancyAverage < 2.0f) {
3561 stats.tripleBufferedTime += segment.totalTime;
3563 ++stats.numSegments;
3564 stats.totalTime += segment.totalTime;
3568 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3569 result.appendFormat("Layer frame timestamps:\n");
3571 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3572 const size_t count = currentLayers.size();
3573 for (size_t i=0 ; i<count ; i++) {
3574 currentLayers[i]->dumpFrameEvents(result);
3578 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3579 result.append("Buffering stats:\n");
3580 result.append(" [Layer name] <Active time> <Two buffer> "
3581 "<Double buffered> <Triple buffered>\n");
3582 Mutex::Autolock lock(mBufferingStatsMutex);
3583 typedef std::tuple<std::string, float, float, float> BufferTuple;
3584 std::map<float, BufferTuple, std::greater<float>> sorted;
3585 for (const auto& statsPair : mBufferingStats) {
3586 const char* name = statsPair.first.c_str();
3587 const BufferingStats& stats = statsPair.second;
3588 if (stats.numSegments == 0) {
3591 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3592 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3594 float doubleBufferRatio = static_cast<float>(
3595 stats.doubleBufferedTime) / stats.totalTime;
3596 float tripleBufferRatio = static_cast<float>(
3597 stats.tripleBufferedTime) / stats.totalTime;
3598 sorted.insert({activeTime, {name, twoBufferRatio,
3599 doubleBufferRatio, tripleBufferRatio}});
3601 for (const auto& sortedPair : sorted) {
3602 float activeTime = sortedPair.first;
3603 const BufferTuple& values = sortedPair.second;
3604 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3605 std::get<0>(values).c_str(), activeTime,
3606 std::get<1>(values), std::get<2>(values),
3607 std::get<3>(values));
3609 result.append("\n");
3612 void SurfaceFlinger::dumpWideColorInfo(String8& result) const {
3613 result.appendFormat("hasWideColorDisplay: %d\n", hasWideColorDisplay);
3615 // TODO: print out if wide-color mode is active or not
3617 for (size_t d = 0; d < mDisplays.size(); d++) {
3618 const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
3619 int32_t hwcId = displayDevice->getHwcDisplayId();
3620 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
3624 result.appendFormat("Display %d color modes:\n", hwcId);
3625 std::vector<android_color_mode_t> modes = getHwComposer().getColorModes(hwcId);
3626 for (auto&& mode : modes) {
3627 result.appendFormat(" %s (%d)\n", decodeColorMode(mode).c_str(), mode);
3630 android_color_mode_t currentMode = displayDevice->getActiveColorMode();
3631 result.appendFormat(" Current color mode: %s (%d)\n",
3632 decodeColorMode(currentMode).c_str(), currentMode);
3634 result.append("\n");
3637 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3638 String8& result) const
3640 bool colorize = false;
3641 if (index < args.size()
3642 && (args[index] == String16("--color"))) {
3647 Colorizer colorizer(colorize);
3649 // figure out if we're stuck somewhere
3650 const nsecs_t now = systemTime();
3651 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3652 const nsecs_t inTransaction(mDebugInTransaction);
3653 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3654 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3657 * Dump library configuration.
3660 colorizer.bold(result);
3661 result.append("Build configuration:");
3662 colorizer.reset(result);
3663 appendSfConfigString(result);
3664 appendUiConfigString(result);
3665 appendGuiConfigString(result);
3666 result.append("\n");
3668 result.append("\nWide-Color information:\n");
3669 dumpWideColorInfo(result);
3671 colorizer.bold(result);
3672 result.append("Sync configuration: ");
3673 colorizer.reset(result);
3674 result.append(SyncFeatures::getInstance().toString());
3675 result.append("\n");
3677 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3679 colorizer.bold(result);
3680 result.append("DispSync configuration: ");
3681 colorizer.reset(result);
3682 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3683 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3684 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs,
3685 dispSyncPresentTimeOffset, activeConfig->getVsyncPeriod());
3686 result.append("\n");
3688 // Dump static screen stats
3689 result.append("\n");
3690 dumpStaticScreenStats(result);
3691 result.append("\n");
3693 dumpBufferingStats(result);
3696 * Dump the visible layer list
3698 colorizer.bold(result);
3699 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
3700 colorizer.reset(result);
3701 mCurrentState.traverseInZOrder([&](Layer* layer) {
3702 layer->dump(result, colorizer);
3706 * Dump Display state
3709 colorizer.bold(result);
3710 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3711 colorizer.reset(result);
3712 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3713 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3718 * Dump SurfaceFlinger global state
3721 colorizer.bold(result);
3722 result.append("SurfaceFlinger global state:\n");
3723 colorizer.reset(result);
3725 HWComposer& hwc(getHwComposer());
3726 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
3728 colorizer.bold(result);
3729 result.appendFormat("EGL implementation : %s\n",
3730 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3731 colorizer.reset(result);
3732 result.appendFormat("%s\n",
3733 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3735 mRenderEngine->dump(result);
3737 hw->undefinedRegion.dump(result, "undefinedRegion");
3738 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3739 hw->getOrientation(), hw->isDisplayOn());
3740 result.appendFormat(
3741 " last eglSwapBuffers() time: %f us\n"
3742 " last transaction time : %f us\n"
3743 " transaction-flags : %08x\n"
3744 " refresh-rate : %f fps\n"
3747 " gpu_to_cpu_unsupported : %d\n"
3749 mLastSwapBufferTime/1000.0,
3750 mLastTransactionTime/1000.0,
3752 1e9 / activeConfig->getVsyncPeriod(),
3753 activeConfig->getDpiX(),
3754 activeConfig->getDpiY(),
3755 !mGpuToCpuSupported);
3757 result.appendFormat(" eglSwapBuffers time: %f us\n",
3758 inSwapBuffersDuration/1000.0);
3760 result.appendFormat(" transaction time: %f us\n",
3761 inTransactionDuration/1000.0);
3766 mEventThread->dump(result);
3767 result.append("\n");
3770 * HWC layer minidump
3772 for (size_t d = 0; d < mDisplays.size(); d++) {
3773 const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
3774 int32_t hwcId = displayDevice->getHwcDisplayId();
3775 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
3779 result.appendFormat("Display %d HWC layers:\n", hwcId);
3780 Layer::miniDumpHeader(result);
3781 mCurrentState.traverseInZOrder([&](Layer* layer) {
3782 layer->miniDump(result, hwcId);
3784 result.append("\n");
3788 * Dump HWComposer state
3790 colorizer.bold(result);
3791 result.append("h/w composer state:\n");
3792 colorizer.reset(result);
3793 bool hwcDisabled = mDebugDisableHWC || mDebugRegion;
3794 result.appendFormat(" h/w composer %s\n",
3795 hwcDisabled ? "disabled" : "enabled");
3799 * Dump gralloc state
3801 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3805 * Dump VrFlinger state if in use.
3807 if (mVrFlingerRequestsDisplay && mVrFlinger) {
3808 result.append("VrFlinger state:\n");
3809 result.append(mVrFlinger->Dump().c_str());
3810 result.append("\n");
3814 const Vector< sp<Layer> >&
3815 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3816 // Note: mStateLock is held here
3818 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3819 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3820 dpy = mDisplays.keyAt(i);
3825 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3826 // Just use the primary display so we have something to return
3827 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3829 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
3832 bool SurfaceFlinger::startDdmConnection()
3834 void* libddmconnection_dso =
3835 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3836 if (!libddmconnection_dso) {
3839 void (*DdmConnection_start)(const char* name);
3840 DdmConnection_start =
3841 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3842 if (!DdmConnection_start) {
3843 dlclose(libddmconnection_dso);
3846 (*DdmConnection_start)(getServiceName());
3850 status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
3852 case CREATE_CONNECTION:
3853 case CREATE_DISPLAY:
3855 case CLEAR_ANIMATION_FRAME_STATS:
3856 case GET_ANIMATION_FRAME_STATS:
3857 case SET_POWER_MODE:
3858 case GET_HDR_CAPABILITIES:
3860 // codes that require permission check
3861 IPCThreadState* ipc = IPCThreadState::self();
3862 const int pid = ipc->getCallingPid();
3863 const int uid = ipc->getCallingUid();
3864 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3865 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3866 ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3867 return PERMISSION_DENIED;
3872 * Calling setTransactionState is safe, because you need to have been
3873 * granted a reference to Client* and Handle* to do anything with it.
3875 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3877 case SET_TRANSACTION_STATE:
3878 case CREATE_SCOPED_CONNECTION:
3882 case CAPTURE_SCREEN:
3884 // codes that require permission check
3885 IPCThreadState* ipc = IPCThreadState::self();
3886 const int pid = ipc->getCallingPid();
3887 const int uid = ipc->getCallingUid();
3888 if ((uid != AID_GRAPHICS) &&
3889 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3890 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
3891 return PERMISSION_DENIED;
3899 status_t SurfaceFlinger::onTransact(
3900 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3902 status_t credentialCheck = CheckTransactCodeCredentials(code);
3903 if (credentialCheck != OK) {
3904 return credentialCheck;
3907 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3908 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3909 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3910 IPCThreadState* ipc = IPCThreadState::self();
3911 const int uid = ipc->getCallingUid();
3912 if (CC_UNLIKELY(uid != AID_SYSTEM
3913 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
3914 const int pid = ipc->getCallingPid();
3915 ALOGE("Permission Denial: "
3916 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3917 return PERMISSION_DENIED;
3921 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3922 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3924 case 1002: // SHOW_UPDATES
3925 n = data.readInt32();
3926 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3927 invalidateHwcGeometry();
3928 repaintEverything();
3930 case 1004:{ // repaint everything
3931 repaintEverything();
3934 case 1005:{ // force transaction
3935 setTransactionFlags(
3937 eDisplayTransactionNeeded|
3941 case 1006:{ // send empty update
3945 case 1008: // toggle use of hw composer
3946 n = data.readInt32();
3947 mDebugDisableHWC = n ? 1 : 0;
3948 invalidateHwcGeometry();
3949 repaintEverything();
3951 case 1009: // toggle use of transform hint
3952 n = data.readInt32();
3953 mDebugDisableTransformHint = n ? 1 : 0;
3954 invalidateHwcGeometry();
3955 repaintEverything();
3957 case 1010: // interrogate.
3958 reply->writeInt32(0);
3959 reply->writeInt32(0);
3960 reply->writeInt32(mDebugRegion);
3961 reply->writeInt32(0);
3962 reply->writeInt32(mDebugDisableHWC);
3965 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3966 reply->writeInt32(hw->getPageFlipCount());
3971 n = data.readInt32();
3974 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3977 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3980 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3983 mDaltonizer.setType(ColorBlindnessType::None);
3987 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3989 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3991 invalidateHwcGeometry();
3992 repaintEverything();
3996 // apply a color matrix
3997 n = data.readInt32();
3999 // color matrix is sent as a column-major mat4 matrix
4000 for (size_t i = 0 ; i < 4; i++) {
4001 for (size_t j = 0; j < 4; j++) {
4002 mColorMatrix[i][j] = data.readFloat();
4006 mColorMatrix = mat4();
4009 // Check that supplied matrix's last row is {0,0,0,1} so we can avoid
4010 // the division by w in the fragment shader
4011 float4 lastRow(transpose(mColorMatrix)[3]);
4012 if (any(greaterThan(abs(lastRow - float4{0, 0, 0, 1}), float4{1e-4f}))) {
4013 ALOGE("The color transform's last row must be (0, 0, 0, 1)");
4016 invalidateHwcGeometry();
4017 repaintEverything();
4020 // This is an experimental interface
4021 // Needs to be shifted to proper binder interface when we productize
4023 n = data.readInt32();
4024 mPrimaryDispSync.setRefreshSkipCount(n);
4028 n = data.readInt32();
4029 mForceFullDamage = static_cast<bool>(n);
4032 case 1018: { // Modify Choreographer's phase offset
4033 n = data.readInt32();
4034 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4037 case 1019: { // Modify SurfaceFlinger's phase offset
4038 n = data.readInt32();
4039 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4042 case 1020: { // Layer updates interceptor
4043 n = data.readInt32();
4045 ALOGV("Interceptor enabled");
4046 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
4049 ALOGV("Interceptor disabled");
4050 mInterceptor.disable();
4054 case 1021: { // Disable HWC virtual displays
4055 n = data.readInt32();
4056 mUseHwcVirtualDisplays = !n;
4059 case 1022: { // Set saturation boost
4060 mSaturation = std::max(0.0f, std::min(data.readFloat(), 2.0f));
4062 invalidateHwcGeometry();
4063 repaintEverything();
4071 void SurfaceFlinger::repaintEverything() {
4072 android_atomic_or(1, &mRepaintEverything);
4073 signalTransaction();
4076 // Checks that the requested width and height are valid and updates them to the display dimensions
4077 // if they are set to 0
4078 static status_t updateDimensionsLocked(const sp<const DisplayDevice>& displayDevice,
4079 Transform::orientation_flags rotation,
4080 uint32_t* requestedWidth, uint32_t* requestedHeight) {
4081 // get screen geometry
4082 uint32_t displayWidth = displayDevice->getWidth();
4083 uint32_t displayHeight = displayDevice->getHeight();
4085 if (rotation & Transform::ROT_90) {
4086 std::swap(displayWidth, displayHeight);
4089 if ((*requestedWidth > displayWidth) || (*requestedHeight > displayHeight)) {
4090 ALOGE("size mismatch (%d, %d) > (%d, %d)",
4091 *requestedWidth, *requestedHeight, displayWidth, displayHeight);
4095 if (*requestedWidth == 0) {
4096 *requestedWidth = displayWidth;
4098 if (*requestedHeight == 0) {
4099 *requestedHeight = displayHeight;
4105 // A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
4106 class WindowDisconnector {
4108 WindowDisconnector(ANativeWindow* window, int api) : mWindow(window), mApi(api) {}
4109 ~WindowDisconnector() {
4110 native_window_api_disconnect(mWindow, mApi);
4114 ANativeWindow* mWindow;
4118 static status_t getWindowBuffer(ANativeWindow* window, uint32_t requestedWidth,
4119 uint32_t requestedHeight, bool hasWideColorDisplay,
4120 bool renderEngineUsesWideColor, ANativeWindowBuffer** outBuffer) {
4121 const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
4122 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
4125 err = native_window_set_buffers_dimensions(window, requestedWidth, requestedHeight);
4126 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4127 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
4128 err |= native_window_set_usage(window, usage);
4130 if (hasWideColorDisplay) {
4131 err |= native_window_set_buffers_data_space(window,
4132 renderEngineUsesWideColor
4133 ? HAL_DATASPACE_DISPLAY_P3
4134 : HAL_DATASPACE_V0_SRGB);
4137 if (err != NO_ERROR) {
4141 /* TODO: Once we have the sync framework everywhere this can use
4142 * server-side waits on the fence that dequeueBuffer returns.
4144 err = native_window_dequeue_buffer_and_wait(window, outBuffer);
4145 if (err != NO_ERROR) {
4152 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
4153 const sp<IGraphicBufferProducer>& producer,
4154 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
4155 int32_t minLayerZ, int32_t maxLayerZ,
4156 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
4159 if (CC_UNLIKELY(display == 0))
4162 if (CC_UNLIKELY(producer == 0))
4165 // if we have secure windows on this display, never allow the screen capture
4166 // unless the producer interface is local (i.e.: we can take a screenshot for
4168 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
4170 // Convert to surfaceflinger's internal rotation type.
4171 Transform::orientation_flags rotationFlags;
4173 case ISurfaceComposer::eRotateNone:
4174 rotationFlags = Transform::ROT_0;
4176 case ISurfaceComposer::eRotate90:
4177 rotationFlags = Transform::ROT_90;
4179 case ISurfaceComposer::eRotate180:
4180 rotationFlags = Transform::ROT_180;
4182 case ISurfaceComposer::eRotate270:
4183 rotationFlags = Transform::ROT_270;
4186 rotationFlags = Transform::ROT_0;
4187 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
4192 Mutex::Autolock lock(mStateLock);
4193 sp<const DisplayDevice> displayDevice(getDisplayDeviceLocked(display));
4194 updateDimensionsLocked(displayDevice, rotationFlags, &reqWidth, &reqHeight);
4197 // create a surface (because we're a producer, and we need to
4198 // dequeue/queue a buffer)
4199 sp<Surface> surface = new Surface(producer, false);
4201 // Put the screenshot Surface into async mode so that
4202 // Layer::headFenceHasSignaled will always return true and we'll latch the
4203 // first buffer regardless of whether or not its acquire fence has
4204 // signaled. This is needed to avoid a race condition in the rotation
4205 // animation. See b/30209608
4206 surface->setAsyncMode(true);
4208 ANativeWindow* window = surface.get();
4210 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
4211 if (result != NO_ERROR) {
4214 WindowDisconnector disconnector(window, NATIVE_WINDOW_API_EGL);
4216 ANativeWindowBuffer* buffer = nullptr;
4217 result = getWindowBuffer(window, reqWidth, reqHeight, hasWideColorDisplay,
4218 getRenderEngine().usesWideColor(), &buffer);
4219 if (result != NO_ERROR) {
4223 // This mutex protects syncFd and captureResult for communication of the return values from the
4224 // main thread back to this Binder thread
4225 std::mutex captureMutex;
4226 std::condition_variable captureCondition;
4227 std::unique_lock<std::mutex> captureLock(captureMutex);
4229 std::optional<status_t> captureResult;
4231 sp<LambdaMessage> message = new LambdaMessage([&]() {
4232 // If there is a refresh pending, bug out early and tell the binder thread to try again
4233 // after the refresh.
4234 if (mRefreshPending) {
4235 ATRACE_NAME("Skipping screenshot for now");
4236 std::unique_lock<std::mutex> captureLock(captureMutex);
4237 captureResult = std::make_optional<status_t>(EAGAIN);
4238 captureCondition.notify_one();
4242 status_t result = NO_ERROR;
4245 Mutex::Autolock _l(mStateLock);
4246 sp<const DisplayDevice> device(getDisplayDeviceLocked(display));
4247 result = captureScreenImplLocked(device, buffer, sourceCrop, reqWidth, reqHeight,
4248 minLayerZ, maxLayerZ, useIdentityTransform,
4249 rotationFlags, isLocalScreenshot, &fd);
4253 std::unique_lock<std::mutex> captureLock(captureMutex);
4255 captureResult = std::make_optional<status_t>(result);
4256 captureCondition.notify_one();
4260 result = postMessageAsync(message);
4261 if (result == NO_ERROR) {
4262 captureCondition.wait(captureLock, [&]() { return captureResult; });
4263 while (*captureResult == EAGAIN) {
4264 captureResult.reset();
4265 result = postMessageAsync(message);
4266 if (result != NO_ERROR) {
4269 captureCondition.wait(captureLock, [&]() { return captureResult; });
4271 result = *captureResult;
4274 if (result == NO_ERROR) {
4275 // queueBuffer takes ownership of syncFd
4276 result = window->queueBuffer(window, buffer, syncFd);
4283 void SurfaceFlinger::renderScreenImplLocked(
4284 const sp<const DisplayDevice>& hw,
4285 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
4286 int32_t minLayerZ, int32_t maxLayerZ,
4287 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
4290 RenderEngine& engine(getRenderEngine());
4292 // get screen geometry
4293 const int32_t hw_w = hw->getWidth();
4294 const int32_t hw_h = hw->getHeight();
4295 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
4296 static_cast<int32_t>(reqHeight) != hw_h;
4298 // if a default or invalid sourceCrop is passed in, set reasonable values
4299 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
4300 !sourceCrop.isValid()) {
4301 sourceCrop.setLeftTop(Point(0, 0));
4302 sourceCrop.setRightBottom(Point(hw_w, hw_h));
4305 // ensure that sourceCrop is inside screen
4306 if (sourceCrop.left < 0) {
4307 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
4309 if (sourceCrop.right > hw_w) {
4310 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
4312 if (sourceCrop.top < 0) {
4313 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
4315 if (sourceCrop.bottom > hw_h) {
4316 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
4320 engine.setWideColor(hw->getWideColorSupport());
4321 engine.setColorMode(hw->getActiveColorMode());
4324 // make sure to clear all GL error flags
4325 engine.checkErrors();
4327 // set-up our viewport
4328 engine.setViewportAndProjection(
4329 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
4330 engine.disableTexturing();
4332 // redraw the screen entirely...
4333 engine.clearWithColor(0, 0, 0, 1);
4335 // We loop through the first level of layers without traversing,
4336 // as we need to interpret min/max layer Z in the top level Z space.
4337 for (const auto& layer : mDrawingState.layersSortedByZ) {
4338 if (layer->getLayerStack() != hw->getLayerStack()) {
4341 const Layer::State& state(layer->getDrawingState());
4342 if (state.z < minLayerZ || state.z > maxLayerZ) {
4345 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4346 if (!layer->isVisible()) {
4349 if (filtering) layer->setFiltering(true);
4350 layer->draw(hw, useIdentityTransform);
4351 if (filtering) layer->setFiltering(false);
4355 hw->setViewportAndProjection();
4358 // A simple RAII class that holds an EGLImage and destroys it either:
4359 // a) When the destroy() method is called
4360 // b) When the object goes out of scope
4363 ImageHolder(EGLDisplay display, EGLImageKHR image) : mDisplay(display), mImage(image) {}
4364 ~ImageHolder() { destroy(); }
4367 if (mImage != EGL_NO_IMAGE_KHR) {
4368 eglDestroyImageKHR(mDisplay, mImage);
4369 mImage = EGL_NO_IMAGE_KHR;
4374 const EGLDisplay mDisplay;
4378 status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& hw,
4379 ANativeWindowBuffer* buffer, Rect sourceCrop,
4380 uint32_t reqWidth, uint32_t reqHeight,
4381 int32_t minLayerZ, int32_t maxLayerZ,
4382 bool useIdentityTransform,
4383 Transform::orientation_flags rotation,
4384 bool isLocalScreenshot, int* outSyncFd) {
4387 bool secureLayerIsVisible = false;
4388 for (const auto& layer : mDrawingState.layersSortedByZ) {
4389 const Layer::State& state(layer->getDrawingState());
4390 if ((layer->getLayerStack() != hw->getLayerStack()) ||
4391 (state.z < minLayerZ || state.z > maxLayerZ)) {
4394 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
4395 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
4400 if (!isLocalScreenshot && secureLayerIsVisible) {
4401 ALOGW("FB is protected: PERMISSION_DENIED");
4402 return PERMISSION_DENIED;
4406 // create an EGLImage from the buffer so we can later
4407 // turn it into a texture
4408 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
4409 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
4410 if (image == EGL_NO_IMAGE_KHR) {
4414 // This will automatically destroy the image if we return before calling its destroy method
4415 ImageHolder imageHolder(mEGLDisplay, image);
4417 // this binds the given EGLImage as a framebuffer for the
4418 // duration of this scope.
4419 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
4420 if (imageBond.getStatus() != NO_ERROR) {
4421 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4422 return INVALID_OPERATION;
4425 // this will in fact render into our dequeued buffer
4426 // via an FBO, which means we didn't have to create
4427 // an EGLSurface and therefore we're not
4428 // dependent on the context's EGLConfig.
4429 renderScreenImplLocked(
4430 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
4431 useIdentityTransform, rotation);
4433 // Attempt to create a sync khr object that can produce a sync point. If that
4434 // isn't available, create a non-dupable sync object in the fallback path and
4435 // wait on it directly.
4436 EGLSyncKHR sync = EGL_NO_SYNC_KHR;
4437 if (!DEBUG_SCREENSHOTS) {
4438 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
4439 // native fence fd will not be populated until flush() is done.
4440 getRenderEngine().flush();
4443 if (sync != EGL_NO_SYNC_KHR) {
4445 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
4446 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
4447 ALOGW("captureScreen: failed to dup sync khr object");
4450 eglDestroySyncKHR(mEGLDisplay, sync);
4453 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
4454 if (sync != EGL_NO_SYNC_KHR) {
4455 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
4456 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
4457 EGLint eglErr = eglGetError();
4458 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
4459 ALOGW("captureScreen: fence wait timed out");
4461 ALOGW_IF(eglErr != EGL_SUCCESS,
4462 "captureScreen: error waiting on EGL fence: %#x", eglErr);
4464 eglDestroySyncKHR(mEGLDisplay, sync);
4466 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
4469 *outSyncFd = syncFd;
4471 if (DEBUG_SCREENSHOTS) {
4472 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4473 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4474 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4475 hw, minLayerZ, maxLayerZ);
4479 // destroy our image
4480 imageHolder.destroy();
4485 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
4486 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
4487 if (DEBUG_SCREENSHOTS) {
4488 for (size_t y=0 ; y<h ; y++) {
4489 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4490 for (size_t x=0 ; x<w ; x++) {
4491 if (p[x] != 0xFF000000) return;
4494 ALOGE("*** we just took a black screenshot ***\n"
4495 "requested minz=%d, maxz=%d, layerStack=%d",
4496 minLayerZ, maxLayerZ, hw->getLayerStack());
4499 for (const auto& layer : mDrawingState.layersSortedByZ) {
4500 const Layer::State& state(layer->getDrawingState());
4501 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4502 state.z <= maxLayerZ) {
4503 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4504 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f",
4505 layer->isVisible() ? '+' : '-',
4506 i, layer->getName().string(), layer->getLayerStack(), state.z,
4507 layer->isVisible(), state.flags, state.alpha);
4515 // ---------------------------------------------------------------------------
4517 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4518 layersSortedByZ.traverseInZOrder(stateSet, visitor);
4521 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4522 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
4525 }; // namespace android
4528 #if defined(__gl_h_)
4529 #error "don't include gl/gl.h in this file"
4532 #if defined(__gl2_h_)
4533 #error "don't include gl2/gl2.h in this file"