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 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 = 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() {
686 return getDensityFromProperty("ro.sf.lcd_density"); }
691 const Vector<HWComposer::DisplayConfig>& hwConfigs =
692 getHwComposer().getConfigs(type);
693 for (size_t c = 0; c < hwConfigs.size(); ++c) {
694 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
695 DisplayInfo info = DisplayInfo();
697 float xdpi = hwConfig.xdpi;
698 float ydpi = hwConfig.ydpi;
700 if (type == DisplayDevice::DISPLAY_PRIMARY) {
701 // The density of the device is provided by a build property
702 float density = Density::getBuildDensity() / 160.0f;
704 // the build doesn't provide a density -- this is wrong!
706 ALOGE("ro.sf.lcd_density must be defined as a build property");
707 density = xdpi / 160.0f;
709 if (Density::getEmuDensity()) {
710 // if "qemu.sf.lcd_density" is specified, it overrides everything
711 xdpi = ydpi = density = Density::getEmuDensity();
714 info.density = density;
716 // TODO: this needs to go away (currently needed only by webkit)
717 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
718 info.orientation = hw->getOrientation();
720 // TODO: where should this value come from?
721 static const int TV_DENSITY = 213;
722 info.density = TV_DENSITY / 160.0f;
723 info.orientation = 0;
726 info.w = hwConfig.width;
727 info.h = hwConfig.height;
730 info.fps = float(1e9 / hwConfig.refresh);
731 info.appVsyncOffset = vsyncPhaseOffsetNs;
733 // This is how far in advance a buffer must be queued for
734 // presentation at a given time. If you want a buffer to appear
735 // on the screen at time N, you must submit the buffer before
736 // (N - presentationDeadline).
738 // Normally it's one full refresh period (to give SF a chance to
739 // latch the buffer), but this can be reduced by configuring a
740 // DispSync offset. Any additional delays introduced by the hardware
741 // composer or panel must be accounted for here.
743 // We add an additional 1ms to allow for processing time and
744 // differences between the ideal and actual refresh rate.
745 info.presentationDeadline =
746 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
748 // All non-virtual displays are currently considered secure.
751 configs->push_back(info);
757 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
758 DisplayStatInfo* stats) {
763 // FIXME for now we always return stats for the primary display
764 memset(stats, 0, sizeof(*stats));
765 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
766 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
770 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
771 sp<const DisplayDevice> device(getDisplayDevice(display));
772 if (device != NULL) {
773 return device->getActiveConfig();
778 void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
779 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
781 int32_t type = hw->getDisplayType();
782 int currentMode = hw->getActiveConfig();
784 if (mode == currentMode) {
785 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
789 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
790 ALOGW("Trying to set config for virtual display");
794 hw->setActiveConfig(mode);
795 getHwComposer().setActiveConfig(type, mode);
798 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
799 class MessageSetActiveConfig: public MessageBase {
800 SurfaceFlinger& mFlinger;
801 sp<IBinder> mDisplay;
804 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
806 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
807 virtual bool handler() {
808 Vector<DisplayInfo> configs;
809 mFlinger.getDisplayConfigs(mDisplay, &configs);
810 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
811 ALOGE("Attempt to set active config = %d for display with %zu configs",
812 mMode, configs.size());
814 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
816 ALOGE("Attempt to set active config = %d for null display %p",
817 mMode, mDisplay.get());
818 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
819 ALOGW("Attempt to set active config = %d for virtual display",
822 mFlinger.setActiveConfigInternal(hw, mMode);
827 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
828 postMessageSync(msg);
832 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
833 Vector<android_color_mode_t>* outColorModes) {
834 if (outColorModes == nullptr || display.get() == nullptr) {
838 int32_t type = getDisplayType(display);
839 if (type < 0) return type;
841 std::set<android_color_mode_t> colorModes;
842 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
843 colorModes.insert(hwConfig.colorMode);
846 outColorModes->clear();
847 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
852 android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
853 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
855 int32_t type = getDisplayType(display);
856 if (type < 0) return static_cast<android_color_mode_t>(type);
858 return getHwComposer().getColorMode(type);
861 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
862 android_color_mode_t colorMode) {
863 if (display.get() == nullptr || colorMode < 0) {
867 int32_t type = getDisplayType(display);
868 if (type < 0) return type;
869 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
870 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
871 desiredConfig.colorMode = colorMode;
872 for (size_t c = 0; c < hwConfigs.size(); ++c) {
873 const HWComposer::DisplayConfig config = hwConfigs[c];
874 if (config == desiredConfig) {
875 return setActiveConfig(display, c);
881 status_t SurfaceFlinger::clearAnimationFrameStats() {
882 Mutex::Autolock _l(mStateLock);
883 mAnimFrameTracker.clearStats();
887 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
888 Mutex::Autolock _l(mStateLock);
889 mAnimFrameTracker.getStats(outStats);
893 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
894 HdrCapabilities* outCapabilities) const {
895 // HWC1 does not provide HDR capabilities
896 *outCapabilities = HdrCapabilities();
900 status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
901 if (enable == mInjectVSyncs) {
906 mInjectVSyncs = enable;
907 ALOGV("VSync Injections enabled");
908 if (mVSyncInjector.get() == nullptr) {
909 mVSyncInjector = new InjectVSyncSource();
910 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
912 mEventQueue.setEventThread(mInjectorEventThread);
914 mInjectVSyncs = enable;
915 ALOGV("VSync Injections disabled");
916 mEventQueue.setEventThread(mSFEventThread);
917 mVSyncInjector.clear();
922 status_t SurfaceFlinger::injectVSync(nsecs_t when) {
923 if (!mInjectVSyncs) {
924 ALOGE("VSync Injections not enabled");
927 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
928 ALOGV("Injecting VSync inside SurfaceFlinger");
929 mVSyncInjector->onInjectSyncEvent(when);
934 // ----------------------------------------------------------------------------
936 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
937 ISurfaceComposer::VsyncSource vsyncSource) {
938 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
939 return mSFEventThread->createEventConnection();
941 return mEventThread->createEventConnection();
945 // ----------------------------------------------------------------------------
947 void SurfaceFlinger::waitForEvent() {
948 mEventQueue.waitMessage();
951 void SurfaceFlinger::signalTransaction() {
952 mEventQueue.invalidate();
955 void SurfaceFlinger::signalLayerUpdate() {
956 mEventQueue.invalidate();
959 void SurfaceFlinger::signalRefresh() {
960 mEventQueue.refresh();
963 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
964 nsecs_t reltime, uint32_t /* flags */) {
965 return mEventQueue.postMessage(msg, reltime);
968 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
969 nsecs_t reltime, uint32_t /* flags */) {
970 status_t res = mEventQueue.postMessage(msg, reltime);
971 if (res == NO_ERROR) {
977 void SurfaceFlinger::run() {
983 void SurfaceFlinger::enableHardwareVsync() {
984 Mutex::Autolock _l(mHWVsyncLock);
985 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
986 mPrimaryDispSync.beginResync();
987 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
988 mEventControlThread->setVsyncEnabled(true);
989 mPrimaryHWVsyncEnabled = true;
993 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
994 Mutex::Autolock _l(mHWVsyncLock);
997 mHWVsyncAvailable = true;
998 } else if (!mHWVsyncAvailable) {
999 // Hardware vsync is not currently available, so abort the resync
1004 const nsecs_t period =
1005 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1007 mPrimaryDispSync.reset();
1008 mPrimaryDispSync.setPeriod(period);
1010 if (!mPrimaryHWVsyncEnabled) {
1011 mPrimaryDispSync.beginResync();
1012 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1013 mEventControlThread->setVsyncEnabled(true);
1014 mPrimaryHWVsyncEnabled = true;
1018 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1019 Mutex::Autolock _l(mHWVsyncLock);
1020 if (mPrimaryHWVsyncEnabled) {
1021 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1022 mEventControlThread->setVsyncEnabled(false);
1023 mPrimaryDispSync.endResync();
1024 mPrimaryHWVsyncEnabled = false;
1026 if (makeUnavailable) {
1027 mHWVsyncAvailable = false;
1031 void SurfaceFlinger::resyncWithRateLimit() {
1032 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1033 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1034 resyncToHardwareVsync(false);
1038 void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1039 nsecs_t timestamp) {
1040 bool needsHwVsync = false;
1042 { // Scope for the lock
1043 Mutex::Autolock _l(mHWVsyncLock);
1044 if (type == 0 && mPrimaryHWVsyncEnabled) {
1045 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1050 enableHardwareVsync();
1052 disableHardwareVsync(false);
1056 void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1057 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1058 *compositorTiming = mCompositorTiming;
1061 void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
1062 if (mEventThread == NULL) {
1063 // This is a temporary workaround for b/7145521. A non-null pointer
1064 // does not mean EventThread has finished initializing, so this
1065 // is not a correct fix.
1066 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1070 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1071 Mutex::Autolock _l(mStateLock);
1073 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1075 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1076 mBuiltinDisplays[type].clear();
1078 setTransactionFlags(eDisplayTransactionNeeded);
1080 // Defer EventThread notification until SF has updated mDisplays.
1084 void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1085 repaintEverything();
1088 void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1090 getHwComposer().eventControl(disp, event, enabled);
1093 void SurfaceFlinger::onMessageReceived(int32_t what) {
1096 case MessageQueue::INVALIDATE: {
1097 bool refreshNeeded = handleMessageTransaction();
1098 refreshNeeded |= handleMessageInvalidate();
1099 refreshNeeded |= mRepaintEverything;
1100 if (refreshNeeded) {
1101 // Signal a refresh if a transaction modified the window state,
1102 // a new buffer was latched, or if HWC has requested a full
1108 case MessageQueue::REFRESH: {
1109 handleMessageRefresh();
1115 bool SurfaceFlinger::handleMessageTransaction() {
1116 uint32_t transactionFlags = peekTransactionFlags();
1117 if (transactionFlags) {
1118 handleTransaction(transactionFlags);
1124 bool SurfaceFlinger::handleMessageInvalidate() {
1126 return handlePageFlip();
1129 void SurfaceFlinger::handleMessageRefresh() {
1132 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1134 preComposition(refreshStartTime);
1135 rebuildLayerStacks();
1137 doDebugFlashRegions();
1139 postComposition(refreshStartTime);
1142 void SurfaceFlinger::doDebugFlashRegions()
1144 // is debugging enabled
1145 if (CC_LIKELY(!mDebugRegion))
1148 const bool repaintEverything = mRepaintEverything;
1149 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1150 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1151 if (hw->isDisplayOn()) {
1152 // transform the dirty region into this screen's coordinate space
1153 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1154 if (!dirtyRegion.isEmpty()) {
1155 // redraw the whole screen
1156 doComposeSurfaces(hw, Region(hw->bounds()));
1158 // and draw the dirty region
1159 const int32_t height = hw->getHeight();
1160 RenderEngine& engine(getRenderEngine());
1161 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1163 hw->compositionComplete();
1164 hw->swapBuffers(getHwComposer());
1171 if (mDebugRegion > 1) {
1172 usleep(mDebugRegion * 1000);
1175 HWComposer& hwc(getHwComposer());
1176 if (hwc.initCheck() == NO_ERROR) {
1177 status_t err = hwc.prepare();
1178 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1182 void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
1184 bool needExtraInvalidate = false;
1185 mDrawingState.traverseInZOrder([&](Layer* layer) {
1186 if (layer->onPreComposition(refreshStartTime)) {
1187 needExtraInvalidate = true;
1191 if (needExtraInvalidate) {
1192 signalLayerUpdate();
1196 void SurfaceFlinger::updateCompositorTiming(
1197 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1198 std::shared_ptr<FenceTime>& presentFenceTime) {
1199 // Update queue of past composite+present times and determine the
1200 // most recently known composite to present latency.
1201 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1202 nsecs_t compositeToPresentLatency = -1;
1203 while (!mCompositePresentTimes.empty()) {
1204 CompositePresentTime& cpt = mCompositePresentTimes.front();
1205 // Cached values should have been updated before calling this method,
1206 // which helps avoid duplicate syscalls.
1207 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1208 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1211 compositeToPresentLatency = displayTime - cpt.composite;
1212 mCompositePresentTimes.pop();
1215 // Don't let mCompositePresentTimes grow unbounded, just in case.
1216 while (mCompositePresentTimes.size() > 16) {
1217 mCompositePresentTimes.pop();
1220 setCompositorTimingSnapped(
1221 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1224 void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1225 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
1226 // Integer division and modulo round toward 0 not -inf, so we need to
1227 // treat negative and positive offsets differently.
1228 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
1229 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1230 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1232 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1233 if (idealLatency <= 0) {
1234 idealLatency = vsyncInterval;
1237 // Snap the latency to a value that removes scheduling jitter from the
1238 // composition and present times, which often have >1ms of jitter.
1239 // Reducing jitter is important if an app attempts to extrapolate
1240 // something (such as user input) to an accurate diasplay time.
1241 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1242 // with (presentLatency % interval).
1243 nsecs_t bias = vsyncInterval / 2;
1244 int64_t extraVsyncs =
1245 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1246 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1247 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
1249 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1250 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1251 mCompositorTiming.interval = vsyncInterval;
1252 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1255 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1257 const HWComposer& hwc = getHwComposer();
1258 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1260 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1261 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1262 glCompositionDoneFenceTime =
1263 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1264 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1266 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1268 mGlCompositionDoneTimeline.updateSignalTimes();
1270 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1271 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
1272 mDisplayTimeline.push(retireFenceTime);
1273 mDisplayTimeline.updateSignalTimes();
1275 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1276 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1278 // We use the refreshStartTime which might be sampled a little later than
1279 // when we started doing work for this frame, but that should be okay
1280 // since updateCompositorTiming has snapping logic.
1281 updateCompositorTiming(
1282 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
1283 CompositorTiming compositorTiming;
1285 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1286 compositorTiming = mCompositorTiming;
1289 mDrawingState.traverseInZOrder([&](Layer* layer) {
1290 // TODO(brianderson): The retire fence is incorrectly passed in as the
1291 // present fence. Fix this if this file lives on.
1292 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
1293 retireFenceTime, compositorTiming);
1295 recordBufferingStats(layer->getName().string(),
1296 layer->getOccupancyHistory(false));
1300 if (retireFence->isValid()) {
1301 if (mPrimaryDispSync.addPresentFence(retireFence)) {
1302 enableHardwareVsync();
1304 disableHardwareVsync(false);
1308 if (!hasSyncFramework) {
1309 if (hw->isDisplayOn()) {
1310 enableHardwareVsync();
1314 if (mAnimCompositionPending) {
1315 mAnimCompositionPending = false;
1317 if (retireFenceTime->isValid()) {
1318 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
1320 // The HWC doesn't support present fences, so use the refresh
1321 // timestamp instead.
1322 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1323 mAnimFrameTracker.setActualPresentTime(presentTime);
1325 mAnimFrameTracker.advanceFrame();
1328 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1332 nsecs_t currentTime = systemTime();
1333 if (mHasPoweredOff) {
1334 mHasPoweredOff = false;
1336 nsecs_t period = mPrimaryDispSync.getPeriod();
1337 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1338 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1339 if (numPeriods < NUM_BUCKETS - 1) {
1340 mFrameBuckets[numPeriods] += elapsedTime;
1342 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1344 mTotalTime += elapsedTime;
1346 mLastSwapTime = currentTime;
1349 void SurfaceFlinger::rebuildLayerStacks() {
1350 // rebuild the visible layer list per screen
1351 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1353 mVisibleRegionsDirty = false;
1354 invalidateHwcGeometry();
1356 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1357 Region opaqueRegion;
1359 Vector< sp<Layer> > layersSortedByZ;
1360 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1361 const Transform& tr(hw->getTransform());
1362 const Rect bounds(hw->getBounds());
1363 if (hw->isDisplayOn()) {
1364 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
1366 mDrawingState.traverseInZOrder([&](Layer* layer) {
1367 if (layer->getLayerStack() == hw->getLayerStack()) {
1368 Region drawRegion(tr.transform(
1369 layer->visibleNonTransparentRegion));
1370 drawRegion.andSelf(bounds);
1371 if (!drawRegion.isEmpty()) {
1372 layersSortedByZ.add(layer);
1377 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1378 hw->undefinedRegion.set(bounds);
1379 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1380 hw->dirtyRegion.orSelf(dirtyRegion);
1385 void SurfaceFlinger::setUpHWComposer() {
1386 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1387 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1388 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1389 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1391 // If nothing has changed (!dirty), don't recompose.
1392 // If something changed, but we don't currently have any visible layers,
1393 // and didn't when we last did a composition, then skip it this time.
1394 // The second rule does two things:
1395 // - When all layers are removed from a display, we'll emit one black
1396 // frame, then nothing more until we get new layers.
1397 // - When a display is created with a private layer stack, we won't
1398 // emit any black frames until a layer is added to the layer stack.
1399 bool mustRecompose = dirty && !(empty && wasEmpty);
1401 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1402 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1403 mustRecompose ? "doing" : "skipping",
1406 wasEmpty ? "+" : "-");
1408 mDisplays[dpy]->beginFrame(mustRecompose);
1410 if (mustRecompose) {
1411 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1415 HWComposer& hwc(getHwComposer());
1416 if (hwc.initCheck() == NO_ERROR) {
1417 // build the h/w work list
1418 if (CC_UNLIKELY(mHwWorkListDirty)) {
1419 mHwWorkListDirty = false;
1420 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1421 sp<const DisplayDevice> hw(mDisplays[dpy]);
1422 const int32_t id = hw->getHwcDisplayId();
1424 const Vector< sp<Layer> >& currentLayers(
1425 hw->getVisibleLayersSortedByZ());
1426 const size_t count = currentLayers.size();
1427 if (hwc.createWorkList(id, count) == NO_ERROR) {
1428 HWComposer::LayerListIterator cur = hwc.begin(id);
1429 const HWComposer::LayerListIterator end = hwc.end(id);
1430 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1431 const sp<Layer>& layer(currentLayers[i]);
1432 layer->setGeometry(hw, *cur);
1433 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1442 // set the per-frame data
1443 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1444 sp<const DisplayDevice> hw(mDisplays[dpy]);
1445 const int32_t id = hw->getHwcDisplayId();
1447 const Vector< sp<Layer> >& currentLayers(
1448 hw->getVisibleLayersSortedByZ());
1449 const size_t count = currentLayers.size();
1450 HWComposer::LayerListIterator cur = hwc.begin(id);
1451 const HWComposer::LayerListIterator end = hwc.end(id);
1452 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1454 * update the per-frame h/w composer data for each layer
1455 * and build the transparent region of the FB
1457 const sp<Layer>& layer(currentLayers[i]);
1458 layer->setPerFrameData(hw, *cur);
1463 // If possible, attempt to use the cursor overlay on each display.
1464 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1465 sp<const DisplayDevice> hw(mDisplays[dpy]);
1466 const int32_t id = hw->getHwcDisplayId();
1468 const Vector< sp<Layer> >& currentLayers(
1469 hw->getVisibleLayersSortedByZ());
1470 const size_t count = currentLayers.size();
1471 HWComposer::LayerListIterator cur = hwc.begin(id);
1472 const HWComposer::LayerListIterator end = hwc.end(id);
1473 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1474 const sp<Layer>& layer(currentLayers[i]);
1475 if (layer->isPotentialCursor()) {
1476 cur->setIsCursorLayerHint();
1483 status_t err = hwc.prepare();
1484 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1486 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1487 sp<const DisplayDevice> hw(mDisplays[dpy]);
1488 hw->prepareFrame(hwc);
1493 void SurfaceFlinger::doComposition() {
1495 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1496 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1497 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1498 if (hw->isDisplayOn()) {
1499 // transform the dirty region into this screen's coordinate space
1500 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1502 // repaint the framebuffer (if needed)
1503 doDisplayComposition(hw, dirtyRegion);
1505 hw->dirtyRegion.clear();
1506 hw->flip(hw->swapRegion);
1507 hw->swapRegion.clear();
1509 // inform the h/w that we're done compositing
1510 hw->compositionComplete();
1515 void SurfaceFlinger::postFramebuffer()
1519 const nsecs_t now = systemTime();
1520 mDebugInSwapBuffers = now;
1522 HWComposer& hwc(getHwComposer());
1523 if (hwc.initCheck() == NO_ERROR) {
1524 if (!hwc.supportsFramebufferTarget()) {
1526 // "surface must be bound to the calling thread's current context,
1527 // for the current rendering API."
1528 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1533 // make the default display current because the VirtualDisplayDevice code cannot
1534 // deal with dequeueBuffer() being called outside of the composition loop; however
1535 // the code below can call glFlush() which is allowed (and does in some case) call
1537 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1539 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1540 sp<const DisplayDevice> hw(mDisplays[dpy]);
1541 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1542 hw->onSwapBuffersCompleted(hwc);
1543 const size_t count = currentLayers.size();
1544 int32_t id = hw->getHwcDisplayId();
1545 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1546 HWComposer::LayerListIterator cur = hwc.begin(id);
1547 const HWComposer::LayerListIterator end = hwc.end(id);
1548 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1549 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1552 for (size_t i = 0; i < count; i++) {
1553 currentLayers[i]->onLayerDisplayed(hw, NULL);
1558 mLastSwapBufferTime = systemTime() - now;
1559 mDebugInSwapBuffers = 0;
1561 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1562 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1567 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1571 // here we keep a copy of the drawing state (that is the state that's
1572 // going to be overwritten by handleTransactionLocked()) outside of
1573 // mStateLock so that the side-effects of the State assignment
1574 // don't happen with mStateLock held (which can cause deadlocks).
1575 State drawingState(mDrawingState);
1577 Mutex::Autolock _l(mStateLock);
1578 const nsecs_t now = systemTime();
1579 mDebugInTransaction = now;
1581 // Here we're guaranteed that some transaction flags are set
1582 // so we can call handleTransactionLocked() unconditionally.
1583 // We call getTransactionFlags(), which will also clear the flags,
1584 // with mStateLock held to guarantee that mCurrentState won't change
1585 // until the transaction is committed.
1587 transactionFlags = getTransactionFlags(eTransactionMask);
1588 handleTransactionLocked(transactionFlags);
1590 mLastTransactionTime = systemTime() - now;
1591 mDebugInTransaction = 0;
1592 invalidateHwcGeometry();
1593 // here the transaction has been committed
1596 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1598 // Notify all layers of available frames
1599 mCurrentState.traverseInZOrder([](Layer* layer) {
1600 layer->notifyAvailableFrames();
1604 * Traversal of the children
1605 * (perform the transaction for each of them if needed)
1608 if (transactionFlags & eTraversalNeeded) {
1609 mCurrentState.traverseInZOrder([&](Layer* layer) {
1610 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
1611 if (!trFlags) return;
1613 const uint32_t flags = layer->doTransaction(0);
1614 if (flags & Layer::eVisibleRegion)
1615 mVisibleRegionsDirty = true;
1620 * Perform display own transactions if needed
1623 if (transactionFlags & eDisplayTransactionNeeded) {
1624 // here we take advantage of Vector's copy-on-write semantics to
1625 // improve performance by skipping the transaction entirely when
1626 // know that the lists are identical
1627 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1628 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1629 if (!curr.isIdenticalTo(draw)) {
1630 mVisibleRegionsDirty = true;
1631 const size_t cc = curr.size();
1632 size_t dc = draw.size();
1634 // find the displays that were removed
1635 // (ie: in drawing state but not in current state)
1636 // also handle displays that changed
1637 // (ie: displays that are in both lists)
1638 for (size_t i=0 ; i<dc ; i++) {
1639 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1641 // in drawing state but not in current state
1642 if (!draw[i].isMainDisplay()) {
1643 // Call makeCurrent() on the primary display so we can
1644 // be sure that nothing associated with this display
1646 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
1647 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1648 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
1650 hw->disconnect(getHwComposer());
1651 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1652 mEventThread->onHotplugReceived(draw[i].type, false);
1653 mDisplays.removeItem(draw.keyAt(i));
1655 ALOGW("trying to remove the main display");
1658 // this display is in both lists. see if something changed.
1659 const DisplayDeviceState& state(curr[j]);
1660 const wp<IBinder>& display(curr.keyAt(j));
1661 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1662 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1663 if (state_binder != draw_binder) {
1664 // changing the surface is like destroying and
1665 // recreating the DisplayDevice, so we just remove it
1666 // from the drawing state, so that it get re-added
1668 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
1670 hw->disconnect(getHwComposer());
1671 mDisplays.removeItem(display);
1672 mDrawingState.displays.removeItemsAt(i);
1674 // at this point we must loop to the next item
1678 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
1680 if (state.layerStack != draw[i].layerStack) {
1681 disp->setLayerStack(state.layerStack);
1683 if ((state.orientation != draw[i].orientation)
1684 || (state.viewport != draw[i].viewport)
1685 || (state.frame != draw[i].frame))
1687 disp->setProjection(state.orientation,
1688 state.viewport, state.frame);
1690 if (state.width != draw[i].width || state.height != draw[i].height) {
1691 disp->setDisplaySize(state.width, state.height);
1697 // find displays that were added
1698 // (ie: in current state but not in drawing state)
1699 for (size_t i=0 ; i<cc ; i++) {
1700 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1701 const DisplayDeviceState& state(curr[i]);
1703 sp<DisplaySurface> dispSurface;
1704 sp<IGraphicBufferProducer> producer;
1705 sp<IGraphicBufferProducer> bqProducer;
1706 sp<IGraphicBufferConsumer> bqConsumer;
1707 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
1709 int32_t hwcDisplayId = -1;
1710 if (state.isVirtualDisplay()) {
1711 // Virtual displays without a surface are dormant:
1712 // they have external state (layer stack, projection,
1713 // etc.) but no internal state (i.e. a DisplayDevice).
1714 if (state.surface != NULL) {
1717 int status = state.surface->query(
1718 NATIVE_WINDOW_WIDTH, &width);
1719 ALOGE_IF(status != NO_ERROR,
1720 "Unable to query width (%d)", status);
1722 status = state.surface->query(
1723 NATIVE_WINDOW_HEIGHT, &height);
1724 ALOGE_IF(status != NO_ERROR,
1725 "Unable to query height (%d)", status);
1726 if (mUseHwcVirtualDisplays &&
1727 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1728 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1729 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
1730 hwcDisplayId = allocateHwcDisplayId(state.type);
1733 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1734 *mHwc, hwcDisplayId, state.surface,
1735 bqProducer, bqConsumer, state.displayName);
1741 ALOGE_IF(state.surface!=NULL,
1742 "adding a supported display, but rendering "
1743 "surface is provided (%p), ignoring it",
1744 state.surface.get());
1745 hwcDisplayId = allocateHwcDisplayId(state.type);
1746 // for supported (by hwc) displays we provide our
1747 // own rendering surface
1748 dispSurface = new FramebufferSurface(*mHwc, state.type,
1750 producer = bqProducer;
1753 const wp<IBinder>& display(curr.keyAt(i));
1754 if (dispSurface != NULL) {
1755 sp<DisplayDevice> hw = new DisplayDevice(this,
1756 state.type, hwcDisplayId,
1757 mHwc->getFormat(hwcDisplayId), state.isSecure,
1758 display, dispSurface, producer,
1759 mRenderEngine->getEGLConfig(), false);
1760 hw->setLayerStack(state.layerStack);
1761 hw->setProjection(state.orientation,
1762 state.viewport, state.frame);
1763 hw->setDisplayName(state.displayName);
1764 mDisplays.add(display, hw);
1765 if (state.isVirtualDisplay()) {
1766 if (hwcDisplayId >= 0) {
1767 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1768 hw->getWidth(), hw->getHeight(),
1772 mEventThread->onHotplugReceived(state.type, true);
1780 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1781 // The transform hint might have changed for some layers
1782 // (either because a display has changed, or because a layer
1785 // Walk through all the layers in currentLayers,
1786 // and update their transform hint.
1788 // If a layer is visible only on a single display, then that
1789 // display is used to calculate the hint, otherwise we use the
1792 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1793 // the hint is set before we acquire a buffer from the surface texture.
1795 // NOTE: layer transactions have taken place already, so we use their
1796 // drawing state. However, SurfaceFlinger's own transaction has not
1797 // happened yet, so we must use the current state layer list
1798 // (soon to become the drawing state list).
1800 sp<const DisplayDevice> disp;
1801 uint32_t currentlayerStack = 0;
1803 mCurrentState.traverseInZOrder([&](Layer* layer) {
1804 // NOTE: we rely on the fact that layers are sorted by
1805 // layerStack first (so we don't have to traverse the list
1806 // of displays for every layer).
1807 uint32_t layerStack = layer->getLayerStack();
1808 if (first || currentlayerStack != layerStack) {
1809 currentlayerStack = layerStack;
1810 // figure out if this layerstack is mirrored
1811 // (more than one display) if so, pick the default display,
1812 // if not, pick the only display it's on.
1814 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1815 sp<const DisplayDevice> hw(mDisplays[dpy]);
1816 if (hw->getLayerStack() == currentlayerStack) {
1827 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1828 // redraw after transform hint changes. See bug 8508397.
1830 // could be null when this layer is using a layerStack
1831 // that is not visible on any display. Also can occur at
1832 // screen off/on times.
1833 disp = getDefaultDisplayDeviceLocked();
1835 layer->updateTransformHint(disp);
1843 * Perform our own transaction if needed
1847 mLayersAdded = false;
1848 // Layers have been added.
1849 mVisibleRegionsDirty = true;
1852 // some layers might have been removed, so
1853 // we need to update the regions they're exposing.
1854 if (mLayersRemoved) {
1855 mLayersRemoved = false;
1856 mVisibleRegionsDirty = true;
1857 mDrawingState.traverseInZOrder([&](Layer* layer) {
1858 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
1859 // this layer is not visible anymore
1860 // TODO: we could traverse the tree from front to back and
1861 // compute the actual visible region
1862 // TODO: we could cache the transformed region
1864 visibleReg.set(layer->computeScreenBounds());
1865 invalidateLayerStack(layer, visibleReg);
1870 commitTransaction();
1872 updateCursorAsync();
1875 void SurfaceFlinger::updateCursorAsync()
1877 HWComposer& hwc(getHwComposer());
1878 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1879 sp<const DisplayDevice> hw(mDisplays[dpy]);
1880 const int32_t id = hw->getHwcDisplayId();
1884 const Vector< sp<Layer> >& currentLayers(
1885 hw->getVisibleLayersSortedByZ());
1886 const size_t count = currentLayers.size();
1887 HWComposer::LayerListIterator cur = hwc.begin(id);
1888 const HWComposer::LayerListIterator end = hwc.end(id);
1889 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1890 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1893 const sp<Layer>& layer(currentLayers[i]);
1894 Rect cursorPos = layer->getPosition(hw);
1895 hwc.setCursorPositionAsync(id, cursorPos);
1901 void SurfaceFlinger::commitTransaction()
1903 if (!mLayersPendingRemoval.isEmpty()) {
1904 // Notify removed layers now that they can't be drawn from
1905 for (const auto& l : mLayersPendingRemoval) {
1906 recordBufferingStats(l->getName().string(),
1907 l->getOccupancyHistory(true));
1910 mLayersPendingRemoval.clear();
1913 // If this transaction is part of a window animation then the next frame
1914 // we composite should be considered an animation as well.
1915 mAnimCompositionPending = mAnimTransactionPending;
1917 mDrawingState = mCurrentState;
1918 mDrawingState.traverseInZOrder([](Layer* layer) {
1919 layer->commitChildList();
1921 mTransactionPending = false;
1922 mAnimTransactionPending = false;
1923 mTransactionCV.broadcast();
1926 void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
1927 Region& outDirtyRegion, Region& outOpaqueRegion)
1931 Region aboveOpaqueLayers;
1932 Region aboveCoveredLayers;
1935 outDirtyRegion.clear();
1937 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
1938 // start with the whole surface at its current location
1939 const Layer::State& s(layer->getDrawingState());
1941 // only consider the layers on the given layer stack
1942 if (layer->getLayerStack() != displayDevice->getLayerStack())
1946 * opaqueRegion: area of a surface that is fully opaque.
1948 Region opaqueRegion;
1951 * visibleRegion: area of a surface that is visible on screen
1952 * and not fully transparent. This is essentially the layer's
1953 * footprint minus the opaque regions above it.
1954 * Areas covered by a translucent surface are considered visible.
1956 Region visibleRegion;
1959 * coveredRegion: area of a surface that is covered by all
1960 * visible regions above it (which includes the translucent areas).
1962 Region coveredRegion;
1965 * transparentRegion: area of a surface that is hinted to be completely
1966 * transparent. This is only used to tell when the layer has no visible
1967 * non-transparent regions and can be removed from the layer list. It
1968 * does not affect the visibleRegion of this layer or any layers
1969 * beneath it. The hint may not be correct if apps don't respect the
1970 * SurfaceView restrictions (which, sadly, some don't).
1972 Region transparentRegion;
1975 // handle hidden surfaces by setting the visible region to empty
1976 if (CC_LIKELY(layer->isVisible())) {
1977 const bool translucent = !layer->isOpaque(s);
1978 Rect bounds(layer->computeScreenBounds());
1979 visibleRegion.set(bounds);
1980 Transform tr = layer->getTransform();
1981 if (!visibleRegion.isEmpty()) {
1982 // Remove the transparent area from the visible region
1984 if (tr.preserveRects()) {
1985 // transform the transparent region
1986 transparentRegion = tr.transform(s.activeTransparentRegion);
1988 // transformation too complex, can't do the
1989 // transparent region optimization.
1990 transparentRegion.clear();
1994 // compute the opaque region
1995 const int32_t layerOrientation = tr.getOrientation();
1996 if (s.alpha==255 && !translucent &&
1997 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1998 // the opaque region is the layer's footprint
1999 opaqueRegion = visibleRegion;
2004 // Clip the covered region to the visible region
2005 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2007 // Update aboveCoveredLayers for next (lower) layer
2008 aboveCoveredLayers.orSelf(visibleRegion);
2010 // subtract the opaque region covered by the layers above us
2011 visibleRegion.subtractSelf(aboveOpaqueLayers);
2013 // compute this layer's dirty region
2014 if (layer->contentDirty) {
2015 // we need to invalidate the whole region
2016 dirty = visibleRegion;
2017 // as well, as the old visible region
2018 dirty.orSelf(layer->visibleRegion);
2019 layer->contentDirty = false;
2021 /* compute the exposed region:
2022 * the exposed region consists of two components:
2023 * 1) what's VISIBLE now and was COVERED before
2024 * 2) what's EXPOSED now less what was EXPOSED before
2026 * note that (1) is conservative, we start with the whole
2027 * visible region but only keep what used to be covered by
2028 * something -- which mean it may have been exposed.
2030 * (2) handles areas that were not covered by anything but got
2031 * exposed because of a resize.
2033 const Region newExposed = visibleRegion - coveredRegion;
2034 const Region oldVisibleRegion = layer->visibleRegion;
2035 const Region oldCoveredRegion = layer->coveredRegion;
2036 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2037 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2039 dirty.subtractSelf(aboveOpaqueLayers);
2041 // accumulate to the screen dirty region
2042 outDirtyRegion.orSelf(dirty);
2044 // Update aboveOpaqueLayers for next (lower) layer
2045 aboveOpaqueLayers.orSelf(opaqueRegion);
2047 // Store the visible region in screen space
2048 layer->setVisibleRegion(visibleRegion);
2049 layer->setCoveredRegion(coveredRegion);
2050 layer->setVisibleNonTransparentRegion(
2051 visibleRegion.subtract(transparentRegion));
2054 outOpaqueRegion = aboveOpaqueLayers;
2057 void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2058 uint32_t layerStack = layer->getLayerStack();
2059 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2060 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2061 if (hw->getLayerStack() == layerStack) {
2062 hw->dirtyRegion.orSelf(dirty);
2067 bool SurfaceFlinger::handlePageFlip()
2069 nsecs_t latchTime = systemTime();
2072 bool visibleRegions = false;
2073 bool frameQueued = false;
2075 // Store the set of layers that need updates. This set must not change as
2076 // buffers are being latched, as this could result in a deadlock.
2077 // Example: Two producers share the same command stream and:
2078 // 1.) Layer 0 is latched
2079 // 2.) Layer 0 gets a new frame
2080 // 2.) Layer 1 gets a new frame
2081 // 3.) Layer 1 is latched.
2082 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2083 // second frame. But layer 0's second frame could be waiting on display.
2084 Vector<Layer*> layersWithQueuedFrames;
2085 mDrawingState.traverseInZOrder([&](Layer* layer) {
2086 if (layer->hasQueuedFrame()) {
2088 if (layer->shouldPresentNow(mPrimaryDispSync)) {
2089 layersWithQueuedFrames.push_back(layer);
2091 layer->useEmptyDamage();
2094 layer->useEmptyDamage();
2097 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2098 Layer* layer = layersWithQueuedFrames[i];
2099 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
2100 layer->useSurfaceDamage();
2101 invalidateLayerStack(layer, dirty);
2104 mVisibleRegionsDirty |= visibleRegions;
2106 // If we will need to wake up at some time in the future to deal with a
2107 // queued frame that shouldn't be displayed during this vsync period, wake
2108 // up during the next vsync period to check again.
2109 if (frameQueued && layersWithQueuedFrames.empty()) {
2110 signalLayerUpdate();
2113 // Only continue with the refresh if there is actually new work to do
2114 return !layersWithQueuedFrames.empty();
2117 void SurfaceFlinger::invalidateHwcGeometry()
2119 mHwWorkListDirty = true;
2123 void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2124 const Region& inDirtyRegion)
2126 // We only need to actually compose the display if:
2127 // 1) It is being handled by hardware composer, which may need this to
2128 // keep its virtual display state machine in sync, or
2129 // 2) There is work to be done (the dirty region isn't empty)
2130 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2131 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2135 Region dirtyRegion(inDirtyRegion);
2137 // compute the invalid region
2138 hw->swapRegion.orSelf(dirtyRegion);
2140 uint32_t flags = hw->getFlags();
2141 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2142 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2143 // takes a rectangle, we must make sure to update that whole
2144 // rectangle in that case
2145 dirtyRegion.set(hw->swapRegion.bounds());
2147 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2148 // We need to redraw the rectangle that will be updated
2149 // (pushed to the framebuffer).
2150 // This is needed because PARTIAL_UPDATES only takes one
2151 // rectangle instead of a region (see DisplayDevice::flip())
2152 dirtyRegion.set(hw->swapRegion.bounds());
2154 // we need to redraw everything (the whole screen)
2155 dirtyRegion.set(hw->bounds());
2156 hw->swapRegion = dirtyRegion;
2160 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2161 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2163 RenderEngine& engine(getRenderEngine());
2164 mat4 colorMatrix = mColorMatrix;
2166 colorMatrix = colorMatrix * mDaltonizer();
2168 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2169 doComposeSurfaces(hw, dirtyRegion);
2170 engine.setupColorTransform(oldMatrix);
2173 // update the swap region and clear the dirty region
2174 hw->swapRegion.orSelf(dirtyRegion);
2176 // swap buffers (presentation)
2177 hw->swapBuffers(getHwComposer());
2180 bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2182 RenderEngine& engine(getRenderEngine());
2183 const int32_t id = hw->getHwcDisplayId();
2184 HWComposer& hwc(getHwComposer());
2185 HWComposer::LayerListIterator cur = hwc.begin(id);
2186 const HWComposer::LayerListIterator end = hwc.end(id);
2188 bool hasGlesComposition = hwc.hasGlesComposition(id);
2189 if (hasGlesComposition) {
2190 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2191 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2192 hw->getDisplayName().string());
2193 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2194 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2195 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2200 // Never touch the framebuffer if we don't have any framebuffer layers
2201 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2202 if (hasHwcComposition) {
2203 // when using overlays, we assume a fully transparent framebuffer
2204 // NOTE: we could reduce how much we need to clear, for instance
2205 // remove where there are opaque FB layers. however, on some
2206 // GPUs doing a "clean slate" clear might be more efficient.
2207 // We'll revisit later if needed.
2208 engine.clearWithColor(0, 0, 0, 0);
2210 // we start with the whole screen area
2211 const Region bounds(hw->getBounds());
2213 // we remove the scissor part
2214 // we're left with the letterbox region
2215 // (common case is that letterbox ends-up being empty)
2216 const Region letterbox(bounds.subtract(hw->getScissor()));
2218 // compute the area to clear
2219 Region region(hw->undefinedRegion.merge(letterbox));
2221 // but limit it to the dirty region
2222 region.andSelf(dirty);
2224 // screen is already cleared here
2225 if (!region.isEmpty()) {
2226 // can happen with SurfaceView
2227 drawWormhole(hw, region);
2231 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2232 // just to be on the safe side, we don't set the
2233 // scissor on the main display. It should never be needed
2234 // anyways (though in theory it could since the API allows it).
2235 const Rect& bounds(hw->getBounds());
2236 const Rect& scissor(hw->getScissor());
2237 if (scissor != bounds) {
2238 // scissor doesn't match the screen's dimensions, so we
2239 // need to clear everything outside of it and enable
2240 // the GL scissor so we don't draw anything where we shouldn't
2242 // enable scissor for this frame
2243 const uint32_t height = hw->getHeight();
2244 engine.setScissor(scissor.left, height - scissor.bottom,
2245 scissor.getWidth(), scissor.getHeight());
2251 * and then, render the layers targeted at the framebuffer
2254 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2255 const size_t count = layers.size();
2256 const Transform& tr = hw->getTransform();
2258 // we're using h/w composer
2259 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2260 const sp<Layer>& layer(layers[i]);
2261 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2262 if (!clip.isEmpty()) {
2263 switch (cur->getCompositionType()) {
2264 case HWC_CURSOR_OVERLAY:
2266 const Layer::State& state(layer->getDrawingState());
2267 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2269 && layer->isOpaque(state) && (state.alpha == 0xFF)
2270 && hasGlesComposition) {
2271 // never clear the very first layer since we're
2272 // guaranteed the FB is already cleared
2273 layer->clearWithOpenGL(hw);
2277 case HWC_FRAMEBUFFER: {
2278 layer->draw(hw, clip);
2281 case HWC_FRAMEBUFFER_TARGET: {
2282 // this should not happen as the iterator shouldn't
2283 // let us get there.
2284 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2289 layer->setAcquireFence(hw, *cur);
2292 // we're not using h/w composer
2293 for (size_t i=0 ; i<count ; ++i) {
2294 const sp<Layer>& layer(layers[i]);
2295 const Region clip(dirty.intersect(
2296 tr.transform(layer->visibleRegion)));
2297 if (!clip.isEmpty()) {
2298 layer->draw(hw, clip);
2303 // disable scissor at the end of the frame
2304 engine.disableScissor();
2308 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2309 const int32_t height = hw->getHeight();
2310 RenderEngine& engine(getRenderEngine());
2311 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2314 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2315 const sp<IBinder>& handle,
2316 const sp<IGraphicBufferProducer>& gbc,
2317 const sp<Layer>& lbc,
2318 const sp<Layer>& parent)
2320 // add this layer to the current state list
2322 Mutex::Autolock _l(mStateLock);
2323 if (mNumLayers >= MAX_LAYERS) {
2326 if (parent == nullptr) {
2327 mCurrentState.layersSortedByZ.add(lbc);
2329 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2330 ALOGE("addClientLayer called with a removed parent");
2331 return NAME_NOT_FOUND;
2333 parent->addChild(lbc);
2336 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2337 mLayersAdded = true;
2341 // attach this layer to the client
2342 client->attachLayer(handle, lbc);
2347 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
2348 Mutex::Autolock _l(mStateLock);
2350 const auto& p = layer->getParent();
2357 sp<Layer> ancestor = p;
2358 while (ancestor->getParent() != nullptr) {
2359 ancestor = ancestor->getParent();
2361 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2362 ALOGE("removeLayer called with a layer whose parent has been removed");
2363 return NAME_NOT_FOUND;
2366 index = p->removeChild(layer);
2368 index = mCurrentState.layersSortedByZ.remove(layer);
2371 // As a matter of normal operation, the LayerCleaner will produce a second
2372 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2373 // so we will succeed in promoting it, but it's already been removed
2374 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2375 // otherwise something has gone wrong and we are leaking the layer.
2376 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
2377 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2378 layer->getName().string(),
2379 (p != nullptr) ? p->getName().string() : "no-parent");
2381 } else if (index < 0) {
2385 mLayersPendingRemoval.add(layer);
2386 mLayersRemoved = true;
2387 mNumLayers -= 1 + layer->getChildrenCount();
2388 setTransactionFlags(eTransactionNeeded);
2392 uint32_t SurfaceFlinger::peekTransactionFlags() {
2393 return android_atomic_release_load(&mTransactionFlags);
2396 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2397 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2400 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2401 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2402 if ((old & flags)==0) { // wake the server up
2403 signalTransaction();
2408 void SurfaceFlinger::setTransactionState(
2409 const Vector<ComposerState>& state,
2410 const Vector<DisplayState>& displays,
2414 Mutex::Autolock _l(mStateLock);
2415 uint32_t transactionFlags = 0;
2417 if (flags & eAnimation) {
2418 // For window updates that are part of an animation we must wait for
2419 // previous animation "frames" to be handled.
2420 while (mAnimTransactionPending) {
2421 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2422 if (CC_UNLIKELY(err != NO_ERROR)) {
2423 // just in case something goes wrong in SF, return to the
2424 // caller after a few seconds.
2425 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2426 "waiting for previous animation frame");
2427 mAnimTransactionPending = false;
2433 size_t count = displays.size();
2434 for (size_t i=0 ; i<count ; i++) {
2435 const DisplayState& s(displays[i]);
2436 transactionFlags |= setDisplayStateLocked(s);
2439 count = state.size();
2440 for (size_t i=0 ; i<count ; i++) {
2441 const ComposerState& s(state[i]);
2442 // Here we need to check that the interface we're given is indeed
2443 // one of our own. A malicious client could give us a NULL
2444 // IInterface, or one of its own or even one of our own but a
2445 // different type. All these situations would cause us to crash.
2447 // NOTE: it would be better to use RTTI as we could directly check
2448 // that we have a Client*. however, RTTI is disabled in Android.
2449 if (s.client != NULL) {
2450 sp<IBinder> binder = IInterface::asBinder(s.client);
2451 if (binder != NULL) {
2452 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
2453 sp<Client> client( static_cast<Client *>(s.client.get()) );
2454 transactionFlags |= setClientStateLocked(client, s.state);
2460 // If a synchronous transaction is explicitly requested without any changes,
2461 // force a transaction anyway. This can be used as a flush mechanism for
2462 // previous async transactions.
2463 if (transactionFlags == 0 && (flags & eSynchronous)) {
2464 transactionFlags = eTransactionNeeded;
2467 if (transactionFlags) {
2468 if (mInterceptor.isEnabled()) {
2469 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2472 // this triggers the transaction
2473 setTransactionFlags(transactionFlags);
2475 // if this is a synchronous transaction, wait for it to take effect
2476 // before returning.
2477 if (flags & eSynchronous) {
2478 mTransactionPending = true;
2480 if (flags & eAnimation) {
2481 mAnimTransactionPending = true;
2483 while (mTransactionPending) {
2484 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2485 if (CC_UNLIKELY(err != NO_ERROR)) {
2486 // just in case something goes wrong in SF, return to the
2487 // called after a few seconds.
2488 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2489 mTransactionPending = false;
2496 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2498 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2503 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2504 if (disp.isValid()) {
2505 const uint32_t what = s.what;
2506 if (what & DisplayState::eSurfaceChanged) {
2507 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2508 disp.surface = s.surface;
2509 flags |= eDisplayTransactionNeeded;
2512 if (what & DisplayState::eLayerStackChanged) {
2513 if (disp.layerStack != s.layerStack) {
2514 disp.layerStack = s.layerStack;
2515 flags |= eDisplayTransactionNeeded;
2518 if (what & DisplayState::eDisplayProjectionChanged) {
2519 if (disp.orientation != s.orientation) {
2520 disp.orientation = s.orientation;
2521 flags |= eDisplayTransactionNeeded;
2523 if (disp.frame != s.frame) {
2524 disp.frame = s.frame;
2525 flags |= eDisplayTransactionNeeded;
2527 if (disp.viewport != s.viewport) {
2528 disp.viewport = s.viewport;
2529 flags |= eDisplayTransactionNeeded;
2532 if (what & DisplayState::eDisplaySizeChanged) {
2533 if (disp.width != s.width) {
2534 disp.width = s.width;
2535 flags |= eDisplayTransactionNeeded;
2537 if (disp.height != s.height) {
2538 disp.height = s.height;
2539 flags |= eDisplayTransactionNeeded;
2546 uint32_t SurfaceFlinger::setClientStateLocked(
2547 const sp<Client>& client,
2548 const layer_state_t& s)
2551 sp<Layer> layer(client->getLayerUser(s.surface));
2553 const uint32_t what = s.what;
2554 bool geometryAppliesWithResize =
2555 what & layer_state_t::eGeometryAppliesWithResize;
2556 if (what & layer_state_t::ePositionChanged) {
2557 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2558 flags |= eTraversalNeeded;
2561 if (what & layer_state_t::eLayerChanged) {
2562 // NOTE: index needs to be calculated before we update the state
2563 const auto& p = layer->getParent();
2565 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2566 if (layer->setLayer(s.z) && idx >= 0) {
2567 mCurrentState.layersSortedByZ.removeAt(idx);
2568 mCurrentState.layersSortedByZ.add(layer);
2569 // we need traversal (state changed)
2570 // AND transaction (list changed)
2571 flags |= eTransactionNeeded|eTraversalNeeded;
2574 if (p->setChildLayer(layer, s.z)) {
2575 flags |= eTransactionNeeded|eTraversalNeeded;
2579 if (what & layer_state_t::eSizeChanged) {
2580 if (layer->setSize(s.w, s.h)) {
2581 flags |= eTraversalNeeded;
2584 if (what & layer_state_t::eAlphaChanged) {
2585 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2586 flags |= eTraversalNeeded;
2588 if (what & layer_state_t::eMatrixChanged) {
2589 if (layer->setMatrix(s.matrix))
2590 flags |= eTraversalNeeded;
2592 if (what & layer_state_t::eTransparentRegionChanged) {
2593 if (layer->setTransparentRegionHint(s.transparentRegion))
2594 flags |= eTraversalNeeded;
2596 if (what & layer_state_t::eFlagsChanged) {
2597 if (layer->setFlags(s.flags, s.mask))
2598 flags |= eTraversalNeeded;
2600 if (what & layer_state_t::eCropChanged) {
2601 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2602 flags |= eTraversalNeeded;
2604 if (what & layer_state_t::eFinalCropChanged) {
2605 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
2606 flags |= eTraversalNeeded;
2608 if (what & layer_state_t::eLayerStackChanged) {
2609 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2610 // We only allow setting layer stacks for top level layers,
2611 // everything else inherits layer stack from its parent.
2612 if (layer->hasParent()) {
2613 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2614 layer->getName().string());
2615 } else if (idx < 0) {
2616 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2617 "that also does not appear in the top level layer list. Something"
2618 " has gone wrong.", layer->getName().string());
2619 } else if (layer->setLayerStack(s.layerStack)) {
2620 mCurrentState.layersSortedByZ.removeAt(idx);
2621 mCurrentState.layersSortedByZ.add(layer);
2622 // we need traversal (state changed)
2623 // AND transaction (list changed)
2624 flags |= eTransactionNeeded|eTraversalNeeded;
2627 if (what & layer_state_t::eDeferTransaction) {
2628 if (s.barrierHandle != nullptr) {
2629 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2630 } else if (s.barrierGbp != nullptr) {
2631 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2632 if (authenticateSurfaceTextureLocked(gbp)) {
2633 const auto& otherLayer =
2634 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2635 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2637 ALOGE("Attempt to defer transaction to to an"
2638 " unrecognized GraphicBufferProducer");
2641 // We don't trigger a traversal here because if no other state is
2642 // changed, we don't want this to cause any more work
2644 if (what & layer_state_t::eReparentChildren) {
2645 if (layer->reparentChildren(s.reparentHandle)) {
2646 flags |= eTransactionNeeded|eTraversalNeeded;
2649 if (what & layer_state_t::eDetachChildren) {
2650 layer->detachChildren();
2652 if (what & layer_state_t::eOverrideScalingModeChanged) {
2653 layer->setOverrideScalingMode(s.overrideScalingMode);
2654 // We don't trigger a traversal here because if no other state is
2655 // changed, we don't want this to cause any more work
2661 status_t SurfaceFlinger::createLayer(
2662 const String8& name,
2663 const sp<Client>& client,
2664 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
2665 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2666 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
2668 if (int32_t(w|h) < 0) {
2669 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2674 status_t result = NO_ERROR;
2678 String8 uniqueName = getUniqueLayerName(name);
2680 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2681 case ISurfaceComposerClient::eFXSurfaceNormal:
2682 result = createNormalLayer(client,
2683 uniqueName, w, h, flags, format,
2684 handle, gbp, &layer);
2686 case ISurfaceComposerClient::eFXSurfaceDim:
2687 result = createDimLayer(client,
2688 uniqueName, w, h, flags,
2689 handle, gbp, &layer);
2696 if (result != NO_ERROR) {
2700 layer->setInfo(windowType, ownerUid);
2702 result = addClientLayer(client, *handle, *gbp, layer, *parent);
2703 if (result != NO_ERROR) {
2706 mInterceptor.saveSurfaceCreation(layer);
2708 setTransactionFlags(eTransactionNeeded);
2712 String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2714 bool matchFound = true;
2715 uint32_t dupeCounter = 0;
2717 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2718 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2720 // Loop over layers until we're sure there is no matching name
2721 while (matchFound) {
2723 mDrawingState.traverseInZOrder([&](Layer* layer) {
2724 if (layer->getName() == uniqueName) {
2726 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2731 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2736 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2737 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2738 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2740 // initialize the surfaces
2742 case PIXEL_FORMAT_TRANSPARENT:
2743 case PIXEL_FORMAT_TRANSLUCENT:
2744 format = PIXEL_FORMAT_RGBA_8888;
2746 case PIXEL_FORMAT_OPAQUE:
2747 format = PIXEL_FORMAT_RGBX_8888;
2751 *outLayer = new Layer(this, client, name, w, h, flags);
2752 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2753 if (err == NO_ERROR) {
2754 *handle = (*outLayer)->getHandle();
2755 *gbp = (*outLayer)->getProducer();
2758 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2762 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2763 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2764 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2766 *outLayer = new LayerDim(this, client, name, w, h, flags);
2767 *handle = (*outLayer)->getHandle();
2768 *gbp = (*outLayer)->getProducer();
2772 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2774 // called by a client when it wants to remove a Layer
2775 status_t err = NO_ERROR;
2776 sp<Layer> l(client->getLayerUser(handle));
2778 mInterceptor.saveSurfaceDeletion(l);
2779 err = removeLayer(l);
2780 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2781 "error removing layer=%p (%s)", l.get(), strerror(-err));
2786 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2788 // called by ~LayerCleaner() when all references to the IBinder (handle)
2790 sp<Layer> l = layer.promote();
2792 // The layer has already been removed, carry on
2795 // If we have a parent, then we can continue to live as long as it does.
2796 return removeLayer(l, true);
2799 // ---------------------------------------------------------------------------
2801 void SurfaceFlinger::onInitializeDisplays() {
2802 // reset screen orientation and use primary layer stack
2803 Vector<ComposerState> state;
2804 Vector<DisplayState> displays;
2806 d.what = DisplayState::eDisplayProjectionChanged |
2807 DisplayState::eLayerStackChanged;
2808 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2810 d.orientation = DisplayState::eOrientationDefault;
2811 d.frame.makeInvalid();
2812 d.viewport.makeInvalid();
2816 setTransactionState(state, displays, 0);
2817 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2819 const nsecs_t period =
2820 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2821 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2823 // Use phase of 0 since phase is not known.
2824 // Use latency of 0, which will snap to the ideal latency.
2825 setCompositorTimingSnapped(0, period, 0);
2828 void SurfaceFlinger::initializeDisplays() {
2829 class MessageScreenInitialized : public MessageBase {
2830 SurfaceFlinger* flinger;
2832 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2833 virtual bool handler() {
2834 flinger->onInitializeDisplays();
2838 sp<MessageBase> msg = new MessageScreenInitialized(this);
2839 postMessageAsync(msg); // we may be called from main thread, use async message
2842 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2844 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2846 int32_t type = hw->getDisplayType();
2847 int currentMode = hw->getPowerMode();
2849 if (mode == currentMode) {
2850 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2854 hw->setPowerMode(mode);
2855 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2856 ALOGW("Trying to set power mode for virtual display");
2860 if (mInterceptor.isEnabled()) {
2861 Mutex::Autolock _l(mStateLock);
2862 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2864 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2867 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2870 if (currentMode == HWC_POWER_MODE_OFF) {
2871 // Turn on the display
2872 getHwComposer().setPowerMode(type, mode);
2873 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2874 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
2875 // FIXME: eventthread only knows about the main display right now
2876 mEventThread->onScreenAcquired();
2877 resyncToHardwareVsync(true);
2880 mVisibleRegionsDirty = true;
2881 mHasPoweredOff = true;
2882 repaintEverything();
2884 struct sched_param param = {0};
2885 param.sched_priority = 1;
2886 if (sched_setscheduler(0, SCHED_FIFO, ¶m) != 0) {
2887 ALOGW("Couldn't set SCHED_FIFO on display on");
2889 } else if (mode == HWC_POWER_MODE_OFF) {
2890 // Turn off the display
2891 struct sched_param param = {0};
2892 if (sched_setscheduler(0, SCHED_OTHER, ¶m) != 0) {
2893 ALOGW("Couldn't set SCHED_OTHER on display off");
2896 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2897 disableHardwareVsync(true); // also cancels any in-progress resync
2899 // FIXME: eventthread only knows about the main display right now
2900 mEventThread->onScreenReleased();
2903 getHwComposer().setPowerMode(type, mode);
2904 mVisibleRegionsDirty = true;
2905 // from this point on, SF will stop drawing on this display
2906 } else if (mode == HWC_POWER_MODE_DOZE ||
2907 mode == HWC_POWER_MODE_NORMAL) {
2908 // Update display while dozing
2909 getHwComposer().setPowerMode(type, mode);
2910 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2911 // FIXME: eventthread only knows about the main display right now
2912 mEventThread->onScreenAcquired();
2913 resyncToHardwareVsync(true);
2915 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2916 // Leave display going to doze
2917 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2918 disableHardwareVsync(true); // also cancels any in-progress resync
2919 // FIXME: eventthread only knows about the main display right now
2920 mEventThread->onScreenReleased();
2922 getHwComposer().setPowerMode(type, mode);
2924 ALOGE("Attempting to set unknown power mode: %d\n", mode);
2925 getHwComposer().setPowerMode(type, mode);
2929 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2930 class MessageSetPowerMode: public MessageBase {
2931 SurfaceFlinger& mFlinger;
2932 sp<IBinder> mDisplay;
2935 MessageSetPowerMode(SurfaceFlinger& flinger,
2936 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2937 mDisplay(disp) { mMode = mode; }
2938 virtual bool handler() {
2939 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2941 ALOGE("Attempt to set power mode = %d for null display %p",
2942 mMode, mDisplay.get());
2943 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2944 ALOGW("Attempt to set power mode = %d for virtual display",
2947 mFlinger.setPowerModeInternal(hw, mMode);
2952 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2953 postMessageSync(msg);
2956 // ---------------------------------------------------------------------------
2958 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2962 IPCThreadState* ipc = IPCThreadState::self();
2963 const int pid = ipc->getCallingPid();
2964 const int uid = ipc->getCallingUid();
2965 if ((uid != AID_SHELL) &&
2966 !PermissionCache::checkPermission(sDump, pid, uid)) {
2967 result.appendFormat("Permission Denial: "
2968 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2970 // Try to get the main lock, but give up after one second
2971 // (this would indicate SF is stuck, but we want to be able to
2972 // print something in dumpsys).
2973 status_t err = mStateLock.timedLock(s2ns(1));
2974 bool locked = (err == NO_ERROR);
2976 result.appendFormat(
2977 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2978 "dumping anyways (no locks held)\n", strerror(-err), err);
2981 bool dumpAll = true;
2983 size_t numArgs = args.size();
2985 if ((index < numArgs) &&
2986 (args[index] == String16("--list"))) {
2988 listLayersLocked(args, index, result);
2992 if ((index < numArgs) &&
2993 (args[index] == String16("--latency"))) {
2995 dumpStatsLocked(args, index, result);
2999 if ((index < numArgs) &&
3000 (args[index] == String16("--latency-clear"))) {
3002 clearStatsLocked(args, index, result);
3006 if ((index < numArgs) &&
3007 (args[index] == String16("--dispsync"))) {
3009 mPrimaryDispSync.dump(result);
3013 if ((index < numArgs) &&
3014 (args[index] == String16("--static-screen"))) {
3016 dumpStaticScreenStats(result);
3020 if ((index < numArgs) &&
3021 (args[index] == String16("--frame-events"))) {
3023 dumpFrameEventsLocked(result);
3029 dumpAllLocked(args, index, result);
3033 mStateLock.unlock();
3036 write(fd, result.string(), result.size());
3040 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3041 size_t& /* index */, String8& result) const
3043 mCurrentState.traverseInZOrder([&](Layer* layer) {
3044 result.appendFormat("%s\n", layer->getName().string());
3048 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3049 String8& result) const
3052 if (index < args.size()) {
3053 name = String8(args[index]);
3057 const nsecs_t period =
3058 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3059 result.appendFormat("%" PRId64 "\n", period);
3061 if (name.isEmpty()) {
3062 mAnimFrameTracker.dumpStats(result);
3064 mCurrentState.traverseInZOrder([&](Layer* layer) {
3065 if (name == layer->getName()) {
3066 layer->dumpFrameStats(result);
3072 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3073 String8& /* result */)
3076 if (index < args.size()) {
3077 name = String8(args[index]);
3081 mCurrentState.traverseInZOrder([&](Layer* layer) {
3082 if (name.isEmpty() || (name == layer->getName())) {
3083 layer->clearFrameStats();
3087 mAnimFrameTracker.clearStats();
3090 // This should only be called from the main thread. Otherwise it would need
3091 // the lock and should use mCurrentState rather than mDrawingState.
3092 void SurfaceFlinger::logFrameStats() {
3093 mDrawingState.traverseInZOrder([&](Layer* layer) {
3094 layer->logFrameStats();
3097 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3100 void SurfaceFlinger::appendSfConfigString(String8& result) const
3102 result.append(" [sf");
3103 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3105 if (isLayerTripleBufferingDisabled())
3106 result.append(" DISABLE_TRIPLE_BUFFERING");
3108 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
3109 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
3110 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
3111 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
3112 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3113 maxFrameBufferAcquiredBuffers);
3117 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3119 result.appendFormat("Static screen stats:\n");
3120 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3121 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3122 float percent = 100.0f *
3123 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3124 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3125 b + 1, bucketTimeSec, percent);
3127 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3128 float percent = 100.0f *
3129 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3130 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3131 NUM_BUCKETS - 1, bucketTimeSec, percent);
3134 void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3135 result.appendFormat("Layer frame timestamps:\n");
3137 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3138 const size_t count = currentLayers.size();
3139 for (size_t i=0 ; i<count ; i++) {
3140 currentLayers[i]->dumpFrameEvents(result);
3144 void SurfaceFlinger::recordBufferingStats(const char* layerName,
3145 std::vector<OccupancyTracker::Segment>&& history) {
3146 Mutex::Autolock lock(mBufferingStatsMutex);
3147 auto& stats = mBufferingStats[layerName];
3148 for (const auto& segment : history) {
3149 if (!segment.usedThirdBuffer) {
3150 stats.twoBufferTime += segment.totalTime;
3152 if (segment.occupancyAverage < 1.0f) {
3153 stats.doubleBufferedTime += segment.totalTime;
3154 } else if (segment.occupancyAverage < 2.0f) {
3155 stats.tripleBufferedTime += segment.totalTime;
3157 ++stats.numSegments;
3158 stats.totalTime += segment.totalTime;
3162 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3163 result.append("Buffering stats:\n");
3164 result.append(" [Layer name] <Active time> <Two buffer> "
3165 "<Double buffered> <Triple buffered>\n");
3166 Mutex::Autolock lock(mBufferingStatsMutex);
3167 typedef std::tuple<std::string, float, float, float> BufferTuple;
3168 std::map<float, BufferTuple, std::greater<float>> sorted;
3169 for (const auto& statsPair : mBufferingStats) {
3170 const char* name = statsPair.first.c_str();
3171 const BufferingStats& stats = statsPair.second;
3172 if (stats.numSegments == 0) {
3175 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3176 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3178 float doubleBufferRatio = static_cast<float>(
3179 stats.doubleBufferedTime) / stats.totalTime;
3180 float tripleBufferRatio = static_cast<float>(
3181 stats.tripleBufferedTime) / stats.totalTime;
3182 sorted.insert({activeTime, {name, twoBufferRatio,
3183 doubleBufferRatio, tripleBufferRatio}});
3185 for (const auto& sortedPair : sorted) {
3186 float activeTime = sortedPair.first;
3187 const BufferTuple& values = sortedPair.second;
3188 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3189 std::get<0>(values).c_str(), activeTime,
3190 std::get<1>(values), std::get<2>(values),
3191 std::get<3>(values));
3193 result.append("\n");
3196 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3197 String8& result) const
3199 bool colorize = false;
3200 if (index < args.size()
3201 && (args[index] == String16("--color"))) {
3206 Colorizer colorizer(colorize);
3208 // figure out if we're stuck somewhere
3209 const nsecs_t now = systemTime();
3210 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3211 const nsecs_t inTransaction(mDebugInTransaction);
3212 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3213 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3216 * Dump library configuration.
3219 colorizer.bold(result);
3220 result.append("Build configuration:");
3221 colorizer.reset(result);
3222 appendSfConfigString(result);
3223 appendUiConfigString(result);
3224 appendGuiConfigString(result);
3225 result.append("\n");
3227 colorizer.bold(result);
3228 result.append("Sync configuration: ");
3229 colorizer.reset(result);
3230 result.append(SyncFeatures::getInstance().toString());
3231 result.append("\n");
3233 colorizer.bold(result);
3234 result.append("DispSync configuration: ");
3235 colorizer.reset(result);
3236 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3237 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3238 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
3239 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3240 result.append("\n");
3242 // Dump static screen stats
3243 result.append("\n");
3244 dumpStaticScreenStats(result);
3245 result.append("\n");
3247 dumpBufferingStats(result);
3250 * Dump the visible layer list
3252 colorizer.bold(result);
3253 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
3254 colorizer.reset(result);
3255 mCurrentState.traverseInZOrder([&](Layer* layer) {
3256 layer->dump(result, colorizer);
3260 * Dump Display state
3263 colorizer.bold(result);
3264 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3265 colorizer.reset(result);
3266 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3267 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3272 * Dump SurfaceFlinger global state
3275 colorizer.bold(result);
3276 result.append("SurfaceFlinger global state:\n");
3277 colorizer.reset(result);
3279 HWComposer& hwc(getHwComposer());
3280 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
3282 colorizer.bold(result);
3283 result.appendFormat("EGL implementation : %s\n",
3284 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3285 colorizer.reset(result);
3286 result.appendFormat("%s\n",
3287 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3289 mRenderEngine->dump(result);
3291 hw->undefinedRegion.dump(result, "undefinedRegion");
3292 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3293 hw->getOrientation(), hw->isDisplayOn());
3294 result.appendFormat(
3295 " last eglSwapBuffers() time: %f us\n"
3296 " last transaction time : %f us\n"
3297 " transaction-flags : %08x\n"
3298 " refresh-rate : %f fps\n"
3301 " gpu_to_cpu_unsupported : %d\n"
3303 mLastSwapBufferTime/1000.0,
3304 mLastTransactionTime/1000.0,
3306 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3307 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3308 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3309 !mGpuToCpuSupported);
3311 result.appendFormat(" eglSwapBuffers time: %f us\n",
3312 inSwapBuffersDuration/1000.0);
3314 result.appendFormat(" transaction time: %f us\n",
3315 inTransactionDuration/1000.0);
3320 mEventThread->dump(result);
3323 * Dump HWComposer state
3325 colorizer.bold(result);
3326 result.append("h/w composer state:\n");
3327 colorizer.reset(result);
3328 result.appendFormat(" h/w composer %s and %s\n",
3329 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3330 (mDebugDisableHWC || mDebugRegion || mDaltonize
3331 || mHasColorMatrix) ? "disabled" : "enabled");
3335 * Dump gralloc state
3337 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3341 const Vector< sp<Layer> >&
3342 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3343 // Note: mStateLock is held here
3345 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3346 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3347 dpy = mDisplays.keyAt(i);
3352 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3353 // Just use the primary display so we have something to return
3354 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3356 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
3359 bool SurfaceFlinger::startDdmConnection()
3361 void* libddmconnection_dso =
3362 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3363 if (!libddmconnection_dso) {
3366 void (*DdmConnection_start)(const char* name);
3367 DdmConnection_start =
3368 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3369 if (!DdmConnection_start) {
3370 dlclose(libddmconnection_dso);
3373 (*DdmConnection_start)(getServiceName());
3377 status_t SurfaceFlinger::onTransact(
3378 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3381 case CREATE_CONNECTION:
3382 case CREATE_DISPLAY:
3384 case CLEAR_ANIMATION_FRAME_STATS:
3385 case GET_ANIMATION_FRAME_STATS:
3386 case SET_POWER_MODE:
3387 case GET_HDR_CAPABILITIES:
3389 // codes that require permission check
3390 IPCThreadState* ipc = IPCThreadState::self();
3391 const int pid = ipc->getCallingPid();
3392 const int uid = ipc->getCallingUid();
3393 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3394 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3395 ALOGE("Permission Denial: "
3396 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3397 return PERMISSION_DENIED;
3402 * Calling setTransactionState is safe, because you need to have been
3403 * granted a reference to Client* and Handle* to do anything with it.
3405 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3407 case SET_TRANSACTION_STATE:
3408 case CREATE_SCOPED_CONNECTION:
3412 case CAPTURE_SCREEN:
3414 // codes that require permission check
3415 IPCThreadState* ipc = IPCThreadState::self();
3416 const int pid = ipc->getCallingPid();
3417 const int uid = ipc->getCallingUid();
3418 if ((uid != AID_GRAPHICS) &&
3419 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3420 ALOGE("Permission Denial: "
3421 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3422 return PERMISSION_DENIED;
3428 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3429 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3430 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3431 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3432 IPCThreadState* ipc = IPCThreadState::self();
3433 const int pid = ipc->getCallingPid();
3434 const int uid = ipc->getCallingUid();
3435 ALOGE("Permission Denial: "
3436 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3437 return PERMISSION_DENIED;
3441 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3442 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3444 case 1002: // SHOW_UPDATES
3445 n = data.readInt32();
3446 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3447 invalidateHwcGeometry();
3448 repaintEverything();
3450 case 1004:{ // repaint everything
3451 repaintEverything();
3454 case 1005:{ // force transaction
3455 setTransactionFlags(
3457 eDisplayTransactionNeeded|
3461 case 1006:{ // send empty update
3465 case 1008: // toggle use of hw composer
3466 n = data.readInt32();
3467 mDebugDisableHWC = n ? 1 : 0;
3468 invalidateHwcGeometry();
3469 repaintEverything();
3471 case 1009: // toggle use of transform hint
3472 n = data.readInt32();
3473 mDebugDisableTransformHint = n ? 1 : 0;
3474 invalidateHwcGeometry();
3475 repaintEverything();
3477 case 1010: // interrogate.
3478 reply->writeInt32(0);
3479 reply->writeInt32(0);
3480 reply->writeInt32(mDebugRegion);
3481 reply->writeInt32(0);
3482 reply->writeInt32(mDebugDisableHWC);
3485 Mutex::Autolock _l(mStateLock);
3486 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3487 reply->writeInt32(hw->getPageFlipCount());
3492 n = data.readInt32();
3495 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3498 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3501 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3505 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3507 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3510 invalidateHwcGeometry();
3511 repaintEverything();
3515 // apply a color matrix
3516 n = data.readInt32();
3517 mHasColorMatrix = n ? 1 : 0;
3519 // color matrix is sent as mat3 matrix followed by vec3
3520 // offset, then packed into a mat4 where the last row is
3521 // the offset and extra values are 0
3522 for (size_t i = 0 ; i < 4; i++) {
3523 for (size_t j = 0; j < 4; j++) {
3524 mColorMatrix[i][j] = data.readFloat();
3528 mColorMatrix = mat4();
3530 invalidateHwcGeometry();
3531 repaintEverything();
3534 // This is an experimental interface
3535 // Needs to be shifted to proper binder interface when we productize
3537 n = data.readInt32();
3538 mPrimaryDispSync.setRefreshSkipCount(n);
3542 n = data.readInt32();
3543 mForceFullDamage = static_cast<bool>(n);
3546 case 1018: { // Modify Choreographer's phase offset
3547 n = data.readInt32();
3548 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3551 case 1019: { // Modify SurfaceFlinger's phase offset
3552 n = data.readInt32();
3553 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3556 case 1020: { // Layer updates interceptor
3557 n = data.readInt32();
3559 ALOGV("Interceptor enabled");
3560 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3563 ALOGV("Interceptor disabled");
3564 mInterceptor.disable();
3568 case 1021: { // Disable HWC virtual displays
3569 n = data.readInt32();
3570 mUseHwcVirtualDisplays = !n;
3578 void SurfaceFlinger::repaintEverything() {
3579 android_atomic_or(1, &mRepaintEverything);
3580 signalTransaction();
3583 // ---------------------------------------------------------------------------
3584 // Capture screen into an IGraphiBufferProducer
3585 // ---------------------------------------------------------------------------
3587 /* The code below is here to handle b/8734824
3589 * We create a IGraphicBufferProducer wrapper that forwards all calls
3590 * from the surfaceflinger thread to the calling binder thread, where they
3591 * are executed. This allows the calling thread in the calling process to be
3592 * reused and not depend on having "enough" binder threads to handle the
3595 class GraphicProducerWrapper : public BBinder, public MessageHandler {
3596 /* Parts of GraphicProducerWrapper are run on two different threads,
3597 * communicating by sending messages via Looper but also by shared member
3598 * data. Coherence maintenance is subtle and in places implicit (ugh).
3600 * Don't rely on Looper's sendMessage/handleMessage providing
3601 * release/acquire semantics for any data not actually in the Message.
3602 * Data going from surfaceflinger to binder threads needs to be
3603 * synchronized explicitly.
3605 * Barrier open/wait do provide release/acquire semantics. This provides
3606 * implicit synchronization for data coming back from binder to
3607 * surfaceflinger threads.
3610 sp<IGraphicBufferProducer> impl;
3626 * Called on surfaceflinger thread. This is called by our "fake"
3627 * BpGraphicBufferProducer. We package the data and reply Parcel and
3628 * forward them to the binder thread.
3630 virtual status_t transact(uint32_t code,
3631 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3634 this->reply = reply;
3636 // if we've exited, we run the message synchronously right here.
3637 // note (JH): as far as I can tell from looking at the code, this
3638 // never actually happens. if it does, i'm not sure if it happens
3639 // on the surfaceflinger or binder thread.
3640 handleMessage(Message(MSG_API_CALL));
3643 // Prevent stores to this->{code, data, reply} from being
3644 // reordered later than the construction of Message.
3645 atomic_thread_fence(memory_order_release);
3646 looper->sendMessage(this, Message(MSG_API_CALL));
3653 * here we run on the binder thread. All we've got to do is
3654 * call the real BpGraphicBufferProducer.
3656 virtual void handleMessage(const Message& message) {
3657 int what = message.what;
3658 // Prevent reads below from happening before the read from Message
3659 atomic_thread_fence(memory_order_acquire);
3660 if (what == MSG_API_CALL) {
3661 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3663 } else if (what == MSG_EXIT) {
3664 exitRequested = true;
3669 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3671 looper(new Looper(true)),
3674 exitRequested(false),
3681 status_t waitForResponse() {
3683 looper->pollOnce(-1);
3684 } while (!exitRequested);
3689 void exit(status_t result) {
3690 this->result = result;
3692 // Ensure this->result is visible to the binder thread before it
3693 // handles the message.
3694 atomic_thread_fence(memory_order_release);
3695 looper->sendMessage(this, Message(MSG_EXIT));
3700 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3701 const sp<IGraphicBufferProducer>& producer,
3702 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3703 int32_t minLayerZ, int32_t maxLayerZ,
3704 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3706 if (CC_UNLIKELY(display == 0))
3709 if (CC_UNLIKELY(producer == 0))
3712 // if we have secure windows on this display, never allow the screen capture
3713 // unless the producer interface is local (i.e.: we can take a screenshot for
3715 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3717 // Convert to surfaceflinger's internal rotation type.
3718 Transform::orientation_flags rotationFlags;
3720 case ISurfaceComposer::eRotateNone:
3721 rotationFlags = Transform::ROT_0;
3723 case ISurfaceComposer::eRotate90:
3724 rotationFlags = Transform::ROT_90;
3726 case ISurfaceComposer::eRotate180:
3727 rotationFlags = Transform::ROT_180;
3729 case ISurfaceComposer::eRotate270:
3730 rotationFlags = Transform::ROT_270;
3733 rotationFlags = Transform::ROT_0;
3734 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3738 class MessageCaptureScreen : public MessageBase {
3739 SurfaceFlinger* flinger;
3740 sp<IBinder> display;
3741 sp<IGraphicBufferProducer> producer;
3743 uint32_t reqWidth, reqHeight;
3744 int32_t minLayerZ,maxLayerZ;
3745 bool useIdentityTransform;
3746 Transform::orientation_flags rotation;
3748 bool isLocalScreenshot;
3750 MessageCaptureScreen(SurfaceFlinger* flinger,
3751 const sp<IBinder>& display,
3752 const sp<IGraphicBufferProducer>& producer,
3753 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3754 int32_t minLayerZ, int32_t maxLayerZ,
3755 bool useIdentityTransform,
3756 Transform::orientation_flags rotation,
3757 bool isLocalScreenshot)
3758 : flinger(flinger), display(display), producer(producer),
3759 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3760 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3761 useIdentityTransform(useIdentityTransform),
3762 rotation(rotation), result(PERMISSION_DENIED),
3763 isLocalScreenshot(isLocalScreenshot)
3766 status_t getResult() const {
3769 virtual bool handler() {
3770 Mutex::Autolock _l(flinger->mStateLock);
3771 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
3772 result = flinger->captureScreenImplLocked(hw, producer,
3773 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3774 useIdentityTransform, rotation, isLocalScreenshot);
3775 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3780 // this creates a "fake" BBinder which will serve as a "fake" remote
3781 // binder to receive the marshaled calls and forward them to the
3782 // real remote (a BpGraphicBufferProducer)
3783 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3785 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3786 // which does the marshaling work forwards to our "fake remote" above.
3787 sp<MessageBase> msg = new MessageCaptureScreen(this,
3788 display, IGraphicBufferProducer::asInterface( wrapper ),
3789 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3790 useIdentityTransform, rotationFlags, isLocalScreenshot);
3792 status_t res = postMessageAsync(msg);
3793 if (res == NO_ERROR) {
3794 res = wrapper->waitForResponse();
3800 void SurfaceFlinger::renderScreenImplLocked(
3801 const sp<const DisplayDevice>& hw,
3802 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3803 int32_t minLayerZ, int32_t maxLayerZ,
3804 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3807 RenderEngine& engine(getRenderEngine());
3809 // get screen geometry
3810 const int32_t hw_w = hw->getWidth();
3811 const int32_t hw_h = hw->getHeight();
3812 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3813 static_cast<int32_t>(reqHeight) != hw_h;
3815 // if a default or invalid sourceCrop is passed in, set reasonable values
3816 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3817 !sourceCrop.isValid()) {
3818 sourceCrop.setLeftTop(Point(0, 0));
3819 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3822 // ensure that sourceCrop is inside screen
3823 if (sourceCrop.left < 0) {
3824 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3826 if (sourceCrop.right > hw_w) {
3827 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3829 if (sourceCrop.top < 0) {
3830 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3832 if (sourceCrop.bottom > hw_h) {
3833 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3836 // make sure to clear all GL error flags
3837 engine.checkErrors();
3839 // set-up our viewport
3840 engine.setViewportAndProjection(
3841 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3842 engine.disableTexturing();
3844 // redraw the screen entirely...
3845 engine.clearWithColor(0, 0, 0, 1);
3847 // We loop through the first level of layers without traversing,
3848 // as we need to interpret min/max layer Z in the top level Z space.
3849 for (const auto& layer : mDrawingState.layersSortedByZ) {
3850 if (layer->getLayerStack() != hw->getLayerStack()) {
3853 const Layer::State& state(layer->getDrawingState());
3854 if (state.z < minLayerZ || state.z > maxLayerZ) {
3857 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
3858 if (!layer->isVisible()) {
3861 if (filtering) layer->setFiltering(true);
3862 layer->draw(hw, useIdentityTransform);
3863 if (filtering) layer->setFiltering(false);
3867 // compositionComplete is needed for older driver
3868 hw->compositionComplete();
3869 hw->setViewportAndProjection();
3873 status_t SurfaceFlinger::captureScreenImplLocked(
3874 const sp<const DisplayDevice>& hw,
3875 const sp<IGraphicBufferProducer>& producer,
3876 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3877 int32_t minLayerZ, int32_t maxLayerZ,
3878 bool useIdentityTransform, Transform::orientation_flags rotation,
3879 bool isLocalScreenshot)
3883 // get screen geometry
3884 uint32_t hw_w = hw->getWidth();
3885 uint32_t hw_h = hw->getHeight();
3887 if (rotation & Transform::ROT_90) {
3888 std::swap(hw_w, hw_h);
3891 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3892 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3893 reqWidth, reqHeight, hw_w, hw_h);
3897 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3898 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3900 bool secureLayerIsVisible = false;
3901 for (const auto& layer : mDrawingState.layersSortedByZ) {
3902 const Layer::State& state(layer->getDrawingState());
3903 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3904 (state.z < minLayerZ || state.z > maxLayerZ)) {
3907 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
3908 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3913 if (!isLocalScreenshot && secureLayerIsVisible) {
3914 ALOGW("FB is protected: PERMISSION_DENIED");
3915 return PERMISSION_DENIED;
3918 // create a surface (because we're a producer, and we need to
3919 // dequeue/queue a buffer)
3920 sp<Surface> sur = new Surface(producer, false);
3921 ANativeWindow* window = sur.get();
3923 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3924 if (result == NO_ERROR) {
3925 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3926 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3929 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3930 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3931 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3932 err |= native_window_set_usage(window, usage);
3934 if (err == NO_ERROR) {
3935 ANativeWindowBuffer* buffer;
3936 /* TODO: Once we have the sync framework everywhere this can use
3937 * server-side waits on the fence that dequeueBuffer returns.
3939 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3940 if (result == NO_ERROR) {
3942 // create an EGLImage from the buffer so we can later
3943 // turn it into a texture
3944 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3945 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3946 if (image != EGL_NO_IMAGE_KHR) {
3947 // this binds the given EGLImage as a framebuffer for the
3948 // duration of this scope.
3949 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3950 if (imageBond.getStatus() == NO_ERROR) {
3951 // this will in fact render into our dequeued buffer
3952 // via an FBO, which means we didn't have to create
3953 // an EGLSurface and therefore we're not
3954 // dependent on the context's EGLConfig.
3955 renderScreenImplLocked(
3956 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3957 useIdentityTransform, rotation);
3959 // Attempt to create a sync khr object that can produce a sync point. If that
3960 // isn't available, create a non-dupable sync object in the fallback path and
3961 // wait on it directly.
3963 if (!DEBUG_SCREENSHOTS) {
3964 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3965 // native fence fd will not be populated until flush() is done.
3966 getRenderEngine().flush();
3968 sync = EGL_NO_SYNC_KHR;
3970 if (sync != EGL_NO_SYNC_KHR) {
3972 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3973 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3974 ALOGW("captureScreen: failed to dup sync khr object");
3977 eglDestroySyncKHR(mEGLDisplay, sync);
3980 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3981 if (sync != EGL_NO_SYNC_KHR) {
3982 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3983 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3984 EGLint eglErr = eglGetError();
3985 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3986 ALOGW("captureScreen: fence wait timed out");
3988 ALOGW_IF(eglErr != EGL_SUCCESS,
3989 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3991 eglDestroySyncKHR(mEGLDisplay, sync);
3993 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3996 if (DEBUG_SCREENSHOTS) {
3997 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3998 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3999 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4000 hw, minLayerZ, maxLayerZ);
4005 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4006 result = INVALID_OPERATION;
4007 window->cancelBuffer(window, buffer, syncFd);
4010 // destroy our image
4011 eglDestroyImageKHR(mEGLDisplay, image);
4016 // queueBuffer takes ownership of syncFd
4017 result = window->queueBuffer(window, buffer, syncFd);
4023 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4029 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
4030 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
4031 if (DEBUG_SCREENSHOTS) {
4032 for (size_t y=0 ; y<h ; y++) {
4033 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4034 for (size_t x=0 ; x<w ; x++) {
4035 if (p[x] != 0xFF000000) return;
4038 ALOGE("*** we just took a black screenshot ***\n"
4039 "requested minz=%d, maxz=%d, layerStack=%d",
4040 minLayerZ, maxLayerZ, hw->getLayerStack());
4042 for (const auto& layer : mDrawingState.layersSortedByZ) {
4043 const Layer::State& state(layer->getDrawingState());
4044 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4045 state.z <= maxLayerZ) {
4046 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
4047 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4048 layer->isVisible() ? '+' : '-',
4049 i, layer->getName().string(), layer->getLayerStack(), state.z,
4050 layer->isVisible(), state.flags, state.alpha);
4058 // ---------------------------------------------------------------------------
4060 void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4061 layersSortedByZ.traverseInZOrder(stateSet, visitor);
4064 void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4065 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
4068 }; // namespace android
4071 #if defined(__gl_h_)
4072 #error "don't include gl/gl.h in this file"
4075 #if defined(__gl2_h_)
4076 #error "don't include gl2/gl2.h in this file"