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 signalLayerUpdate();
1383 // Now that we're going to make it to the handleMessageTransaction()
1384 // call below it's safe to call updateVrFlinger(), which will
1385 // potentially trigger a display handoff.
1388 bool refreshNeeded = handleMessageTransaction();
1389 refreshNeeded |= handleMessageInvalidate();
1390 refreshNeeded |= mRepaintEverything;
1391 if (refreshNeeded) {
1392 // Signal a refresh if a transaction modified the window state,
1393 // a new buffer was latched, or if HWC has requested a full
1399 case MessageQueue::REFRESH: {
1400 handleMessageRefresh();
1406 bool SurfaceFlinger::handleMessageTransaction() {
1407 uint32_t transactionFlags = peekTransactionFlags();
1408 if (transactionFlags) {
1409 handleTransaction(transactionFlags);
1415 bool SurfaceFlinger::handleMessageInvalidate() {
1417 return handlePageFlip();
1420 void SurfaceFlinger::handleMessageRefresh() {
1423 mRefreshPending = false;
1425 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1427 preComposition(refreshStartTime);
1428 rebuildLayerStacks();
1430 doDebugFlashRegions();
1432 postComposition(refreshStartTime);
1434 mPreviousPresentFence = mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1436 mHadClientComposition = false;
1437 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1438 const sp<DisplayDevice>& displayDevice = mDisplays[displayId];
1439 mHadClientComposition = mHadClientComposition ||
1440 mHwc->hasClientComposition(displayDevice->getHwcDisplayId());
1443 mLayersWithQueuedFrames.clear();
1446 void SurfaceFlinger::doDebugFlashRegions()
1448 // is debugging enabled
1449 if (CC_LIKELY(!mDebugRegion))
1452 const bool repaintEverything = mRepaintEverything;
1453 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1454 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1455 if (hw->isDisplayOn()) {
1456 // transform the dirty region into this screen's coordinate space
1457 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1458 if (!dirtyRegion.isEmpty()) {
1459 // redraw the whole screen
1460 doComposeSurfaces(hw, Region(hw->bounds()));
1462 // and draw the dirty region
1463 const int32_t height = hw->getHeight();
1464 RenderEngine& engine(getRenderEngine());
1465 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1467 hw->swapBuffers(getHwComposer());
1474 if (mDebugRegion > 1) {
1475 usleep(mDebugRegion * 1000);
1478 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1479 auto& displayDevice = mDisplays[displayId];
1480 if (!displayDevice->isDisplayOn()) {
1484 status_t result = displayDevice->prepareFrame(*mHwc);
1485 ALOGE_IF(result != NO_ERROR, "prepareFrame for display %zd failed:"
1486 " %d (%s)", displayId, result, strerror(-result));
1490 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
1493 ALOGV("preComposition");
1495 bool needExtraInvalidate = false;
1496 mDrawingState.traverseInZOrder([&](Layer* layer) {
1497 if (layer->onPreComposition(refreshStartTime)) {
1498 needExtraInvalidate = true;
1502 if (needExtraInvalidate) {
1503 signalLayerUpdate();
1507 void SurfaceFlinger::updateCompositorTiming(
1508 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1509 std::shared_ptr<FenceTime>& presentFenceTime) {
1510 // Update queue of past composite+present times and determine the
1511 // most recently known composite to present latency.
1512 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1513 nsecs_t compositeToPresentLatency = -1;
1514 while (!mCompositePresentTimes.empty()) {
1515 CompositePresentTime& cpt = mCompositePresentTimes.front();
1516 // Cached values should have been updated before calling this method,
1517 // which helps avoid duplicate syscalls.
1518 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1519 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1522 compositeToPresentLatency = displayTime - cpt.composite;
1523 mCompositePresentTimes.pop();
1526 // Don't let mCompositePresentTimes grow unbounded, just in case.
1527 while (mCompositePresentTimes.size() > 16) {
1528 mCompositePresentTimes.pop();
1531 setCompositorTimingSnapped(
1532 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1535 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1536 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
1537 // Integer division and modulo round toward 0 not -inf, so we need to
1538 // treat negative and positive offsets differently.
1539 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
1540 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1541 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1543 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1544 if (idealLatency <= 0) {
1545 idealLatency = vsyncInterval;
1548 // Snap the latency to a value that removes scheduling jitter from the
1549 // composition and present times, which often have >1ms of jitter.
1550 // Reducing jitter is important if an app attempts to extrapolate
1551 // something (such as user input) to an accurate diasplay time.
1552 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1553 // with (presentLatency % interval).
1554 nsecs_t bias = vsyncInterval / 2;
1555 int64_t extraVsyncs =
1556 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1557 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1558 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
1560 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1561 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1562 mCompositorTiming.interval = vsyncInterval;
1563 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1566 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1569 ALOGV("postComposition");
1571 // Release any buffers which were replaced this frame
1572 nsecs_t dequeueReadyTime = systemTime();
1573 for (auto& layer : mLayersWithQueuedFrames) {
1574 layer->releasePendingBuffer(dequeueReadyTime);
1577 // |mStateLock| not needed as we are on the main thread
1578 const sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
1580 mGlCompositionDoneTimeline.updateSignalTimes();
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;
1590 mDisplayTimeline.updateSignalTimes();
1591 sp<Fence> presentFence = mHwc->getPresentFence(HWC_DISPLAY_PRIMARY);
1592 auto presentFenceTime = std::make_shared<FenceTime>(presentFence);
1593 mDisplayTimeline.push(presentFenceTime);
1595 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1596 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1598 // We use the refreshStartTime which might be sampled a little later than
1599 // when we started doing work for this frame, but that should be okay
1600 // since updateCompositorTiming has snapping logic.
1601 updateCompositorTiming(
1602 vsyncPhase, vsyncInterval, refreshStartTime, presentFenceTime);
1603 CompositorTiming compositorTiming;
1605 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1606 compositorTiming = mCompositorTiming;
1609 mDrawingState.traverseInZOrder([&](Layer* layer) {
1610 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
1611 presentFenceTime, compositorTiming);
1613 recordBufferingStats(layer->getName().string(),
1614 layer->getOccupancyHistory(false));
1618 if (presentFenceTime->isValid()) {
1619 if (mPrimaryDispSync.addPresentFence(presentFenceTime)) {
1620 enableHardwareVsync();
1622 disableHardwareVsync(false);
1626 if (!hasSyncFramework) {
1627 if (hw->isDisplayOn()) {
1628 enableHardwareVsync();
1632 if (mAnimCompositionPending) {
1633 mAnimCompositionPending = false;
1635 if (presentFenceTime->isValid()) {
1636 mAnimFrameTracker.setActualPresentFence(
1637 std::move(presentFenceTime));
1639 // The HWC doesn't support present fences, so use the refresh
1640 // timestamp instead.
1641 nsecs_t presentTime =
1642 mHwc->getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1643 mAnimFrameTracker.setActualPresentTime(presentTime);
1645 mAnimFrameTracker.advanceFrame();
1648 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1652 nsecs_t currentTime = systemTime();
1653 if (mHasPoweredOff) {
1654 mHasPoweredOff = false;
1656 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1657 size_t numPeriods = static_cast<size_t>(elapsedTime / vsyncInterval);
1658 if (numPeriods < NUM_BUCKETS - 1) {
1659 mFrameBuckets[numPeriods] += elapsedTime;
1661 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1663 mTotalTime += elapsedTime;
1665 mLastSwapTime = currentTime;
1668 void SurfaceFlinger::rebuildLayerStacks() {
1670 ALOGV("rebuildLayerStacks");
1672 // rebuild the visible layer list per screen
1673 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1675 mVisibleRegionsDirty = false;
1676 invalidateHwcGeometry();
1678 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1679 Region opaqueRegion;
1681 Vector<sp<Layer>> layersSortedByZ;
1682 const sp<DisplayDevice>& displayDevice(mDisplays[dpy]);
1683 const Transform& tr(displayDevice->getTransform());
1684 const Rect bounds(displayDevice->getBounds());
1685 if (displayDevice->isDisplayOn()) {
1686 computeVisibleRegions(
1687 displayDevice->getLayerStack(), dirtyRegion,
1690 mDrawingState.traverseInZOrder([&](Layer* layer) {
1691 if (layer->getLayerStack() == displayDevice->getLayerStack()) {
1692 Region drawRegion(tr.transform(
1693 layer->visibleNonTransparentRegion));
1694 drawRegion.andSelf(bounds);
1695 if (!drawRegion.isEmpty()) {
1696 layersSortedByZ.add(layer);
1698 // Clear out the HWC layer if this layer was
1699 // previously visible, but no longer is
1700 layer->setHwcLayer(displayDevice->getHwcDisplayId(),
1704 // WM changes displayDevice->layerStack upon sleep/awake.
1705 // Here we make sure we delete the HWC layers even if
1706 // WM changed their layer stack.
1707 layer->setHwcLayer(displayDevice->getHwcDisplayId(),
1712 displayDevice->setVisibleLayersSortedByZ(layersSortedByZ);
1713 displayDevice->undefinedRegion.set(bounds);
1714 displayDevice->undefinedRegion.subtractSelf(
1715 tr.transform(opaqueRegion));
1716 displayDevice->dirtyRegion.orSelf(dirtyRegion);
1721 mat4 SurfaceFlinger::computeSaturationMatrix() const {
1722 if (mSaturation == 1.0f) {
1726 // Rec.709 luma coefficients
1727 float3 luminance{0.213f, 0.715f, 0.072f};
1728 luminance *= 1.0f - mSaturation;
1730 vec4{luminance.r + mSaturation, luminance.r, luminance.r, 0.0f},
1731 vec4{luminance.g, luminance.g + mSaturation, luminance.g, 0.0f},
1732 vec4{luminance.b, luminance.b, luminance.b + mSaturation, 0.0f},
1733 vec4{0.0f, 0.0f, 0.0f, 1.0f}
1737 // pickColorMode translates a given dataspace into the best available color mode.
1738 // Currently only support sRGB and Display-P3.
1739 android_color_mode SurfaceFlinger::pickColorMode(android_dataspace dataSpace) const {
1740 switch (dataSpace) {
1741 // treat Unknown as regular SRGB buffer, since that's what the rest of the
1743 case HAL_DATASPACE_UNKNOWN:
1744 case HAL_DATASPACE_SRGB:
1745 case HAL_DATASPACE_V0_SRGB:
1746 return HAL_COLOR_MODE_SRGB;
1749 case HAL_DATASPACE_DISPLAY_P3:
1750 return HAL_COLOR_MODE_DISPLAY_P3;
1754 // TODO (courtneygo): Do we want to assert an error here?
1755 ALOGE("No color mode mapping for %s (%#x)", dataspaceDetails(dataSpace).c_str(),
1757 return HAL_COLOR_MODE_SRGB;
1762 android_dataspace SurfaceFlinger::bestTargetDataSpace(
1763 android_dataspace a, android_dataspace b) const {
1764 // Only support sRGB and Display-P3 right now.
1765 if (a == HAL_DATASPACE_DISPLAY_P3 || b == HAL_DATASPACE_DISPLAY_P3) {
1766 return HAL_DATASPACE_DISPLAY_P3;
1768 if (a == HAL_DATASPACE_V0_SCRGB_LINEAR || b == HAL_DATASPACE_V0_SCRGB_LINEAR) {
1769 return HAL_DATASPACE_DISPLAY_P3;
1771 if (a == HAL_DATASPACE_V0_SCRGB || b == HAL_DATASPACE_V0_SCRGB) {
1772 return HAL_DATASPACE_DISPLAY_P3;
1775 return HAL_DATASPACE_V0_SRGB;
1778 void SurfaceFlinger::setUpHWComposer() {
1780 ALOGV("setUpHWComposer");
1782 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1783 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1784 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1785 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1787 // If nothing has changed (!dirty), don't recompose.
1788 // If something changed, but we don't currently have any visible layers,
1789 // and didn't when we last did a composition, then skip it this time.
1790 // The second rule does two things:
1791 // - When all layers are removed from a display, we'll emit one black
1792 // frame, then nothing more until we get new layers.
1793 // - When a display is created with a private layer stack, we won't
1794 // emit any black frames until a layer is added to the layer stack.
1795 bool mustRecompose = dirty && !(empty && wasEmpty);
1797 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1798 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1799 mustRecompose ? "doing" : "skipping",
1802 wasEmpty ? "+" : "-");
1804 mDisplays[dpy]->beginFrame(mustRecompose);
1806 if (mustRecompose) {
1807 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1811 // build the h/w work list
1812 if (CC_UNLIKELY(mGeometryInvalid)) {
1813 mGeometryInvalid = false;
1814 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1815 sp<const DisplayDevice> displayDevice(mDisplays[dpy]);
1816 const auto hwcId = displayDevice->getHwcDisplayId();
1818 const Vector<sp<Layer>>& currentLayers(
1819 displayDevice->getVisibleLayersSortedByZ());
1820 for (size_t i = 0; i < currentLayers.size(); i++) {
1821 const auto& layer = currentLayers[i];
1822 if (!layer->hasHwcLayer(hwcId)) {
1823 auto hwcLayer = mHwc->createLayer(hwcId);
1825 layer->setHwcLayer(hwcId, std::move(hwcLayer));
1827 layer->forceClientComposition(hwcId);
1832 layer->setGeometry(displayDevice, i);
1833 if (mDebugDisableHWC || mDebugRegion) {
1834 layer->forceClientComposition(hwcId);
1842 mat4 colorMatrix = mColorMatrix * computeSaturationMatrix() * mDaltonizer();
1844 // Set the per-frame data
1845 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1846 auto& displayDevice = mDisplays[displayId];
1847 const auto hwcId = displayDevice->getHwcDisplayId();
1852 if (colorMatrix != mPreviousColorMatrix) {
1853 status_t result = mHwc->setColorTransform(hwcId, colorMatrix);
1854 ALOGE_IF(result != NO_ERROR, "Failed to set color transform on "
1855 "display %zd: %d", displayId, result);
1857 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1858 layer->setPerFrameData(displayDevice);
1861 if (hasWideColorDisplay) {
1862 android_color_mode newColorMode;
1863 android_dataspace newDataSpace = HAL_DATASPACE_V0_SRGB;
1865 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1866 newDataSpace = bestTargetDataSpace(layer->getDataSpace(), newDataSpace);
1867 ALOGV("layer: %s, dataspace: %s (%#x), newDataSpace: %s (%#x)",
1868 layer->getName().string(), dataspaceDetails(layer->getDataSpace()).c_str(),
1869 layer->getDataSpace(), dataspaceDetails(newDataSpace).c_str(), newDataSpace);
1871 newColorMode = pickColorMode(newDataSpace);
1873 // We want the color mode of the boot animation to match that of the bootloader
1874 // To achieve this we suppress color mode changes until after the boot animation
1875 if (mBootFinished) {
1876 setActiveColorModeInternal(displayDevice, newColorMode);
1877 displayDevice->setCompositionDataSpace(newDataSpace);
1882 mPreviousColorMatrix = colorMatrix;
1884 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1885 auto& displayDevice = mDisplays[displayId];
1886 if (!displayDevice->isDisplayOn()) {
1890 status_t result = displayDevice->prepareFrame(*mHwc);
1891 ALOGE_IF(result != NO_ERROR, "prepareFrame for display %zd failed:"
1892 " %d (%s)", displayId, result, strerror(-result));
1896 void SurfaceFlinger::doComposition() {
1898 ALOGV("doComposition");
1900 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1901 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1902 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1903 if (hw->isDisplayOn()) {
1904 // transform the dirty region into this screen's coordinate space
1905 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1907 // repaint the framebuffer (if needed)
1908 doDisplayComposition(hw, dirtyRegion);
1910 hw->dirtyRegion.clear();
1911 hw->flip(hw->swapRegion);
1912 hw->swapRegion.clear();
1918 void SurfaceFlinger::postFramebuffer()
1921 ALOGV("postFramebuffer");
1923 const nsecs_t now = systemTime();
1924 mDebugInSwapBuffers = now;
1926 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
1927 auto& displayDevice = mDisplays[displayId];
1928 if (!displayDevice->isDisplayOn()) {
1931 const auto hwcId = displayDevice->getHwcDisplayId();
1933 mHwc->presentAndGetReleaseFences(hwcId);
1935 displayDevice->onSwapBuffersCompleted();
1936 displayDevice->makeCurrent(mEGLDisplay, mEGLContext);
1937 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
1938 sp<Fence> releaseFence = Fence::NO_FENCE;
1939 if (layer->getCompositionType(hwcId) == HWC2::Composition::Client) {
1940 releaseFence = displayDevice->getClientTargetAcquireFence();
1942 auto hwcLayer = layer->getHwcLayer(hwcId);
1943 releaseFence = mHwc->getLayerReleaseFence(hwcId, hwcLayer);
1945 layer->onLayerDisplayed(releaseFence);
1948 mHwc->clearReleaseFences(hwcId);
1952 mLastSwapBufferTime = systemTime() - now;
1953 mDebugInSwapBuffers = 0;
1955 // |mStateLock| not needed as we are on the main thread
1956 uint32_t flipCount = getDefaultDisplayDeviceLocked()->getPageFlipCount();
1957 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1962 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1966 // here we keep a copy of the drawing state (that is the state that's
1967 // going to be overwritten by handleTransactionLocked()) outside of
1968 // mStateLock so that the side-effects of the State assignment
1969 // don't happen with mStateLock held (which can cause deadlocks).
1970 State drawingState(mDrawingState);
1972 Mutex::Autolock _l(mStateLock);
1973 const nsecs_t now = systemTime();
1974 mDebugInTransaction = now;
1976 // Here we're guaranteed that some transaction flags are set
1977 // so we can call handleTransactionLocked() unconditionally.
1978 // We call getTransactionFlags(), which will also clear the flags,
1979 // with mStateLock held to guarantee that mCurrentState won't change
1980 // until the transaction is committed.
1982 transactionFlags = getTransactionFlags(eTransactionMask);
1983 handleTransactionLocked(transactionFlags);
1985 mLastTransactionTime = systemTime() - now;
1986 mDebugInTransaction = 0;
1987 invalidateHwcGeometry();
1988 // here the transaction has been committed
1991 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1993 // Notify all layers of available frames
1994 mCurrentState.traverseInZOrder([](Layer* layer) {
1995 layer->notifyAvailableFrames();
1999 * Traversal of the children
2000 * (perform the transaction for each of them if needed)
2003 if (transactionFlags & eTraversalNeeded) {
2004 mCurrentState.traverseInZOrder([&](Layer* layer) {
2005 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
2006 if (!trFlags) return;
2008 const uint32_t flags = layer->doTransaction(0);
2009 if (flags & Layer::eVisibleRegion)
2010 mVisibleRegionsDirty = true;
2015 * Perform display own transactions if needed
2018 if (transactionFlags & eDisplayTransactionNeeded) {
2019 // here we take advantage of Vector's copy-on-write semantics to
2020 // improve performance by skipping the transaction entirely when
2021 // know that the lists are identical
2022 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
2023 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
2024 if (!curr.isIdenticalTo(draw)) {
2025 mVisibleRegionsDirty = true;
2026 const size_t cc = curr.size();
2027 size_t dc = draw.size();
2029 // find the displays that were removed
2030 // (ie: in drawing state but not in current state)
2031 // also handle displays that changed
2032 // (ie: displays that are in both lists)
2033 for (size_t i=0 ; i<dc ; i++) {
2034 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
2036 // in drawing state but not in current state
2037 if (!draw[i].isMainDisplay()) {
2038 // Call makeCurrent() on the primary display so we can
2039 // be sure that nothing associated with this display
2041 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
2042 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
2043 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
2045 hw->disconnect(getHwComposer());
2046 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
2047 mEventThread->onHotplugReceived(draw[i].type, false);
2048 mDisplays.removeItem(draw.keyAt(i));
2050 ALOGW("trying to remove the main display");
2053 // this display is in both lists. see if something changed.
2054 const DisplayDeviceState& state(curr[j]);
2055 const wp<IBinder>& display(curr.keyAt(j));
2056 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
2057 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
2058 if (state_binder != draw_binder) {
2059 // changing the surface is like destroying and
2060 // recreating the DisplayDevice, so we just remove it
2061 // from the drawing state, so that it get re-added
2063 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
2065 hw->disconnect(getHwComposer());
2066 mDisplays.removeItem(display);
2067 mDrawingState.displays.removeItemsAt(i);
2069 // at this point we must loop to the next item
2073 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
2075 if (state.layerStack != draw[i].layerStack) {
2076 disp->setLayerStack(state.layerStack);
2078 if ((state.orientation != draw[i].orientation)
2079 || (state.viewport != draw[i].viewport)
2080 || (state.frame != draw[i].frame))
2082 disp->setProjection(state.orientation,
2083 state.viewport, state.frame);
2085 if (state.width != draw[i].width || state.height != draw[i].height) {
2086 disp->setDisplaySize(state.width, state.height);
2092 // find displays that were added
2093 // (ie: in current state but not in drawing state)
2094 for (size_t i=0 ; i<cc ; i++) {
2095 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
2096 const DisplayDeviceState& state(curr[i]);
2098 sp<DisplaySurface> dispSurface;
2099 sp<IGraphicBufferProducer> producer;
2100 sp<IGraphicBufferProducer> bqProducer;
2101 sp<IGraphicBufferConsumer> bqConsumer;
2102 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
2105 if (state.isVirtualDisplay()) {
2106 // Virtual displays without a surface are dormant:
2107 // they have external state (layer stack, projection,
2108 // etc.) but no internal state (i.e. a DisplayDevice).
2109 if (state.surface != NULL) {
2111 // Allow VR composer to use virtual displays.
2112 if (mUseHwcVirtualDisplays || mHwc == mVrHwc) {
2114 int status = state.surface->query(
2115 NATIVE_WINDOW_WIDTH, &width);
2116 ALOGE_IF(status != NO_ERROR,
2117 "Unable to query width (%d)", status);
2119 status = state.surface->query(
2120 NATIVE_WINDOW_HEIGHT, &height);
2121 ALOGE_IF(status != NO_ERROR,
2122 "Unable to query height (%d)", status);
2124 status = state.surface->query(
2125 NATIVE_WINDOW_FORMAT, &intFormat);
2126 ALOGE_IF(status != NO_ERROR,
2127 "Unable to query format (%d)", status);
2128 auto format = static_cast<android_pixel_format_t>(
2131 mHwc->allocateVirtualDisplay(width, height, &format,
2135 // TODO: Plumb requested format back up to consumer
2137 sp<VirtualDisplaySurface> vds =
2138 new VirtualDisplaySurface(*mHwc,
2139 hwcId, state.surface, bqProducer,
2140 bqConsumer, state.displayName);
2146 ALOGE_IF(state.surface!=NULL,
2147 "adding a supported display, but rendering "
2148 "surface is provided (%p), ignoring it",
2149 state.surface.get());
2152 dispSurface = new FramebufferSurface(*mHwc, hwcId, bqConsumer);
2153 producer = bqProducer;
2156 const wp<IBinder>& display(curr.keyAt(i));
2157 if (dispSurface != NULL) {
2158 sp<DisplayDevice> hw =
2159 new DisplayDevice(this, state.type, hwcId, state.isSecure, display,
2160 dispSurface, producer,
2161 mRenderEngine->getEGLConfig(),
2162 hasWideColorDisplay);
2163 hw->setLayerStack(state.layerStack);
2164 hw->setProjection(state.orientation,
2165 state.viewport, state.frame);
2166 hw->setDisplayName(state.displayName);
2167 mDisplays.add(display, hw);
2168 if (!state.isVirtualDisplay()) {
2169 mEventThread->onHotplugReceived(state.type, true);
2177 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
2178 // The transform hint might have changed for some layers
2179 // (either because a display has changed, or because a layer
2182 // Walk through all the layers in currentLayers,
2183 // and update their transform hint.
2185 // If a layer is visible only on a single display, then that
2186 // display is used to calculate the hint, otherwise we use the
2189 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
2190 // the hint is set before we acquire a buffer from the surface texture.
2192 // NOTE: layer transactions have taken place already, so we use their
2193 // drawing state. However, SurfaceFlinger's own transaction has not
2194 // happened yet, so we must use the current state layer list
2195 // (soon to become the drawing state list).
2197 sp<const DisplayDevice> disp;
2198 uint32_t currentlayerStack = 0;
2200 mCurrentState.traverseInZOrder([&](Layer* layer) {
2201 // NOTE: we rely on the fact that layers are sorted by
2202 // layerStack first (so we don't have to traverse the list
2203 // of displays for every layer).
2204 uint32_t layerStack = layer->getLayerStack();
2205 if (first || currentlayerStack != layerStack) {
2206 currentlayerStack = layerStack;
2207 // figure out if this layerstack is mirrored
2208 // (more than one display) if so, pick the default display,
2209 // if not, pick the only display it's on.
2211 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2212 sp<const DisplayDevice> hw(mDisplays[dpy]);
2213 if (hw->getLayerStack() == currentlayerStack) {
2224 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
2225 // redraw after transform hint changes. See bug 8508397.
2227 // could be null when this layer is using a layerStack
2228 // that is not visible on any display. Also can occur at
2229 // screen off/on times.
2230 disp = getDefaultDisplayDeviceLocked();
2232 layer->updateTransformHint(disp);
2240 * Perform our own transaction if needed
2244 mLayersAdded = false;
2245 // Layers have been added.
2246 mVisibleRegionsDirty = true;
2249 // some layers might have been removed, so
2250 // we need to update the regions they're exposing.
2251 if (mLayersRemoved) {
2252 mLayersRemoved = false;
2253 mVisibleRegionsDirty = true;
2254 mDrawingState.traverseInZOrder([&](Layer* layer) {
2255 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
2256 // this layer is not visible anymore
2257 // TODO: we could traverse the tree from front to back and
2258 // compute the actual visible region
2259 // TODO: we could cache the transformed region
2261 visibleReg.set(layer->computeScreenBounds());
2262 invalidateLayerStack(layer->getLayerStack(), visibleReg);
2267 commitTransaction();
2269 updateCursorAsync();
2272 void SurfaceFlinger::updateCursorAsync()
2274 for (size_t displayId = 0; displayId < mDisplays.size(); ++displayId) {
2275 auto& displayDevice = mDisplays[displayId];
2276 if (displayDevice->getHwcDisplayId() < 0) {
2280 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2281 layer->updateCursorPosition(displayDevice);
2286 void SurfaceFlinger::commitTransaction()
2288 if (!mLayersPendingRemoval.isEmpty()) {
2289 // Notify removed layers now that they can't be drawn from
2290 for (const auto& l : mLayersPendingRemoval) {
2291 recordBufferingStats(l->getName().string(),
2292 l->getOccupancyHistory(true));
2295 mLayersPendingRemoval.clear();
2298 // If this transaction is part of a window animation then the next frame
2299 // we composite should be considered an animation as well.
2300 mAnimCompositionPending = mAnimTransactionPending;
2302 mDrawingState = mCurrentState;
2303 mDrawingState.traverseInZOrder([](Layer* layer) {
2304 layer->commitChildList();
2306 mTransactionPending = false;
2307 mAnimTransactionPending = false;
2308 mTransactionCV.broadcast();
2311 void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
2312 Region& outDirtyRegion, Region& outOpaqueRegion)
2315 ALOGV("computeVisibleRegions");
2317 Region aboveOpaqueLayers;
2318 Region aboveCoveredLayers;
2321 outDirtyRegion.clear();
2323 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
2324 // start with the whole surface at its current location
2325 const Layer::State& s(layer->getDrawingState());
2327 // only consider the layers on the given layer stack
2328 if (layer->getLayerStack() != layerStack)
2332 * opaqueRegion: area of a surface that is fully opaque.
2334 Region opaqueRegion;
2337 * visibleRegion: area of a surface that is visible on screen
2338 * and not fully transparent. This is essentially the layer's
2339 * footprint minus the opaque regions above it.
2340 * Areas covered by a translucent surface are considered visible.
2342 Region visibleRegion;
2345 * coveredRegion: area of a surface that is covered by all
2346 * visible regions above it (which includes the translucent areas).
2348 Region coveredRegion;
2351 * transparentRegion: area of a surface that is hinted to be completely
2352 * transparent. This is only used to tell when the layer has no visible
2353 * non-transparent regions and can be removed from the layer list. It
2354 * does not affect the visibleRegion of this layer or any layers
2355 * beneath it. The hint may not be correct if apps don't respect the
2356 * SurfaceView restrictions (which, sadly, some don't).
2358 Region transparentRegion;
2361 // handle hidden surfaces by setting the visible region to empty
2362 if (CC_LIKELY(layer->isVisible())) {
2363 const bool translucent = !layer->isOpaque(s);
2364 Rect bounds(layer->computeScreenBounds());
2365 visibleRegion.set(bounds);
2366 Transform tr = layer->getTransform();
2367 if (!visibleRegion.isEmpty()) {
2368 // Remove the transparent area from the visible region
2370 if (tr.preserveRects()) {
2371 // transform the transparent region
2372 transparentRegion = tr.transform(s.activeTransparentRegion);
2374 // transformation too complex, can't do the
2375 // transparent region optimization.
2376 transparentRegion.clear();
2380 // compute the opaque region
2381 const int32_t layerOrientation = tr.getOrientation();
2382 if (s.alpha == 1.0f && !translucent &&
2383 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2384 // the opaque region is the layer's footprint
2385 opaqueRegion = visibleRegion;
2390 // Clip the covered region to the visible region
2391 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2393 // Update aboveCoveredLayers for next (lower) layer
2394 aboveCoveredLayers.orSelf(visibleRegion);
2396 // subtract the opaque region covered by the layers above us
2397 visibleRegion.subtractSelf(aboveOpaqueLayers);
2399 // compute this layer's dirty region
2400 if (layer->contentDirty) {
2401 // we need to invalidate the whole region
2402 dirty = visibleRegion;
2403 // as well, as the old visible region
2404 dirty.orSelf(layer->visibleRegion);
2405 layer->contentDirty = false;
2407 /* compute the exposed region:
2408 * the exposed region consists of two components:
2409 * 1) what's VISIBLE now and was COVERED before
2410 * 2) what's EXPOSED now less what was EXPOSED before
2412 * note that (1) is conservative, we start with the whole
2413 * visible region but only keep what used to be covered by
2414 * something -- which mean it may have been exposed.
2416 * (2) handles areas that were not covered by anything but got
2417 * exposed because of a resize.
2419 const Region newExposed = visibleRegion - coveredRegion;
2420 const Region oldVisibleRegion = layer->visibleRegion;
2421 const Region oldCoveredRegion = layer->coveredRegion;
2422 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2423 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2425 dirty.subtractSelf(aboveOpaqueLayers);
2427 // accumulate to the screen dirty region
2428 outDirtyRegion.orSelf(dirty);
2430 // Update aboveOpaqueLayers for next (lower) layer
2431 aboveOpaqueLayers.orSelf(opaqueRegion);
2433 // Store the visible region in screen space
2434 layer->setVisibleRegion(visibleRegion);
2435 layer->setCoveredRegion(coveredRegion);
2436 layer->setVisibleNonTransparentRegion(
2437 visibleRegion.subtract(transparentRegion));
2440 outOpaqueRegion = aboveOpaqueLayers;
2443 void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2444 const Region& dirty) {
2445 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2446 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2447 if (hw->getLayerStack() == layerStack) {
2448 hw->dirtyRegion.orSelf(dirty);
2453 bool SurfaceFlinger::handlePageFlip()
2455 ALOGV("handlePageFlip");
2457 nsecs_t latchTime = systemTime();
2459 bool visibleRegions = false;
2460 bool frameQueued = false;
2461 bool newDataLatched = false;
2463 // Store the set of layers that need updates. This set must not change as
2464 // buffers are being latched, as this could result in a deadlock.
2465 // Example: Two producers share the same command stream and:
2466 // 1.) Layer 0 is latched
2467 // 2.) Layer 0 gets a new frame
2468 // 2.) Layer 1 gets a new frame
2469 // 3.) Layer 1 is latched.
2470 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2471 // second frame. But layer 0's second frame could be waiting on display.
2472 mDrawingState.traverseInZOrder([&](Layer* layer) {
2473 if (layer->hasQueuedFrame()) {
2475 if (layer->shouldPresentNow(mPrimaryDispSync)) {
2476 mLayersWithQueuedFrames.push_back(layer);
2478 layer->useEmptyDamage();
2481 layer->useEmptyDamage();
2485 for (auto& layer : mLayersWithQueuedFrames) {
2486 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
2487 layer->useSurfaceDamage();
2488 invalidateLayerStack(layer->getLayerStack(), dirty);
2489 if (layer->isBufferLatched()) {
2490 newDataLatched = true;
2494 mVisibleRegionsDirty |= visibleRegions;
2496 // If we will need to wake up at some time in the future to deal with a
2497 // queued frame that shouldn't be displayed during this vsync period, wake
2498 // up during the next vsync period to check again.
2499 if (frameQueued && (mLayersWithQueuedFrames.empty() || !newDataLatched)) {
2500 signalLayerUpdate();
2503 // Only continue with the refresh if there is actually new work to do
2504 return !mLayersWithQueuedFrames.empty() && newDataLatched;
2507 void SurfaceFlinger::invalidateHwcGeometry()
2509 mGeometryInvalid = true;
2513 void SurfaceFlinger::doDisplayComposition(
2514 const sp<const DisplayDevice>& displayDevice,
2515 const Region& inDirtyRegion)
2517 // We only need to actually compose the display if:
2518 // 1) It is being handled by hardware composer, which may need this to
2519 // keep its virtual display state machine in sync, or
2520 // 2) There is work to be done (the dirty region isn't empty)
2521 bool isHwcDisplay = displayDevice->getHwcDisplayId() >= 0;
2522 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2523 ALOGV("Skipping display composition");
2527 ALOGV("doDisplayComposition");
2529 Region dirtyRegion(inDirtyRegion);
2531 // compute the invalid region
2532 displayDevice->swapRegion.orSelf(dirtyRegion);
2534 uint32_t flags = displayDevice->getFlags();
2535 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2536 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2537 // takes a rectangle, we must make sure to update that whole
2538 // rectangle in that case
2539 dirtyRegion.set(displayDevice->swapRegion.bounds());
2541 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2542 // We need to redraw the rectangle that will be updated
2543 // (pushed to the framebuffer).
2544 // This is needed because PARTIAL_UPDATES only takes one
2545 // rectangle instead of a region (see DisplayDevice::flip())
2546 dirtyRegion.set(displayDevice->swapRegion.bounds());
2548 // we need to redraw everything (the whole screen)
2549 dirtyRegion.set(displayDevice->bounds());
2550 displayDevice->swapRegion = dirtyRegion;
2554 if (!doComposeSurfaces(displayDevice, dirtyRegion)) return;
2556 // update the swap region and clear the dirty region
2557 displayDevice->swapRegion.orSelf(dirtyRegion);
2559 // swap buffers (presentation)
2560 displayDevice->swapBuffers(getHwComposer());
2563 bool SurfaceFlinger::doComposeSurfaces(
2564 const sp<const DisplayDevice>& displayDevice, const Region& dirty)
2566 ALOGV("doComposeSurfaces");
2568 const auto hwcId = displayDevice->getHwcDisplayId();
2570 mat4 oldColorMatrix;
2571 const bool applyColorMatrix = !mHwc->hasDeviceComposition(hwcId) &&
2572 !mHwc->hasCapability(HWC2::Capability::SkipClientColorTransform);
2573 if (applyColorMatrix) {
2574 mat4 colorMatrix = mColorMatrix * mDaltonizer();
2575 oldColorMatrix = getRenderEngine().setupColorTransform(colorMatrix);
2578 bool hasClientComposition = mHwc->hasClientComposition(hwcId);
2579 if (hasClientComposition) {
2580 ALOGV("hasClientComposition");
2583 mRenderEngine->setWideColor(displayDevice->getWideColorSupport());
2584 mRenderEngine->setColorMode(displayDevice->getActiveColorMode());
2586 if (!displayDevice->makeCurrent(mEGLDisplay, mEGLContext)) {
2587 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2588 displayDevice->getDisplayName().string());
2589 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2591 // |mStateLock| not needed as we are on the main thread
2592 if(!getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext)) {
2593 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2598 // Never touch the framebuffer if we don't have any framebuffer layers
2599 const bool hasDeviceComposition = mHwc->hasDeviceComposition(hwcId);
2600 if (hasDeviceComposition) {
2601 // when using overlays, we assume a fully transparent framebuffer
2602 // NOTE: we could reduce how much we need to clear, for instance
2603 // remove where there are opaque FB layers. however, on some
2604 // GPUs doing a "clean slate" clear might be more efficient.
2605 // We'll revisit later if needed.
2606 mRenderEngine->clearWithColor(0, 0, 0, 0);
2608 // we start with the whole screen area
2609 const Region bounds(displayDevice->getBounds());
2611 // we remove the scissor part
2612 // we're left with the letterbox region
2613 // (common case is that letterbox ends-up being empty)
2614 const Region letterbox(bounds.subtract(displayDevice->getScissor()));
2616 // compute the area to clear
2617 Region region(displayDevice->undefinedRegion.merge(letterbox));
2619 // but limit it to the dirty region
2620 region.andSelf(dirty);
2622 // screen is already cleared here
2623 if (!region.isEmpty()) {
2624 // can happen with SurfaceView
2625 drawWormhole(displayDevice, region);
2629 if (displayDevice->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2630 // just to be on the safe side, we don't set the
2631 // scissor on the main display. It should never be needed
2632 // anyways (though in theory it could since the API allows it).
2633 const Rect& bounds(displayDevice->getBounds());
2634 const Rect& scissor(displayDevice->getScissor());
2635 if (scissor != bounds) {
2636 // scissor doesn't match the screen's dimensions, so we
2637 // need to clear everything outside of it and enable
2638 // the GL scissor so we don't draw anything where we shouldn't
2640 // enable scissor for this frame
2641 const uint32_t height = displayDevice->getHeight();
2642 mRenderEngine->setScissor(scissor.left, height - scissor.bottom,
2643 scissor.getWidth(), scissor.getHeight());
2649 * and then, render the layers targeted at the framebuffer
2652 ALOGV("Rendering client layers");
2653 const Transform& displayTransform = displayDevice->getTransform();
2655 // we're using h/w composer
2656 bool firstLayer = true;
2657 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2658 const Region clip(dirty.intersect(
2659 displayTransform.transform(layer->visibleRegion)));
2660 ALOGV("Layer: %s", layer->getName().string());
2661 ALOGV(" Composition type: %s",
2662 to_string(layer->getCompositionType(hwcId)).c_str());
2663 if (!clip.isEmpty()) {
2664 switch (layer->getCompositionType(hwcId)) {
2665 case HWC2::Composition::Cursor:
2666 case HWC2::Composition::Device:
2667 case HWC2::Composition::Sideband:
2668 case HWC2::Composition::SolidColor: {
2669 const Layer::State& state(layer->getDrawingState());
2670 if (layer->getClearClientTarget(hwcId) && !firstLayer &&
2671 layer->isOpaque(state) && (state.alpha == 1.0f)
2672 && hasClientComposition) {
2673 // never clear the very first layer since we're
2674 // guaranteed the FB is already cleared
2675 layer->clearWithOpenGL(displayDevice);
2679 case HWC2::Composition::Client: {
2680 layer->draw(displayDevice, clip);
2687 ALOGV(" Skipping for empty clip");
2692 // we're not using h/w composer
2693 for (auto& layer : displayDevice->getVisibleLayersSortedByZ()) {
2694 const Region clip(dirty.intersect(
2695 displayTransform.transform(layer->visibleRegion)));
2696 if (!clip.isEmpty()) {
2697 layer->draw(displayDevice, clip);
2702 if (applyColorMatrix) {
2703 getRenderEngine().setupColorTransform(oldColorMatrix);
2706 // disable scissor at the end of the frame
2707 mRenderEngine->disableScissor();
2711 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& displayDevice, const Region& region) const {
2712 const int32_t height = displayDevice->getHeight();
2713 RenderEngine& engine(getRenderEngine());
2714 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2717 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2718 const sp<IBinder>& handle,
2719 const sp<IGraphicBufferProducer>& gbc,
2720 const sp<Layer>& lbc,
2721 const sp<Layer>& parent)
2723 // add this layer to the current state list
2725 Mutex::Autolock _l(mStateLock);
2726 if (mNumLayers >= MAX_LAYERS) {
2727 ALOGE("AddClientLayer failed, mNumLayers (%zu) >= MAX_LAYERS (%zu)", mNumLayers,
2731 if (parent == nullptr) {
2732 mCurrentState.layersSortedByZ.add(lbc);
2734 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2735 ALOGE("addClientLayer called with a removed parent");
2736 return NAME_NOT_FOUND;
2738 parent->addChild(lbc);
2741 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2742 mLayersAdded = true;
2746 // attach this layer to the client
2747 client->attachLayer(handle, lbc);
2752 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
2753 Mutex::Autolock _l(mStateLock);
2755 const auto& p = layer->getParent();
2762 sp<Layer> ancestor = p;
2763 while (ancestor->getParent() != nullptr) {
2764 ancestor = ancestor->getParent();
2766 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2767 ALOGE("removeLayer called with a layer whose parent has been removed");
2768 return NAME_NOT_FOUND;
2771 index = p->removeChild(layer);
2773 index = mCurrentState.layersSortedByZ.remove(layer);
2776 // As a matter of normal operation, the LayerCleaner will produce a second
2777 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2778 // so we will succeed in promoting it, but it's already been removed
2779 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2780 // otherwise something has gone wrong and we are leaking the layer.
2781 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
2782 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2783 layer->getName().string(),
2784 (p != nullptr) ? p->getName().string() : "no-parent");
2786 } else if (index < 0) {
2790 mLayersPendingRemoval.add(layer);
2791 mLayersRemoved = true;
2792 mNumLayers -= 1 + layer->getChildrenCount();
2793 setTransactionFlags(eTransactionNeeded);
2797 uint32_t SurfaceFlinger::peekTransactionFlags() {
2798 return android_atomic_release_load(&mTransactionFlags);
2801 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2802 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2805 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2806 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2807 if ((old & flags)==0) { // wake the server up
2808 signalTransaction();
2813 void SurfaceFlinger::setTransactionState(
2814 const Vector<ComposerState>& state,
2815 const Vector<DisplayState>& displays,
2819 Mutex::Autolock _l(mStateLock);
2820 uint32_t transactionFlags = 0;
2822 if (flags & eAnimation) {
2823 // For window updates that are part of an animation we must wait for
2824 // previous animation "frames" to be handled.
2825 while (mAnimTransactionPending) {
2826 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2827 if (CC_UNLIKELY(err != NO_ERROR)) {
2828 // just in case something goes wrong in SF, return to the
2829 // caller after a few seconds.
2830 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2831 "waiting for previous animation frame");
2832 mAnimTransactionPending = false;
2838 size_t count = displays.size();
2839 for (size_t i=0 ; i<count ; i++) {
2840 const DisplayState& s(displays[i]);
2841 transactionFlags |= setDisplayStateLocked(s);
2844 count = state.size();
2845 for (size_t i=0 ; i<count ; i++) {
2846 const ComposerState& s(state[i]);
2847 // Here we need to check that the interface we're given is indeed
2848 // one of our own. A malicious client could give us a NULL
2849 // IInterface, or one of its own or even one of our own but a
2850 // different type. All these situations would cause us to crash.
2852 // NOTE: it would be better to use RTTI as we could directly check
2853 // that we have a Client*. however, RTTI is disabled in Android.
2854 if (s.client != NULL) {
2855 sp<IBinder> binder = IInterface::asBinder(s.client);
2856 if (binder != NULL) {
2857 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
2858 sp<Client> client( static_cast<Client *>(s.client.get()) );
2859 transactionFlags |= setClientStateLocked(client, s.state);
2865 // If a synchronous transaction is explicitly requested without any changes,
2866 // force a transaction anyway. This can be used as a flush mechanism for
2867 // previous async transactions.
2868 if (transactionFlags == 0 && (flags & eSynchronous)) {
2869 transactionFlags = eTransactionNeeded;
2872 if (transactionFlags) {
2873 if (mInterceptor.isEnabled()) {
2874 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2877 // this triggers the transaction
2878 setTransactionFlags(transactionFlags);
2880 // if this is a synchronous transaction, wait for it to take effect
2881 // before returning.
2882 if (flags & eSynchronous) {
2883 mTransactionPending = true;
2885 if (flags & eAnimation) {
2886 mAnimTransactionPending = true;
2888 while (mTransactionPending) {
2889 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2890 if (CC_UNLIKELY(err != NO_ERROR)) {
2891 // just in case something goes wrong in SF, return to the
2892 // called after a few seconds.
2893 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2894 mTransactionPending = false;
2901 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2903 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2908 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2909 if (disp.isValid()) {
2910 const uint32_t what = s.what;
2911 if (what & DisplayState::eSurfaceChanged) {
2912 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2913 disp.surface = s.surface;
2914 flags |= eDisplayTransactionNeeded;
2917 if (what & DisplayState::eLayerStackChanged) {
2918 if (disp.layerStack != s.layerStack) {
2919 disp.layerStack = s.layerStack;
2920 flags |= eDisplayTransactionNeeded;
2923 if (what & DisplayState::eDisplayProjectionChanged) {
2924 if (disp.orientation != s.orientation) {
2925 disp.orientation = s.orientation;
2926 flags |= eDisplayTransactionNeeded;
2928 if (disp.frame != s.frame) {
2929 disp.frame = s.frame;
2930 flags |= eDisplayTransactionNeeded;
2932 if (disp.viewport != s.viewport) {
2933 disp.viewport = s.viewport;
2934 flags |= eDisplayTransactionNeeded;
2937 if (what & DisplayState::eDisplaySizeChanged) {
2938 if (disp.width != s.width) {
2939 disp.width = s.width;
2940 flags |= eDisplayTransactionNeeded;
2942 if (disp.height != s.height) {
2943 disp.height = s.height;
2944 flags |= eDisplayTransactionNeeded;
2951 uint32_t SurfaceFlinger::setClientStateLocked(
2952 const sp<Client>& client,
2953 const layer_state_t& s)
2956 sp<Layer> layer(client->getLayerUser(s.surface));
2958 const uint32_t what = s.what;
2959 bool geometryAppliesWithResize =
2960 what & layer_state_t::eGeometryAppliesWithResize;
2961 if (what & layer_state_t::ePositionChanged) {
2962 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2963 flags |= eTraversalNeeded;
2966 if (what & layer_state_t::eLayerChanged) {
2967 // NOTE: index needs to be calculated before we update the state
2968 const auto& p = layer->getParent();
2970 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2971 if (layer->setLayer(s.z) && idx >= 0) {
2972 mCurrentState.layersSortedByZ.removeAt(idx);
2973 mCurrentState.layersSortedByZ.add(layer);
2974 // we need traversal (state changed)
2975 // AND transaction (list changed)
2976 flags |= eTransactionNeeded|eTraversalNeeded;
2979 if (p->setChildLayer(layer, s.z)) {
2980 flags |= eTransactionNeeded|eTraversalNeeded;
2984 if (what & layer_state_t::eRelativeLayerChanged) {
2985 if (layer->setRelativeLayer(s.relativeLayerHandle, s.z)) {
2986 flags |= eTransactionNeeded|eTraversalNeeded;
2989 if (what & layer_state_t::eSizeChanged) {
2990 if (layer->setSize(s.w, s.h)) {
2991 flags |= eTraversalNeeded;
2994 if (what & layer_state_t::eAlphaChanged) {
2995 if (layer->setAlpha(s.alpha))
2996 flags |= eTraversalNeeded;
2998 if (what & layer_state_t::eMatrixChanged) {
2999 if (layer->setMatrix(s.matrix))
3000 flags |= eTraversalNeeded;
3002 if (what & layer_state_t::eTransparentRegionChanged) {
3003 if (layer->setTransparentRegionHint(s.transparentRegion))
3004 flags |= eTraversalNeeded;
3006 if (what & layer_state_t::eFlagsChanged) {
3007 if (layer->setFlags(s.flags, s.mask))
3008 flags |= eTraversalNeeded;
3010 if (what & layer_state_t::eCropChanged) {
3011 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
3012 flags |= eTraversalNeeded;
3014 if (what & layer_state_t::eFinalCropChanged) {
3015 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
3016 flags |= eTraversalNeeded;
3018 if (what & layer_state_t::eLayerStackChanged) {
3019 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
3020 // We only allow setting layer stacks for top level layers,
3021 // everything else inherits layer stack from its parent.
3022 if (layer->hasParent()) {
3023 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
3024 layer->getName().string());
3025 } else if (idx < 0) {
3026 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
3027 "that also does not appear in the top level layer list. Something"
3028 " has gone wrong.", layer->getName().string());
3029 } else if (layer->setLayerStack(s.layerStack)) {
3030 mCurrentState.layersSortedByZ.removeAt(idx);
3031 mCurrentState.layersSortedByZ.add(layer);
3032 // we need traversal (state changed)
3033 // AND transaction (list changed)
3034 flags |= eTransactionNeeded|eTraversalNeeded;
3037 if (what & layer_state_t::eDeferTransaction) {
3038 if (s.barrierHandle != nullptr) {
3039 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
3040 } else if (s.barrierGbp != nullptr) {
3041 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
3042 if (authenticateSurfaceTextureLocked(gbp)) {
3043 const auto& otherLayer =
3044 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
3045 layer->deferTransactionUntil(otherLayer, s.frameNumber);
3047 ALOGE("Attempt to defer transaction to to an"
3048 " unrecognized GraphicBufferProducer");
3051 // We don't trigger a traversal here because if no other state is
3052 // changed, we don't want this to cause any more work
3054 if (what & layer_state_t::eReparentChildren) {
3055 if (layer->reparentChildren(s.reparentHandle)) {
3056 flags |= eTransactionNeeded|eTraversalNeeded;
3059 if (what & layer_state_t::eDetachChildren) {
3060 layer->detachChildren();
3062 if (what & layer_state_t::eOverrideScalingModeChanged) {
3063 layer->setOverrideScalingMode(s.overrideScalingMode);
3064 // We don't trigger a traversal here because if no other state is
3065 // changed, we don't want this to cause any more work
3071 status_t SurfaceFlinger::createLayer(
3072 const String8& name,
3073 const sp<Client>& client,
3074 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
3075 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
3076 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
3078 if (int32_t(w|h) < 0) {
3079 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
3084 status_t result = NO_ERROR;
3088 String8 uniqueName = getUniqueLayerName(name);
3090 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
3091 case ISurfaceComposerClient::eFXSurfaceNormal:
3092 result = createNormalLayer(client,
3093 uniqueName, w, h, flags, format,
3094 handle, gbp, &layer);
3096 case ISurfaceComposerClient::eFXSurfaceDim:
3097 result = createDimLayer(client,
3098 uniqueName, w, h, flags,
3099 handle, gbp, &layer);
3106 if (result != NO_ERROR) {
3110 layer->setInfo(windowType, ownerUid);
3112 result = addClientLayer(client, *handle, *gbp, layer, *parent);
3113 if (result != NO_ERROR) {
3116 mInterceptor.saveSurfaceCreation(layer);
3118 setTransactionFlags(eTransactionNeeded);
3122 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
3124 bool matchFound = true;
3125 uint32_t dupeCounter = 0;
3127 // Tack on our counter whether there is a hit or not, so everyone gets a tag
3128 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
3130 // Loop over layers until we're sure there is no matching name
3131 while (matchFound) {
3133 mDrawingState.traverseInZOrder([&](Layer* layer) {
3134 if (layer->getName() == uniqueName) {
3136 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
3141 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
3146 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
3147 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
3148 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
3150 // initialize the surfaces
3152 case PIXEL_FORMAT_TRANSPARENT:
3153 case PIXEL_FORMAT_TRANSLUCENT:
3154 format = PIXEL_FORMAT_RGBA_8888;
3156 case PIXEL_FORMAT_OPAQUE:
3157 format = PIXEL_FORMAT_RGBX_8888;
3161 *outLayer = new Layer(this, client, name, w, h, flags);
3162 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
3163 if (err == NO_ERROR) {
3164 *handle = (*outLayer)->getHandle();
3165 *gbp = (*outLayer)->getProducer();
3168 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
3172 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
3173 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
3174 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
3176 *outLayer = new LayerDim(this, client, name, w, h, flags);
3177 *handle = (*outLayer)->getHandle();
3178 *gbp = (*outLayer)->getProducer();
3182 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
3184 // called by a client when it wants to remove a Layer
3185 status_t err = NO_ERROR;
3186 sp<Layer> l(client->getLayerUser(handle));
3188 mInterceptor.saveSurfaceDeletion(l);
3189 err = removeLayer(l);
3190 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
3191 "error removing layer=%p (%s)", l.get(), strerror(-err));
3196 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
3198 // called by ~LayerCleaner() when all references to the IBinder (handle)
3200 sp<Layer> l = layer.promote();
3202 // The layer has already been removed, carry on
3205 // If we have a parent, then we can continue to live as long as it does.
3206 return removeLayer(l, true);
3209 // ---------------------------------------------------------------------------
3211 void SurfaceFlinger::onInitializeDisplays() {
3212 // reset screen orientation and use primary layer stack
3213 Vector<ComposerState> state;
3214 Vector<DisplayState> displays;
3216 d.what = DisplayState::eDisplayProjectionChanged |
3217 DisplayState::eLayerStackChanged;
3218 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
3220 d.orientation = DisplayState::eOrientationDefault;
3221 d.frame.makeInvalid();
3222 d.viewport.makeInvalid();
3226 setTransactionState(state, displays, 0);
3227 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
3229 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3230 const nsecs_t period = activeConfig->getVsyncPeriod();
3231 mAnimFrameTracker.setDisplayRefreshPeriod(period);
3233 // Use phase of 0 since phase is not known.
3234 // Use latency of 0, which will snap to the ideal latency.
3235 setCompositorTimingSnapped(0, period, 0);
3238 void SurfaceFlinger::initializeDisplays() {
3239 class MessageScreenInitialized : public MessageBase {
3240 SurfaceFlinger* flinger;
3242 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
3243 virtual bool handler() {
3244 flinger->onInitializeDisplays();
3248 sp<MessageBase> msg = new MessageScreenInitialized(this);
3249 postMessageAsync(msg); // we may be called from main thread, use async message
3252 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
3254 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
3256 int32_t type = hw->getDisplayType();
3257 int currentMode = hw->getPowerMode();
3259 if (mode == currentMode) {
3263 hw->setPowerMode(mode);
3264 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
3265 ALOGW("Trying to set power mode for virtual display");
3269 if (mInterceptor.isEnabled()) {
3270 Mutex::Autolock _l(mStateLock);
3271 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
3273 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
3276 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
3279 if (currentMode == HWC_POWER_MODE_OFF) {
3280 // Turn on the display
3281 getHwComposer().setPowerMode(type, mode);
3282 if (type == DisplayDevice::DISPLAY_PRIMARY &&
3283 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
3284 // FIXME: eventthread only knows about the main display right now
3285 mEventThread->onScreenAcquired();
3286 resyncToHardwareVsync(true);
3289 mVisibleRegionsDirty = true;
3290 mHasPoweredOff = true;
3291 repaintEverything();
3293 struct sched_param param = {0};
3294 param.sched_priority = 1;
3295 if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
3296 ALOGW("Couldn't set SCHED_FIFO on display on");
3298 } else if (mode == HWC_POWER_MODE_OFF) {
3299 // Turn off the display
3300 struct sched_param param = {0};
3301 if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) {
3302 ALOGW("Couldn't set SCHED_OTHER on display off");
3305 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3306 disableHardwareVsync(true); // also cancels any in-progress resync
3308 // FIXME: eventthread only knows about the main display right now
3309 mEventThread->onScreenReleased();
3312 getHwComposer().setPowerMode(type, mode);
3313 mVisibleRegionsDirty = true;
3314 // from this point on, SF will stop drawing on this display
3315 } else if (mode == HWC_POWER_MODE_DOZE ||
3316 mode == HWC_POWER_MODE_NORMAL) {
3317 // Update display while dozing
3318 getHwComposer().setPowerMode(type, mode);
3319 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3320 // FIXME: eventthread only knows about the main display right now
3321 mEventThread->onScreenAcquired();
3322 resyncToHardwareVsync(true);
3324 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
3325 // Leave display going to doze
3326 if (type == DisplayDevice::DISPLAY_PRIMARY) {
3327 disableHardwareVsync(true); // also cancels any in-progress resync
3328 // FIXME: eventthread only knows about the main display right now
3329 mEventThread->onScreenReleased();
3331 getHwComposer().setPowerMode(type, mode);
3333 ALOGE("Attempting to set unknown power mode: %d\n", mode);
3334 getHwComposer().setPowerMode(type, mode);
3338 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
3339 class MessageSetPowerMode: public MessageBase {
3340 SurfaceFlinger& mFlinger;
3341 sp<IBinder> mDisplay;
3344 MessageSetPowerMode(SurfaceFlinger& flinger,
3345 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
3346 mDisplay(disp) { mMode = mode; }
3347 virtual bool handler() {
3348 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
3350 ALOGE("Attempt to set power mode = %d for null display %p",
3351 mMode, mDisplay.get());
3352 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
3353 ALOGW("Attempt to set power mode = %d for virtual display",
3356 mFlinger.setPowerModeInternal(hw, mMode);
3361 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
3362 postMessageSync(msg);
3365 // ---------------------------------------------------------------------------
3367 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
3371 IPCThreadState* ipc = IPCThreadState::self();
3372 const int pid = ipc->getCallingPid();
3373 const int uid = ipc->getCallingUid();
3374 if ((uid != AID_SHELL) &&
3375 !PermissionCache::checkPermission(sDump, pid, uid)) {
3376 result.appendFormat("Permission Denial: "
3377 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3379 // Try to get the main lock, but give up after one second
3380 // (this would indicate SF is stuck, but we want to be able to
3381 // print something in dumpsys).
3382 status_t err = mStateLock.timedLock(s2ns(1));
3383 bool locked = (err == NO_ERROR);
3385 result.appendFormat(
3386 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3387 "dumping anyways (no locks held)\n", strerror(-err), err);
3390 bool dumpAll = true;
3392 size_t numArgs = args.size();
3394 if ((index < numArgs) &&
3395 (args[index] == String16("--list"))) {
3397 listLayersLocked(args, index, result);
3401 if ((index < numArgs) &&
3402 (args[index] == String16("--latency"))) {
3404 dumpStatsLocked(args, index, result);
3408 if ((index < numArgs) &&
3409 (args[index] == String16("--latency-clear"))) {
3411 clearStatsLocked(args, index, result);
3415 if ((index < numArgs) &&
3416 (args[index] == String16("--dispsync"))) {
3418 mPrimaryDispSync.dump(result);
3422 if ((index < numArgs) &&
3423 (args[index] == String16("--static-screen"))) {
3425 dumpStaticScreenStats(result);
3429 if ((index < numArgs) &&
3430 (args[index] == String16("--frame-events"))) {
3432 dumpFrameEventsLocked(result);
3436 if ((index < numArgs) && (args[index] == String16("--wide-color"))) {
3438 dumpWideColorInfo(result);
3444 dumpAllLocked(args, index, result);
3448 mStateLock.unlock();
3451 write(fd, result.string(), result.size());
3455 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3456 size_t& /* index */, String8& result) const
3458 mCurrentState.traverseInZOrder([&](Layer* layer) {
3459 result.appendFormat("%s\n", layer->getName().string());
3463 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3464 String8& result) const
3467 if (index < args.size()) {
3468 name = String8(args[index]);
3472 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3473 const nsecs_t period = activeConfig->getVsyncPeriod();
3474 result.appendFormat("%" PRId64 "\n", period);
3476 if (name.isEmpty()) {
3477 mAnimFrameTracker.dumpStats(result);
3479 mCurrentState.traverseInZOrder([&](Layer* layer) {
3480 if (name == layer->getName()) {
3481 layer->dumpFrameStats(result);
3487 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3488 String8& /* result */)
3491 if (index < args.size()) {
3492 name = String8(args[index]);
3496 mCurrentState.traverseInZOrder([&](Layer* layer) {
3497 if (name.isEmpty() || (name == layer->getName())) {
3498 layer->clearFrameStats();
3502 mAnimFrameTracker.clearStats();
3505 // This should only be called from the main thread. Otherwise it would need
3506 // the lock and should use mCurrentState rather than mDrawingState.
3507 void SurfaceFlinger::logFrameStats() {
3508 mDrawingState.traverseInZOrder([&](Layer* layer) {
3509 layer->logFrameStats();
3512 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3515 void SurfaceFlinger::appendSfConfigString(String8& result) const
3517 result.append(" [sf");
3518 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3520 if (isLayerTripleBufferingDisabled())
3521 result.append(" DISABLE_TRIPLE_BUFFERING");
3523 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64 , dispSyncPresentTimeOffset);
3524 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
3525 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
3526 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
3527 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3528 maxFrameBufferAcquiredBuffers);
3532 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3534 result.appendFormat("Static screen stats:\n");
3535 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3536 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3537 float percent = 100.0f *
3538 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3539 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3540 b + 1, bucketTimeSec, percent);
3542 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3543 float percent = 100.0f *
3544 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3545 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3546 NUM_BUCKETS - 1, bucketTimeSec, percent);
3549 void SurfaceFlinger::recordBufferingStats(const char* layerName,
3550 std::vector<OccupancyTracker::Segment>&& history) {
3551 Mutex::Autolock lock(mBufferingStatsMutex);
3552 auto& stats = mBufferingStats[layerName];
3553 for (const auto& segment : history) {
3554 if (!segment.usedThirdBuffer) {
3555 stats.twoBufferTime += segment.totalTime;
3557 if (segment.occupancyAverage < 1.0f) {
3558 stats.doubleBufferedTime += segment.totalTime;
3559 } else if (segment.occupancyAverage < 2.0f) {
3560 stats.tripleBufferedTime += segment.totalTime;
3562 ++stats.numSegments;
3563 stats.totalTime += segment.totalTime;
3567 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3568 result.appendFormat("Layer frame timestamps:\n");
3570 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3571 const size_t count = currentLayers.size();
3572 for (size_t i=0 ; i<count ; i++) {
3573 currentLayers[i]->dumpFrameEvents(result);
3577 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3578 result.append("Buffering stats:\n");
3579 result.append(" [Layer name] <Active time> <Two buffer> "
3580 "<Double buffered> <Triple buffered>\n");
3581 Mutex::Autolock lock(mBufferingStatsMutex);
3582 typedef std::tuple<std::string, float, float, float> BufferTuple;
3583 std::map<float, BufferTuple, std::greater<float>> sorted;
3584 for (const auto& statsPair : mBufferingStats) {
3585 const char* name = statsPair.first.c_str();
3586 const BufferingStats& stats = statsPair.second;
3587 if (stats.numSegments == 0) {
3590 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3591 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3593 float doubleBufferRatio = static_cast<float>(
3594 stats.doubleBufferedTime) / stats.totalTime;
3595 float tripleBufferRatio = static_cast<float>(
3596 stats.tripleBufferedTime) / stats.totalTime;
3597 sorted.insert({activeTime, {name, twoBufferRatio,
3598 doubleBufferRatio, tripleBufferRatio}});
3600 for (const auto& sortedPair : sorted) {
3601 float activeTime = sortedPair.first;
3602 const BufferTuple& values = sortedPair.second;
3603 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3604 std::get<0>(values).c_str(), activeTime,
3605 std::get<1>(values), std::get<2>(values),
3606 std::get<3>(values));
3608 result.append("\n");
3611 void SurfaceFlinger::dumpWideColorInfo(String8& result) const {
3612 result.appendFormat("hasWideColorDisplay: %d\n", hasWideColorDisplay);
3614 // TODO: print out if wide-color mode is active or not
3616 for (size_t d = 0; d < mDisplays.size(); d++) {
3617 const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
3618 int32_t hwcId = displayDevice->getHwcDisplayId();
3619 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
3623 result.appendFormat("Display %d color modes:\n", hwcId);
3624 std::vector<android_color_mode_t> modes = getHwComposer().getColorModes(hwcId);
3625 for (auto&& mode : modes) {
3626 result.appendFormat(" %s (%d)\n", decodeColorMode(mode).c_str(), mode);
3629 android_color_mode_t currentMode = displayDevice->getActiveColorMode();
3630 result.appendFormat(" Current color mode: %s (%d)\n",
3631 decodeColorMode(currentMode).c_str(), currentMode);
3633 result.append("\n");
3636 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3637 String8& result) const
3639 bool colorize = false;
3640 if (index < args.size()
3641 && (args[index] == String16("--color"))) {
3646 Colorizer colorizer(colorize);
3648 // figure out if we're stuck somewhere
3649 const nsecs_t now = systemTime();
3650 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3651 const nsecs_t inTransaction(mDebugInTransaction);
3652 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3653 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3656 * Dump library configuration.
3659 colorizer.bold(result);
3660 result.append("Build configuration:");
3661 colorizer.reset(result);
3662 appendSfConfigString(result);
3663 appendUiConfigString(result);
3664 appendGuiConfigString(result);
3665 result.append("\n");
3667 result.append("\nWide-Color information:\n");
3668 dumpWideColorInfo(result);
3670 colorizer.bold(result);
3671 result.append("Sync configuration: ");
3672 colorizer.reset(result);
3673 result.append(SyncFeatures::getInstance().toString());
3674 result.append("\n");
3676 const auto& activeConfig = mHwc->getActiveConfig(HWC_DISPLAY_PRIMARY);
3678 colorizer.bold(result);
3679 result.append("DispSync configuration: ");
3680 colorizer.reset(result);
3681 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3682 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3683 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs,
3684 dispSyncPresentTimeOffset, activeConfig->getVsyncPeriod());
3685 result.append("\n");
3687 // Dump static screen stats
3688 result.append("\n");
3689 dumpStaticScreenStats(result);
3690 result.append("\n");
3692 dumpBufferingStats(result);
3695 * Dump the visible layer list
3697 colorizer.bold(result);
3698 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
3699 colorizer.reset(result);
3700 mCurrentState.traverseInZOrder([&](Layer* layer) {
3701 layer->dump(result, colorizer);
3705 * Dump Display state
3708 colorizer.bold(result);
3709 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3710 colorizer.reset(result);
3711 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3712 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3717 * Dump SurfaceFlinger global state
3720 colorizer.bold(result);
3721 result.append("SurfaceFlinger global state:\n");
3722 colorizer.reset(result);
3724 HWComposer& hwc(getHwComposer());
3725 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
3727 colorizer.bold(result);
3728 result.appendFormat("EGL implementation : %s\n",
3729 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3730 colorizer.reset(result);
3731 result.appendFormat("%s\n",
3732 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3734 mRenderEngine->dump(result);
3736 hw->undefinedRegion.dump(result, "undefinedRegion");
3737 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3738 hw->getOrientation(), hw->isDisplayOn());
3739 result.appendFormat(
3740 " last eglSwapBuffers() time: %f us\n"
3741 " last transaction time : %f us\n"
3742 " transaction-flags : %08x\n"
3743 " refresh-rate : %f fps\n"
3746 " gpu_to_cpu_unsupported : %d\n"
3748 mLastSwapBufferTime/1000.0,
3749 mLastTransactionTime/1000.0,
3751 1e9 / activeConfig->getVsyncPeriod(),
3752 activeConfig->getDpiX(),
3753 activeConfig->getDpiY(),
3754 !mGpuToCpuSupported);
3756 result.appendFormat(" eglSwapBuffers time: %f us\n",
3757 inSwapBuffersDuration/1000.0);
3759 result.appendFormat(" transaction time: %f us\n",
3760 inTransactionDuration/1000.0);
3765 mEventThread->dump(result);
3766 result.append("\n");
3769 * HWC layer minidump
3771 for (size_t d = 0; d < mDisplays.size(); d++) {
3772 const sp<const DisplayDevice>& displayDevice(mDisplays[d]);
3773 int32_t hwcId = displayDevice->getHwcDisplayId();
3774 if (hwcId == DisplayDevice::DISPLAY_ID_INVALID) {
3778 result.appendFormat("Display %d HWC layers:\n", hwcId);
3779 Layer::miniDumpHeader(result);
3780 mCurrentState.traverseInZOrder([&](Layer* layer) {
3781 layer->miniDump(result, hwcId);
3783 result.append("\n");
3787 * Dump HWComposer state
3789 colorizer.bold(result);
3790 result.append("h/w composer state:\n");
3791 colorizer.reset(result);
3792 bool hwcDisabled = mDebugDisableHWC || mDebugRegion;
3793 result.appendFormat(" h/w composer %s\n",
3794 hwcDisabled ? "disabled" : "enabled");
3798 * Dump gralloc state
3800 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3804 * Dump VrFlinger state if in use.
3806 if (mVrFlingerRequestsDisplay && mVrFlinger) {
3807 result.append("VrFlinger state:\n");
3808 result.append(mVrFlinger->Dump().c_str());
3809 result.append("\n");
3813 const Vector< sp<Layer> >&
3814 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3815 // Note: mStateLock is held here
3817 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3818 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3819 dpy = mDisplays.keyAt(i);
3824 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3825 // Just use the primary display so we have something to return
3826 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3828 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
3831 bool SurfaceFlinger::startDdmConnection()
3833 void* libddmconnection_dso =
3834 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3835 if (!libddmconnection_dso) {
3838 void (*DdmConnection_start)(const char* name);
3839 DdmConnection_start =
3840 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3841 if (!DdmConnection_start) {
3842 dlclose(libddmconnection_dso);
3845 (*DdmConnection_start)(getServiceName());
3849 status_t SurfaceFlinger::CheckTransactCodeCredentials(uint32_t code) {
3851 case CREATE_CONNECTION:
3852 case CREATE_DISPLAY:
3854 case CLEAR_ANIMATION_FRAME_STATS:
3855 case GET_ANIMATION_FRAME_STATS:
3856 case SET_POWER_MODE:
3857 case GET_HDR_CAPABILITIES:
3859 // codes that require permission check
3860 IPCThreadState* ipc = IPCThreadState::self();
3861 const int pid = ipc->getCallingPid();
3862 const int uid = ipc->getCallingUid();
3863 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3864 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3865 ALOGE("Permission Denial: can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3866 return PERMISSION_DENIED;
3871 * Calling setTransactionState is safe, because you need to have been
3872 * granted a reference to Client* and Handle* to do anything with it.
3874 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3876 case SET_TRANSACTION_STATE:
3877 case CREATE_SCOPED_CONNECTION:
3881 case CAPTURE_SCREEN:
3883 // codes that require permission check
3884 IPCThreadState* ipc = IPCThreadState::self();
3885 const int pid = ipc->getCallingPid();
3886 const int uid = ipc->getCallingUid();
3887 if ((uid != AID_GRAPHICS) &&
3888 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3889 ALOGE("Permission Denial: can't read framebuffer pid=%d, uid=%d", pid, uid);
3890 return PERMISSION_DENIED;
3898 status_t SurfaceFlinger::onTransact(
3899 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3901 status_t credentialCheck = CheckTransactCodeCredentials(code);
3902 if (credentialCheck != OK) {
3903 return credentialCheck;
3906 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3907 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3908 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3909 IPCThreadState* ipc = IPCThreadState::self();
3910 const int uid = ipc->getCallingUid();
3911 if (CC_UNLIKELY(uid != AID_SYSTEM
3912 && !PermissionCache::checkCallingPermission(sHardwareTest))) {
3913 const int pid = ipc->getCallingPid();
3914 ALOGE("Permission Denial: "
3915 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3916 return PERMISSION_DENIED;
3920 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3921 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3923 case 1002: // SHOW_UPDATES
3924 n = data.readInt32();
3925 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3926 invalidateHwcGeometry();
3927 repaintEverything();
3929 case 1004:{ // repaint everything
3930 repaintEverything();
3933 case 1005:{ // force transaction
3934 setTransactionFlags(
3936 eDisplayTransactionNeeded|
3940 case 1006:{ // send empty update
3944 case 1008: // toggle use of hw composer
3945 n = data.readInt32();
3946 mDebugDisableHWC = n ? 1 : 0;
3947 invalidateHwcGeometry();
3948 repaintEverything();
3950 case 1009: // toggle use of transform hint
3951 n = data.readInt32();
3952 mDebugDisableTransformHint = n ? 1 : 0;
3953 invalidateHwcGeometry();
3954 repaintEverything();
3956 case 1010: // interrogate.
3957 reply->writeInt32(0);
3958 reply->writeInt32(0);
3959 reply->writeInt32(mDebugRegion);
3960 reply->writeInt32(0);
3961 reply->writeInt32(mDebugDisableHWC);
3964 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3965 reply->writeInt32(hw->getPageFlipCount());
3970 n = data.readInt32();
3973 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3976 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3979 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3982 mDaltonizer.setType(ColorBlindnessType::None);
3986 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3988 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3990 invalidateHwcGeometry();
3991 repaintEverything();
3995 // apply a color matrix
3996 n = data.readInt32();
3998 // color matrix is sent as a column-major mat4 matrix
3999 for (size_t i = 0 ; i < 4; i++) {
4000 for (size_t j = 0; j < 4; j++) {
4001 mColorMatrix[i][j] = data.readFloat();
4005 mColorMatrix = mat4();
4008 // Check that supplied matrix's last row is {0,0,0,1} so we can avoid
4009 // the division by w in the fragment shader
4010 float4 lastRow(transpose(mColorMatrix)[3]);
4011 if (any(greaterThan(abs(lastRow - float4{0, 0, 0, 1}), float4{1e-4f}))) {
4012 ALOGE("The color transform's last row must be (0, 0, 0, 1)");
4015 invalidateHwcGeometry();
4016 repaintEverything();
4019 // This is an experimental interface
4020 // Needs to be shifted to proper binder interface when we productize
4022 n = data.readInt32();
4023 mPrimaryDispSync.setRefreshSkipCount(n);
4027 n = data.readInt32();
4028 mForceFullDamage = static_cast<bool>(n);
4031 case 1018: { // Modify Choreographer's phase offset
4032 n = data.readInt32();
4033 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4036 case 1019: { // Modify SurfaceFlinger's phase offset
4037 n = data.readInt32();
4038 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
4041 case 1020: { // Layer updates interceptor
4042 n = data.readInt32();
4044 ALOGV("Interceptor enabled");
4045 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
4048 ALOGV("Interceptor disabled");
4049 mInterceptor.disable();
4053 case 1021: { // Disable HWC virtual displays
4054 n = data.readInt32();
4055 mUseHwcVirtualDisplays = !n;
4058 case 1022: { // Set saturation boost
4059 mSaturation = std::max(0.0f, std::min(data.readFloat(), 2.0f));
4061 invalidateHwcGeometry();
4062 repaintEverything();
4070 void SurfaceFlinger::repaintEverything() {
4071 android_atomic_or(1, &mRepaintEverything);
4072 signalTransaction();
4075 // Checks that the requested width and height are valid and updates them to the display dimensions
4076 // if they are set to 0
4077 static status_t updateDimensionsLocked(const sp<const DisplayDevice>& displayDevice,
4078 Transform::orientation_flags rotation,
4079 uint32_t* requestedWidth, uint32_t* requestedHeight) {
4080 // get screen geometry
4081 uint32_t displayWidth = displayDevice->getWidth();
4082 uint32_t displayHeight = displayDevice->getHeight();
4084 if (rotation & Transform::ROT_90) {
4085 std::swap(displayWidth, displayHeight);
4088 if ((*requestedWidth > displayWidth) || (*requestedHeight > displayHeight)) {
4089 ALOGE("size mismatch (%d, %d) > (%d, %d)",
4090 *requestedWidth, *requestedHeight, displayWidth, displayHeight);
4094 if (*requestedWidth == 0) {
4095 *requestedWidth = displayWidth;
4097 if (*requestedHeight == 0) {
4098 *requestedHeight = displayHeight;
4104 // A simple RAII class to disconnect from an ANativeWindow* when it goes out of scope
4105 class WindowDisconnector {
4107 WindowDisconnector(ANativeWindow* window, int api) : mWindow(window), mApi(api) {}
4108 ~WindowDisconnector() {
4109 native_window_api_disconnect(mWindow, mApi);
4113 ANativeWindow* mWindow;
4117 static status_t getWindowBuffer(ANativeWindow* window, uint32_t requestedWidth,
4118 uint32_t requestedHeight, bool hasWideColorDisplay,
4119 bool renderEngineUsesWideColor, ANativeWindowBuffer** outBuffer) {
4120 const uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
4121 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
4124 err = native_window_set_buffers_dimensions(window, requestedWidth, requestedHeight);
4125 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
4126 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
4127 err |= native_window_set_usage(window, usage);
4129 if (hasWideColorDisplay) {
4130 err |= native_window_set_buffers_data_space(window,
4131 renderEngineUsesWideColor
4132 ? HAL_DATASPACE_DISPLAY_P3
4133 : HAL_DATASPACE_V0_SRGB);
4136 if (err != NO_ERROR) {
4140 /* TODO: Once we have the sync framework everywhere this can use
4141 * server-side waits on the fence that dequeueBuffer returns.
4143 err = native_window_dequeue_buffer_and_wait(window, outBuffer);
4144 if (err != NO_ERROR) {
4151 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
4152 const sp<IGraphicBufferProducer>& producer,
4153 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
4154 int32_t minLayerZ, int32_t maxLayerZ,
4155 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
4158 if (CC_UNLIKELY(display == 0))
4161 if (CC_UNLIKELY(producer == 0))
4164 // if we have secure windows on this display, never allow the screen capture
4165 // unless the producer interface is local (i.e.: we can take a screenshot for
4167 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
4169 // Convert to surfaceflinger's internal rotation type.
4170 Transform::orientation_flags rotationFlags;
4172 case ISurfaceComposer::eRotateNone:
4173 rotationFlags = Transform::ROT_0;
4175 case ISurfaceComposer::eRotate90:
4176 rotationFlags = Transform::ROT_90;
4178 case ISurfaceComposer::eRotate180:
4179 rotationFlags = Transform::ROT_180;
4181 case ISurfaceComposer::eRotate270:
4182 rotationFlags = Transform::ROT_270;
4185 rotationFlags = Transform::ROT_0;
4186 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
4191 Mutex::Autolock lock(mStateLock);
4192 sp<const DisplayDevice> displayDevice(getDisplayDeviceLocked(display));
4193 updateDimensionsLocked(displayDevice, rotationFlags, &reqWidth, &reqHeight);
4196 // create a surface (because we're a producer, and we need to
4197 // dequeue/queue a buffer)
4198 sp<Surface> surface = new Surface(producer, false);
4200 // Put the screenshot Surface into async mode so that
4201 // Layer::headFenceHasSignaled will always return true and we'll latch the
4202 // first buffer regardless of whether or not its acquire fence has
4203 // signaled. This is needed to avoid a race condition in the rotation
4204 // animation. See b/30209608
4205 surface->setAsyncMode(true);
4207 ANativeWindow* window = surface.get();
4209 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
4210 if (result != NO_ERROR) {
4213 WindowDisconnector disconnector(window, NATIVE_WINDOW_API_EGL);
4215 ANativeWindowBuffer* buffer = nullptr;
4216 result = getWindowBuffer(window, reqWidth, reqHeight, hasWideColorDisplay,
4217 getRenderEngine().usesWideColor(), &buffer);
4218 if (result != NO_ERROR) {
4222 // This mutex protects syncFd and captureResult for communication of the return values from the
4223 // main thread back to this Binder thread
4224 std::mutex captureMutex;
4225 std::condition_variable captureCondition;
4226 std::unique_lock<std::mutex> captureLock(captureMutex);
4228 std::optional<status_t> captureResult;
4230 sp<LambdaMessage> message = new LambdaMessage([&]() {
4231 // If there is a refresh pending, bug out early and tell the binder thread to try again
4232 // after the refresh.
4233 if (mRefreshPending) {
4234 ATRACE_NAME("Skipping screenshot for now");
4235 std::unique_lock<std::mutex> captureLock(captureMutex);
4236 captureResult = std::make_optional<status_t>(EAGAIN);
4237 captureCondition.notify_one();
4241 status_t result = NO_ERROR;
4244 Mutex::Autolock _l(mStateLock);
4245 sp<const DisplayDevice> device(getDisplayDeviceLocked(display));
4246 result = captureScreenImplLocked(device, buffer, sourceCrop, reqWidth, reqHeight,
4247 minLayerZ, maxLayerZ, useIdentityTransform,
4248 rotationFlags, isLocalScreenshot, &fd);
4252 std::unique_lock<std::mutex> captureLock(captureMutex);
4254 captureResult = std::make_optional<status_t>(result);
4255 captureCondition.notify_one();
4259 result = postMessageAsync(message);
4260 if (result == NO_ERROR) {
4261 captureCondition.wait(captureLock, [&]() { return captureResult; });
4262 while (*captureResult == EAGAIN) {
4263 captureResult.reset();
4264 result = postMessageAsync(message);
4265 if (result != NO_ERROR) {
4268 captureCondition.wait(captureLock, [&]() { return captureResult; });
4270 result = *captureResult;
4273 if (result == NO_ERROR) {
4274 // queueBuffer takes ownership of syncFd
4275 result = window->queueBuffer(window, buffer, syncFd);
4282 void SurfaceFlinger::renderScreenImplLocked(
4283 const sp<const DisplayDevice>& hw,
4284 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
4285 int32_t minLayerZ, int32_t maxLayerZ,
4286 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
4289 RenderEngine& engine(getRenderEngine());
4291 // get screen geometry
4292 const int32_t hw_w = hw->getWidth();
4293 const int32_t hw_h = hw->getHeight();
4294 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
4295 static_cast<int32_t>(reqHeight) != hw_h;
4297 // if a default or invalid sourceCrop is passed in, set reasonable values
4298 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
4299 !sourceCrop.isValid()) {
4300 sourceCrop.setLeftTop(Point(0, 0));
4301 sourceCrop.setRightBottom(Point(hw_w, hw_h));
4304 // ensure that sourceCrop is inside screen
4305 if (sourceCrop.left < 0) {
4306 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
4308 if (sourceCrop.right > hw_w) {
4309 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
4311 if (sourceCrop.top < 0) {
4312 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
4314 if (sourceCrop.bottom > hw_h) {
4315 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
4319 engine.setWideColor(hw->getWideColorSupport());
4320 engine.setColorMode(hw->getActiveColorMode());
4323 // make sure to clear all GL error flags
4324 engine.checkErrors();
4326 // set-up our viewport
4327 engine.setViewportAndProjection(
4328 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
4329 engine.disableTexturing();
4331 // redraw the screen entirely...
4332 engine.clearWithColor(0, 0, 0, 1);
4334 // We loop through the first level of layers without traversing,
4335 // as we need to interpret min/max layer Z in the top level Z space.
4336 for (const auto& layer : mDrawingState.layersSortedByZ) {
4337 if (layer->getLayerStack() != hw->getLayerStack()) {
4340 const Layer::State& state(layer->getDrawingState());
4341 if (state.z < minLayerZ || state.z > maxLayerZ) {
4344 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4345 if (!layer->isVisible()) {
4348 if (filtering) layer->setFiltering(true);
4349 layer->draw(hw, useIdentityTransform);
4350 if (filtering) layer->setFiltering(false);
4354 hw->setViewportAndProjection();
4357 // A simple RAII class that holds an EGLImage and destroys it either:
4358 // a) When the destroy() method is called
4359 // b) When the object goes out of scope
4362 ImageHolder(EGLDisplay display, EGLImageKHR image) : mDisplay(display), mImage(image) {}
4363 ~ImageHolder() { destroy(); }
4366 if (mImage != EGL_NO_IMAGE_KHR) {
4367 eglDestroyImageKHR(mDisplay, mImage);
4368 mImage = EGL_NO_IMAGE_KHR;
4373 const EGLDisplay mDisplay;
4377 status_t SurfaceFlinger::captureScreenImplLocked(const sp<const DisplayDevice>& hw,
4378 ANativeWindowBuffer* buffer, Rect sourceCrop,
4379 uint32_t reqWidth, uint32_t reqHeight,
4380 int32_t minLayerZ, int32_t maxLayerZ,
4381 bool useIdentityTransform,
4382 Transform::orientation_flags rotation,
4383 bool isLocalScreenshot, int* outSyncFd) {
4386 bool secureLayerIsVisible = false;
4387 for (const auto& layer : mDrawingState.layersSortedByZ) {
4388 const Layer::State& state(layer->getDrawingState());
4389 if ((layer->getLayerStack() != hw->getLayerStack()) ||
4390 (state.z < minLayerZ || state.z > maxLayerZ)) {
4393 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
4394 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
4399 if (!isLocalScreenshot && secureLayerIsVisible) {
4400 ALOGW("FB is protected: PERMISSION_DENIED");
4401 return PERMISSION_DENIED;
4405 // create an EGLImage from the buffer so we can later
4406 // turn it into a texture
4407 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
4408 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
4409 if (image == EGL_NO_IMAGE_KHR) {
4413 // This will automatically destroy the image if we return before calling its destroy method
4414 ImageHolder imageHolder(mEGLDisplay, image);
4416 // this binds the given EGLImage as a framebuffer for the
4417 // duration of this scope.
4418 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
4419 if (imageBond.getStatus() != NO_ERROR) {
4420 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4421 return INVALID_OPERATION;
4424 // this will in fact render into our dequeued buffer
4425 // via an FBO, which means we didn't have to create
4426 // an EGLSurface and therefore we're not
4427 // dependent on the context's EGLConfig.
4428 renderScreenImplLocked(
4429 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
4430 useIdentityTransform, rotation);
4432 // Attempt to create a sync khr object that can produce a sync point. If that
4433 // isn't available, create a non-dupable sync object in the fallback path and
4434 // wait on it directly.
4435 EGLSyncKHR sync = EGL_NO_SYNC_KHR;
4436 if (!DEBUG_SCREENSHOTS) {
4437 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
4438 // native fence fd will not be populated until flush() is done.
4439 getRenderEngine().flush();
4442 if (sync != EGL_NO_SYNC_KHR) {
4444 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
4445 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
4446 ALOGW("captureScreen: failed to dup sync khr object");
4449 eglDestroySyncKHR(mEGLDisplay, sync);
4452 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
4453 if (sync != EGL_NO_SYNC_KHR) {
4454 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
4455 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
4456 EGLint eglErr = eglGetError();
4457 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
4458 ALOGW("captureScreen: fence wait timed out");
4460 ALOGW_IF(eglErr != EGL_SUCCESS,
4461 "captureScreen: error waiting on EGL fence: %#x", eglErr);
4463 eglDestroySyncKHR(mEGLDisplay, sync);
4465 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
4468 *outSyncFd = syncFd;
4470 if (DEBUG_SCREENSHOTS) {
4471 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4472 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4473 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4474 hw, minLayerZ, maxLayerZ);
4478 // destroy our image
4479 imageHolder.destroy();
4484 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
4485 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
4486 if (DEBUG_SCREENSHOTS) {
4487 for (size_t y=0 ; y<h ; y++) {
4488 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4489 for (size_t x=0 ; x<w ; x++) {
4490 if (p[x] != 0xFF000000) return;
4493 ALOGE("*** we just took a black screenshot ***\n"
4494 "requested minz=%d, maxz=%d, layerStack=%d",
4495 minLayerZ, maxLayerZ, hw->getLayerStack());
4498 for (const auto& layer : mDrawingState.layersSortedByZ) {
4499 const Layer::State& state(layer->getDrawingState());
4500 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4501 state.z <= maxLayerZ) {
4502 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4503 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%.3f",
4504 layer->isVisible() ? '+' : '-',
4505 i, layer->getName().string(), layer->getLayerStack(), state.z,
4506 layer->isVisible(), state.flags, state.alpha);
4514 // ---------------------------------------------------------------------------
4516 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4517 layersSortedByZ.traverseInZOrder(stateSet, visitor);
4520 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4521 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
4524 }; // namespace android
4527 #if defined(__gl_h_)
4528 #error "don't include gl/gl.h in this file"
4531 #if defined(__gl2_h_)
4532 #error "don't include gl2/gl2.h in this file"