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 ATRACE_TAG ATRACE_TAG_GRAPHICS
23 #include <stdatomic.h>
25 #include <sys/types.h>
31 #include <cutils/properties.h>
34 #include <binder/IPCThreadState.h>
35 #include <binder/IServiceManager.h>
36 #include <binder/PermissionCache.h>
38 #include <ui/DisplayInfo.h>
39 #include <ui/DisplayStatInfo.h>
41 #include <gui/BufferQueue.h>
42 #include <gui/GuiConfig.h>
43 #include <gui/IDisplayEventConnection.h>
44 #include <gui/Surface.h>
46 #include <ui/GraphicBufferAllocator.h>
47 #include <ui/HdrCapabilities.h>
48 #include <ui/PixelFormat.h>
49 #include <ui/UiConfig.h>
51 #include <utils/misc.h>
52 #include <utils/String8.h>
53 #include <utils/String16.h>
54 #include <utils/StopWatch.h>
55 #include <utils/Timers.h>
56 #include <utils/Trace.h>
58 #include <private/android_filesystem_config.h>
59 #include <private/gui/SyncFeatures.h>
65 #include "Colorizer.h"
66 #include "DdmConnection.h"
67 #include "DisplayDevice.h"
69 #include "EventControlThread.h"
70 #include "EventThread.h"
72 #include "LayerVector.h"
74 #include "MonitoredProducer.h"
75 #include "SurfaceFlinger.h"
77 #include "DisplayHardware/FramebufferSurface.h"
78 #include "DisplayHardware/HWComposer.h"
79 #include "DisplayHardware/VirtualDisplaySurface.h"
81 #include "Effects/Daltonizer.h"
83 #include "RenderEngine/RenderEngine.h"
84 #include <cutils/compiler.h>
86 #include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
87 #include <configstore/Utils.h>
89 #define DISPLAY_COUNT 1
92 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
95 #define DEBUG_SCREENSHOTS false
97 extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
100 // ---------------------------------------------------------------------------
102 using namespace android::hardware::configstore;
103 using namespace android::hardware::configstore::V1_0;
105 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
106 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
107 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
108 const String16 sDump("android.permission.DUMP");
110 // ---------------------------------------------------------------------------
111 int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
112 int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
113 bool SurfaceFlinger::useContextPriority;
114 int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
115 bool SurfaceFlinger::useHwcForRgbToYuv;
116 uint64_t SurfaceFlinger::maxVirtualDisplaySize;
117 bool SurfaceFlinger::hasSyncFramework;
118 int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
120 SurfaceFlinger::SurfaceFlinger()
121 : BnSurfaceComposer(),
122 mTransactionFlags(0),
123 mTransactionPending(false),
124 mAnimTransactionPending(false),
125 mLayersRemoved(false),
127 mRepaintEverything(0),
129 mBootTime(systemTime()),
130 mVisibleRegionsDirty(false),
131 mHwWorkListDirty(false),
132 mAnimCompositionPending(false),
136 mDebugDisableTransformHint(0),
137 mDebugInSwapBuffers(0),
138 mLastSwapBufferTime(0),
139 mDebugInTransaction(0),
140 mLastTransactionTime(0),
141 mBootFinished(false),
142 mForceFullDamage(false),
144 mPrimaryDispSync("PrimaryDispSync"),
145 mPrimaryHWVsyncEnabled(false),
146 mHWVsyncAvailable(false),
148 mHasColorMatrix(false),
149 mHasPoweredOff(false),
155 ALOGI("SurfaceFlinger is starting");
157 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
158 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
160 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
161 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
163 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
164 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
166 hasSyncFramework = getBool< ISurfaceFlingerConfigs,
167 &ISurfaceFlingerConfigs::hasSyncFramework>(true);
169 useContextPriority = getBool< ISurfaceFlingerConfigs,
170 &ISurfaceFlingerConfigs::useContextPriority>(false);
172 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
173 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
175 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
176 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
178 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
179 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
181 char value[PROPERTY_VALUE_MAX];
183 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
184 mGpuToCpuSupported = !atoi(value);
186 property_get("debug.sf.showupdates", value, "0");
187 mDebugRegion = atoi(value);
189 property_get("debug.sf.ddms", value, "0");
190 mDebugDDMS = atoi(value);
192 if (!startDdmConnection()) {
193 // start failed, and DDMS debugging not enabled
197 ALOGI_IF(mDebugRegion, "showupdates enabled");
198 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
200 property_get("debug.sf.enable_hwc_vds", value, "0");
201 mUseHwcVirtualDisplays = atoi(value);
202 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
204 property_get("ro.sf.disable_triple_buffer", value, "1");
205 mLayerTripleBufferingDisabled = atoi(value);
206 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
209 void SurfaceFlinger::onFirstRef()
211 mEventQueue.init(this);
214 SurfaceFlinger::~SurfaceFlinger()
216 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
217 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
218 eglTerminate(display);
221 void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
223 // the window manager died on us. prepare its eulogy.
225 // restore initial conditions (default device unblank, etc)
226 initializeDisplays();
228 // restart the boot-animation
232 static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
233 status_t err = client->initCheck();
234 if (err == NO_ERROR) {
240 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
241 return initClient(new Client(this));
244 sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
245 const sp<IGraphicBufferProducer>& gbp) {
246 if (authenticateSurfaceTexture(gbp) == false) {
249 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
250 if (layer == nullptr) {
254 return initClient(new Client(this, layer));
257 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
260 class DisplayToken : public BBinder {
261 sp<SurfaceFlinger> flinger;
262 virtual ~DisplayToken() {
263 // no more references, this display must be terminated
264 Mutex::Autolock _l(flinger->mStateLock);
265 flinger->mCurrentState.displays.removeItem(this);
266 flinger->setTransactionFlags(eDisplayTransactionNeeded);
269 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
274 sp<BBinder> token = new DisplayToken(this);
276 Mutex::Autolock _l(mStateLock);
277 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
278 info.displayName = displayName;
279 mCurrentState.displays.add(token, info);
280 mInterceptor.saveDisplayCreation(info);
284 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
285 Mutex::Autolock _l(mStateLock);
287 ssize_t idx = mCurrentState.displays.indexOfKey(display);
289 ALOGW("destroyDisplay: invalid display token");
293 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
294 if (!info.isVirtualDisplay()) {
295 ALOGE("destroyDisplay called for non-virtual display");
298 mInterceptor.saveDisplayDeletion(info.displayId);
299 mCurrentState.displays.removeItemsAt(idx);
300 setTransactionFlags(eDisplayTransactionNeeded);
303 void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
304 ALOGW_IF(mBuiltinDisplays[type],
305 "Overwriting display token for display type %d", type);
306 mBuiltinDisplays[type] = new BBinder();
307 // All non-virtual displays are currently considered secure.
308 DisplayDeviceState info(type, true);
309 mCurrentState.displays.add(mBuiltinDisplays[type], info);
310 mInterceptor.saveDisplayCreation(info);
313 sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
314 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
315 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
318 return mBuiltinDisplays[id];
321 void SurfaceFlinger::bootFinished()
323 if (mStartPropertySetThread->join() != NO_ERROR) {
324 ALOGE("Join StartPropertySetThread failed!");
326 const nsecs_t now = systemTime();
327 const nsecs_t duration = now - mBootTime;
328 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
329 mBootFinished = true;
331 // wait patiently for the window manager death
332 const String16 name("window");
333 sp<IBinder> window(defaultServiceManager()->getService(name));
335 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
338 // stop boot animation
339 // formerly we would just kill the process, but we now ask it to exit so it
340 // can choose where to stop the animation.
341 property_set("service.bootanim.exit", "1");
343 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
344 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
345 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
348 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
349 class MessageDestroyGLTexture : public MessageBase {
350 RenderEngine& engine;
353 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
354 : engine(engine), texture(texture) {
356 virtual bool handler() {
357 engine.deleteTextures(1, &texture);
361 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
364 class DispSyncSource : public VSyncSource, private DispSync::Callback {
366 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
370 mTraceVsync(traceVsync),
371 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
372 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
377 mPhaseOffset(phaseOffset),
380 virtual ~DispSyncSource() {}
382 virtual void setVSyncEnabled(bool enable) {
383 Mutex::Autolock lock(mVsyncMutex);
385 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
386 static_cast<DispSync::Callback*>(this));
387 if (err != NO_ERROR) {
388 ALOGE("error registering vsync callback: %s (%d)",
389 strerror(-err), err);
391 //ATRACE_INT(mVsyncOnLabel.string(), 1);
393 status_t err = mDispSync->removeEventListener(
394 static_cast<DispSync::Callback*>(this));
395 if (err != NO_ERROR) {
396 ALOGE("error unregistering vsync callback: %s (%d)",
397 strerror(-err), err);
399 //ATRACE_INT(mVsyncOnLabel.string(), 0);
404 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
405 Mutex::Autolock lock(mCallbackMutex);
406 mCallback = callback;
409 virtual void setPhaseOffset(nsecs_t phaseOffset) {
410 Mutex::Autolock lock(mVsyncMutex);
412 // Normalize phaseOffset to [0, period)
413 auto period = mDispSync->getPeriod();
414 phaseOffset %= period;
415 if (phaseOffset < 0) {
416 // If we're here, then phaseOffset is in (-period, 0). After this
417 // operation, it will be in (0, period)
418 phaseOffset += period;
420 mPhaseOffset = phaseOffset;
422 // If we're not enabled, we don't need to mess with the listeners
427 // Remove the listener with the old offset
428 status_t err = mDispSync->removeEventListener(
429 static_cast<DispSync::Callback*>(this));
430 if (err != NO_ERROR) {
431 ALOGE("error unregistering vsync callback: %s (%d)",
432 strerror(-err), err);
435 // Add a listener with the new offset
436 err = mDispSync->addEventListener(mName, mPhaseOffset,
437 static_cast<DispSync::Callback*>(this));
438 if (err != NO_ERROR) {
439 ALOGE("error registering vsync callback: %s (%d)",
440 strerror(-err), err);
445 virtual void onDispSyncEvent(nsecs_t when) {
446 sp<VSyncSource::Callback> callback;
448 Mutex::Autolock lock(mCallbackMutex);
449 callback = mCallback;
452 mValue = (mValue + 1) % 2;
453 ATRACE_INT(mVsyncEventLabel.string(), mValue);
457 if (callback != NULL) {
458 callback->onVSyncEvent(when);
462 const char* const mName;
466 const bool mTraceVsync;
467 const String8 mVsyncOnLabel;
468 const String8 mVsyncEventLabel;
472 Mutex mCallbackMutex; // Protects the following
473 sp<VSyncSource::Callback> mCallback;
475 Mutex mVsyncMutex; // Protects the following
476 nsecs_t mPhaseOffset;
480 class InjectVSyncSource : public VSyncSource {
482 InjectVSyncSource() {}
484 virtual ~InjectVSyncSource() {}
486 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
487 std::lock_guard<std::mutex> lock(mCallbackMutex);
488 mCallback = callback;
491 virtual void onInjectSyncEvent(nsecs_t when) {
492 std::lock_guard<std::mutex> lock(mCallbackMutex);
493 mCallback->onVSyncEvent(when);
496 virtual void setVSyncEnabled(bool) {}
497 virtual void setPhaseOffset(nsecs_t) {}
500 std::mutex mCallbackMutex; // Protects the following
501 sp<VSyncSource::Callback> mCallback;
504 // Do not call property_set on main thread which will be blocked by init
505 // Use StartPropertySetThread instead.
506 void SurfaceFlinger::init() {
507 ALOGI( "SurfaceFlinger's main thread ready to run. "
508 "Initializing graphics H/W...");
510 Mutex::Autolock _l(mStateLock);
512 // initialize EGL for the default display
513 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
514 eglInitialize(mEGLDisplay, NULL, NULL);
516 // start the EventThread
517 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
518 vsyncPhaseOffsetNs, true, "app");
519 mEventThread = new EventThread(vsyncSrc, *this, false);
520 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
521 sfVsyncPhaseOffsetNs, true, "sf");
522 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
523 mEventQueue.setEventThread(mSFEventThread);
525 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
526 struct sched_param param = {0};
527 param.sched_priority = 2;
528 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, ¶m) != 0) {
529 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
531 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, ¶m) != 0) {
532 ALOGE("Couldn't set SCHED_FIFO for EventThread");
535 // Initialize the H/W composer object. There may or may not be an
536 // actual hardware composer underneath.
537 mHwc.reset(new HWComposer(this,
538 *static_cast<HWComposer::EventHandler *>(this)));
540 // get a RenderEngine for the given display / config (can't fail)
541 mRenderEngine = RenderEngine::create(mEGLDisplay,
542 mHwc->getVisualID(), 0);
544 // retrieve the EGL context that was selected/created
545 mEGLContext = mRenderEngine->getEGLContext();
547 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
548 "couldn't create EGLContext");
550 // initialize our non-virtual displays
551 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
552 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
553 // set-up the displays that are already connected
554 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
555 // All non-virtual displays are currently considered secure.
556 bool isSecure = true;
557 createBuiltinDisplayLocked(type);
558 wp<IBinder> token = mBuiltinDisplays[i];
560 sp<IGraphicBufferProducer> producer;
561 sp<IGraphicBufferConsumer> consumer;
562 BufferQueue::createBufferQueue(&producer, &consumer);
564 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
566 int32_t hwcId = allocateHwcDisplayId(type);
567 sp<DisplayDevice> hw = new DisplayDevice(this,
568 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
570 mRenderEngine->getEGLConfig(), false);
571 if (i > DisplayDevice::DISPLAY_PRIMARY) {
572 // FIXME: currently we don't get blank/unblank requests
573 // for displays other than the main display, so we always
574 // assume a connected display is unblanked.
575 ALOGD("marking display %zu as acquired/unblanked", i);
576 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
578 mDisplays.add(token, hw);
582 // make the GLContext current so that we can create textures when creating Layers
583 // (which may happens before we render something)
584 getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
586 mEventControlThread = new EventControlThread(this);
587 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
589 // set a fake vsync period if there is no HWComposer
590 if (mHwc->initCheck() != NO_ERROR) {
591 mPrimaryDispSync.setPeriod(16666667);
594 // initialize our drawing state
595 mDrawingState = mCurrentState;
597 // set initial conditions (e.g. unblank default device)
598 initializeDisplays();
600 mRenderEngine->primeCache();
602 // Inform native graphics APIs that the present timestamp is NOT supported:
603 mStartPropertySetThread = new StartPropertySetThread(false);
604 if (mStartPropertySetThread->Start() != NO_ERROR) {
605 ALOGE("Run StartPropertySetThread failed!");
608 ALOGV("Done initializing");
611 int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
612 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
613 type : mHwc->allocateDisplayId();
616 void SurfaceFlinger::startBootAnim() {
617 // Start boot animation service by setting a property mailbox
618 // if property setting thread is already running, Start() will be just a NOP
619 mStartPropertySetThread->Start();
620 // Wait until property was set
621 if (mStartPropertySetThread->join() != NO_ERROR) {
622 ALOGE("Join StartPropertySetThread failed!");
626 size_t SurfaceFlinger::getMaxTextureSize() const {
627 return mRenderEngine->getMaxTextureSize();
630 size_t SurfaceFlinger::getMaxViewportDims() const {
631 return mRenderEngine->getMaxViewportDims();
634 // ----------------------------------------------------------------------------
636 bool SurfaceFlinger::authenticateSurfaceTexture(
637 const sp<IGraphicBufferProducer>& bufferProducer) const {
638 Mutex::Autolock _l(mStateLock);
639 return authenticateSurfaceTextureLocked(bufferProducer);
642 bool SurfaceFlinger::authenticateSurfaceTextureLocked(
643 const sp<IGraphicBufferProducer>& bufferProducer) const {
644 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
645 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
648 status_t SurfaceFlinger::getSupportedFrameTimestamps(
649 std::vector<FrameEvent>* outSupported) const {
651 FrameEvent::REQUESTED_PRESENT,
654 FrameEvent::FIRST_REFRESH_START,
655 FrameEvent::LAST_REFRESH_START,
656 FrameEvent::GPU_COMPOSITION_DONE,
657 FrameEvent::DEQUEUE_READY,
663 status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
664 Vector<DisplayInfo>* configs) {
665 if ((configs == NULL) || (display.get() == NULL)) {
669 int32_t type = getDisplayType(display);
670 if (type < 0) return type;
672 // TODO: Not sure if display density should handled by SF any longer
674 static int getDensityFromProperty(char const* propName) {
675 char property[PROPERTY_VALUE_MAX];
677 if (property_get(propName, property, NULL) > 0) {
678 density = atoi(property);
683 static int getEmuDensity() {
684 return getDensityFromProperty("qemu.sf.lcd_density"); }
685 static int getBuildDensity(const DisplayInfo& info) {
686 static int density = getDensityFromProperty("ro.sf.lcd_density");
687 #if defined(__i386__) || defined(__x86_64__)
689 uint32_t area = info.w * info.h;
690 if (area <= 800 * 480) {
692 } else if (area <= 1024 * 600) {
694 } else if (area < 1024 * 768) {
696 } else if (area < 1920 * 1080) {
701 ALOGI("auto set density to %d", density);
710 const Vector<HWComposer::DisplayConfig>& hwConfigs =
711 getHwComposer().getConfigs(type);
712 for (size_t c = 0; c < hwConfigs.size(); ++c) {
713 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
714 DisplayInfo info = DisplayInfo();
716 float xdpi = hwConfig.xdpi;
717 float ydpi = hwConfig.ydpi;
718 info.w = hwConfig.width;
719 info.h = hwConfig.height;
721 if (type == DisplayDevice::DISPLAY_PRIMARY) {
722 // The density of the device is provided by a build property
723 float density = Density::getBuildDensity(info) / 160.0f;
725 // the build doesn't provide a density -- this is wrong!
727 ALOGE("ro.sf.lcd_density must be defined as a build property");
728 density = xdpi / 160.0f;
730 if (Density::getEmuDensity()) {
731 // if "qemu.sf.lcd_density" is specified, it overrides everything
732 xdpi = ydpi = density = Density::getEmuDensity();
735 info.density = density;
737 // TODO: this needs to go away (currently needed only by webkit)
738 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
739 info.orientation = hw->getOrientation();
741 // TODO: where should this value come from?
742 static const int TV_DENSITY = 213;
743 info.density = TV_DENSITY / 160.0f;
744 info.orientation = 0;
749 info.fps = float(1e9 / hwConfig.refresh);
750 info.appVsyncOffset = vsyncPhaseOffsetNs;
752 // This is how far in advance a buffer must be queued for
753 // presentation at a given time. If you want a buffer to appear
754 // on the screen at time N, you must submit the buffer before
755 // (N - presentationDeadline).
757 // Normally it's one full refresh period (to give SF a chance to
758 // latch the buffer), but this can be reduced by configuring a
759 // DispSync offset. Any additional delays introduced by the hardware
760 // composer or panel must be accounted for here.
762 // We add an additional 1ms to allow for processing time and
763 // differences between the ideal and actual refresh rate.
764 info.presentationDeadline =
765 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
767 // All non-virtual displays are currently considered secure.
770 configs->push_back(info);
776 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
777 DisplayStatInfo* stats) {
782 // FIXME for now we always return stats for the primary display
783 memset(stats, 0, sizeof(*stats));
784 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
785 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
789 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
790 sp<const DisplayDevice> device(getDisplayDevice(display));
791 if (device != NULL) {
792 return device->getActiveConfig();
797 void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
798 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
800 int32_t type = hw->getDisplayType();
801 int currentMode = hw->getActiveConfig();
803 if (mode == currentMode) {
804 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
808 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
809 ALOGW("Trying to set config for virtual display");
813 hw->setActiveConfig(mode);
814 getHwComposer().setActiveConfig(type, mode);
817 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
818 class MessageSetActiveConfig: public MessageBase {
819 SurfaceFlinger& mFlinger;
820 sp<IBinder> mDisplay;
823 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
825 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
826 virtual bool handler() {
827 Vector<DisplayInfo> configs;
828 mFlinger.getDisplayConfigs(mDisplay, &configs);
829 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
830 ALOGE("Attempt to set active config = %d for display with %zu configs",
831 mMode, configs.size());
833 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
835 ALOGE("Attempt to set active config = %d for null display %p",
836 mMode, mDisplay.get());
837 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
838 ALOGW("Attempt to set active config = %d for virtual display",
841 mFlinger.setActiveConfigInternal(hw, mMode);
846 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
847 postMessageSync(msg);
851 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
852 Vector<android_color_mode_t>* outColorModes) {
853 if (outColorModes == nullptr || display.get() == nullptr) {
857 int32_t type = getDisplayType(display);
858 if (type < 0) return type;
860 std::set<android_color_mode_t> colorModes;
861 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
862 colorModes.insert(hwConfig.colorMode);
865 outColorModes->clear();
866 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
871 android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
872 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
874 int32_t type = getDisplayType(display);
875 if (type < 0) return static_cast<android_color_mode_t>(type);
877 return getHwComposer().getColorMode(type);
880 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
881 android_color_mode_t colorMode) {
882 if (display.get() == nullptr || colorMode < 0) {
886 int32_t type = getDisplayType(display);
887 if (type < 0) return type;
888 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
889 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
890 desiredConfig.colorMode = colorMode;
891 for (size_t c = 0; c < hwConfigs.size(); ++c) {
892 const HWComposer::DisplayConfig config = hwConfigs[c];
893 if (config == desiredConfig) {
894 return setActiveConfig(display, c);
900 status_t SurfaceFlinger::clearAnimationFrameStats() {
901 Mutex::Autolock _l(mStateLock);
902 mAnimFrameTracker.clearStats();
906 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
907 Mutex::Autolock _l(mStateLock);
908 mAnimFrameTracker.getStats(outStats);
912 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
913 HdrCapabilities* outCapabilities) const {
914 // HWC1 does not provide HDR capabilities
915 *outCapabilities = HdrCapabilities();
919 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
920 if (enable == mInjectVSyncs) {
925 mInjectVSyncs = enable;
926 ALOGV("VSync Injections enabled");
927 if (mVSyncInjector.get() == nullptr) {
928 mVSyncInjector = new InjectVSyncSource();
929 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
931 mEventQueue.setEventThread(mInjectorEventThread);
933 mInjectVSyncs = enable;
934 ALOGV("VSync Injections disabled");
935 mEventQueue.setEventThread(mSFEventThread);
936 mVSyncInjector.clear();
941 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
942 if (!mInjectVSyncs) {
943 ALOGE("VSync Injections not enabled");
946 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
947 ALOGV("Injecting VSync inside SurfaceFlinger");
948 mVSyncInjector->onInjectSyncEvent(when);
953 // ----------------------------------------------------------------------------
955 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
956 ISurfaceComposer::VsyncSource vsyncSource) {
957 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
958 return mSFEventThread->createEventConnection();
960 return mEventThread->createEventConnection();
964 // ----------------------------------------------------------------------------
966 void SurfaceFlinger::waitForEvent() {
967 mEventQueue.waitMessage();
970 #ifdef CONSOLE_MANAGER
971 void SurfaceFlinger::screenReleased(const sp<IBinder>& display) {
972 // this may be called by a signal handler, we can't do too much in here
973 setPowerMode(display, HWC_POWER_MODE_OFF);
977 void SurfaceFlinger::screenAcquired(const sp<IBinder>& display) {
978 // this may be called by a signal handler, we can't do too much in here
979 setPowerMode(display, HWC_POWER_MODE_NORMAL);
984 void SurfaceFlinger::signalTransaction() {
985 mEventQueue.invalidate();
988 void SurfaceFlinger::signalLayerUpdate() {
989 mEventQueue.invalidate();
992 void SurfaceFlinger::signalRefresh() {
993 mEventQueue.refresh();
996 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
997 nsecs_t reltime, uint32_t /* flags */) {
998 return mEventQueue.postMessage(msg, reltime);
1001 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
1002 nsecs_t reltime, uint32_t /* flags */) {
1003 status_t res = mEventQueue.postMessage(msg, reltime);
1004 if (res == NO_ERROR) {
1010 void SurfaceFlinger::run() {
1016 void SurfaceFlinger::enableHardwareVsync() {
1017 Mutex::Autolock _l(mHWVsyncLock);
1018 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
1019 mPrimaryDispSync.beginResync();
1020 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1021 mEventControlThread->setVsyncEnabled(true);
1022 mPrimaryHWVsyncEnabled = true;
1026 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
1027 Mutex::Autolock _l(mHWVsyncLock);
1029 if (makeAvailable) {
1030 mHWVsyncAvailable = true;
1031 } else if (!mHWVsyncAvailable) {
1032 // Hardware vsync is not currently available, so abort the resync
1037 const nsecs_t period =
1038 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1040 mPrimaryDispSync.reset();
1041 mPrimaryDispSync.setPeriod(period);
1043 if (!mPrimaryHWVsyncEnabled) {
1044 mPrimaryDispSync.beginResync();
1045 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1046 mEventControlThread->setVsyncEnabled(true);
1047 mPrimaryHWVsyncEnabled = true;
1051 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1052 Mutex::Autolock _l(mHWVsyncLock);
1053 if (mPrimaryHWVsyncEnabled) {
1054 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1055 mEventControlThread->setVsyncEnabled(false);
1056 mPrimaryDispSync.endResync();
1057 mPrimaryHWVsyncEnabled = false;
1059 if (makeUnavailable) {
1060 mHWVsyncAvailable = false;
1064 void SurfaceFlinger::resyncWithRateLimit() {
1065 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1066 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1067 resyncToHardwareVsync(false);
1071 void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1072 nsecs_t timestamp) {
1073 bool needsHwVsync = false;
1075 { // Scope for the lock
1076 Mutex::Autolock _l(mHWVsyncLock);
1077 if (type == 0 && mPrimaryHWVsyncEnabled) {
1078 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1083 enableHardwareVsync();
1085 disableHardwareVsync(false);
1089 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1090 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1091 *compositorTiming = mCompositorTiming;
1094 void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
1095 if (mEventThread == NULL) {
1096 // This is a temporary workaround for b/7145521. A non-null pointer
1097 // does not mean EventThread has finished initializing, so this
1098 // is not a correct fix.
1099 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1103 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1104 Mutex::Autolock _l(mStateLock);
1106 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1108 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1109 mBuiltinDisplays[type].clear();
1111 setTransactionFlags(eDisplayTransactionNeeded);
1113 // Defer EventThread notification until SF has updated mDisplays.
1117 void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1118 repaintEverything();
1121 void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1123 getHwComposer().eventControl(disp, event, enabled);
1126 void SurfaceFlinger::onMessageReceived(int32_t what) {
1129 case MessageQueue::INVALIDATE: {
1130 bool refreshNeeded = handleMessageTransaction();
1131 refreshNeeded |= handleMessageInvalidate();
1132 refreshNeeded |= mRepaintEverything;
1133 if (refreshNeeded) {
1134 // Signal a refresh if a transaction modified the window state,
1135 // a new buffer was latched, or if HWC has requested a full
1141 case MessageQueue::REFRESH: {
1142 handleMessageRefresh();
1148 bool SurfaceFlinger::handleMessageTransaction() {
1149 uint32_t transactionFlags = peekTransactionFlags();
1150 if (transactionFlags) {
1151 handleTransaction(transactionFlags);
1157 bool SurfaceFlinger::handleMessageInvalidate() {
1159 return handlePageFlip();
1162 void SurfaceFlinger::handleMessageRefresh() {
1165 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1167 preComposition(refreshStartTime);
1168 rebuildLayerStacks();
1170 doDebugFlashRegions();
1172 postComposition(refreshStartTime);
1175 void SurfaceFlinger::doDebugFlashRegions()
1177 // is debugging enabled
1178 if (CC_LIKELY(!mDebugRegion))
1181 const bool repaintEverything = mRepaintEverything;
1182 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1183 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1184 if (hw->isDisplayOn()) {
1185 // transform the dirty region into this screen's coordinate space
1186 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1187 if (!dirtyRegion.isEmpty()) {
1188 // redraw the whole screen
1189 doComposeSurfaces(hw, Region(hw->bounds()));
1191 // and draw the dirty region
1192 const int32_t height = hw->getHeight();
1193 RenderEngine& engine(getRenderEngine());
1194 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1196 hw->compositionComplete();
1197 hw->swapBuffers(getHwComposer());
1204 if (mDebugRegion > 1) {
1205 usleep(mDebugRegion * 1000);
1208 HWComposer& hwc(getHwComposer());
1209 if (hwc.initCheck() == NO_ERROR) {
1210 status_t err = hwc.prepare();
1211 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1215 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
1217 bool needExtraInvalidate = false;
1218 mDrawingState.traverseInZOrder([&](Layer* layer) {
1219 if (layer->onPreComposition(refreshStartTime)) {
1220 needExtraInvalidate = true;
1224 if (needExtraInvalidate) {
1225 signalLayerUpdate();
1229 void SurfaceFlinger::updateCompositorTiming(
1230 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1231 std::shared_ptr<FenceTime>& presentFenceTime) {
1232 // Update queue of past composite+present times and determine the
1233 // most recently known composite to present latency.
1234 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1235 nsecs_t compositeToPresentLatency = -1;
1236 while (!mCompositePresentTimes.empty()) {
1237 CompositePresentTime& cpt = mCompositePresentTimes.front();
1238 // Cached values should have been updated before calling this method,
1239 // which helps avoid duplicate syscalls.
1240 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1241 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1244 compositeToPresentLatency = displayTime - cpt.composite;
1245 mCompositePresentTimes.pop();
1248 // Don't let mCompositePresentTimes grow unbounded, just in case.
1249 while (mCompositePresentTimes.size() > 16) {
1250 mCompositePresentTimes.pop();
1253 setCompositorTimingSnapped(
1254 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1257 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1258 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
1259 // Integer division and modulo round toward 0 not -inf, so we need to
1260 // treat negative and positive offsets differently.
1261 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
1262 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1263 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1265 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1266 if (idealLatency <= 0) {
1267 idealLatency = vsyncInterval;
1270 // Snap the latency to a value that removes scheduling jitter from the
1271 // composition and present times, which often have >1ms of jitter.
1272 // Reducing jitter is important if an app attempts to extrapolate
1273 // something (such as user input) to an accurate diasplay time.
1274 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1275 // with (presentLatency % interval).
1276 nsecs_t bias = vsyncInterval / 2;
1277 int64_t extraVsyncs =
1278 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1279 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1280 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
1282 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1283 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1284 mCompositorTiming.interval = vsyncInterval;
1285 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1288 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1290 const HWComposer& hwc = getHwComposer();
1291 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1293 mGlCompositionDoneTimeline.updateSignalTimes();
1294 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1295 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1296 glCompositionDoneFenceTime =
1297 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1298 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1300 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1303 mDisplayTimeline.updateSignalTimes();
1304 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1305 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
1306 mDisplayTimeline.push(retireFenceTime);
1308 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1309 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1311 // We use the refreshStartTime which might be sampled a little later than
1312 // when we started doing work for this frame, but that should be okay
1313 // since updateCompositorTiming has snapping logic.
1314 updateCompositorTiming(
1315 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
1316 CompositorTiming compositorTiming;
1318 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1319 compositorTiming = mCompositorTiming;
1322 mDrawingState.traverseInZOrder([&](Layer* layer) {
1323 // TODO(brianderson): The retire fence is incorrectly passed in as the
1324 // present fence. Fix this if this file lives on.
1325 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
1326 retireFenceTime, compositorTiming);
1328 recordBufferingStats(layer->getName().string(),
1329 layer->getOccupancyHistory(false));
1333 if (retireFence->isValid()) {
1334 if (mPrimaryDispSync.addPresentFence(retireFenceTime)) {
1335 enableHardwareVsync();
1337 disableHardwareVsync(false);
1341 if (!hasSyncFramework) {
1342 if (hw->isDisplayOn()) {
1343 enableHardwareVsync();
1347 if (mAnimCompositionPending) {
1348 mAnimCompositionPending = false;
1350 if (retireFenceTime->isValid()) {
1351 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
1353 // The HWC doesn't support present fences, so use the refresh
1354 // timestamp instead.
1355 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1356 mAnimFrameTracker.setActualPresentTime(presentTime);
1358 mAnimFrameTracker.advanceFrame();
1361 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1365 nsecs_t currentTime = systemTime();
1366 if (mHasPoweredOff) {
1367 mHasPoweredOff = false;
1369 nsecs_t period = mPrimaryDispSync.getPeriod();
1370 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1371 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1372 if (numPeriods < NUM_BUCKETS - 1) {
1373 mFrameBuckets[numPeriods] += elapsedTime;
1375 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1377 mTotalTime += elapsedTime;
1379 mLastSwapTime = currentTime;
1382 void SurfaceFlinger::rebuildLayerStacks() {
1383 // rebuild the visible layer list per screen
1384 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1386 mVisibleRegionsDirty = false;
1387 invalidateHwcGeometry();
1389 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1390 Region opaqueRegion;
1392 Vector< sp<Layer> > layersSortedByZ;
1393 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1394 const Transform& tr(hw->getTransform());
1395 const Rect bounds(hw->getBounds());
1396 if (hw->isDisplayOn()) {
1397 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
1399 mDrawingState.traverseInZOrder([&](Layer* layer) {
1400 if (layer->getLayerStack() == hw->getLayerStack()) {
1401 Region drawRegion(tr.transform(
1402 layer->visibleNonTransparentRegion));
1403 drawRegion.andSelf(bounds);
1404 if (!drawRegion.isEmpty()) {
1405 layersSortedByZ.add(layer);
1410 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1411 hw->undefinedRegion.set(bounds);
1412 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1413 hw->dirtyRegion.orSelf(dirtyRegion);
1418 void SurfaceFlinger::setUpHWComposer() {
1419 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1420 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1421 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1422 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1424 // If nothing has changed (!dirty), don't recompose.
1425 // If something changed, but we don't currently have any visible layers,
1426 // and didn't when we last did a composition, then skip it this time.
1427 // The second rule does two things:
1428 // - When all layers are removed from a display, we'll emit one black
1429 // frame, then nothing more until we get new layers.
1430 // - When a display is created with a private layer stack, we won't
1431 // emit any black frames until a layer is added to the layer stack.
1432 bool mustRecompose = dirty && !(empty && wasEmpty);
1434 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1435 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1436 mustRecompose ? "doing" : "skipping",
1439 wasEmpty ? "+" : "-");
1441 mDisplays[dpy]->beginFrame(mustRecompose);
1443 if (mustRecompose) {
1444 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1448 HWComposer& hwc(getHwComposer());
1449 if (hwc.initCheck() == NO_ERROR) {
1450 // build the h/w work list
1451 if (CC_UNLIKELY(mHwWorkListDirty)) {
1452 mHwWorkListDirty = false;
1453 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1454 sp<const DisplayDevice> hw(mDisplays[dpy]);
1455 const int32_t id = hw->getHwcDisplayId();
1457 const Vector< sp<Layer> >& currentLayers(
1458 hw->getVisibleLayersSortedByZ());
1459 const size_t count = currentLayers.size();
1460 if (hwc.createWorkList(id, count) == NO_ERROR) {
1461 HWComposer::LayerListIterator cur = hwc.begin(id);
1462 const HWComposer::LayerListIterator end = hwc.end(id);
1463 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1464 const sp<Layer>& layer(currentLayers[i]);
1465 layer->setGeometry(hw, *cur);
1466 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1475 // set the per-frame data
1476 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1477 sp<const DisplayDevice> hw(mDisplays[dpy]);
1478 const int32_t id = hw->getHwcDisplayId();
1480 const Vector< sp<Layer> >& currentLayers(
1481 hw->getVisibleLayersSortedByZ());
1482 const size_t count = currentLayers.size();
1483 HWComposer::LayerListIterator cur = hwc.begin(id);
1484 const HWComposer::LayerListIterator end = hwc.end(id);
1485 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1487 * update the per-frame h/w composer data for each layer
1488 * and build the transparent region of the FB
1490 const sp<Layer>& layer(currentLayers[i]);
1491 layer->setPerFrameData(hw, *cur);
1496 // If possible, attempt to use the cursor overlay on each display.
1497 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1498 sp<const DisplayDevice> hw(mDisplays[dpy]);
1499 const int32_t id = hw->getHwcDisplayId();
1501 const Vector< sp<Layer> >& currentLayers(
1502 hw->getVisibleLayersSortedByZ());
1503 const size_t count = currentLayers.size();
1504 HWComposer::LayerListIterator cur = hwc.begin(id);
1505 const HWComposer::LayerListIterator end = hwc.end(id);
1506 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1507 const sp<Layer>& layer(currentLayers[i]);
1508 if (layer->isPotentialCursor()) {
1509 cur->setIsCursorLayerHint();
1516 status_t err = hwc.prepare();
1517 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1519 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1520 sp<const DisplayDevice> hw(mDisplays[dpy]);
1521 hw->prepareFrame(hwc);
1526 void SurfaceFlinger::doComposition() {
1528 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1529 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1530 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1531 if (hw->isDisplayOn()) {
1532 // transform the dirty region into this screen's coordinate space
1533 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1535 // repaint the framebuffer (if needed)
1536 doDisplayComposition(hw, dirtyRegion);
1538 hw->dirtyRegion.clear();
1539 hw->flip(hw->swapRegion);
1540 hw->swapRegion.clear();
1542 // inform the h/w that we're done compositing
1543 hw->compositionComplete();
1548 void SurfaceFlinger::postFramebuffer()
1552 const nsecs_t now = systemTime();
1553 mDebugInSwapBuffers = now;
1555 HWComposer& hwc(getHwComposer());
1556 if (hwc.initCheck() == NO_ERROR) {
1557 if (!hwc.supportsFramebufferTarget()) {
1559 // "surface must be bound to the calling thread's current context,
1560 // for the current rendering API."
1561 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1566 // make the default display current because the VirtualDisplayDevice code cannot
1567 // deal with dequeueBuffer() being called outside of the composition loop; however
1568 // the code below can call glFlush() which is allowed (and does in some case) call
1570 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1572 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1573 sp<const DisplayDevice> hw(mDisplays[dpy]);
1574 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1575 hw->onSwapBuffersCompleted(hwc);
1576 const size_t count = currentLayers.size();
1577 int32_t id = hw->getHwcDisplayId();
1578 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1579 HWComposer::LayerListIterator cur = hwc.begin(id);
1580 const HWComposer::LayerListIterator end = hwc.end(id);
1581 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1582 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1585 for (size_t i = 0; i < count; i++) {
1586 currentLayers[i]->onLayerDisplayed(hw, NULL);
1591 mLastSwapBufferTime = systemTime() - now;
1592 mDebugInSwapBuffers = 0;
1594 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1595 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1600 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1604 // here we keep a copy of the drawing state (that is the state that's
1605 // going to be overwritten by handleTransactionLocked()) outside of
1606 // mStateLock so that the side-effects of the State assignment
1607 // don't happen with mStateLock held (which can cause deadlocks).
1608 State drawingState(mDrawingState);
1610 Mutex::Autolock _l(mStateLock);
1611 const nsecs_t now = systemTime();
1612 mDebugInTransaction = now;
1614 // Here we're guaranteed that some transaction flags are set
1615 // so we can call handleTransactionLocked() unconditionally.
1616 // We call getTransactionFlags(), which will also clear the flags,
1617 // with mStateLock held to guarantee that mCurrentState won't change
1618 // until the transaction is committed.
1620 transactionFlags = getTransactionFlags(eTransactionMask);
1621 handleTransactionLocked(transactionFlags);
1623 mLastTransactionTime = systemTime() - now;
1624 mDebugInTransaction = 0;
1625 invalidateHwcGeometry();
1626 // here the transaction has been committed
1629 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1631 // Notify all layers of available frames
1632 mCurrentState.traverseInZOrder([](Layer* layer) {
1633 layer->notifyAvailableFrames();
1637 * Traversal of the children
1638 * (perform the transaction for each of them if needed)
1641 if (transactionFlags & eTraversalNeeded) {
1642 mCurrentState.traverseInZOrder([&](Layer* layer) {
1643 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
1644 if (!trFlags) return;
1646 const uint32_t flags = layer->doTransaction(0);
1647 if (flags & Layer::eVisibleRegion)
1648 mVisibleRegionsDirty = true;
1653 * Perform display own transactions if needed
1656 if (transactionFlags & eDisplayTransactionNeeded) {
1657 // here we take advantage of Vector's copy-on-write semantics to
1658 // improve performance by skipping the transaction entirely when
1659 // know that the lists are identical
1660 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1661 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1662 if (!curr.isIdenticalTo(draw)) {
1663 mVisibleRegionsDirty = true;
1664 const size_t cc = curr.size();
1665 size_t dc = draw.size();
1667 // find the displays that were removed
1668 // (ie: in drawing state but not in current state)
1669 // also handle displays that changed
1670 // (ie: displays that are in both lists)
1671 for (size_t i=0 ; i<dc ; i++) {
1672 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1674 // in drawing state but not in current state
1675 if (!draw[i].isMainDisplay()) {
1676 // Call makeCurrent() on the primary display so we can
1677 // be sure that nothing associated with this display
1679 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
1680 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1681 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
1683 hw->disconnect(getHwComposer());
1684 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1685 mEventThread->onHotplugReceived(draw[i].type, false);
1686 mDisplays.removeItem(draw.keyAt(i));
1688 ALOGW("trying to remove the main display");
1691 // this display is in both lists. see if something changed.
1692 const DisplayDeviceState& state(curr[j]);
1693 const wp<IBinder>& display(curr.keyAt(j));
1694 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1695 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1696 if (state_binder != draw_binder) {
1697 // changing the surface is like destroying and
1698 // recreating the DisplayDevice, so we just remove it
1699 // from the drawing state, so that it get re-added
1701 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
1703 hw->disconnect(getHwComposer());
1704 mDisplays.removeItem(display);
1705 mDrawingState.displays.removeItemsAt(i);
1707 // at this point we must loop to the next item
1711 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
1713 if (state.layerStack != draw[i].layerStack) {
1714 disp->setLayerStack(state.layerStack);
1716 if ((state.orientation != draw[i].orientation)
1717 || (state.viewport != draw[i].viewport)
1718 || (state.frame != draw[i].frame))
1720 disp->setProjection(state.orientation,
1721 state.viewport, state.frame);
1723 if (state.width != draw[i].width || state.height != draw[i].height) {
1724 disp->setDisplaySize(state.width, state.height);
1730 // find displays that were added
1731 // (ie: in current state but not in drawing state)
1732 for (size_t i=0 ; i<cc ; i++) {
1733 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1734 const DisplayDeviceState& state(curr[i]);
1736 sp<DisplaySurface> dispSurface;
1737 sp<IGraphicBufferProducer> producer;
1738 sp<IGraphicBufferProducer> bqProducer;
1739 sp<IGraphicBufferConsumer> bqConsumer;
1740 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
1742 int32_t hwcDisplayId = -1;
1743 if (state.isVirtualDisplay()) {
1744 // Virtual displays without a surface are dormant:
1745 // they have external state (layer stack, projection,
1746 // etc.) but no internal state (i.e. a DisplayDevice).
1747 if (state.surface != NULL) {
1750 int status = state.surface->query(
1751 NATIVE_WINDOW_WIDTH, &width);
1752 ALOGE_IF(status != NO_ERROR,
1753 "Unable to query width (%d)", status);
1755 status = state.surface->query(
1756 NATIVE_WINDOW_HEIGHT, &height);
1757 ALOGE_IF(status != NO_ERROR,
1758 "Unable to query height (%d)", status);
1759 if (mUseHwcVirtualDisplays &&
1760 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1761 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1762 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
1763 hwcDisplayId = allocateHwcDisplayId(state.type);
1766 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1767 *mHwc, hwcDisplayId, state.surface,
1768 bqProducer, bqConsumer, state.displayName);
1774 ALOGE_IF(state.surface!=NULL,
1775 "adding a supported display, but rendering "
1776 "surface is provided (%p), ignoring it",
1777 state.surface.get());
1778 hwcDisplayId = allocateHwcDisplayId(state.type);
1779 // for supported (by hwc) displays we provide our
1780 // own rendering surface
1781 dispSurface = new FramebufferSurface(*mHwc, state.type,
1783 producer = bqProducer;
1786 const wp<IBinder>& display(curr.keyAt(i));
1787 if (dispSurface != NULL) {
1788 sp<DisplayDevice> hw = new DisplayDevice(this,
1789 state.type, hwcDisplayId,
1790 mHwc->getFormat(hwcDisplayId), state.isSecure,
1791 display, dispSurface, producer,
1792 mRenderEngine->getEGLConfig(), false);
1793 hw->setLayerStack(state.layerStack);
1794 hw->setProjection(state.orientation,
1795 state.viewport, state.frame);
1796 hw->setDisplayName(state.displayName);
1797 mDisplays.add(display, hw);
1798 if (state.isVirtualDisplay()) {
1799 if (hwcDisplayId >= 0) {
1800 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1801 hw->getWidth(), hw->getHeight(),
1805 mEventThread->onHotplugReceived(state.type, true);
1813 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1814 // The transform hint might have changed for some layers
1815 // (either because a display has changed, or because a layer
1818 // Walk through all the layers in currentLayers,
1819 // and update their transform hint.
1821 // If a layer is visible only on a single display, then that
1822 // display is used to calculate the hint, otherwise we use the
1825 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1826 // the hint is set before we acquire a buffer from the surface texture.
1828 // NOTE: layer transactions have taken place already, so we use their
1829 // drawing state. However, SurfaceFlinger's own transaction has not
1830 // happened yet, so we must use the current state layer list
1831 // (soon to become the drawing state list).
1833 sp<const DisplayDevice> disp;
1834 uint32_t currentlayerStack = 0;
1836 mCurrentState.traverseInZOrder([&](Layer* layer) {
1837 // NOTE: we rely on the fact that layers are sorted by
1838 // layerStack first (so we don't have to traverse the list
1839 // of displays for every layer).
1840 uint32_t layerStack = layer->getLayerStack();
1841 if (first || currentlayerStack != layerStack) {
1842 currentlayerStack = layerStack;
1843 // figure out if this layerstack is mirrored
1844 // (more than one display) if so, pick the default display,
1845 // if not, pick the only display it's on.
1847 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1848 sp<const DisplayDevice> hw(mDisplays[dpy]);
1849 if (hw->getLayerStack() == currentlayerStack) {
1860 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1861 // redraw after transform hint changes. See bug 8508397.
1863 // could be null when this layer is using a layerStack
1864 // that is not visible on any display. Also can occur at
1865 // screen off/on times.
1866 disp = getDefaultDisplayDeviceLocked();
1868 layer->updateTransformHint(disp);
1876 * Perform our own transaction if needed
1880 mLayersAdded = false;
1881 // Layers have been added.
1882 mVisibleRegionsDirty = true;
1885 // some layers might have been removed, so
1886 // we need to update the regions they're exposing.
1887 if (mLayersRemoved) {
1888 mLayersRemoved = false;
1889 mVisibleRegionsDirty = true;
1890 mDrawingState.traverseInZOrder([&](Layer* layer) {
1891 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
1892 // this layer is not visible anymore
1893 // TODO: we could traverse the tree from front to back and
1894 // compute the actual visible region
1895 // TODO: we could cache the transformed region
1897 visibleReg.set(layer->computeScreenBounds());
1898 invalidateLayerStack(layer, visibleReg);
1903 commitTransaction();
1905 updateCursorAsync();
1908 void SurfaceFlinger::updateCursorAsync()
1910 HWComposer& hwc(getHwComposer());
1911 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1912 sp<const DisplayDevice> hw(mDisplays[dpy]);
1913 const int32_t id = hw->getHwcDisplayId();
1917 const Vector< sp<Layer> >& currentLayers(
1918 hw->getVisibleLayersSortedByZ());
1919 const size_t count = currentLayers.size();
1920 HWComposer::LayerListIterator cur = hwc.begin(id);
1921 const HWComposer::LayerListIterator end = hwc.end(id);
1922 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1923 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1926 const sp<Layer>& layer(currentLayers[i]);
1927 Rect cursorPos = layer->getPosition(hw);
1928 hwc.setCursorPositionAsync(id, cursorPos);
1934 void SurfaceFlinger::commitTransaction()
1936 if (!mLayersPendingRemoval.isEmpty()) {
1937 // Notify removed layers now that they can't be drawn from
1938 for (const auto& l : mLayersPendingRemoval) {
1939 recordBufferingStats(l->getName().string(),
1940 l->getOccupancyHistory(true));
1943 mLayersPendingRemoval.clear();
1946 // If this transaction is part of a window animation then the next frame
1947 // we composite should be considered an animation as well.
1948 mAnimCompositionPending = mAnimTransactionPending;
1950 mDrawingState = mCurrentState;
1951 mDrawingState.traverseInZOrder([](Layer* layer) {
1952 layer->commitChildList();
1954 mTransactionPending = false;
1955 mAnimTransactionPending = false;
1956 mTransactionCV.broadcast();
1959 void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
1960 Region& outDirtyRegion, Region& outOpaqueRegion)
1964 Region aboveOpaqueLayers;
1965 Region aboveCoveredLayers;
1968 outDirtyRegion.clear();
1970 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
1971 // start with the whole surface at its current location
1972 const Layer::State& s(layer->getDrawingState());
1974 // only consider the layers on the given layer stack
1975 if (layer->getLayerStack() != displayDevice->getLayerStack())
1979 * opaqueRegion: area of a surface that is fully opaque.
1981 Region opaqueRegion;
1984 * visibleRegion: area of a surface that is visible on screen
1985 * and not fully transparent. This is essentially the layer's
1986 * footprint minus the opaque regions above it.
1987 * Areas covered by a translucent surface are considered visible.
1989 Region visibleRegion;
1992 * coveredRegion: area of a surface that is covered by all
1993 * visible regions above it (which includes the translucent areas).
1995 Region coveredRegion;
1998 * transparentRegion: area of a surface that is hinted to be completely
1999 * transparent. This is only used to tell when the layer has no visible
2000 * non-transparent regions and can be removed from the layer list. It
2001 * does not affect the visibleRegion of this layer or any layers
2002 * beneath it. The hint may not be correct if apps don't respect the
2003 * SurfaceView restrictions (which, sadly, some don't).
2005 Region transparentRegion;
2008 // handle hidden surfaces by setting the visible region to empty
2009 if (CC_LIKELY(layer->isVisible())) {
2010 const bool translucent = !layer->isOpaque(s);
2011 Rect bounds(layer->computeScreenBounds());
2012 visibleRegion.set(bounds);
2013 Transform tr = layer->getTransform();
2014 if (!visibleRegion.isEmpty()) {
2015 // Remove the transparent area from the visible region
2017 if (tr.preserveRects()) {
2018 // transform the transparent region
2019 transparentRegion = tr.transform(s.activeTransparentRegion);
2021 // transformation too complex, can't do the
2022 // transparent region optimization.
2023 transparentRegion.clear();
2027 // compute the opaque region
2028 const int32_t layerOrientation = tr.getOrientation();
2029 if (s.alpha==255 && !translucent &&
2030 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2031 // the opaque region is the layer's footprint
2032 opaqueRegion = visibleRegion;
2037 // Clip the covered region to the visible region
2038 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2040 // Update aboveCoveredLayers for next (lower) layer
2041 aboveCoveredLayers.orSelf(visibleRegion);
2043 // subtract the opaque region covered by the layers above us
2044 visibleRegion.subtractSelf(aboveOpaqueLayers);
2046 // compute this layer's dirty region
2047 if (layer->contentDirty) {
2048 // we need to invalidate the whole region
2049 dirty = visibleRegion;
2050 // as well, as the old visible region
2051 dirty.orSelf(layer->visibleRegion);
2052 layer->contentDirty = false;
2054 /* compute the exposed region:
2055 * the exposed region consists of two components:
2056 * 1) what's VISIBLE now and was COVERED before
2057 * 2) what's EXPOSED now less what was EXPOSED before
2059 * note that (1) is conservative, we start with the whole
2060 * visible region but only keep what used to be covered by
2061 * something -- which mean it may have been exposed.
2063 * (2) handles areas that were not covered by anything but got
2064 * exposed because of a resize.
2066 const Region newExposed = visibleRegion - coveredRegion;
2067 const Region oldVisibleRegion = layer->visibleRegion;
2068 const Region oldCoveredRegion = layer->coveredRegion;
2069 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2070 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2072 dirty.subtractSelf(aboveOpaqueLayers);
2074 // accumulate to the screen dirty region
2075 outDirtyRegion.orSelf(dirty);
2077 // Update aboveOpaqueLayers for next (lower) layer
2078 aboveOpaqueLayers.orSelf(opaqueRegion);
2080 // Store the visible region in screen space
2081 layer->setVisibleRegion(visibleRegion);
2082 layer->setCoveredRegion(coveredRegion);
2083 layer->setVisibleNonTransparentRegion(
2084 visibleRegion.subtract(transparentRegion));
2087 outOpaqueRegion = aboveOpaqueLayers;
2090 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2091 uint32_t layerStack = layer->getLayerStack();
2092 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2093 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2094 if (hw->getLayerStack() == layerStack) {
2095 hw->dirtyRegion.orSelf(dirty);
2100 bool SurfaceFlinger::handlePageFlip()
2102 nsecs_t latchTime = systemTime();
2105 bool visibleRegions = false;
2106 bool frameQueued = false;
2108 // Store the set of layers that need updates. This set must not change as
2109 // buffers are being latched, as this could result in a deadlock.
2110 // Example: Two producers share the same command stream and:
2111 // 1.) Layer 0 is latched
2112 // 2.) Layer 0 gets a new frame
2113 // 2.) Layer 1 gets a new frame
2114 // 3.) Layer 1 is latched.
2115 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2116 // second frame. But layer 0's second frame could be waiting on display.
2117 Vector<Layer*> layersWithQueuedFrames;
2118 mDrawingState.traverseInZOrder([&](Layer* layer) {
2119 if (layer->hasQueuedFrame()) {
2121 if (layer->shouldPresentNow(mPrimaryDispSync)) {
2122 layersWithQueuedFrames.push_back(layer);
2124 layer->useEmptyDamage();
2127 layer->useEmptyDamage();
2130 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2131 Layer* layer = layersWithQueuedFrames[i];
2132 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
2133 layer->useSurfaceDamage();
2134 invalidateLayerStack(layer, dirty);
2137 mVisibleRegionsDirty |= visibleRegions;
2139 // If we will need to wake up at some time in the future to deal with a
2140 // queued frame that shouldn't be displayed during this vsync period, wake
2141 // up during the next vsync period to check again.
2142 if (frameQueued && layersWithQueuedFrames.empty()) {
2143 signalLayerUpdate();
2146 // Only continue with the refresh if there is actually new work to do
2147 return !layersWithQueuedFrames.empty();
2150 void SurfaceFlinger::invalidateHwcGeometry()
2152 mHwWorkListDirty = true;
2156 void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2157 const Region& inDirtyRegion)
2159 // We only need to actually compose the display if:
2160 // 1) It is being handled by hardware composer, which may need this to
2161 // keep its virtual display state machine in sync, or
2162 // 2) There is work to be done (the dirty region isn't empty)
2163 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2164 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2168 Region dirtyRegion(inDirtyRegion);
2170 // compute the invalid region
2171 hw->swapRegion.orSelf(dirtyRegion);
2173 uint32_t flags = hw->getFlags();
2174 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2175 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2176 // takes a rectangle, we must make sure to update that whole
2177 // rectangle in that case
2178 dirtyRegion.set(hw->swapRegion.bounds());
2180 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2181 // We need to redraw the rectangle that will be updated
2182 // (pushed to the framebuffer).
2183 // This is needed because PARTIAL_UPDATES only takes one
2184 // rectangle instead of a region (see DisplayDevice::flip())
2185 dirtyRegion.set(hw->swapRegion.bounds());
2187 // we need to redraw everything (the whole screen)
2188 dirtyRegion.set(hw->bounds());
2189 hw->swapRegion = dirtyRegion;
2193 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2194 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2196 RenderEngine& engine(getRenderEngine());
2197 mat4 colorMatrix = mColorMatrix;
2199 colorMatrix = colorMatrix * mDaltonizer();
2201 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2202 doComposeSurfaces(hw, dirtyRegion);
2203 engine.setupColorTransform(oldMatrix);
2206 // update the swap region and clear the dirty region
2207 hw->swapRegion.orSelf(dirtyRegion);
2209 // swap buffers (presentation)
2210 hw->swapBuffers(getHwComposer());
2213 bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2215 RenderEngine& engine(getRenderEngine());
2216 const int32_t id = hw->getHwcDisplayId();
2217 HWComposer& hwc(getHwComposer());
2218 HWComposer::LayerListIterator cur = hwc.begin(id);
2219 const HWComposer::LayerListIterator end = hwc.end(id);
2221 bool hasGlesComposition = hwc.hasGlesComposition(id);
2222 if (hasGlesComposition) {
2223 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2224 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2225 hw->getDisplayName().string());
2226 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2227 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2228 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2233 // Never touch the framebuffer if we don't have any framebuffer layers
2234 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2235 if (hasHwcComposition) {
2236 // when using overlays, we assume a fully transparent framebuffer
2237 // NOTE: we could reduce how much we need to clear, for instance
2238 // remove where there are opaque FB layers. however, on some
2239 // GPUs doing a "clean slate" clear might be more efficient.
2240 // We'll revisit later if needed.
2241 engine.clearWithColor(0, 0, 0, 0);
2243 // we start with the whole screen area
2244 const Region bounds(hw->getBounds());
2246 // we remove the scissor part
2247 // we're left with the letterbox region
2248 // (common case is that letterbox ends-up being empty)
2249 const Region letterbox(bounds.subtract(hw->getScissor()));
2251 // compute the area to clear
2252 Region region(hw->undefinedRegion.merge(letterbox));
2254 // but limit it to the dirty region
2255 region.andSelf(dirty);
2257 // screen is already cleared here
2258 if (!region.isEmpty()) {
2259 // can happen with SurfaceView
2260 drawWormhole(hw, region);
2264 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2265 // just to be on the safe side, we don't set the
2266 // scissor on the main display. It should never be needed
2267 // anyways (though in theory it could since the API allows it).
2268 const Rect& bounds(hw->getBounds());
2269 const Rect& scissor(hw->getScissor());
2270 if (scissor != bounds) {
2271 // scissor doesn't match the screen's dimensions, so we
2272 // need to clear everything outside of it and enable
2273 // the GL scissor so we don't draw anything where we shouldn't
2275 // enable scissor for this frame
2276 const uint32_t height = hw->getHeight();
2277 engine.setScissor(scissor.left, height - scissor.bottom,
2278 scissor.getWidth(), scissor.getHeight());
2284 * and then, render the layers targeted at the framebuffer
2287 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2288 const size_t count = layers.size();
2289 const Transform& tr = hw->getTransform();
2291 // we're using h/w composer
2292 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2293 const sp<Layer>& layer(layers[i]);
2294 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2295 if (!clip.isEmpty()) {
2296 switch (cur->getCompositionType()) {
2297 case HWC_CURSOR_OVERLAY:
2299 const Layer::State& state(layer->getDrawingState());
2300 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2302 && layer->isOpaque(state) && (state.alpha == 0xFF)
2303 && hasGlesComposition) {
2304 // never clear the very first layer since we're
2305 // guaranteed the FB is already cleared
2306 layer->clearWithOpenGL(hw);
2310 case HWC_FRAMEBUFFER: {
2311 layer->draw(hw, clip);
2314 case HWC_FRAMEBUFFER_TARGET: {
2315 // this should not happen as the iterator shouldn't
2316 // let us get there.
2317 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2322 layer->setAcquireFence(hw, *cur);
2325 // we're not using h/w composer
2326 for (size_t i=0 ; i<count ; ++i) {
2327 const sp<Layer>& layer(layers[i]);
2328 const Region clip(dirty.intersect(
2329 tr.transform(layer->visibleRegion)));
2330 if (!clip.isEmpty()) {
2331 layer->draw(hw, clip);
2336 // disable scissor at the end of the frame
2337 engine.disableScissor();
2341 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2342 const int32_t height = hw->getHeight();
2343 RenderEngine& engine(getRenderEngine());
2344 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2347 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2348 const sp<IBinder>& handle,
2349 const sp<IGraphicBufferProducer>& gbc,
2350 const sp<Layer>& lbc,
2351 const sp<Layer>& parent)
2353 // add this layer to the current state list
2355 Mutex::Autolock _l(mStateLock);
2356 if (mNumLayers >= MAX_LAYERS) {
2359 if (parent == nullptr) {
2360 mCurrentState.layersSortedByZ.add(lbc);
2362 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2363 ALOGE("addClientLayer called with a removed parent");
2364 return NAME_NOT_FOUND;
2366 parent->addChild(lbc);
2369 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2370 mLayersAdded = true;
2374 // attach this layer to the client
2375 client->attachLayer(handle, lbc);
2380 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
2381 Mutex::Autolock _l(mStateLock);
2383 const auto& p = layer->getParent();
2390 sp<Layer> ancestor = p;
2391 while (ancestor->getParent() != nullptr) {
2392 ancestor = ancestor->getParent();
2394 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2395 ALOGE("removeLayer called with a layer whose parent has been removed");
2396 return NAME_NOT_FOUND;
2399 index = p->removeChild(layer);
2401 index = mCurrentState.layersSortedByZ.remove(layer);
2404 // As a matter of normal operation, the LayerCleaner will produce a second
2405 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2406 // so we will succeed in promoting it, but it's already been removed
2407 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2408 // otherwise something has gone wrong and we are leaking the layer.
2409 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
2410 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2411 layer->getName().string(),
2412 (p != nullptr) ? p->getName().string() : "no-parent");
2414 } else if (index < 0) {
2418 layer->onRemovedFromCurrentState();
2419 mLayersPendingRemoval.add(layer);
2420 mLayersRemoved = true;
2421 mNumLayers -= 1 + layer->getChildrenCount();
2422 setTransactionFlags(eTransactionNeeded);
2426 uint32_t SurfaceFlinger::peekTransactionFlags() {
2427 return android_atomic_release_load(&mTransactionFlags);
2430 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2431 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2434 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2435 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2436 if ((old & flags)==0) { // wake the server up
2437 signalTransaction();
2442 void SurfaceFlinger::setTransactionState(
2443 const Vector<ComposerState>& state,
2444 const Vector<DisplayState>& displays,
2448 Mutex::Autolock _l(mStateLock);
2449 uint32_t transactionFlags = 0;
2451 if (flags & eAnimation) {
2452 // For window updates that are part of an animation we must wait for
2453 // previous animation "frames" to be handled.
2454 while (mAnimTransactionPending) {
2455 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2456 if (CC_UNLIKELY(err != NO_ERROR)) {
2457 // just in case something goes wrong in SF, return to the
2458 // caller after a few seconds.
2459 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2460 "waiting for previous animation frame");
2461 mAnimTransactionPending = false;
2467 size_t count = displays.size();
2468 for (size_t i=0 ; i<count ; i++) {
2469 const DisplayState& s(displays[i]);
2470 transactionFlags |= setDisplayStateLocked(s);
2473 count = state.size();
2474 for (size_t i=0 ; i<count ; i++) {
2475 const ComposerState& s(state[i]);
2476 // Here we need to check that the interface we're given is indeed
2477 // one of our own. A malicious client could give us a NULL
2478 // IInterface, or one of its own or even one of our own but a
2479 // different type. All these situations would cause us to crash.
2481 // NOTE: it would be better to use RTTI as we could directly check
2482 // that we have a Client*. however, RTTI is disabled in Android.
2483 if (s.client != NULL) {
2484 sp<IBinder> binder = IInterface::asBinder(s.client);
2485 if (binder != NULL) {
2486 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
2487 sp<Client> client( static_cast<Client *>(s.client.get()) );
2488 transactionFlags |= setClientStateLocked(client, s.state);
2494 // If a synchronous transaction is explicitly requested without any changes,
2495 // force a transaction anyway. This can be used as a flush mechanism for
2496 // previous async transactions.
2497 if (transactionFlags == 0 && (flags & eSynchronous)) {
2498 transactionFlags = eTransactionNeeded;
2501 if (transactionFlags) {
2502 if (mInterceptor.isEnabled()) {
2503 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2506 // this triggers the transaction
2507 setTransactionFlags(transactionFlags);
2509 // if this is a synchronous transaction, wait for it to take effect
2510 // before returning.
2511 if (flags & eSynchronous) {
2512 mTransactionPending = true;
2514 if (flags & eAnimation) {
2515 mAnimTransactionPending = true;
2517 while (mTransactionPending) {
2518 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2519 if (CC_UNLIKELY(err != NO_ERROR)) {
2520 // just in case something goes wrong in SF, return to the
2521 // called after a few seconds.
2522 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2523 mTransactionPending = false;
2530 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2532 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2537 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2538 if (disp.isValid()) {
2539 const uint32_t what = s.what;
2540 if (what & DisplayState::eSurfaceChanged) {
2541 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2542 disp.surface = s.surface;
2543 flags |= eDisplayTransactionNeeded;
2546 if (what & DisplayState::eLayerStackChanged) {
2547 if (disp.layerStack != s.layerStack) {
2548 disp.layerStack = s.layerStack;
2549 flags |= eDisplayTransactionNeeded;
2552 if (what & DisplayState::eDisplayProjectionChanged) {
2553 if (disp.orientation != s.orientation) {
2554 disp.orientation = s.orientation;
2555 flags |= eDisplayTransactionNeeded;
2557 if (disp.frame != s.frame) {
2558 disp.frame = s.frame;
2559 flags |= eDisplayTransactionNeeded;
2561 if (disp.viewport != s.viewport) {
2562 disp.viewport = s.viewport;
2563 flags |= eDisplayTransactionNeeded;
2566 if (what & DisplayState::eDisplaySizeChanged) {
2567 if (disp.width != s.width) {
2568 disp.width = s.width;
2569 flags |= eDisplayTransactionNeeded;
2571 if (disp.height != s.height) {
2572 disp.height = s.height;
2573 flags |= eDisplayTransactionNeeded;
2580 uint32_t SurfaceFlinger::setClientStateLocked(
2581 const sp<Client>& client,
2582 const layer_state_t& s)
2585 sp<Layer> layer(client->getLayerUser(s.surface));
2587 const uint32_t what = s.what;
2588 bool geometryAppliesWithResize =
2589 what & layer_state_t::eGeometryAppliesWithResize;
2590 if (what & layer_state_t::ePositionChanged) {
2591 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2592 flags |= eTraversalNeeded;
2595 if (what & layer_state_t::eLayerChanged) {
2596 // NOTE: index needs to be calculated before we update the state
2597 const auto& p = layer->getParent();
2599 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2600 if (layer->setLayer(s.z) && idx >= 0) {
2601 mCurrentState.layersSortedByZ.removeAt(idx);
2602 mCurrentState.layersSortedByZ.add(layer);
2603 // we need traversal (state changed)
2604 // AND transaction (list changed)
2605 flags |= eTransactionNeeded|eTraversalNeeded;
2608 if (p->setChildLayer(layer, s.z)) {
2609 flags |= eTransactionNeeded|eTraversalNeeded;
2613 if (what & layer_state_t::eSizeChanged) {
2614 if (layer->setSize(s.w, s.h)) {
2615 flags |= eTraversalNeeded;
2618 if (what & layer_state_t::eAlphaChanged) {
2619 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2620 flags |= eTraversalNeeded;
2622 if (what & layer_state_t::eMatrixChanged) {
2623 if (layer->setMatrix(s.matrix))
2624 flags |= eTraversalNeeded;
2626 if (what & layer_state_t::eTransparentRegionChanged) {
2627 if (layer->setTransparentRegionHint(s.transparentRegion))
2628 flags |= eTraversalNeeded;
2630 if (what & layer_state_t::eFlagsChanged) {
2631 if (layer->setFlags(s.flags, s.mask))
2632 flags |= eTraversalNeeded;
2634 if (what & layer_state_t::eCropChanged) {
2635 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2636 flags |= eTraversalNeeded;
2638 if (what & layer_state_t::eFinalCropChanged) {
2639 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
2640 flags |= eTraversalNeeded;
2642 if (what & layer_state_t::eLayerStackChanged) {
2643 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2644 // We only allow setting layer stacks for top level layers,
2645 // everything else inherits layer stack from its parent.
2646 if (layer->hasParent()) {
2647 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2648 layer->getName().string());
2649 } else if (idx < 0) {
2650 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2651 "that also does not appear in the top level layer list. Something"
2652 " has gone wrong.", layer->getName().string());
2653 } else if (layer->setLayerStack(s.layerStack)) {
2654 mCurrentState.layersSortedByZ.removeAt(idx);
2655 mCurrentState.layersSortedByZ.add(layer);
2656 // we need traversal (state changed)
2657 // AND transaction (list changed)
2658 flags |= eTransactionNeeded|eTraversalNeeded;
2661 if (what & layer_state_t::eDeferTransaction) {
2662 if (s.barrierHandle != nullptr) {
2663 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2664 } else if (s.barrierGbp != nullptr) {
2665 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2666 if (authenticateSurfaceTextureLocked(gbp)) {
2667 const auto& otherLayer =
2668 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2669 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2671 ALOGE("Attempt to defer transaction to to an"
2672 " unrecognized GraphicBufferProducer");
2675 // We don't trigger a traversal here because if no other state is
2676 // changed, we don't want this to cause any more work
2678 if (what & layer_state_t::eReparentChildren) {
2679 if (layer->reparentChildren(s.reparentHandle)) {
2680 flags |= eTransactionNeeded|eTraversalNeeded;
2683 if (what & layer_state_t::eDetachChildren) {
2684 layer->detachChildren();
2686 if (what & layer_state_t::eOverrideScalingModeChanged) {
2687 layer->setOverrideScalingMode(s.overrideScalingMode);
2688 // We don't trigger a traversal here because if no other state is
2689 // changed, we don't want this to cause any more work
2695 status_t SurfaceFlinger::createLayer(
2696 const String8& name,
2697 const sp<Client>& client,
2698 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
2699 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2700 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
2702 if (int32_t(w|h) < 0) {
2703 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2708 status_t result = NO_ERROR;
2712 String8 uniqueName = getUniqueLayerName(name);
2714 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2715 case ISurfaceComposerClient::eFXSurfaceNormal:
2716 result = createNormalLayer(client,
2717 uniqueName, w, h, flags, format,
2718 handle, gbp, &layer);
2720 case ISurfaceComposerClient::eFXSurfaceDim:
2721 result = createDimLayer(client,
2722 uniqueName, w, h, flags,
2723 handle, gbp, &layer);
2730 if (result != NO_ERROR) {
2734 layer->setInfo(windowType, ownerUid);
2736 result = addClientLayer(client, *handle, *gbp, layer, *parent);
2737 if (result != NO_ERROR) {
2740 mInterceptor.saveSurfaceCreation(layer);
2742 setTransactionFlags(eTransactionNeeded);
2746 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2748 bool matchFound = true;
2749 uint32_t dupeCounter = 0;
2751 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2752 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2754 // Loop over layers until we're sure there is no matching name
2755 while (matchFound) {
2757 mDrawingState.traverseInZOrder([&](Layer* layer) {
2758 if (layer->getName() == uniqueName) {
2760 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2765 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2770 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2771 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2772 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2774 // initialize the surfaces
2776 case PIXEL_FORMAT_TRANSPARENT:
2777 case PIXEL_FORMAT_TRANSLUCENT:
2778 format = PIXEL_FORMAT_RGBA_8888;
2780 case PIXEL_FORMAT_OPAQUE:
2781 format = PIXEL_FORMAT_RGBX_8888;
2785 *outLayer = new Layer(this, client, name, w, h, flags);
2786 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2787 if (err == NO_ERROR) {
2788 *handle = (*outLayer)->getHandle();
2789 *gbp = (*outLayer)->getProducer();
2792 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2796 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2797 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2798 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2800 *outLayer = new LayerDim(this, client, name, w, h, flags);
2801 *handle = (*outLayer)->getHandle();
2802 *gbp = (*outLayer)->getProducer();
2806 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2808 // called by a client when it wants to remove a Layer
2809 status_t err = NO_ERROR;
2810 sp<Layer> l(client->getLayerUser(handle));
2812 mInterceptor.saveSurfaceDeletion(l);
2813 err = removeLayer(l);
2814 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2815 "error removing layer=%p (%s)", l.get(), strerror(-err));
2820 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2822 // called by ~LayerCleaner() when all references to the IBinder (handle)
2824 sp<Layer> l = layer.promote();
2826 // The layer has already been removed, carry on
2829 // If we have a parent, then we can continue to live as long as it does.
2830 return removeLayer(l, true);
2833 // ---------------------------------------------------------------------------
2835 void SurfaceFlinger::onInitializeDisplays() {
2836 // reset screen orientation and use primary layer stack
2837 Vector<ComposerState> state;
2838 Vector<DisplayState> displays;
2840 d.what = DisplayState::eDisplayProjectionChanged |
2841 DisplayState::eLayerStackChanged;
2842 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2844 d.orientation = DisplayState::eOrientationDefault;
2845 d.frame.makeInvalid();
2846 d.viewport.makeInvalid();
2850 setTransactionState(state, displays, 0);
2851 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2853 const nsecs_t period =
2854 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2855 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2857 // Use phase of 0 since phase is not known.
2858 // Use latency of 0, which will snap to the ideal latency.
2859 setCompositorTimingSnapped(0, period, 0);
2862 void SurfaceFlinger::initializeDisplays() {
2863 class MessageScreenInitialized : public MessageBase {
2864 SurfaceFlinger* flinger;
2866 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2867 virtual bool handler() {
2868 flinger->onInitializeDisplays();
2872 sp<MessageBase> msg = new MessageScreenInitialized(this);
2873 postMessageAsync(msg); // we may be called from main thread, use async message
2876 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2878 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2880 int32_t type = hw->getDisplayType();
2881 int currentMode = hw->getPowerMode();
2883 if (mode == currentMode) {
2884 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2888 hw->setPowerMode(mode);
2889 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2890 ALOGW("Trying to set power mode for virtual display");
2894 if (mInterceptor.isEnabled()) {
2895 Mutex::Autolock _l(mStateLock);
2896 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2898 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2901 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2904 if (currentMode == HWC_POWER_MODE_OFF) {
2905 // Turn on the display
2906 getHwComposer().setPowerMode(type, mode);
2907 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2908 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
2909 // FIXME: eventthread only knows about the main display right now
2910 mEventThread->onScreenAcquired();
2911 resyncToHardwareVsync(true);
2914 mVisibleRegionsDirty = true;
2915 mHasPoweredOff = true;
2916 repaintEverything();
2918 struct sched_param param = {0};
2919 param.sched_priority = 1;
2920 if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
2921 ALOGW("Couldn't set SCHED_FIFO on display on");
2923 } else if (mode == HWC_POWER_MODE_OFF) {
2924 // Turn off the display
2925 struct sched_param param = {0};
2926 if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) {
2927 ALOGW("Couldn't set SCHED_OTHER on display off");
2930 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2931 disableHardwareVsync(true); // also cancels any in-progress resync
2933 // FIXME: eventthread only knows about the main display right now
2934 mEventThread->onScreenReleased();
2937 getHwComposer().setPowerMode(type, mode);
2938 mVisibleRegionsDirty = true;
2939 // from this point on, SF will stop drawing on this display
2940 } else if (mode == HWC_POWER_MODE_DOZE ||
2941 mode == HWC_POWER_MODE_NORMAL) {
2942 // Update display while dozing
2943 getHwComposer().setPowerMode(type, mode);
2944 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2945 // FIXME: eventthread only knows about the main display right now
2946 mEventThread->onScreenAcquired();
2947 resyncToHardwareVsync(true);
2949 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2950 // Leave display going to doze
2951 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2952 disableHardwareVsync(true); // also cancels any in-progress resync
2953 // FIXME: eventthread only knows about the main display right now
2954 mEventThread->onScreenReleased();
2956 getHwComposer().setPowerMode(type, mode);
2958 ALOGE("Attempting to set unknown power mode: %d\n", mode);
2959 getHwComposer().setPowerMode(type, mode);
2963 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2964 class MessageSetPowerMode: public MessageBase {
2965 SurfaceFlinger& mFlinger;
2966 sp<IBinder> mDisplay;
2969 MessageSetPowerMode(SurfaceFlinger& flinger,
2970 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2971 mDisplay(disp) { mMode = mode; }
2972 virtual bool handler() {
2973 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2975 ALOGE("Attempt to set power mode = %d for null display %p",
2976 mMode, mDisplay.get());
2977 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2978 ALOGW("Attempt to set power mode = %d for virtual display",
2981 mFlinger.setPowerModeInternal(hw, mMode);
2986 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2987 postMessageSync(msg);
2990 // ---------------------------------------------------------------------------
2992 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2996 IPCThreadState* ipc = IPCThreadState::self();
2997 const int pid = ipc->getCallingPid();
2998 const int uid = ipc->getCallingUid();
2999 if ((uid != AID_SHELL) &&
3000 !PermissionCache::checkPermission(sDump, pid, uid)) {
3001 result.appendFormat("Permission Denial: "
3002 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
3004 // Try to get the main lock, but give up after one second
3005 // (this would indicate SF is stuck, but we want to be able to
3006 // print something in dumpsys).
3007 status_t err = mStateLock.timedLock(s2ns(1));
3008 bool locked = (err == NO_ERROR);
3010 result.appendFormat(
3011 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
3012 "dumping anyways (no locks held)\n", strerror(-err), err);
3015 bool dumpAll = true;
3017 size_t numArgs = args.size();
3019 if ((index < numArgs) &&
3020 (args[index] == String16("--list"))) {
3022 listLayersLocked(args, index, result);
3026 if ((index < numArgs) &&
3027 (args[index] == String16("--latency"))) {
3029 dumpStatsLocked(args, index, result);
3033 if ((index < numArgs) &&
3034 (args[index] == String16("--latency-clear"))) {
3036 clearStatsLocked(args, index, result);
3040 if ((index < numArgs) &&
3041 (args[index] == String16("--dispsync"))) {
3043 mPrimaryDispSync.dump(result);
3047 if ((index < numArgs) &&
3048 (args[index] == String16("--static-screen"))) {
3050 dumpStaticScreenStats(result);
3054 if ((index < numArgs) &&
3055 (args[index] == String16("--frame-events"))) {
3057 dumpFrameEventsLocked(result);
3063 dumpAllLocked(args, index, result);
3067 mStateLock.unlock();
3070 write(fd, result.string(), result.size());
3074 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3075 size_t& /* index */, String8& result) const
3077 mCurrentState.traverseInZOrder([&](Layer* layer) {
3078 result.appendFormat("%s\n", layer->getName().string());
3082 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3083 String8& result) const
3086 if (index < args.size()) {
3087 name = String8(args[index]);
3091 const nsecs_t period =
3092 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3093 result.appendFormat("%" PRId64 "\n", period);
3095 if (name.isEmpty()) {
3096 mAnimFrameTracker.dumpStats(result);
3098 mCurrentState.traverseInZOrder([&](Layer* layer) {
3099 if (name == layer->getName()) {
3100 layer->dumpFrameStats(result);
3106 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3107 String8& /* result */)
3110 if (index < args.size()) {
3111 name = String8(args[index]);
3115 mCurrentState.traverseInZOrder([&](Layer* layer) {
3116 if (name.isEmpty() || (name == layer->getName())) {
3117 layer->clearFrameStats();
3121 mAnimFrameTracker.clearStats();
3124 // This should only be called from the main thread. Otherwise it would need
3125 // the lock and should use mCurrentState rather than mDrawingState.
3126 void SurfaceFlinger::logFrameStats() {
3127 mDrawingState.traverseInZOrder([&](Layer* layer) {
3128 layer->logFrameStats();
3131 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3134 void SurfaceFlinger::appendSfConfigString(String8& result) const
3136 result.append(" [sf");
3137 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3139 if (isLayerTripleBufferingDisabled())
3140 result.append(" DISABLE_TRIPLE_BUFFERING");
3142 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
3143 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
3144 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
3145 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
3146 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3147 maxFrameBufferAcquiredBuffers);
3151 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3153 result.appendFormat("Static screen stats:\n");
3154 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3155 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3156 float percent = 100.0f *
3157 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3158 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3159 b + 1, bucketTimeSec, percent);
3161 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3162 float percent = 100.0f *
3163 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3164 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3165 NUM_BUCKETS - 1, bucketTimeSec, percent);
3168 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3169 result.appendFormat("Layer frame timestamps:\n");
3171 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3172 const size_t count = currentLayers.size();
3173 for (size_t i=0 ; i<count ; i++) {
3174 currentLayers[i]->dumpFrameEvents(result);
3178 void SurfaceFlinger::recordBufferingStats(const char* layerName,
3179 std::vector<OccupancyTracker::Segment>&& history) {
3180 Mutex::Autolock lock(mBufferingStatsMutex);
3181 auto& stats = mBufferingStats[layerName];
3182 for (const auto& segment : history) {
3183 if (!segment.usedThirdBuffer) {
3184 stats.twoBufferTime += segment.totalTime;
3186 if (segment.occupancyAverage < 1.0f) {
3187 stats.doubleBufferedTime += segment.totalTime;
3188 } else if (segment.occupancyAverage < 2.0f) {
3189 stats.tripleBufferedTime += segment.totalTime;
3191 ++stats.numSegments;
3192 stats.totalTime += segment.totalTime;
3196 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3197 result.append("Buffering stats:\n");
3198 result.append(" [Layer name] <Active time> <Two buffer> "
3199 "<Double buffered> <Triple buffered>\n");
3200 Mutex::Autolock lock(mBufferingStatsMutex);
3201 typedef std::tuple<std::string, float, float, float> BufferTuple;
3202 std::map<float, BufferTuple, std::greater<float>> sorted;
3203 for (const auto& statsPair : mBufferingStats) {
3204 const char* name = statsPair.first.c_str();
3205 const BufferingStats& stats = statsPair.second;
3206 if (stats.numSegments == 0) {
3209 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3210 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3212 float doubleBufferRatio = static_cast<float>(
3213 stats.doubleBufferedTime) / stats.totalTime;
3214 float tripleBufferRatio = static_cast<float>(
3215 stats.tripleBufferedTime) / stats.totalTime;
3216 sorted.insert({activeTime, {name, twoBufferRatio,
3217 doubleBufferRatio, tripleBufferRatio}});
3219 for (const auto& sortedPair : sorted) {
3220 float activeTime = sortedPair.first;
3221 const BufferTuple& values = sortedPair.second;
3222 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3223 std::get<0>(values).c_str(), activeTime,
3224 std::get<1>(values), std::get<2>(values),
3225 std::get<3>(values));
3227 result.append("\n");
3230 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3231 String8& result) const
3233 bool colorize = false;
3234 if (index < args.size()
3235 && (args[index] == String16("--color"))) {
3240 Colorizer colorizer(colorize);
3242 // figure out if we're stuck somewhere
3243 const nsecs_t now = systemTime();
3244 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3245 const nsecs_t inTransaction(mDebugInTransaction);
3246 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3247 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3250 * Dump library configuration.
3253 colorizer.bold(result);
3254 result.append("Build configuration:");
3255 colorizer.reset(result);
3256 appendSfConfigString(result);
3257 appendUiConfigString(result);
3258 appendGuiConfigString(result);
3259 result.append("\n");
3261 colorizer.bold(result);
3262 result.append("Sync configuration: ");
3263 colorizer.reset(result);
3264 result.append(SyncFeatures::getInstance().toString());
3265 result.append("\n");
3267 colorizer.bold(result);
3268 result.append("DispSync configuration: ");
3269 colorizer.reset(result);
3270 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3271 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3272 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
3273 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3274 result.append("\n");
3276 // Dump static screen stats
3277 result.append("\n");
3278 dumpStaticScreenStats(result);
3279 result.append("\n");
3281 dumpBufferingStats(result);
3284 * Dump the visible layer list
3286 colorizer.bold(result);
3287 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
3288 colorizer.reset(result);
3289 mCurrentState.traverseInZOrder([&](Layer* layer) {
3290 layer->dump(result, colorizer);
3294 * Dump Display state
3297 colorizer.bold(result);
3298 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3299 colorizer.reset(result);
3300 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3301 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3306 * Dump SurfaceFlinger global state
3309 colorizer.bold(result);
3310 result.append("SurfaceFlinger global state:\n");
3311 colorizer.reset(result);
3313 HWComposer& hwc(getHwComposer());
3314 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
3316 colorizer.bold(result);
3317 result.appendFormat("EGL implementation : %s\n",
3318 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3319 colorizer.reset(result);
3320 result.appendFormat("%s\n",
3321 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3323 mRenderEngine->dump(result);
3325 hw->undefinedRegion.dump(result, "undefinedRegion");
3326 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3327 hw->getOrientation(), hw->isDisplayOn());
3328 result.appendFormat(
3329 " last eglSwapBuffers() time: %f us\n"
3330 " last transaction time : %f us\n"
3331 " transaction-flags : %08x\n"
3332 " refresh-rate : %f fps\n"
3335 " gpu_to_cpu_unsupported : %d\n"
3337 mLastSwapBufferTime/1000.0,
3338 mLastTransactionTime/1000.0,
3340 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3341 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3342 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3343 !mGpuToCpuSupported);
3345 result.appendFormat(" eglSwapBuffers time: %f us\n",
3346 inSwapBuffersDuration/1000.0);
3348 result.appendFormat(" transaction time: %f us\n",
3349 inTransactionDuration/1000.0);
3354 mEventThread->dump(result);
3357 * Dump HWComposer state
3359 colorizer.bold(result);
3360 result.append("h/w composer state:\n");
3361 colorizer.reset(result);
3362 result.appendFormat(" h/w composer %s and %s\n",
3363 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3364 (mDebugDisableHWC || mDebugRegion || mDaltonize
3365 || mHasColorMatrix) ? "disabled" : "enabled");
3369 * Dump gralloc state
3371 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3375 const Vector< sp<Layer> >&
3376 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3377 // Note: mStateLock is held here
3379 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3380 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3381 dpy = mDisplays.keyAt(i);
3386 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3387 // Just use the primary display so we have something to return
3388 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3390 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
3393 bool SurfaceFlinger::startDdmConnection()
3395 void* libddmconnection_dso =
3396 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3397 if (!libddmconnection_dso) {
3400 void (*DdmConnection_start)(const char* name);
3401 DdmConnection_start =
3402 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3403 if (!DdmConnection_start) {
3404 dlclose(libddmconnection_dso);
3407 (*DdmConnection_start)(getServiceName());
3411 status_t SurfaceFlinger::onTransact(
3412 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3415 case CREATE_CONNECTION:
3416 case CREATE_DISPLAY:
3418 case CLEAR_ANIMATION_FRAME_STATS:
3419 case GET_ANIMATION_FRAME_STATS:
3420 case SET_POWER_MODE:
3421 case GET_HDR_CAPABILITIES:
3423 // codes that require permission check
3424 IPCThreadState* ipc = IPCThreadState::self();
3425 const int pid = ipc->getCallingPid();
3426 const int uid = ipc->getCallingUid();
3427 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3428 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3429 ALOGE("Permission Denial: "
3430 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3431 return PERMISSION_DENIED;
3436 * Calling setTransactionState is safe, because you need to have been
3437 * granted a reference to Client* and Handle* to do anything with it.
3439 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3441 case SET_TRANSACTION_STATE:
3442 case CREATE_SCOPED_CONNECTION:
3446 case CAPTURE_SCREEN:
3448 // codes that require permission check
3449 IPCThreadState* ipc = IPCThreadState::self();
3450 const int pid = ipc->getCallingPid();
3451 const int uid = ipc->getCallingUid();
3452 if ((uid != AID_GRAPHICS) &&
3453 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3454 ALOGE("Permission Denial: "
3455 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3456 return PERMISSION_DENIED;
3462 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3463 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3464 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3465 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3466 IPCThreadState* ipc = IPCThreadState::self();
3467 const int pid = ipc->getCallingPid();
3468 const int uid = ipc->getCallingUid();
3469 ALOGE("Permission Denial: "
3470 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3471 return PERMISSION_DENIED;
3475 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3476 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3478 case 1002: // SHOW_UPDATES
3479 n = data.readInt32();
3480 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3481 invalidateHwcGeometry();
3482 repaintEverything();
3484 case 1004:{ // repaint everything
3485 repaintEverything();
3488 case 1005:{ // force transaction
3489 setTransactionFlags(
3491 eDisplayTransactionNeeded|
3495 case 1006:{ // send empty update
3499 case 1008: // toggle use of hw composer
3500 n = data.readInt32();
3501 mDebugDisableHWC = n ? 1 : 0;
3502 invalidateHwcGeometry();
3503 repaintEverything();
3505 case 1009: // toggle use of transform hint
3506 n = data.readInt32();
3507 mDebugDisableTransformHint = n ? 1 : 0;
3508 invalidateHwcGeometry();
3509 repaintEverything();
3511 case 1010: // interrogate.
3512 reply->writeInt32(0);
3513 reply->writeInt32(0);
3514 reply->writeInt32(mDebugRegion);
3515 reply->writeInt32(0);
3516 reply->writeInt32(mDebugDisableHWC);
3519 Mutex::Autolock _l(mStateLock);
3520 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3521 reply->writeInt32(hw->getPageFlipCount());
3526 n = data.readInt32();
3529 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3532 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3535 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3539 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3541 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3544 invalidateHwcGeometry();
3545 repaintEverything();
3549 // apply a color matrix
3550 n = data.readInt32();
3551 mHasColorMatrix = n ? 1 : 0;
3553 // color matrix is sent as mat3 matrix followed by vec3
3554 // offset, then packed into a mat4 where the last row is
3555 // the offset and extra values are 0
3556 for (size_t i = 0 ; i < 4; i++) {
3557 for (size_t j = 0; j < 4; j++) {
3558 mColorMatrix[i][j] = data.readFloat();
3562 mColorMatrix = mat4();
3564 invalidateHwcGeometry();
3565 repaintEverything();
3568 // This is an experimental interface
3569 // Needs to be shifted to proper binder interface when we productize
3571 n = data.readInt32();
3572 mPrimaryDispSync.setRefreshSkipCount(n);
3576 n = data.readInt32();
3577 mForceFullDamage = static_cast<bool>(n);
3580 case 1018: { // Modify Choreographer's phase offset
3581 n = data.readInt32();
3582 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3585 case 1019: { // Modify SurfaceFlinger's phase offset
3586 n = data.readInt32();
3587 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3590 case 1020: { // Layer updates interceptor
3591 n = data.readInt32();
3593 ALOGV("Interceptor enabled");
3594 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3597 ALOGV("Interceptor disabled");
3598 mInterceptor.disable();
3602 case 1021: { // Disable HWC virtual displays
3603 n = data.readInt32();
3604 mUseHwcVirtualDisplays = !n;
3612 void SurfaceFlinger::repaintEverything() {
3613 android_atomic_or(1, &mRepaintEverything);
3614 signalTransaction();
3617 // ---------------------------------------------------------------------------
3618 // Capture screen into an IGraphiBufferProducer
3619 // ---------------------------------------------------------------------------
3621 /* The code below is here to handle b/8734824
3623 * We create a IGraphicBufferProducer wrapper that forwards all calls
3624 * from the surfaceflinger thread to the calling binder thread, where they
3625 * are executed. This allows the calling thread in the calling process to be
3626 * reused and not depend on having "enough" binder threads to handle the
3629 class GraphicProducerWrapper : public BBinder, public MessageHandler {
3630 /* Parts of GraphicProducerWrapper are run on two different threads,
3631 * communicating by sending messages via Looper but also by shared member
3632 * data. Coherence maintenance is subtle and in places implicit (ugh).
3634 * Don't rely on Looper's sendMessage/handleMessage providing
3635 * release/acquire semantics for any data not actually in the Message.
3636 * Data going from surfaceflinger to binder threads needs to be
3637 * synchronized explicitly.
3639 * Barrier open/wait do provide release/acquire semantics. This provides
3640 * implicit synchronization for data coming back from binder to
3641 * surfaceflinger threads.
3644 sp<IGraphicBufferProducer> impl;
3660 * Called on surfaceflinger thread. This is called by our "fake"
3661 * BpGraphicBufferProducer. We package the data and reply Parcel and
3662 * forward them to the binder thread.
3664 virtual status_t transact(uint32_t code,
3665 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3668 this->reply = reply;
3670 // if we've exited, we run the message synchronously right here.
3671 // note (JH): as far as I can tell from looking at the code, this
3672 // never actually happens. if it does, i'm not sure if it happens
3673 // on the surfaceflinger or binder thread.
3674 handleMessage(Message(MSG_API_CALL));
3677 // Prevent stores to this->{code, data, reply} from being
3678 // reordered later than the construction of Message.
3679 atomic_thread_fence(memory_order_release);
3680 looper->sendMessage(this, Message(MSG_API_CALL));
3687 * here we run on the binder thread. All we've got to do is
3688 * call the real BpGraphicBufferProducer.
3690 virtual void handleMessage(const Message& message) {
3691 int what = message.what;
3692 // Prevent reads below from happening before the read from Message
3693 atomic_thread_fence(memory_order_acquire);
3694 if (what == MSG_API_CALL) {
3695 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3697 } else if (what == MSG_EXIT) {
3698 exitRequested = true;
3703 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3705 looper(new Looper(true)),
3708 exitRequested(false),
3715 status_t waitForResponse() {
3717 looper->pollOnce(-1);
3718 } while (!exitRequested);
3723 void exit(status_t result) {
3724 this->result = result;
3726 // Ensure this->result is visible to the binder thread before it
3727 // handles the message.
3728 atomic_thread_fence(memory_order_release);
3729 looper->sendMessage(this, Message(MSG_EXIT));
3734 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3735 const sp<IGraphicBufferProducer>& producer,
3736 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3737 int32_t minLayerZ, int32_t maxLayerZ,
3738 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3740 if (CC_UNLIKELY(display == 0))
3743 if (CC_UNLIKELY(producer == 0))
3746 // if we have secure windows on this display, never allow the screen capture
3747 // unless the producer interface is local (i.e.: we can take a screenshot for
3749 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3751 // Convert to surfaceflinger's internal rotation type.
3752 Transform::orientation_flags rotationFlags;
3754 case ISurfaceComposer::eRotateNone:
3755 rotationFlags = Transform::ROT_0;
3757 case ISurfaceComposer::eRotate90:
3758 rotationFlags = Transform::ROT_90;
3760 case ISurfaceComposer::eRotate180:
3761 rotationFlags = Transform::ROT_180;
3763 case ISurfaceComposer::eRotate270:
3764 rotationFlags = Transform::ROT_270;
3767 rotationFlags = Transform::ROT_0;
3768 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3772 class MessageCaptureScreen : public MessageBase {
3773 SurfaceFlinger* flinger;
3774 sp<IBinder> display;
3775 sp<IGraphicBufferProducer> producer;
3777 uint32_t reqWidth, reqHeight;
3778 int32_t minLayerZ,maxLayerZ;
3779 bool useIdentityTransform;
3780 Transform::orientation_flags rotation;
3782 bool isLocalScreenshot;
3784 MessageCaptureScreen(SurfaceFlinger* flinger,
3785 const sp<IBinder>& display,
3786 const sp<IGraphicBufferProducer>& producer,
3787 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3788 int32_t minLayerZ, int32_t maxLayerZ,
3789 bool useIdentityTransform,
3790 Transform::orientation_flags rotation,
3791 bool isLocalScreenshot)
3792 : flinger(flinger), display(display), producer(producer),
3793 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3794 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3795 useIdentityTransform(useIdentityTransform),
3796 rotation(rotation), result(PERMISSION_DENIED),
3797 isLocalScreenshot(isLocalScreenshot)
3800 status_t getResult() const {
3803 virtual bool handler() {
3804 Mutex::Autolock _l(flinger->mStateLock);
3805 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
3806 result = flinger->captureScreenImplLocked(hw, producer,
3807 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3808 useIdentityTransform, rotation, isLocalScreenshot);
3809 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3814 // this creates a "fake" BBinder which will serve as a "fake" remote
3815 // binder to receive the marshaled calls and forward them to the
3816 // real remote (a BpGraphicBufferProducer)
3817 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3819 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3820 // which does the marshaling work forwards to our "fake remote" above.
3821 sp<MessageBase> msg = new MessageCaptureScreen(this,
3822 display, IGraphicBufferProducer::asInterface( wrapper ),
3823 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3824 useIdentityTransform, rotationFlags, isLocalScreenshot);
3826 status_t res = postMessageAsync(msg);
3827 if (res == NO_ERROR) {
3828 res = wrapper->waitForResponse();
3834 void SurfaceFlinger::renderScreenImplLocked(
3835 const sp<const DisplayDevice>& hw,
3836 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3837 int32_t minLayerZ, int32_t maxLayerZ,
3838 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3841 RenderEngine& engine(getRenderEngine());
3843 // get screen geometry
3844 const int32_t hw_w = hw->getWidth();
3845 const int32_t hw_h = hw->getHeight();
3846 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3847 static_cast<int32_t>(reqHeight) != hw_h;
3849 // if a default or invalid sourceCrop is passed in, set reasonable values
3850 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3851 !sourceCrop.isValid()) {
3852 sourceCrop.setLeftTop(Point(0, 0));
3853 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3856 // ensure that sourceCrop is inside screen
3857 if (sourceCrop.left < 0) {
3858 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3860 if (sourceCrop.right > hw_w) {
3861 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3863 if (sourceCrop.top < 0) {
3864 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3866 if (sourceCrop.bottom > hw_h) {
3867 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3870 // make sure to clear all GL error flags
3871 engine.checkErrors();
3873 // set-up our viewport
3874 engine.setViewportAndProjection(
3875 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3876 engine.disableTexturing();
3878 // redraw the screen entirely...
3879 engine.clearWithColor(0, 0, 0, 1);
3881 // We loop through the first level of layers without traversing,
3882 // as we need to interpret min/max layer Z in the top level Z space.
3883 for (const auto& layer : mDrawingState.layersSortedByZ) {
3884 if (layer->getLayerStack() != hw->getLayerStack()) {
3887 const Layer::State& state(layer->getDrawingState());
3888 if (state.z < minLayerZ || state.z > maxLayerZ) {
3891 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
3892 if (!layer->isVisible()) {
3895 if (filtering) layer->setFiltering(true);
3896 layer->draw(hw, useIdentityTransform);
3897 if (filtering) layer->setFiltering(false);
3901 // compositionComplete is needed for older driver
3902 hw->compositionComplete();
3903 hw->setViewportAndProjection();
3907 status_t SurfaceFlinger::captureScreenImplLocked(
3908 const sp<const DisplayDevice>& hw,
3909 const sp<IGraphicBufferProducer>& producer,
3910 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3911 int32_t minLayerZ, int32_t maxLayerZ,
3912 bool useIdentityTransform, Transform::orientation_flags rotation,
3913 bool isLocalScreenshot)
3917 // get screen geometry
3918 uint32_t hw_w = hw->getWidth();
3919 uint32_t hw_h = hw->getHeight();
3921 if (rotation & Transform::ROT_90) {
3922 std::swap(hw_w, hw_h);
3925 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3926 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3927 reqWidth, reqHeight, hw_w, hw_h);
3931 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3932 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3934 bool secureLayerIsVisible = false;
3935 for (const auto& layer : mDrawingState.layersSortedByZ) {
3936 const Layer::State& state(layer->getDrawingState());
3937 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3938 (state.z < minLayerZ || state.z > maxLayerZ)) {
3941 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
3942 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3947 if (!isLocalScreenshot && secureLayerIsVisible) {
3948 ALOGW("FB is protected: PERMISSION_DENIED");
3949 return PERMISSION_DENIED;
3952 // create a surface (because we're a producer, and we need to
3953 // dequeue/queue a buffer)
3954 sp<Surface> sur = new Surface(producer, false);
3955 ANativeWindow* window = sur.get();
3957 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3958 if (result == NO_ERROR) {
3959 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3960 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3963 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3964 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3965 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3966 err |= native_window_set_usage(window, usage);
3968 if (err == NO_ERROR) {
3969 ANativeWindowBuffer* buffer;
3970 /* TODO: Once we have the sync framework everywhere this can use
3971 * server-side waits on the fence that dequeueBuffer returns.
3973 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3974 if (result == NO_ERROR) {
3976 // create an EGLImage from the buffer so we can later
3977 // turn it into a texture
3978 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3979 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3980 if (image != EGL_NO_IMAGE_KHR) {
3981 // this binds the given EGLImage as a framebuffer for the
3982 // duration of this scope.
3983 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3984 if (imageBond.getStatus() == NO_ERROR) {
3985 // this will in fact render into our dequeued buffer
3986 // via an FBO, which means we didn't have to create
3987 // an EGLSurface and therefore we're not
3988 // dependent on the context's EGLConfig.
3989 renderScreenImplLocked(
3990 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3991 useIdentityTransform, rotation);
3993 // Attempt to create a sync khr object that can produce a sync point. If that
3994 // isn't available, create a non-dupable sync object in the fallback path and
3995 // wait on it directly.
3997 if (!DEBUG_SCREENSHOTS) {
3998 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3999 // native fence fd will not be populated until flush() is done.
4000 getRenderEngine().flush();
4002 sync = EGL_NO_SYNC_KHR;
4004 if (sync != EGL_NO_SYNC_KHR) {
4006 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
4007 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
4008 ALOGW("captureScreen: failed to dup sync khr object");
4011 eglDestroySyncKHR(mEGLDisplay, sync);
4014 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
4015 if (sync != EGL_NO_SYNC_KHR) {
4016 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
4017 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
4018 EGLint eglErr = eglGetError();
4019 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
4020 ALOGW("captureScreen: fence wait timed out");
4022 ALOGW_IF(eglErr != EGL_SUCCESS,
4023 "captureScreen: error waiting on EGL fence: %#x", eglErr);
4025 eglDestroySyncKHR(mEGLDisplay, sync);
4027 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
4030 if (DEBUG_SCREENSHOTS) {
4031 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4032 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4033 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4034 hw, minLayerZ, maxLayerZ);
4039 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4040 result = INVALID_OPERATION;
4041 window->cancelBuffer(window, buffer, syncFd);
4044 // destroy our image
4045 eglDestroyImageKHR(mEGLDisplay, image);
4050 // queueBuffer takes ownership of syncFd
4051 result = window->queueBuffer(window, buffer, syncFd);
4057 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4063 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
4064 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
4065 if (DEBUG_SCREENSHOTS) {
4066 for (size_t y=0 ; y<h ; y++) {
4067 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4068 for (size_t x=0 ; x<w ; x++) {
4069 if (p[x] != 0xFF000000) return;
4072 ALOGE("*** we just took a black screenshot ***\n"
4073 "requested minz=%d, maxz=%d, layerStack=%d",
4074 minLayerZ, maxLayerZ, hw->getLayerStack());
4076 for (const auto& layer : mDrawingState.layersSortedByZ) {
4077 const Layer::State& state(layer->getDrawingState());
4078 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4079 state.z <= maxLayerZ) {
4080 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4081 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4082 layer->isVisible() ? '+' : '-',
4083 i, layer->getName().string(), layer->getLayerStack(), state.z,
4084 layer->isVisible(), state.flags, state.alpha);
4092 // ---------------------------------------------------------------------------
4094 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4095 layersSortedByZ.traverseInZOrder(stateSet, visitor);
4098 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4099 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
4102 }; // namespace android
4105 #if defined(__gl_h_)
4106 #error "don't include gl/gl.h in this file"
4109 #if defined(__gl2_h_)
4110 #error "don't include gl2/gl2.h in this file"