OSDN Git Service

Merge "Update default DispSync offsets" into nyc-mr1-dev
[android-x86/frameworks-native.git] / services / surfaceflinger / SurfaceFlinger_hwc1.cpp
1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #define ATRACE_TAG ATRACE_TAG_GRAPHICS
18
19 #include <stdint.h>
20 #include <sys/types.h>
21 #include <errno.h>
22 #include <math.h>
23 #include <dlfcn.h>
24 #include <inttypes.h>
25 #include <stdatomic.h>
26
27 #include <EGL/egl.h>
28
29 #include <cutils/log.h>
30 #include <cutils/properties.h>
31
32 #include <binder/IPCThreadState.h>
33 #include <binder/IServiceManager.h>
34 #include <binder/MemoryHeapBase.h>
35 #include <binder/PermissionCache.h>
36
37 #include <ui/DisplayInfo.h>
38 #include <ui/DisplayStatInfo.h>
39
40 #include <gui/BitTube.h>
41 #include <gui/BufferQueue.h>
42 #include <gui/GuiConfig.h>
43 #include <gui/IDisplayEventConnection.h>
44 #include <gui/Surface.h>
45 #include <gui/GraphicBufferAlloc.h>
46
47 #include <ui/GraphicBufferAllocator.h>
48 #include <ui/HdrCapabilities.h>
49 #include <ui/PixelFormat.h>
50 #include <ui/UiConfig.h>
51
52 #include <utils/misc.h>
53 #include <utils/String8.h>
54 #include <utils/String16.h>
55 #include <utils/StopWatch.h>
56 #include <utils/Timers.h>
57 #include <utils/Trace.h>
58
59 #include <private/android_filesystem_config.h>
60 #include <private/gui/SyncFeatures.h>
61
62 #include <set>
63
64 #include "Client.h"
65 #include "clz.h"
66 #include "Colorizer.h"
67 #include "DdmConnection.h"
68 #include "DisplayDevice.h"
69 #include "DispSync.h"
70 #include "EventControlThread.h"
71 #include "EventThread.h"
72 #include "Layer.h"
73 #include "LayerDim.h"
74 #include "SurfaceFlinger.h"
75
76 #include "DisplayHardware/FramebufferSurface.h"
77 #include "DisplayHardware/HWComposer.h"
78 #include "DisplayHardware/VirtualDisplaySurface.h"
79
80 #include "Effects/Daltonizer.h"
81
82 #include "RenderEngine/RenderEngine.h"
83 #include <cutils/compiler.h>
84
85 #define DISPLAY_COUNT       1
86
87 /*
88  * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
89  * black pixels.
90  */
91 #define DEBUG_SCREENSHOTS   false
92
93 EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
94
95 namespace android {
96
97 // This is the phase offset in nanoseconds of the software vsync event
98 // relative to the vsync event reported by HWComposer.  The software vsync
99 // event is when SurfaceFlinger and Choreographer-based applications run each
100 // frame.
101 //
102 // This phase offset allows adjustment of the minimum latency from application
103 // wake-up (by Choregographer) time to the time at which the resulting window
104 // image is displayed.  This value may be either positive (after the HW vsync)
105 // or negative (before the HW vsync).  Setting it to 0 will result in a
106 // minimum latency of two vsync periods because the app and SurfaceFlinger
107 // will run just after the HW vsync.  Setting it to a positive number will
108 // result in the minimum latency being:
109 //
110 //     (2 * VSYNC_PERIOD - (vsyncPhaseOffsetNs % VSYNC_PERIOD))
111 //
112 // Note that reducing this latency makes it more likely for the applications
113 // to not have their window content image ready in time.  When this happens
114 // the latency will end up being an additional vsync period, and animations
115 // will hiccup.  Therefore, this latency should be tuned somewhat
116 // conservatively (or at least with awareness of the trade-off being made).
117 static const int64_t vsyncPhaseOffsetNs = VSYNC_EVENT_PHASE_OFFSET_NS;
118
119 // This is the phase offset at which SurfaceFlinger's composition runs.
120 static const int64_t sfVsyncPhaseOffsetNs = SF_VSYNC_EVENT_PHASE_OFFSET_NS;
121
122 // ---------------------------------------------------------------------------
123
124 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
125 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
126 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
127 const String16 sDump("android.permission.DUMP");
128
129 // ---------------------------------------------------------------------------
130
131 SurfaceFlinger::SurfaceFlinger()
132     :   BnSurfaceComposer(),
133         mTransactionFlags(0),
134         mTransactionPending(false),
135         mAnimTransactionPending(false),
136         mLayersRemoved(false),
137         mRepaintEverything(0),
138         mRenderEngine(NULL),
139         mBootTime(systemTime()),
140         mVisibleRegionsDirty(false),
141         mHwWorkListDirty(false),
142         mAnimCompositionPending(false),
143         mDebugRegion(0),
144         mDebugDDMS(0),
145         mDebugDisableHWC(0),
146         mDebugDisableTransformHint(0),
147         mDebugInSwapBuffers(0),
148         mLastSwapBufferTime(0),
149         mDebugInTransaction(0),
150         mLastTransactionTime(0),
151         mBootFinished(false),
152         mForceFullDamage(false),
153         mPrimaryDispSync("PrimaryDispSync"),
154         mPrimaryHWVsyncEnabled(false),
155         mHWVsyncAvailable(false),
156         mDaltonize(false),
157         mHasColorMatrix(false),
158         mHasPoweredOff(false),
159         mFrameBuckets(),
160         mTotalTime(0),
161         mLastSwapTime(0)
162 {
163     ALOGI("SurfaceFlinger is starting");
164
165     // debugging stuff...
166     char value[PROPERTY_VALUE_MAX];
167
168     property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
169     mGpuToCpuSupported = !atoi(value);
170
171     property_get("debug.sf.showupdates", value, "0");
172     mDebugRegion = atoi(value);
173
174     property_get("debug.sf.ddms", value, "0");
175     mDebugDDMS = atoi(value);
176     if (mDebugDDMS) {
177         if (!startDdmConnection()) {
178             // start failed, and DDMS debugging not enabled
179             mDebugDDMS = 0;
180         }
181     }
182     ALOGI_IF(mDebugRegion, "showupdates enabled");
183     ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
184
185     property_get("debug.sf.disable_hwc_vds", value, "0");
186     mUseHwcVirtualDisplays = !atoi(value);
187     ALOGI_IF(!mUseHwcVirtualDisplays, "Disabling HWC virtual displays");
188 }
189
190 void SurfaceFlinger::onFirstRef()
191 {
192     mEventQueue.init(this);
193 }
194
195 SurfaceFlinger::~SurfaceFlinger()
196 {
197     EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
198     eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
199     eglTerminate(display);
200 }
201
202 void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
203 {
204     // the window manager died on us. prepare its eulogy.
205
206     // restore initial conditions (default device unblank, etc)
207     initializeDisplays();
208
209     // restart the boot-animation
210     startBootAnim();
211 }
212
213 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
214 {
215     sp<ISurfaceComposerClient> bclient;
216     sp<Client> client(new Client(this));
217     status_t err = client->initCheck();
218     if (err == NO_ERROR) {
219         bclient = client;
220     }
221     return bclient;
222 }
223
224 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
225         bool secure)
226 {
227     class DisplayToken : public BBinder {
228         sp<SurfaceFlinger> flinger;
229         virtual ~DisplayToken() {
230              // no more references, this display must be terminated
231              Mutex::Autolock _l(flinger->mStateLock);
232              flinger->mCurrentState.displays.removeItem(this);
233              flinger->setTransactionFlags(eDisplayTransactionNeeded);
234          }
235      public:
236         DisplayToken(const sp<SurfaceFlinger>& flinger)
237             : flinger(flinger) {
238         }
239     };
240
241     sp<BBinder> token = new DisplayToken(this);
242
243     Mutex::Autolock _l(mStateLock);
244     DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
245     info.displayName = displayName;
246     mCurrentState.displays.add(token, info);
247
248     return token;
249 }
250
251 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
252     Mutex::Autolock _l(mStateLock);
253
254     ssize_t idx = mCurrentState.displays.indexOfKey(display);
255     if (idx < 0) {
256         ALOGW("destroyDisplay: invalid display token");
257         return;
258     }
259
260     const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
261     if (!info.isVirtualDisplay()) {
262         ALOGE("destroyDisplay called for non-virtual display");
263         return;
264     }
265
266     mCurrentState.displays.removeItemsAt(idx);
267     setTransactionFlags(eDisplayTransactionNeeded);
268 }
269
270 void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
271     ALOGW_IF(mBuiltinDisplays[type],
272             "Overwriting display token for display type %d", type);
273     mBuiltinDisplays[type] = new BBinder();
274     // All non-virtual displays are currently considered secure.
275     DisplayDeviceState info(type, true);
276     mCurrentState.displays.add(mBuiltinDisplays[type], info);
277 }
278
279 sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
280     if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
281         ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
282         return NULL;
283     }
284     return mBuiltinDisplays[id];
285 }
286
287 sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
288 {
289     sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
290     return gba;
291 }
292
293 void SurfaceFlinger::bootFinished()
294 {
295     const nsecs_t now = systemTime();
296     const nsecs_t duration = now - mBootTime;
297     ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
298     mBootFinished = true;
299
300     // wait patiently for the window manager death
301     const String16 name("window");
302     sp<IBinder> window(defaultServiceManager()->getService(name));
303     if (window != 0) {
304         window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
305     }
306
307     // stop boot animation
308     // formerly we would just kill the process, but we now ask it to exit so it
309     // can choose where to stop the animation.
310     property_set("service.bootanim.exit", "1");
311
312     const int LOGTAG_SF_STOP_BOOTANIM = 60110;
313     LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
314                    ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
315 }
316
317 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
318     class MessageDestroyGLTexture : public MessageBase {
319         RenderEngine& engine;
320         uint32_t texture;
321     public:
322         MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
323             : engine(engine), texture(texture) {
324         }
325         virtual bool handler() {
326             engine.deleteTextures(1, &texture);
327             return true;
328         }
329     };
330     postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
331 }
332
333 class DispSyncSource : public VSyncSource, private DispSync::Callback {
334 public:
335     DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
336         const char* name) :
337             mName(name),
338             mValue(0),
339             mTraceVsync(traceVsync),
340             mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
341             mVsyncEventLabel(String8::format("VSYNC-%s", name)),
342             mDispSync(dispSync),
343             mCallbackMutex(),
344             mCallback(),
345             mVsyncMutex(),
346             mPhaseOffset(phaseOffset),
347             mEnabled(false) {}
348
349     virtual ~DispSyncSource() {}
350
351     virtual void setVSyncEnabled(bool enable) {
352         Mutex::Autolock lock(mVsyncMutex);
353         if (enable) {
354             status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
355                     static_cast<DispSync::Callback*>(this));
356             if (err != NO_ERROR) {
357                 ALOGE("error registering vsync callback: %s (%d)",
358                         strerror(-err), err);
359             }
360             //ATRACE_INT(mVsyncOnLabel.string(), 1);
361         } else {
362             status_t err = mDispSync->removeEventListener(
363                     static_cast<DispSync::Callback*>(this));
364             if (err != NO_ERROR) {
365                 ALOGE("error unregistering vsync callback: %s (%d)",
366                         strerror(-err), err);
367             }
368             //ATRACE_INT(mVsyncOnLabel.string(), 0);
369         }
370         mEnabled = enable;
371     }
372
373     virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
374         Mutex::Autolock lock(mCallbackMutex);
375         mCallback = callback;
376     }
377
378     virtual void setPhaseOffset(nsecs_t phaseOffset) {
379         Mutex::Autolock lock(mVsyncMutex);
380
381         // Normalize phaseOffset to [0, period)
382         auto period = mDispSync->getPeriod();
383         phaseOffset %= period;
384         if (phaseOffset < 0) {
385             // If we're here, then phaseOffset is in (-period, 0). After this
386             // operation, it will be in (0, period)
387             phaseOffset += period;
388         }
389         mPhaseOffset = phaseOffset;
390
391         // If we're not enabled, we don't need to mess with the listeners
392         if (!mEnabled) {
393             return;
394         }
395
396         // Remove the listener with the old offset
397         status_t err = mDispSync->removeEventListener(
398                 static_cast<DispSync::Callback*>(this));
399         if (err != NO_ERROR) {
400             ALOGE("error unregistering vsync callback: %s (%d)",
401                     strerror(-err), err);
402         }
403
404         // Add a listener with the new offset
405         err = mDispSync->addEventListener(mName, mPhaseOffset,
406                 static_cast<DispSync::Callback*>(this));
407         if (err != NO_ERROR) {
408             ALOGE("error registering vsync callback: %s (%d)",
409                     strerror(-err), err);
410         }
411     }
412
413 private:
414     virtual void onDispSyncEvent(nsecs_t when) {
415         sp<VSyncSource::Callback> callback;
416         {
417             Mutex::Autolock lock(mCallbackMutex);
418             callback = mCallback;
419
420             if (mTraceVsync) {
421                 mValue = (mValue + 1) % 2;
422                 ATRACE_INT(mVsyncEventLabel.string(), mValue);
423             }
424         }
425
426         if (callback != NULL) {
427             callback->onVSyncEvent(when);
428         }
429     }
430
431     const char* const mName;
432
433     int mValue;
434
435     const bool mTraceVsync;
436     const String8 mVsyncOnLabel;
437     const String8 mVsyncEventLabel;
438
439     DispSync* mDispSync;
440
441     Mutex mCallbackMutex; // Protects the following
442     sp<VSyncSource::Callback> mCallback;
443
444     Mutex mVsyncMutex; // Protects the following
445     nsecs_t mPhaseOffset;
446     bool mEnabled;
447 };
448
449 void SurfaceFlinger::init() {
450     ALOGI(  "SurfaceFlinger's main thread ready to run. "
451             "Initializing graphics H/W...");
452
453     Mutex::Autolock _l(mStateLock);
454
455     // initialize EGL for the default display
456     mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
457     eglInitialize(mEGLDisplay, NULL, NULL);
458
459     // start the EventThread
460     sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
461             vsyncPhaseOffsetNs, true, "app");
462     mEventThread = new EventThread(vsyncSrc, *this);
463     sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
464             sfVsyncPhaseOffsetNs, true, "sf");
465     mSFEventThread = new EventThread(sfVsyncSrc, *this);
466     mEventQueue.setEventThread(mSFEventThread);
467
468     // set SFEventThread to SCHED_FIFO to minimize jitter
469     struct sched_param param = {0};
470     param.sched_priority = 2;
471     if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
472         ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
473     }
474
475
476     // Initialize the H/W composer object.  There may or may not be an
477     // actual hardware composer underneath.
478     mHwc = new HWComposer(this,
479             *static_cast<HWComposer::EventHandler *>(this));
480
481     // get a RenderEngine for the given display / config (can't fail)
482     mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
483
484     // retrieve the EGL context that was selected/created
485     mEGLContext = mRenderEngine->getEGLContext();
486
487     LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
488             "couldn't create EGLContext");
489
490     // initialize our non-virtual displays
491     for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
492         DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
493         // set-up the displays that are already connected
494         if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
495             // All non-virtual displays are currently considered secure.
496             bool isSecure = true;
497             createBuiltinDisplayLocked(type);
498             wp<IBinder> token = mBuiltinDisplays[i];
499
500             sp<IGraphicBufferProducer> producer;
501             sp<IGraphicBufferConsumer> consumer;
502             BufferQueue::createBufferQueue(&producer, &consumer,
503                     new GraphicBufferAlloc());
504
505             sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
506                     consumer);
507             int32_t hwcId = allocateHwcDisplayId(type);
508             sp<DisplayDevice> hw = new DisplayDevice(this,
509                     type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
510                     fbs, producer,
511                     mRenderEngine->getEGLConfig());
512             if (i > DisplayDevice::DISPLAY_PRIMARY) {
513                 // FIXME: currently we don't get blank/unblank requests
514                 // for displays other than the main display, so we always
515                 // assume a connected display is unblanked.
516                 ALOGD("marking display %zu as acquired/unblanked", i);
517                 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
518             }
519             mDisplays.add(token, hw);
520         }
521     }
522
523     // make the GLContext current so that we can create textures when creating Layers
524     // (which may happens before we render something)
525     getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
526
527     mEventControlThread = new EventControlThread(this);
528     mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
529
530     // set a fake vsync period if there is no HWComposer
531     if (mHwc->initCheck() != NO_ERROR) {
532         mPrimaryDispSync.setPeriod(16666667);
533     }
534
535     // initialize our drawing state
536     mDrawingState = mCurrentState;
537
538     // set initial conditions (e.g. unblank default device)
539     initializeDisplays();
540
541     mRenderEngine->primeCache();
542
543     // start boot animation
544     startBootAnim();
545 }
546
547 int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
548     return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
549             type : mHwc->allocateDisplayId();
550 }
551
552 void SurfaceFlinger::startBootAnim() {
553     // start boot animation
554     property_set("service.bootanim.exit", "0");
555     property_set("ctl.start", "bootanim");
556 }
557
558 size_t SurfaceFlinger::getMaxTextureSize() const {
559     return mRenderEngine->getMaxTextureSize();
560 }
561
562 size_t SurfaceFlinger::getMaxViewportDims() const {
563     return mRenderEngine->getMaxViewportDims();
564 }
565
566 // ----------------------------------------------------------------------------
567
568 bool SurfaceFlinger::authenticateSurfaceTexture(
569         const sp<IGraphicBufferProducer>& bufferProducer) const {
570     Mutex::Autolock _l(mStateLock);
571     sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
572     return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
573 }
574
575 status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
576         Vector<DisplayInfo>* configs) {
577     if ((configs == NULL) || (display.get() == NULL)) {
578         return BAD_VALUE;
579     }
580
581     int32_t type = getDisplayType(display);
582     if (type < 0) return type;
583
584     // TODO: Not sure if display density should handled by SF any longer
585     class Density {
586         static int getDensityFromProperty(char const* propName) {
587             char property[PROPERTY_VALUE_MAX];
588             int density = 0;
589             if (property_get(propName, property, NULL) > 0) {
590                 density = atoi(property);
591             }
592             return density;
593         }
594     public:
595         static int getEmuDensity() {
596             return getDensityFromProperty("qemu.sf.lcd_density"); }
597         static int getBuildDensity()  {
598             return getDensityFromProperty("ro.sf.lcd_density"); }
599     };
600
601     configs->clear();
602
603     const Vector<HWComposer::DisplayConfig>& hwConfigs =
604             getHwComposer().getConfigs(type);
605     for (size_t c = 0; c < hwConfigs.size(); ++c) {
606         const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
607         DisplayInfo info = DisplayInfo();
608
609         float xdpi = hwConfig.xdpi;
610         float ydpi = hwConfig.ydpi;
611
612         if (type == DisplayDevice::DISPLAY_PRIMARY) {
613             // The density of the device is provided by a build property
614             float density = Density::getBuildDensity() / 160.0f;
615             if (density == 0) {
616                 // the build doesn't provide a density -- this is wrong!
617                 // use xdpi instead
618                 ALOGE("ro.sf.lcd_density must be defined as a build property");
619                 density = xdpi / 160.0f;
620             }
621             if (Density::getEmuDensity()) {
622                 // if "qemu.sf.lcd_density" is specified, it overrides everything
623                 xdpi = ydpi = density = Density::getEmuDensity();
624                 density /= 160.0f;
625             }
626             info.density = density;
627
628             // TODO: this needs to go away (currently needed only by webkit)
629             sp<const DisplayDevice> hw(getDefaultDisplayDevice());
630             info.orientation = hw->getOrientation();
631         } else {
632             // TODO: where should this value come from?
633             static const int TV_DENSITY = 213;
634             info.density = TV_DENSITY / 160.0f;
635             info.orientation = 0;
636         }
637
638         info.w = hwConfig.width;
639         info.h = hwConfig.height;
640         info.xdpi = xdpi;
641         info.ydpi = ydpi;
642         info.fps = float(1e9 / hwConfig.refresh);
643         info.appVsyncOffset = VSYNC_EVENT_PHASE_OFFSET_NS;
644
645         // This is how far in advance a buffer must be queued for
646         // presentation at a given time.  If you want a buffer to appear
647         // on the screen at time N, you must submit the buffer before
648         // (N - presentationDeadline).
649         //
650         // Normally it's one full refresh period (to give SF a chance to
651         // latch the buffer), but this can be reduced by configuring a
652         // DispSync offset.  Any additional delays introduced by the hardware
653         // composer or panel must be accounted for here.
654         //
655         // We add an additional 1ms to allow for processing time and
656         // differences between the ideal and actual refresh rate.
657         info.presentationDeadline =
658                 hwConfig.refresh - SF_VSYNC_EVENT_PHASE_OFFSET_NS + 1000000;
659
660         // All non-virtual displays are currently considered secure.
661         info.secure = true;
662
663         configs->push_back(info);
664     }
665
666     return NO_ERROR;
667 }
668
669 status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
670         DisplayStatInfo* stats) {
671     if (stats == NULL) {
672         return BAD_VALUE;
673     }
674
675     // FIXME for now we always return stats for the primary display
676     memset(stats, 0, sizeof(*stats));
677     stats->vsyncTime   = mPrimaryDispSync.computeNextRefresh(0);
678     stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
679     return NO_ERROR;
680 }
681
682 int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
683     sp<DisplayDevice> device(getDisplayDevice(display));
684     if (device != NULL) {
685         return device->getActiveConfig();
686     }
687     return BAD_VALUE;
688 }
689
690 void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
691     ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
692           this);
693     int32_t type = hw->getDisplayType();
694     int currentMode = hw->getActiveConfig();
695
696     if (mode == currentMode) {
697         ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
698         return;
699     }
700
701     if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
702         ALOGW("Trying to set config for virtual display");
703         return;
704     }
705
706     hw->setActiveConfig(mode);
707     getHwComposer().setActiveConfig(type, mode);
708 }
709
710 status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
711     class MessageSetActiveConfig: public MessageBase {
712         SurfaceFlinger& mFlinger;
713         sp<IBinder> mDisplay;
714         int mMode;
715     public:
716         MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
717                                int mode) :
718             mFlinger(flinger), mDisplay(disp) { mMode = mode; }
719         virtual bool handler() {
720             Vector<DisplayInfo> configs;
721             mFlinger.getDisplayConfigs(mDisplay, &configs);
722             if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
723                 ALOGE("Attempt to set active config = %d for display with %zu configs",
724                         mMode, configs.size());
725             }
726             sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
727             if (hw == NULL) {
728                 ALOGE("Attempt to set active config = %d for null display %p",
729                         mMode, mDisplay.get());
730             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
731                 ALOGW("Attempt to set active config = %d for virtual display",
732                         mMode);
733             } else {
734                 mFlinger.setActiveConfigInternal(hw, mMode);
735             }
736             return true;
737         }
738     };
739     sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
740     postMessageSync(msg);
741     return NO_ERROR;
742 }
743
744 status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
745         Vector<android_color_mode_t>* outColorModes) {
746     if (outColorModes == nullptr || display.get() == nullptr) {
747         return BAD_VALUE;
748     }
749
750     int32_t type = getDisplayType(display);
751     if (type < 0) return type;
752
753     std::set<android_color_mode_t> colorModes;
754     for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
755         colorModes.insert(hwConfig.colorMode);
756     }
757
758     outColorModes->clear();
759     std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
760
761     return NO_ERROR;
762 }
763
764 android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
765     if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
766
767     int32_t type = getDisplayType(display);
768     if (type < 0) return static_cast<android_color_mode_t>(type);
769
770     return getHwComposer().getColorMode(type);
771 }
772
773 status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
774         android_color_mode_t colorMode) {
775     if (display.get() == nullptr || colorMode < 0) {
776         return BAD_VALUE;
777     }
778
779     int32_t type = getDisplayType(display);
780     if (type < 0) return type;
781     const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
782     HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
783     desiredConfig.colorMode = colorMode;
784     for (size_t c = 0; c < hwConfigs.size(); ++c) {
785         const HWComposer::DisplayConfig config = hwConfigs[c];
786         if (config == desiredConfig) {
787             return setActiveConfig(display, c);
788         }
789     }
790     return BAD_VALUE;
791 }
792
793 status_t SurfaceFlinger::clearAnimationFrameStats() {
794     Mutex::Autolock _l(mStateLock);
795     mAnimFrameTracker.clearStats();
796     return NO_ERROR;
797 }
798
799 status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
800     Mutex::Autolock _l(mStateLock);
801     mAnimFrameTracker.getStats(outStats);
802     return NO_ERROR;
803 }
804
805 status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
806         HdrCapabilities* outCapabilities) const {
807     // HWC1 does not provide HDR capabilities
808     *outCapabilities = HdrCapabilities();
809     return NO_ERROR;
810 }
811
812 // ----------------------------------------------------------------------------
813
814 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
815     return mEventThread->createEventConnection();
816 }
817
818 // ----------------------------------------------------------------------------
819
820 void SurfaceFlinger::waitForEvent() {
821     mEventQueue.waitMessage();
822 }
823
824 void SurfaceFlinger::signalTransaction() {
825     mEventQueue.invalidate();
826 }
827
828 void SurfaceFlinger::signalLayerUpdate() {
829     mEventQueue.invalidate();
830 }
831
832 void SurfaceFlinger::signalRefresh() {
833     mEventQueue.refresh();
834 }
835
836 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
837         nsecs_t reltime, uint32_t /* flags */) {
838     return mEventQueue.postMessage(msg, reltime);
839 }
840
841 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
842         nsecs_t reltime, uint32_t /* flags */) {
843     status_t res = mEventQueue.postMessage(msg, reltime);
844     if (res == NO_ERROR) {
845         msg->wait();
846     }
847     return res;
848 }
849
850 void SurfaceFlinger::run() {
851     do {
852         waitForEvent();
853     } while (true);
854 }
855
856 void SurfaceFlinger::enableHardwareVsync() {
857     Mutex::Autolock _l(mHWVsyncLock);
858     if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
859         mPrimaryDispSync.beginResync();
860         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
861         mEventControlThread->setVsyncEnabled(true);
862         mPrimaryHWVsyncEnabled = true;
863     }
864 }
865
866 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
867     Mutex::Autolock _l(mHWVsyncLock);
868
869     if (makeAvailable) {
870         mHWVsyncAvailable = true;
871     } else if (!mHWVsyncAvailable) {
872         // Hardware vsync is not currently available, so abort the resync
873         // attempt for now
874         return;
875     }
876
877     const nsecs_t period =
878             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
879
880     mPrimaryDispSync.reset();
881     mPrimaryDispSync.setPeriod(period);
882
883     if (!mPrimaryHWVsyncEnabled) {
884         mPrimaryDispSync.beginResync();
885         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
886         mEventControlThread->setVsyncEnabled(true);
887         mPrimaryHWVsyncEnabled = true;
888     }
889 }
890
891 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
892     Mutex::Autolock _l(mHWVsyncLock);
893     if (mPrimaryHWVsyncEnabled) {
894         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
895         mEventControlThread->setVsyncEnabled(false);
896         mPrimaryDispSync.endResync();
897         mPrimaryHWVsyncEnabled = false;
898     }
899     if (makeUnavailable) {
900         mHWVsyncAvailable = false;
901     }
902 }
903
904 void SurfaceFlinger::resyncWithRateLimit() {
905     static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
906     if (systemTime() - mLastSwapTime > kIgnoreDelay) {
907         resyncToHardwareVsync(false);
908     }
909 }
910
911 void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) {
912     bool needsHwVsync = false;
913
914     { // Scope for the lock
915         Mutex::Autolock _l(mHWVsyncLock);
916         if (type == 0 && mPrimaryHWVsyncEnabled) {
917             needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
918         }
919     }
920
921     if (needsHwVsync) {
922         enableHardwareVsync();
923     } else {
924         disableHardwareVsync(false);
925     }
926 }
927
928 void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
929     if (mEventThread == NULL) {
930         // This is a temporary workaround for b/7145521.  A non-null pointer
931         // does not mean EventThread has finished initializing, so this
932         // is not a correct fix.
933         ALOGW("WARNING: EventThread not started, ignoring hotplug");
934         return;
935     }
936
937     if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
938         Mutex::Autolock _l(mStateLock);
939         if (connected) {
940             createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
941         } else {
942             mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
943             mBuiltinDisplays[type].clear();
944         }
945         setTransactionFlags(eDisplayTransactionNeeded);
946
947         // Defer EventThread notification until SF has updated mDisplays.
948     }
949 }
950
951 void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
952     ATRACE_CALL();
953     getHwComposer().eventControl(disp, event, enabled);
954 }
955
956 void SurfaceFlinger::onMessageReceived(int32_t what) {
957     ATRACE_CALL();
958     switch (what) {
959         case MessageQueue::INVALIDATE: {
960             bool refreshNeeded = handleMessageTransaction();
961             refreshNeeded |= handleMessageInvalidate();
962             refreshNeeded |= mRepaintEverything;
963             if (refreshNeeded) {
964                 // Signal a refresh if a transaction modified the window state,
965                 // a new buffer was latched, or if HWC has requested a full
966                 // repaint
967                 signalRefresh();
968             }
969             break;
970         }
971         case MessageQueue::REFRESH: {
972             handleMessageRefresh();
973             break;
974         }
975     }
976 }
977
978 bool SurfaceFlinger::handleMessageTransaction() {
979     uint32_t transactionFlags = peekTransactionFlags(eTransactionMask);
980     if (transactionFlags) {
981         handleTransaction(transactionFlags);
982         return true;
983     }
984     return false;
985 }
986
987 bool SurfaceFlinger::handleMessageInvalidate() {
988     ATRACE_CALL();
989     return handlePageFlip();
990 }
991
992 void SurfaceFlinger::handleMessageRefresh() {
993     ATRACE_CALL();
994
995     nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
996
997     preComposition();
998     rebuildLayerStacks();
999     setUpHWComposer();
1000     doDebugFlashRegions();
1001     doComposition();
1002     postComposition(refreshStartTime);
1003 }
1004
1005 void SurfaceFlinger::doDebugFlashRegions()
1006 {
1007     // is debugging enabled
1008     if (CC_LIKELY(!mDebugRegion))
1009         return;
1010
1011     const bool repaintEverything = mRepaintEverything;
1012     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1013         const sp<DisplayDevice>& hw(mDisplays[dpy]);
1014         if (hw->isDisplayOn()) {
1015             // transform the dirty region into this screen's coordinate space
1016             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1017             if (!dirtyRegion.isEmpty()) {
1018                 // redraw the whole screen
1019                 doComposeSurfaces(hw, Region(hw->bounds()));
1020
1021                 // and draw the dirty region
1022                 const int32_t height = hw->getHeight();
1023                 RenderEngine& engine(getRenderEngine());
1024                 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1025
1026                 hw->compositionComplete();
1027                 hw->swapBuffers(getHwComposer());
1028             }
1029         }
1030     }
1031
1032     postFramebuffer();
1033
1034     if (mDebugRegion > 1) {
1035         usleep(mDebugRegion * 1000);
1036     }
1037
1038     HWComposer& hwc(getHwComposer());
1039     if (hwc.initCheck() == NO_ERROR) {
1040         status_t err = hwc.prepare();
1041         ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1042     }
1043 }
1044
1045 void SurfaceFlinger::preComposition()
1046 {
1047     bool needExtraInvalidate = false;
1048     const LayerVector& layers(mDrawingState.layersSortedByZ);
1049     const size_t count = layers.size();
1050     for (size_t i=0 ; i<count ; i++) {
1051         if (layers[i]->onPreComposition()) {
1052             needExtraInvalidate = true;
1053         }
1054     }
1055     if (needExtraInvalidate) {
1056         signalLayerUpdate();
1057     }
1058 }
1059
1060 void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
1061 {
1062     const LayerVector& layers(mDrawingState.layersSortedByZ);
1063     const size_t count = layers.size();
1064     for (size_t i=0 ; i<count ; i++) {
1065         bool frameLatched = layers[i]->onPostComposition();
1066         if (frameLatched) {
1067             recordBufferingStats(layers[i]->getName().string(),
1068                     layers[i]->getOccupancyHistory(false));
1069         }
1070     }
1071
1072     const HWComposer& hwc = getHwComposer();
1073     sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
1074
1075     if (presentFence->isValid()) {
1076         if (mPrimaryDispSync.addPresentFence(presentFence)) {
1077             enableHardwareVsync();
1078         } else {
1079             disableHardwareVsync(false);
1080         }
1081     }
1082
1083     const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1084     if (kIgnorePresentFences) {
1085         if (hw->isDisplayOn()) {
1086             enableHardwareVsync();
1087         }
1088     }
1089
1090     mFenceTracker.addFrame(refreshStartTime, presentFence,
1091             hw->getVisibleLayersSortedByZ(), hw->getClientTargetAcquireFence());
1092
1093     if (mAnimCompositionPending) {
1094         mAnimCompositionPending = false;
1095
1096         if (presentFence->isValid()) {
1097             mAnimFrameTracker.setActualPresentFence(presentFence);
1098         } else {
1099             // The HWC doesn't support present fences, so use the refresh
1100             // timestamp instead.
1101             nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1102             mAnimFrameTracker.setActualPresentTime(presentTime);
1103         }
1104         mAnimFrameTracker.advanceFrame();
1105     }
1106
1107     if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1108         return;
1109     }
1110
1111     nsecs_t currentTime = systemTime();
1112     if (mHasPoweredOff) {
1113         mHasPoweredOff = false;
1114     } else {
1115         nsecs_t period = mPrimaryDispSync.getPeriod();
1116         nsecs_t elapsedTime = currentTime - mLastSwapTime;
1117         size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1118         if (numPeriods < NUM_BUCKETS - 1) {
1119             mFrameBuckets[numPeriods] += elapsedTime;
1120         } else {
1121             mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1122         }
1123         mTotalTime += elapsedTime;
1124     }
1125     mLastSwapTime = currentTime;
1126 }
1127
1128 void SurfaceFlinger::rebuildLayerStacks() {
1129     // rebuild the visible layer list per screen
1130     if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1131         ATRACE_CALL();
1132         mVisibleRegionsDirty = false;
1133         invalidateHwcGeometry();
1134
1135         const LayerVector& layers(mDrawingState.layersSortedByZ);
1136         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1137             Region opaqueRegion;
1138             Region dirtyRegion;
1139             Vector< sp<Layer> > layersSortedByZ;
1140             const sp<DisplayDevice>& hw(mDisplays[dpy]);
1141             const Transform& tr(hw->getTransform());
1142             const Rect bounds(hw->getBounds());
1143             if (hw->isDisplayOn()) {
1144                 SurfaceFlinger::computeVisibleRegions(layers,
1145                         hw->getLayerStack(), dirtyRegion, opaqueRegion);
1146
1147                 const size_t count = layers.size();
1148                 for (size_t i=0 ; i<count ; i++) {
1149                     const sp<Layer>& layer(layers[i]);
1150                     const Layer::State& s(layer->getDrawingState());
1151                     if (s.layerStack == hw->getLayerStack()) {
1152                         Region drawRegion(tr.transform(
1153                                 layer->visibleNonTransparentRegion));
1154                         drawRegion.andSelf(bounds);
1155                         if (!drawRegion.isEmpty()) {
1156                             layersSortedByZ.add(layer);
1157                         }
1158                     }
1159                 }
1160             }
1161             hw->setVisibleLayersSortedByZ(layersSortedByZ);
1162             hw->undefinedRegion.set(bounds);
1163             hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1164             hw->dirtyRegion.orSelf(dirtyRegion);
1165         }
1166     }
1167 }
1168
1169 void SurfaceFlinger::setUpHWComposer() {
1170     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1171         bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1172         bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1173         bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1174
1175         // If nothing has changed (!dirty), don't recompose.
1176         // If something changed, but we don't currently have any visible layers,
1177         //   and didn't when we last did a composition, then skip it this time.
1178         // The second rule does two things:
1179         // - When all layers are removed from a display, we'll emit one black
1180         //   frame, then nothing more until we get new layers.
1181         // - When a display is created with a private layer stack, we won't
1182         //   emit any black frames until a layer is added to the layer stack.
1183         bool mustRecompose = dirty && !(empty && wasEmpty);
1184
1185         ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1186                 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1187                 mustRecompose ? "doing" : "skipping",
1188                 dirty ? "+" : "-",
1189                 empty ? "+" : "-",
1190                 wasEmpty ? "+" : "-");
1191
1192         mDisplays[dpy]->beginFrame(mustRecompose);
1193
1194         if (mustRecompose) {
1195             mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1196         }
1197     }
1198
1199     HWComposer& hwc(getHwComposer());
1200     if (hwc.initCheck() == NO_ERROR) {
1201         // build the h/w work list
1202         if (CC_UNLIKELY(mHwWorkListDirty)) {
1203             mHwWorkListDirty = false;
1204             for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1205                 sp<const DisplayDevice> hw(mDisplays[dpy]);
1206                 const int32_t id = hw->getHwcDisplayId();
1207                 if (id >= 0) {
1208                     const Vector< sp<Layer> >& currentLayers(
1209                         hw->getVisibleLayersSortedByZ());
1210                     const size_t count = currentLayers.size();
1211                     if (hwc.createWorkList(id, count) == NO_ERROR) {
1212                         HWComposer::LayerListIterator cur = hwc.begin(id);
1213                         const HWComposer::LayerListIterator end = hwc.end(id);
1214                         for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1215                             const sp<Layer>& layer(currentLayers[i]);
1216                             layer->setGeometry(hw, *cur);
1217                             if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1218                                 cur->setSkip(true);
1219                             }
1220                         }
1221                     }
1222                 }
1223             }
1224         }
1225
1226         // set the per-frame data
1227         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1228             sp<const DisplayDevice> hw(mDisplays[dpy]);
1229             const int32_t id = hw->getHwcDisplayId();
1230             if (id >= 0) {
1231                 const Vector< sp<Layer> >& currentLayers(
1232                     hw->getVisibleLayersSortedByZ());
1233                 const size_t count = currentLayers.size();
1234                 HWComposer::LayerListIterator cur = hwc.begin(id);
1235                 const HWComposer::LayerListIterator end = hwc.end(id);
1236                 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1237                     /*
1238                      * update the per-frame h/w composer data for each layer
1239                      * and build the transparent region of the FB
1240                      */
1241                     const sp<Layer>& layer(currentLayers[i]);
1242                     layer->setPerFrameData(hw, *cur);
1243                 }
1244             }
1245         }
1246
1247         // If possible, attempt to use the cursor overlay on each display.
1248         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1249             sp<const DisplayDevice> hw(mDisplays[dpy]);
1250             const int32_t id = hw->getHwcDisplayId();
1251             if (id >= 0) {
1252                 const Vector< sp<Layer> >& currentLayers(
1253                     hw->getVisibleLayersSortedByZ());
1254                 const size_t count = currentLayers.size();
1255                 HWComposer::LayerListIterator cur = hwc.begin(id);
1256                 const HWComposer::LayerListIterator end = hwc.end(id);
1257                 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1258                     const sp<Layer>& layer(currentLayers[i]);
1259                     if (layer->isPotentialCursor()) {
1260                         cur->setIsCursorLayerHint();
1261                         break;
1262                     }
1263                 }
1264             }
1265         }
1266
1267         status_t err = hwc.prepare();
1268         ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1269
1270         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1271             sp<const DisplayDevice> hw(mDisplays[dpy]);
1272             hw->prepareFrame(hwc);
1273         }
1274     }
1275 }
1276
1277 void SurfaceFlinger::doComposition() {
1278     ATRACE_CALL();
1279     const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1280     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1281         const sp<DisplayDevice>& hw(mDisplays[dpy]);
1282         if (hw->isDisplayOn()) {
1283             // transform the dirty region into this screen's coordinate space
1284             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1285
1286             // repaint the framebuffer (if needed)
1287             doDisplayComposition(hw, dirtyRegion);
1288
1289             hw->dirtyRegion.clear();
1290             hw->flip(hw->swapRegion);
1291             hw->swapRegion.clear();
1292         }
1293         // inform the h/w that we're done compositing
1294         hw->compositionComplete();
1295     }
1296     postFramebuffer();
1297 }
1298
1299 void SurfaceFlinger::postFramebuffer()
1300 {
1301     ATRACE_CALL();
1302
1303     const nsecs_t now = systemTime();
1304     mDebugInSwapBuffers = now;
1305
1306     HWComposer& hwc(getHwComposer());
1307     if (hwc.initCheck() == NO_ERROR) {
1308         if (!hwc.supportsFramebufferTarget()) {
1309             // EGL spec says:
1310             //   "surface must be bound to the calling thread's current context,
1311             //    for the current rendering API."
1312             getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1313         }
1314         hwc.commit();
1315     }
1316
1317     // make the default display current because the VirtualDisplayDevice code cannot
1318     // deal with dequeueBuffer() being called outside of the composition loop; however
1319     // the code below can call glFlush() which is allowed (and does in some case) call
1320     // dequeueBuffer().
1321     getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1322
1323     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1324         sp<const DisplayDevice> hw(mDisplays[dpy]);
1325         const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1326         hw->onSwapBuffersCompleted(hwc);
1327         const size_t count = currentLayers.size();
1328         int32_t id = hw->getHwcDisplayId();
1329         if (id >=0 && hwc.initCheck() == NO_ERROR) {
1330             HWComposer::LayerListIterator cur = hwc.begin(id);
1331             const HWComposer::LayerListIterator end = hwc.end(id);
1332             for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1333                 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1334             }
1335         } else {
1336             for (size_t i = 0; i < count; i++) {
1337                 currentLayers[i]->onLayerDisplayed(hw, NULL);
1338             }
1339         }
1340     }
1341
1342     mLastSwapBufferTime = systemTime() - now;
1343     mDebugInSwapBuffers = 0;
1344
1345     uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1346     if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1347         logFrameStats();
1348     }
1349 }
1350
1351 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1352 {
1353     ATRACE_CALL();
1354
1355     // here we keep a copy of the drawing state (that is the state that's
1356     // going to be overwritten by handleTransactionLocked()) outside of
1357     // mStateLock so that the side-effects of the State assignment
1358     // don't happen with mStateLock held (which can cause deadlocks).
1359     State drawingState(mDrawingState);
1360
1361     Mutex::Autolock _l(mStateLock);
1362     const nsecs_t now = systemTime();
1363     mDebugInTransaction = now;
1364
1365     // Here we're guaranteed that some transaction flags are set
1366     // so we can call handleTransactionLocked() unconditionally.
1367     // We call getTransactionFlags(), which will also clear the flags,
1368     // with mStateLock held to guarantee that mCurrentState won't change
1369     // until the transaction is committed.
1370
1371     transactionFlags = getTransactionFlags(eTransactionMask);
1372     handleTransactionLocked(transactionFlags);
1373
1374     mLastTransactionTime = systemTime() - now;
1375     mDebugInTransaction = 0;
1376     invalidateHwcGeometry();
1377     // here the transaction has been committed
1378 }
1379
1380 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1381 {
1382     const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
1383     const size_t count = currentLayers.size();
1384
1385     // Notify all layers of available frames
1386     for (size_t i = 0; i < count; ++i) {
1387         currentLayers[i]->notifyAvailableFrames();
1388     }
1389
1390     /*
1391      * Traversal of the children
1392      * (perform the transaction for each of them if needed)
1393      */
1394
1395     if (transactionFlags & eTraversalNeeded) {
1396         for (size_t i=0 ; i<count ; i++) {
1397             const sp<Layer>& layer(currentLayers[i]);
1398             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
1399             if (!trFlags) continue;
1400
1401             const uint32_t flags = layer->doTransaction(0);
1402             if (flags & Layer::eVisibleRegion)
1403                 mVisibleRegionsDirty = true;
1404         }
1405     }
1406
1407     /*
1408      * Perform display own transactions if needed
1409      */
1410
1411     if (transactionFlags & eDisplayTransactionNeeded) {
1412         // here we take advantage of Vector's copy-on-write semantics to
1413         // improve performance by skipping the transaction entirely when
1414         // know that the lists are identical
1415         const KeyedVector<  wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1416         const KeyedVector<  wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1417         if (!curr.isIdenticalTo(draw)) {
1418             mVisibleRegionsDirty = true;
1419             const size_t cc = curr.size();
1420                   size_t dc = draw.size();
1421
1422             // find the displays that were removed
1423             // (ie: in drawing state but not in current state)
1424             // also handle displays that changed
1425             // (ie: displays that are in both lists)
1426             for (size_t i=0 ; i<dc ; i++) {
1427                 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1428                 if (j < 0) {
1429                     // in drawing state but not in current state
1430                     if (!draw[i].isMainDisplay()) {
1431                         // Call makeCurrent() on the primary display so we can
1432                         // be sure that nothing associated with this display
1433                         // is current.
1434                         const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1435                         defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1436                         sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1437                         if (hw != NULL)
1438                             hw->disconnect(getHwComposer());
1439                         if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1440                             mEventThread->onHotplugReceived(draw[i].type, false);
1441                         mDisplays.removeItem(draw.keyAt(i));
1442                     } else {
1443                         ALOGW("trying to remove the main display");
1444                     }
1445                 } else {
1446                     // this display is in both lists. see if something changed.
1447                     const DisplayDeviceState& state(curr[j]);
1448                     const wp<IBinder>& display(curr.keyAt(j));
1449                     const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1450                     const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1451                     if (state_binder != draw_binder) {
1452                         // changing the surface is like destroying and
1453                         // recreating the DisplayDevice, so we just remove it
1454                         // from the drawing state, so that it get re-added
1455                         // below.
1456                         sp<DisplayDevice> hw(getDisplayDevice(display));
1457                         if (hw != NULL)
1458                             hw->disconnect(getHwComposer());
1459                         mDisplays.removeItem(display);
1460                         mDrawingState.displays.removeItemsAt(i);
1461                         dc--; i--;
1462                         // at this point we must loop to the next item
1463                         continue;
1464                     }
1465
1466                     const sp<DisplayDevice> disp(getDisplayDevice(display));
1467                     if (disp != NULL) {
1468                         if (state.layerStack != draw[i].layerStack) {
1469                             disp->setLayerStack(state.layerStack);
1470                         }
1471                         if ((state.orientation != draw[i].orientation)
1472                                 || (state.viewport != draw[i].viewport)
1473                                 || (state.frame != draw[i].frame))
1474                         {
1475                             disp->setProjection(state.orientation,
1476                                     state.viewport, state.frame);
1477                         }
1478                         if (state.width != draw[i].width || state.height != draw[i].height) {
1479                             disp->setDisplaySize(state.width, state.height);
1480                         }
1481                     }
1482                 }
1483             }
1484
1485             // find displays that were added
1486             // (ie: in current state but not in drawing state)
1487             for (size_t i=0 ; i<cc ; i++) {
1488                 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1489                     const DisplayDeviceState& state(curr[i]);
1490
1491                     sp<DisplaySurface> dispSurface;
1492                     sp<IGraphicBufferProducer> producer;
1493                     sp<IGraphicBufferProducer> bqProducer;
1494                     sp<IGraphicBufferConsumer> bqConsumer;
1495                     BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1496                             new GraphicBufferAlloc());
1497
1498                     int32_t hwcDisplayId = -1;
1499                     if (state.isVirtualDisplay()) {
1500                         // Virtual displays without a surface are dormant:
1501                         // they have external state (layer stack, projection,
1502                         // etc.) but no internal state (i.e. a DisplayDevice).
1503                         if (state.surface != NULL) {
1504
1505                             int width = 0;
1506                             int status = state.surface->query(
1507                                     NATIVE_WINDOW_WIDTH, &width);
1508                             ALOGE_IF(status != NO_ERROR,
1509                                     "Unable to query width (%d)", status);
1510                             int height = 0;
1511                             status = state.surface->query(
1512                                     NATIVE_WINDOW_HEIGHT, &height);
1513                             ALOGE_IF(status != NO_ERROR,
1514                                     "Unable to query height (%d)", status);
1515                             if (mUseHwcVirtualDisplays &&
1516                                     (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
1517                                     (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
1518                                      height <= MAX_VIRTUAL_DISPLAY_DIMENSION))) {
1519                                 hwcDisplayId = allocateHwcDisplayId(state.type);
1520                             }
1521
1522                             sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1523                                     *mHwc, hwcDisplayId, state.surface,
1524                                     bqProducer, bqConsumer, state.displayName);
1525
1526                             dispSurface = vds;
1527                             producer = vds;
1528                         }
1529                     } else {
1530                         ALOGE_IF(state.surface!=NULL,
1531                                 "adding a supported display, but rendering "
1532                                 "surface is provided (%p), ignoring it",
1533                                 state.surface.get());
1534                         hwcDisplayId = allocateHwcDisplayId(state.type);
1535                         // for supported (by hwc) displays we provide our
1536                         // own rendering surface
1537                         dispSurface = new FramebufferSurface(*mHwc, state.type,
1538                                 bqConsumer);
1539                         producer = bqProducer;
1540                     }
1541
1542                     const wp<IBinder>& display(curr.keyAt(i));
1543                     if (dispSurface != NULL) {
1544                         sp<DisplayDevice> hw = new DisplayDevice(this,
1545                                 state.type, hwcDisplayId,
1546                                 mHwc->getFormat(hwcDisplayId), state.isSecure,
1547                                 display, dispSurface, producer,
1548                                 mRenderEngine->getEGLConfig());
1549                         hw->setLayerStack(state.layerStack);
1550                         hw->setProjection(state.orientation,
1551                                 state.viewport, state.frame);
1552                         hw->setDisplayName(state.displayName);
1553                         mDisplays.add(display, hw);
1554                         if (state.isVirtualDisplay()) {
1555                             if (hwcDisplayId >= 0) {
1556                                 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1557                                         hw->getWidth(), hw->getHeight(),
1558                                         hw->getFormat());
1559                             }
1560                         } else {
1561                             mEventThread->onHotplugReceived(state.type, true);
1562                         }
1563                     }
1564                 }
1565             }
1566         }
1567     }
1568
1569     if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1570         // The transform hint might have changed for some layers
1571         // (either because a display has changed, or because a layer
1572         // as changed).
1573         //
1574         // Walk through all the layers in currentLayers,
1575         // and update their transform hint.
1576         //
1577         // If a layer is visible only on a single display, then that
1578         // display is used to calculate the hint, otherwise we use the
1579         // default display.
1580         //
1581         // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1582         // the hint is set before we acquire a buffer from the surface texture.
1583         //
1584         // NOTE: layer transactions have taken place already, so we use their
1585         // drawing state. However, SurfaceFlinger's own transaction has not
1586         // happened yet, so we must use the current state layer list
1587         // (soon to become the drawing state list).
1588         //
1589         sp<const DisplayDevice> disp;
1590         uint32_t currentlayerStack = 0;
1591         for (size_t i=0; i<count; i++) {
1592             // NOTE: we rely on the fact that layers are sorted by
1593             // layerStack first (so we don't have to traverse the list
1594             // of displays for every layer).
1595             const sp<Layer>& layer(currentLayers[i]);
1596             uint32_t layerStack = layer->getDrawingState().layerStack;
1597             if (i==0 || currentlayerStack != layerStack) {
1598                 currentlayerStack = layerStack;
1599                 // figure out if this layerstack is mirrored
1600                 // (more than one display) if so, pick the default display,
1601                 // if not, pick the only display it's on.
1602                 disp.clear();
1603                 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1604                     sp<const DisplayDevice> hw(mDisplays[dpy]);
1605                     if (hw->getLayerStack() == currentlayerStack) {
1606                         if (disp == NULL) {
1607                             disp = hw;
1608                         } else {
1609                             disp = NULL;
1610                             break;
1611                         }
1612                     }
1613                 }
1614             }
1615             if (disp == NULL) {
1616                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1617                 // redraw after transform hint changes. See bug 8508397.
1618
1619                 // could be null when this layer is using a layerStack
1620                 // that is not visible on any display. Also can occur at
1621                 // screen off/on times.
1622                 disp = getDefaultDisplayDevice();
1623             }
1624             layer->updateTransformHint(disp);
1625         }
1626     }
1627
1628
1629     /*
1630      * Perform our own transaction if needed
1631      */
1632
1633     const LayerVector& layers(mDrawingState.layersSortedByZ);
1634     if (currentLayers.size() > layers.size()) {
1635         // layers have been added
1636         mVisibleRegionsDirty = true;
1637     }
1638
1639     // some layers might have been removed, so
1640     // we need to update the regions they're exposing.
1641     if (mLayersRemoved) {
1642         mLayersRemoved = false;
1643         mVisibleRegionsDirty = true;
1644         const size_t count = layers.size();
1645         for (size_t i=0 ; i<count ; i++) {
1646             const sp<Layer>& layer(layers[i]);
1647             if (currentLayers.indexOf(layer) < 0) {
1648                 // this layer is not visible anymore
1649                 // TODO: we could traverse the tree from front to back and
1650                 //       compute the actual visible region
1651                 // TODO: we could cache the transformed region
1652                 const Layer::State& s(layer->getDrawingState());
1653                 Region visibleReg = s.active.transform.transform(
1654                         Region(Rect(s.active.w, s.active.h)));
1655                 invalidateLayerStack(s.layerStack, visibleReg);
1656             }
1657         }
1658     }
1659
1660     commitTransaction();
1661
1662     updateCursorAsync();
1663 }
1664
1665 void SurfaceFlinger::updateCursorAsync()
1666 {
1667     HWComposer& hwc(getHwComposer());
1668     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1669         sp<const DisplayDevice> hw(mDisplays[dpy]);
1670         const int32_t id = hw->getHwcDisplayId();
1671         if (id < 0) {
1672             continue;
1673         }
1674         const Vector< sp<Layer> >& currentLayers(
1675             hw->getVisibleLayersSortedByZ());
1676         const size_t count = currentLayers.size();
1677         HWComposer::LayerListIterator cur = hwc.begin(id);
1678         const HWComposer::LayerListIterator end = hwc.end(id);
1679         for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1680             if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1681                 continue;
1682             }
1683             const sp<Layer>& layer(currentLayers[i]);
1684             Rect cursorPos = layer->getPosition(hw);
1685             hwc.setCursorPositionAsync(id, cursorPos);
1686             break;
1687         }
1688     }
1689 }
1690
1691 void SurfaceFlinger::commitTransaction()
1692 {
1693     if (!mLayersPendingRemoval.isEmpty()) {
1694         // Notify removed layers now that they can't be drawn from
1695         for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) {
1696             recordBufferingStats(mLayersPendingRemoval[i]->getName().string(),
1697                     mLayersPendingRemoval[i]->getOccupancyHistory(true));
1698             mLayersPendingRemoval[i]->onRemoved();
1699         }
1700         mLayersPendingRemoval.clear();
1701     }
1702
1703     // If this transaction is part of a window animation then the next frame
1704     // we composite should be considered an animation as well.
1705     mAnimCompositionPending = mAnimTransactionPending;
1706
1707     mDrawingState = mCurrentState;
1708     mTransactionPending = false;
1709     mAnimTransactionPending = false;
1710     mTransactionCV.broadcast();
1711 }
1712
1713 void SurfaceFlinger::computeVisibleRegions(
1714         const LayerVector& currentLayers, uint32_t layerStack,
1715         Region& outDirtyRegion, Region& outOpaqueRegion)
1716 {
1717     ATRACE_CALL();
1718
1719     Region aboveOpaqueLayers;
1720     Region aboveCoveredLayers;
1721     Region dirty;
1722
1723     outDirtyRegion.clear();
1724
1725     size_t i = currentLayers.size();
1726     while (i--) {
1727         const sp<Layer>& layer = currentLayers[i];
1728
1729         // start with the whole surface at its current location
1730         const Layer::State& s(layer->getDrawingState());
1731
1732         // only consider the layers on the given layer stack
1733         if (s.layerStack != layerStack)
1734             continue;
1735
1736         /*
1737          * opaqueRegion: area of a surface that is fully opaque.
1738          */
1739         Region opaqueRegion;
1740
1741         /*
1742          * visibleRegion: area of a surface that is visible on screen
1743          * and not fully transparent. This is essentially the layer's
1744          * footprint minus the opaque regions above it.
1745          * Areas covered by a translucent surface are considered visible.
1746          */
1747         Region visibleRegion;
1748
1749         /*
1750          * coveredRegion: area of a surface that is covered by all
1751          * visible regions above it (which includes the translucent areas).
1752          */
1753         Region coveredRegion;
1754
1755         /*
1756          * transparentRegion: area of a surface that is hinted to be completely
1757          * transparent. This is only used to tell when the layer has no visible
1758          * non-transparent regions and can be removed from the layer list. It
1759          * does not affect the visibleRegion of this layer or any layers
1760          * beneath it. The hint may not be correct if apps don't respect the
1761          * SurfaceView restrictions (which, sadly, some don't).
1762          */
1763         Region transparentRegion;
1764
1765
1766         // handle hidden surfaces by setting the visible region to empty
1767         if (CC_LIKELY(layer->isVisible())) {
1768             const bool translucent = !layer->isOpaque(s);
1769             Rect bounds(s.active.transform.transform(layer->computeBounds()));
1770             visibleRegion.set(bounds);
1771             if (!visibleRegion.isEmpty()) {
1772                 // Remove the transparent area from the visible region
1773                 if (translucent) {
1774                     const Transform tr(s.active.transform);
1775                     if (tr.preserveRects()) {
1776                         // transform the transparent region
1777                         transparentRegion = tr.transform(s.activeTransparentRegion);
1778                     } else {
1779                         // transformation too complex, can't do the
1780                         // transparent region optimization.
1781                         transparentRegion.clear();
1782                     }
1783                 }
1784
1785                 // compute the opaque region
1786                 const int32_t layerOrientation = s.active.transform.getOrientation();
1787                 if (s.alpha==255 && !translucent &&
1788                         ((layerOrientation & Transform::ROT_INVALID) == false)) {
1789                     // the opaque region is the layer's footprint
1790                     opaqueRegion = visibleRegion;
1791                 }
1792             }
1793         }
1794
1795         // Clip the covered region to the visible region
1796         coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1797
1798         // Update aboveCoveredLayers for next (lower) layer
1799         aboveCoveredLayers.orSelf(visibleRegion);
1800
1801         // subtract the opaque region covered by the layers above us
1802         visibleRegion.subtractSelf(aboveOpaqueLayers);
1803
1804         // compute this layer's dirty region
1805         if (layer->contentDirty) {
1806             // we need to invalidate the whole region
1807             dirty = visibleRegion;
1808             // as well, as the old visible region
1809             dirty.orSelf(layer->visibleRegion);
1810             layer->contentDirty = false;
1811         } else {
1812             /* compute the exposed region:
1813              *   the exposed region consists of two components:
1814              *   1) what's VISIBLE now and was COVERED before
1815              *   2) what's EXPOSED now less what was EXPOSED before
1816              *
1817              * note that (1) is conservative, we start with the whole
1818              * visible region but only keep what used to be covered by
1819              * something -- which mean it may have been exposed.
1820              *
1821              * (2) handles areas that were not covered by anything but got
1822              * exposed because of a resize.
1823              */
1824             const Region newExposed = visibleRegion - coveredRegion;
1825             const Region oldVisibleRegion = layer->visibleRegion;
1826             const Region oldCoveredRegion = layer->coveredRegion;
1827             const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1828             dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1829         }
1830         dirty.subtractSelf(aboveOpaqueLayers);
1831
1832         // accumulate to the screen dirty region
1833         outDirtyRegion.orSelf(dirty);
1834
1835         // Update aboveOpaqueLayers for next (lower) layer
1836         aboveOpaqueLayers.orSelf(opaqueRegion);
1837
1838         // Store the visible region in screen space
1839         layer->setVisibleRegion(visibleRegion);
1840         layer->setCoveredRegion(coveredRegion);
1841         layer->setVisibleNonTransparentRegion(
1842                 visibleRegion.subtract(transparentRegion));
1843     }
1844
1845     outOpaqueRegion = aboveOpaqueLayers;
1846 }
1847
1848 void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
1849         const Region& dirty) {
1850     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1851         const sp<DisplayDevice>& hw(mDisplays[dpy]);
1852         if (hw->getLayerStack() == layerStack) {
1853             hw->dirtyRegion.orSelf(dirty);
1854         }
1855     }
1856 }
1857
1858 bool SurfaceFlinger::handlePageFlip()
1859 {
1860     Region dirtyRegion;
1861
1862     bool visibleRegions = false;
1863     const LayerVector& layers(mDrawingState.layersSortedByZ);
1864     bool frameQueued = false;
1865
1866     // Store the set of layers that need updates. This set must not change as
1867     // buffers are being latched, as this could result in a deadlock.
1868     // Example: Two producers share the same command stream and:
1869     // 1.) Layer 0 is latched
1870     // 2.) Layer 0 gets a new frame
1871     // 2.) Layer 1 gets a new frame
1872     // 3.) Layer 1 is latched.
1873     // Display is now waiting on Layer 1's frame, which is behind layer 0's
1874     // second frame. But layer 0's second frame could be waiting on display.
1875     Vector<Layer*> layersWithQueuedFrames;
1876     for (size_t i = 0, count = layers.size(); i<count ; i++) {
1877         const sp<Layer>& layer(layers[i]);
1878         if (layer->hasQueuedFrame()) {
1879             frameQueued = true;
1880             if (layer->shouldPresentNow(mPrimaryDispSync)) {
1881                 layersWithQueuedFrames.push_back(layer.get());
1882             } else {
1883                 layer->useEmptyDamage();
1884             }
1885         } else {
1886             layer->useEmptyDamage();
1887         }
1888     }
1889     for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
1890         Layer* layer = layersWithQueuedFrames[i];
1891         const Region dirty(layer->latchBuffer(visibleRegions));
1892         layer->useSurfaceDamage();
1893         const Layer::State& s(layer->getDrawingState());
1894         invalidateLayerStack(s.layerStack, dirty);
1895     }
1896
1897     mVisibleRegionsDirty |= visibleRegions;
1898
1899     // If we will need to wake up at some time in the future to deal with a
1900     // queued frame that shouldn't be displayed during this vsync period, wake
1901     // up during the next vsync period to check again.
1902     if (frameQueued && layersWithQueuedFrames.empty()) {
1903         signalLayerUpdate();
1904     }
1905
1906     // Only continue with the refresh if there is actually new work to do
1907     return !layersWithQueuedFrames.empty();
1908 }
1909
1910 void SurfaceFlinger::invalidateHwcGeometry()
1911 {
1912     mHwWorkListDirty = true;
1913 }
1914
1915
1916 void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
1917         const Region& inDirtyRegion)
1918 {
1919     // We only need to actually compose the display if:
1920     // 1) It is being handled by hardware composer, which may need this to
1921     //    keep its virtual display state machine in sync, or
1922     // 2) There is work to be done (the dirty region isn't empty)
1923     bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
1924     if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
1925         return;
1926     }
1927
1928     Region dirtyRegion(inDirtyRegion);
1929
1930     // compute the invalid region
1931     hw->swapRegion.orSelf(dirtyRegion);
1932
1933     uint32_t flags = hw->getFlags();
1934     if (flags & DisplayDevice::SWAP_RECTANGLE) {
1935         // we can redraw only what's dirty, but since SWAP_RECTANGLE only
1936         // takes a rectangle, we must make sure to update that whole
1937         // rectangle in that case
1938         dirtyRegion.set(hw->swapRegion.bounds());
1939     } else {
1940         if (flags & DisplayDevice::PARTIAL_UPDATES) {
1941             // We need to redraw the rectangle that will be updated
1942             // (pushed to the framebuffer).
1943             // This is needed because PARTIAL_UPDATES only takes one
1944             // rectangle instead of a region (see DisplayDevice::flip())
1945             dirtyRegion.set(hw->swapRegion.bounds());
1946         } else {
1947             // we need to redraw everything (the whole screen)
1948             dirtyRegion.set(hw->bounds());
1949             hw->swapRegion = dirtyRegion;
1950         }
1951     }
1952
1953     if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
1954         if (!doComposeSurfaces(hw, dirtyRegion)) return;
1955     } else {
1956         RenderEngine& engine(getRenderEngine());
1957         mat4 colorMatrix = mColorMatrix;
1958         if (mDaltonize) {
1959             colorMatrix = colorMatrix * mDaltonizer();
1960         }
1961         mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
1962         doComposeSurfaces(hw, dirtyRegion);
1963         engine.setupColorTransform(oldMatrix);
1964     }
1965
1966     // update the swap region and clear the dirty region
1967     hw->swapRegion.orSelf(dirtyRegion);
1968
1969     // swap buffers (presentation)
1970     hw->swapBuffers(getHwComposer());
1971 }
1972
1973 bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
1974 {
1975     RenderEngine& engine(getRenderEngine());
1976     const int32_t id = hw->getHwcDisplayId();
1977     HWComposer& hwc(getHwComposer());
1978     HWComposer::LayerListIterator cur = hwc.begin(id);
1979     const HWComposer::LayerListIterator end = hwc.end(id);
1980
1981     bool hasGlesComposition = hwc.hasGlesComposition(id);
1982     if (hasGlesComposition) {
1983         if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
1984             ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
1985                   hw->getDisplayName().string());
1986             eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
1987             if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
1988               ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
1989             }
1990             return false;
1991         }
1992
1993         // Never touch the framebuffer if we don't have any framebuffer layers
1994         const bool hasHwcComposition = hwc.hasHwcComposition(id);
1995         if (hasHwcComposition) {
1996             // when using overlays, we assume a fully transparent framebuffer
1997             // NOTE: we could reduce how much we need to clear, for instance
1998             // remove where there are opaque FB layers. however, on some
1999             // GPUs doing a "clean slate" clear might be more efficient.
2000             // We'll revisit later if needed.
2001             engine.clearWithColor(0, 0, 0, 0);
2002         } else {
2003             // we start with the whole screen area
2004             const Region bounds(hw->getBounds());
2005
2006             // we remove the scissor part
2007             // we're left with the letterbox region
2008             // (common case is that letterbox ends-up being empty)
2009             const Region letterbox(bounds.subtract(hw->getScissor()));
2010
2011             // compute the area to clear
2012             Region region(hw->undefinedRegion.merge(letterbox));
2013
2014             // but limit it to the dirty region
2015             region.andSelf(dirty);
2016
2017             // screen is already cleared here
2018             if (!region.isEmpty()) {
2019                 // can happen with SurfaceView
2020                 drawWormhole(hw, region);
2021             }
2022         }
2023
2024         if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2025             // just to be on the safe side, we don't set the
2026             // scissor on the main display. It should never be needed
2027             // anyways (though in theory it could since the API allows it).
2028             const Rect& bounds(hw->getBounds());
2029             const Rect& scissor(hw->getScissor());
2030             if (scissor != bounds) {
2031                 // scissor doesn't match the screen's dimensions, so we
2032                 // need to clear everything outside of it and enable
2033                 // the GL scissor so we don't draw anything where we shouldn't
2034
2035                 // enable scissor for this frame
2036                 const uint32_t height = hw->getHeight();
2037                 engine.setScissor(scissor.left, height - scissor.bottom,
2038                         scissor.getWidth(), scissor.getHeight());
2039             }
2040         }
2041     }
2042
2043     /*
2044      * and then, render the layers targeted at the framebuffer
2045      */
2046
2047     const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2048     const size_t count = layers.size();
2049     const Transform& tr = hw->getTransform();
2050     if (cur != end) {
2051         // we're using h/w composer
2052         for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2053             const sp<Layer>& layer(layers[i]);
2054             const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2055             if (!clip.isEmpty()) {
2056                 switch (cur->getCompositionType()) {
2057                     case HWC_CURSOR_OVERLAY:
2058                     case HWC_OVERLAY: {
2059                         const Layer::State& state(layer->getDrawingState());
2060                         if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2061                                 && i
2062                                 && layer->isOpaque(state) && (state.alpha == 0xFF)
2063                                 && hasGlesComposition) {
2064                             // never clear the very first layer since we're
2065                             // guaranteed the FB is already cleared
2066                             layer->clearWithOpenGL(hw, clip);
2067                         }
2068                         break;
2069                     }
2070                     case HWC_FRAMEBUFFER: {
2071                         layer->draw(hw, clip);
2072                         break;
2073                     }
2074                     case HWC_FRAMEBUFFER_TARGET: {
2075                         // this should not happen as the iterator shouldn't
2076                         // let us get there.
2077                         ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2078                         break;
2079                     }
2080                 }
2081             }
2082             layer->setAcquireFence(hw, *cur);
2083         }
2084     } else {
2085         // we're not using h/w composer
2086         for (size_t i=0 ; i<count ; ++i) {
2087             const sp<Layer>& layer(layers[i]);
2088             const Region clip(dirty.intersect(
2089                     tr.transform(layer->visibleRegion)));
2090             if (!clip.isEmpty()) {
2091                 layer->draw(hw, clip);
2092             }
2093         }
2094     }
2095
2096     // disable scissor at the end of the frame
2097     engine.disableScissor();
2098     return true;
2099 }
2100
2101 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2102     const int32_t height = hw->getHeight();
2103     RenderEngine& engine(getRenderEngine());
2104     engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2105 }
2106
2107 status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2108         const sp<IBinder>& handle,
2109         const sp<IGraphicBufferProducer>& gbc,
2110         const sp<Layer>& lbc)
2111 {
2112     // add this layer to the current state list
2113     {
2114         Mutex::Autolock _l(mStateLock);
2115         if (mCurrentState.layersSortedByZ.size() >= MAX_LAYERS) {
2116             return NO_MEMORY;
2117         }
2118         mCurrentState.layersSortedByZ.add(lbc);
2119         mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2120     }
2121
2122     // attach this layer to the client
2123     client->attachLayer(handle, lbc);
2124
2125     return NO_ERROR;
2126 }
2127
2128 status_t SurfaceFlinger::removeLayer(const wp<Layer>& weakLayer) {
2129     Mutex::Autolock _l(mStateLock);
2130     sp<Layer> layer = weakLayer.promote();
2131     if (layer == nullptr) {
2132         // The layer has already been removed, carry on
2133         return NO_ERROR;
2134     }
2135
2136     ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
2137     if (index >= 0) {
2138         mLayersPendingRemoval.push(layer);
2139         mLayersRemoved = true;
2140         setTransactionFlags(eTransactionNeeded);
2141         return NO_ERROR;
2142     }
2143     return status_t(index);
2144 }
2145
2146 uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t /* flags */) {
2147     return android_atomic_release_load(&mTransactionFlags);
2148 }
2149
2150 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2151     return android_atomic_and(~flags, &mTransactionFlags) & flags;
2152 }
2153
2154 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2155     uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2156     if ((old & flags)==0) { // wake the server up
2157         signalTransaction();
2158     }
2159     return old;
2160 }
2161
2162 void SurfaceFlinger::setTransactionState(
2163         const Vector<ComposerState>& state,
2164         const Vector<DisplayState>& displays,
2165         uint32_t flags)
2166 {
2167     ATRACE_CALL();
2168     Mutex::Autolock _l(mStateLock);
2169     uint32_t transactionFlags = 0;
2170
2171     if (flags & eAnimation) {
2172         // For window updates that are part of an animation we must wait for
2173         // previous animation "frames" to be handled.
2174         while (mAnimTransactionPending) {
2175             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2176             if (CC_UNLIKELY(err != NO_ERROR)) {
2177                 // just in case something goes wrong in SF, return to the
2178                 // caller after a few seconds.
2179                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2180                         "waiting for previous animation frame");
2181                 mAnimTransactionPending = false;
2182                 break;
2183             }
2184         }
2185     }
2186
2187     size_t count = displays.size();
2188     for (size_t i=0 ; i<count ; i++) {
2189         const DisplayState& s(displays[i]);
2190         transactionFlags |= setDisplayStateLocked(s);
2191     }
2192
2193     count = state.size();
2194     for (size_t i=0 ; i<count ; i++) {
2195         const ComposerState& s(state[i]);
2196         // Here we need to check that the interface we're given is indeed
2197         // one of our own. A malicious client could give us a NULL
2198         // IInterface, or one of its own or even one of our own but a
2199         // different type. All these situations would cause us to crash.
2200         //
2201         // NOTE: it would be better to use RTTI as we could directly check
2202         // that we have a Client*. however, RTTI is disabled in Android.
2203         if (s.client != NULL) {
2204             sp<IBinder> binder = IInterface::asBinder(s.client);
2205             if (binder != NULL) {
2206                 String16 desc(binder->getInterfaceDescriptor());
2207                 if (desc == ISurfaceComposerClient::descriptor) {
2208                     sp<Client> client( static_cast<Client *>(s.client.get()) );
2209                     transactionFlags |= setClientStateLocked(client, s.state);
2210                 }
2211             }
2212         }
2213     }
2214
2215     // If a synchronous transaction is explicitly requested without any changes,
2216     // force a transaction anyway. This can be used as a flush mechanism for
2217     // previous async transactions.
2218     if (transactionFlags == 0 && (flags & eSynchronous)) {
2219         transactionFlags = eTransactionNeeded;
2220     }
2221
2222     if (transactionFlags) {
2223         // this triggers the transaction
2224         setTransactionFlags(transactionFlags);
2225
2226         // if this is a synchronous transaction, wait for it to take effect
2227         // before returning.
2228         if (flags & eSynchronous) {
2229             mTransactionPending = true;
2230         }
2231         if (flags & eAnimation) {
2232             mAnimTransactionPending = true;
2233         }
2234         while (mTransactionPending) {
2235             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2236             if (CC_UNLIKELY(err != NO_ERROR)) {
2237                 // just in case something goes wrong in SF, return to the
2238                 // called after a few seconds.
2239                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2240                 mTransactionPending = false;
2241                 break;
2242             }
2243         }
2244     }
2245 }
2246
2247 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2248 {
2249     ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2250     if (dpyIdx < 0)
2251         return 0;
2252
2253     uint32_t flags = 0;
2254     DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2255     if (disp.isValid()) {
2256         const uint32_t what = s.what;
2257         if (what & DisplayState::eSurfaceChanged) {
2258             if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2259                 disp.surface = s.surface;
2260                 flags |= eDisplayTransactionNeeded;
2261             }
2262         }
2263         if (what & DisplayState::eLayerStackChanged) {
2264             if (disp.layerStack != s.layerStack) {
2265                 disp.layerStack = s.layerStack;
2266                 flags |= eDisplayTransactionNeeded;
2267             }
2268         }
2269         if (what & DisplayState::eDisplayProjectionChanged) {
2270             if (disp.orientation != s.orientation) {
2271                 disp.orientation = s.orientation;
2272                 flags |= eDisplayTransactionNeeded;
2273             }
2274             if (disp.frame != s.frame) {
2275                 disp.frame = s.frame;
2276                 flags |= eDisplayTransactionNeeded;
2277             }
2278             if (disp.viewport != s.viewport) {
2279                 disp.viewport = s.viewport;
2280                 flags |= eDisplayTransactionNeeded;
2281             }
2282         }
2283         if (what & DisplayState::eDisplaySizeChanged) {
2284             if (disp.width != s.width) {
2285                 disp.width = s.width;
2286                 flags |= eDisplayTransactionNeeded;
2287             }
2288             if (disp.height != s.height) {
2289                 disp.height = s.height;
2290                 flags |= eDisplayTransactionNeeded;
2291             }
2292         }
2293     }
2294     return flags;
2295 }
2296
2297 uint32_t SurfaceFlinger::setClientStateLocked(
2298         const sp<Client>& client,
2299         const layer_state_t& s)
2300 {
2301     uint32_t flags = 0;
2302     sp<Layer> layer(client->getLayerUser(s.surface));
2303     if (layer != 0) {
2304         const uint32_t what = s.what;
2305         bool geometryAppliesWithResize =
2306                 what & layer_state_t::eGeometryAppliesWithResize;
2307         if (what & layer_state_t::ePositionChanged) {
2308             if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2309                 flags |= eTraversalNeeded;
2310             }
2311         }
2312         if (what & layer_state_t::eLayerChanged) {
2313             // NOTE: index needs to be calculated before we update the state
2314             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2315             if (layer->setLayer(s.z) && idx >= 0) {
2316                 mCurrentState.layersSortedByZ.removeAt(idx);
2317                 mCurrentState.layersSortedByZ.add(layer);
2318                 // we need traversal (state changed)
2319                 // AND transaction (list changed)
2320                 flags |= eTransactionNeeded|eTraversalNeeded;
2321             }
2322         }
2323         if (what & layer_state_t::eSizeChanged) {
2324             if (layer->setSize(s.w, s.h)) {
2325                 flags |= eTraversalNeeded;
2326             }
2327         }
2328         if (what & layer_state_t::eAlphaChanged) {
2329             if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2330                 flags |= eTraversalNeeded;
2331         }
2332         if (what & layer_state_t::eMatrixChanged) {
2333             if (layer->setMatrix(s.matrix))
2334                 flags |= eTraversalNeeded;
2335         }
2336         if (what & layer_state_t::eTransparentRegionChanged) {
2337             if (layer->setTransparentRegionHint(s.transparentRegion))
2338                 flags |= eTraversalNeeded;
2339         }
2340         if (what & layer_state_t::eFlagsChanged) {
2341             if (layer->setFlags(s.flags, s.mask))
2342                 flags |= eTraversalNeeded;
2343         }
2344         if (what & layer_state_t::eCropChanged) {
2345             if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2346                 flags |= eTraversalNeeded;
2347         }
2348         if (what & layer_state_t::eFinalCropChanged) {
2349             if (layer->setFinalCrop(s.finalCrop))
2350                 flags |= eTraversalNeeded;
2351         }
2352         if (what & layer_state_t::eLayerStackChanged) {
2353             // NOTE: index needs to be calculated before we update the state
2354             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2355             if (layer->setLayerStack(s.layerStack) && idx >= 0) {
2356                 mCurrentState.layersSortedByZ.removeAt(idx);
2357                 mCurrentState.layersSortedByZ.add(layer);
2358                 // we need traversal (state changed)
2359                 // AND transaction (list changed)
2360                 flags |= eTransactionNeeded|eTraversalNeeded;
2361             }
2362         }
2363         if (what & layer_state_t::eDeferTransaction) {
2364             layer->deferTransactionUntil(s.handle, s.frameNumber);
2365             // We don't trigger a traversal here because if no other state is
2366             // changed, we don't want this to cause any more work
2367         }
2368         if (what & layer_state_t::eOverrideScalingModeChanged) {
2369             layer->setOverrideScalingMode(s.overrideScalingMode);
2370             // We don't trigger a traversal here because if no other state is
2371             // changed, we don't want this to cause any more work
2372         }
2373     }
2374     return flags;
2375 }
2376
2377 status_t SurfaceFlinger::createLayer(
2378         const String8& name,
2379         const sp<Client>& client,
2380         uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
2381         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
2382 {
2383     //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
2384     if (int32_t(w|h) < 0) {
2385         ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2386                 int(w), int(h));
2387         return BAD_VALUE;
2388     }
2389
2390     status_t result = NO_ERROR;
2391
2392     sp<Layer> layer;
2393
2394     switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2395         case ISurfaceComposerClient::eFXSurfaceNormal:
2396             result = createNormalLayer(client,
2397                     name, w, h, flags, format,
2398                     handle, gbp, &layer);
2399             break;
2400         case ISurfaceComposerClient::eFXSurfaceDim:
2401             result = createDimLayer(client,
2402                     name, w, h, flags,
2403                     handle, gbp, &layer);
2404             break;
2405         default:
2406             result = BAD_VALUE;
2407             break;
2408     }
2409
2410     if (result != NO_ERROR) {
2411         return result;
2412     }
2413
2414     result = addClientLayer(client, *handle, *gbp, layer);
2415     if (result != NO_ERROR) {
2416         return result;
2417     }
2418
2419     setTransactionFlags(eTransactionNeeded);
2420     return result;
2421 }
2422
2423 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2424         const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2425         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2426 {
2427     // initialize the surfaces
2428     switch (format) {
2429     case PIXEL_FORMAT_TRANSPARENT:
2430     case PIXEL_FORMAT_TRANSLUCENT:
2431         format = PIXEL_FORMAT_RGBA_8888;
2432         break;
2433     case PIXEL_FORMAT_OPAQUE:
2434         format = PIXEL_FORMAT_RGBX_8888;
2435         break;
2436     }
2437
2438     *outLayer = new Layer(this, client, name, w, h, flags);
2439     status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2440     if (err == NO_ERROR) {
2441         *handle = (*outLayer)->getHandle();
2442         *gbp = (*outLayer)->getProducer();
2443     }
2444
2445     ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2446     return err;
2447 }
2448
2449 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2450         const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2451         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2452 {
2453     *outLayer = new LayerDim(this, client, name, w, h, flags);
2454     *handle = (*outLayer)->getHandle();
2455     *gbp = (*outLayer)->getProducer();
2456     return NO_ERROR;
2457 }
2458
2459 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2460 {
2461     // called by the window manager when it wants to remove a Layer
2462     status_t err = NO_ERROR;
2463     sp<Layer> l(client->getLayerUser(handle));
2464     if (l != NULL) {
2465         err = removeLayer(l);
2466         ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2467                 "error removing layer=%p (%s)", l.get(), strerror(-err));
2468     }
2469     return err;
2470 }
2471
2472 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2473 {
2474     // called by ~LayerCleaner() when all references to the IBinder (handle)
2475     // are gone
2476     return removeLayer(layer);
2477 }
2478
2479 // ---------------------------------------------------------------------------
2480
2481 void SurfaceFlinger::onInitializeDisplays() {
2482     // reset screen orientation and use primary layer stack
2483     Vector<ComposerState> state;
2484     Vector<DisplayState> displays;
2485     DisplayState d;
2486     d.what = DisplayState::eDisplayProjectionChanged |
2487              DisplayState::eLayerStackChanged;
2488     d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2489     d.layerStack = 0;
2490     d.orientation = DisplayState::eOrientationDefault;
2491     d.frame.makeInvalid();
2492     d.viewport.makeInvalid();
2493     d.width = 0;
2494     d.height = 0;
2495     displays.add(d);
2496     setTransactionState(state, displays, 0);
2497     setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2498
2499     const nsecs_t period =
2500             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2501     mAnimFrameTracker.setDisplayRefreshPeriod(period);
2502 }
2503
2504 void SurfaceFlinger::initializeDisplays() {
2505     class MessageScreenInitialized : public MessageBase {
2506         SurfaceFlinger* flinger;
2507     public:
2508         MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2509         virtual bool handler() {
2510             flinger->onInitializeDisplays();
2511             return true;
2512         }
2513     };
2514     sp<MessageBase> msg = new MessageScreenInitialized(this);
2515     postMessageAsync(msg);  // we may be called from main thread, use async message
2516 }
2517
2518 void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2519         int mode) {
2520     ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2521             this);
2522     int32_t type = hw->getDisplayType();
2523     int currentMode = hw->getPowerMode();
2524
2525     if (mode == currentMode) {
2526         ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2527         return;
2528     }
2529
2530     hw->setPowerMode(mode);
2531     if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2532         ALOGW("Trying to set power mode for virtual display");
2533         return;
2534     }
2535
2536     if (currentMode == HWC_POWER_MODE_OFF) {
2537         // Turn on the display
2538         getHwComposer().setPowerMode(type, mode);
2539         if (type == DisplayDevice::DISPLAY_PRIMARY) {
2540             // FIXME: eventthread only knows about the main display right now
2541             mEventThread->onScreenAcquired();
2542             resyncToHardwareVsync(true);
2543         }
2544
2545         mVisibleRegionsDirty = true;
2546         mHasPoweredOff = true;
2547         repaintEverything();
2548
2549         struct sched_param param = {0};
2550         param.sched_priority = 1;
2551         if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2552             ALOGW("Couldn't set SCHED_FIFO on display on");
2553         }
2554     } else if (mode == HWC_POWER_MODE_OFF) {
2555         // Turn off the display
2556         struct sched_param param = {0};
2557         if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2558             ALOGW("Couldn't set SCHED_OTHER on display off");
2559         }
2560
2561         if (type == DisplayDevice::DISPLAY_PRIMARY) {
2562             disableHardwareVsync(true); // also cancels any in-progress resync
2563
2564             // FIXME: eventthread only knows about the main display right now
2565             mEventThread->onScreenReleased();
2566         }
2567
2568         getHwComposer().setPowerMode(type, mode);
2569         mVisibleRegionsDirty = true;
2570         // from this point on, SF will stop drawing on this display
2571     } else {
2572         getHwComposer().setPowerMode(type, mode);
2573     }
2574 }
2575
2576 void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2577     class MessageSetPowerMode: public MessageBase {
2578         SurfaceFlinger& mFlinger;
2579         sp<IBinder> mDisplay;
2580         int mMode;
2581     public:
2582         MessageSetPowerMode(SurfaceFlinger& flinger,
2583                 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2584                     mDisplay(disp) { mMode = mode; }
2585         virtual bool handler() {
2586             sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2587             if (hw == NULL) {
2588                 ALOGE("Attempt to set power mode = %d for null display %p",
2589                         mMode, mDisplay.get());
2590             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2591                 ALOGW("Attempt to set power mode = %d for virtual display",
2592                         mMode);
2593             } else {
2594                 mFlinger.setPowerModeInternal(hw, mMode);
2595             }
2596             return true;
2597         }
2598     };
2599     sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2600     postMessageSync(msg);
2601 }
2602
2603 // ---------------------------------------------------------------------------
2604
2605 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2606 {
2607     String8 result;
2608
2609     IPCThreadState* ipc = IPCThreadState::self();
2610     const int pid = ipc->getCallingPid();
2611     const int uid = ipc->getCallingUid();
2612     if ((uid != AID_SHELL) &&
2613             !PermissionCache::checkPermission(sDump, pid, uid)) {
2614         result.appendFormat("Permission Denial: "
2615                 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2616     } else {
2617         // Try to get the main lock, but give up after one second
2618         // (this would indicate SF is stuck, but we want to be able to
2619         // print something in dumpsys).
2620         status_t err = mStateLock.timedLock(s2ns(1));
2621         bool locked = (err == NO_ERROR);
2622         if (!locked) {
2623             result.appendFormat(
2624                     "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2625                     "dumping anyways (no locks held)\n", strerror(-err), err);
2626         }
2627
2628         bool dumpAll = true;
2629         size_t index = 0;
2630         size_t numArgs = args.size();
2631         if (numArgs) {
2632             if ((index < numArgs) &&
2633                     (args[index] == String16("--list"))) {
2634                 index++;
2635                 listLayersLocked(args, index, result);
2636                 dumpAll = false;
2637             }
2638
2639             if ((index < numArgs) &&
2640                     (args[index] == String16("--latency"))) {
2641                 index++;
2642                 dumpStatsLocked(args, index, result);
2643                 dumpAll = false;
2644             }
2645
2646             if ((index < numArgs) &&
2647                     (args[index] == String16("--latency-clear"))) {
2648                 index++;
2649                 clearStatsLocked(args, index, result);
2650                 dumpAll = false;
2651             }
2652
2653             if ((index < numArgs) &&
2654                     (args[index] == String16("--dispsync"))) {
2655                 index++;
2656                 mPrimaryDispSync.dump(result);
2657                 dumpAll = false;
2658             }
2659
2660             if ((index < numArgs) &&
2661                     (args[index] == String16("--static-screen"))) {
2662                 index++;
2663                 dumpStaticScreenStats(result);
2664                 dumpAll = false;
2665             }
2666
2667             if ((index < numArgs) &&
2668                     (args[index] == String16("--fences"))) {
2669                 index++;
2670                 mFenceTracker.dump(&result);
2671                 dumpAll = false;
2672             }
2673         }
2674
2675         if (dumpAll) {
2676             dumpAllLocked(args, index, result);
2677         }
2678
2679         if (locked) {
2680             mStateLock.unlock();
2681         }
2682     }
2683     write(fd, result.string(), result.size());
2684     return NO_ERROR;
2685 }
2686
2687 void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2688         size_t& /* index */, String8& result) const
2689 {
2690     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2691     const size_t count = currentLayers.size();
2692     for (size_t i=0 ; i<count ; i++) {
2693         const sp<Layer>& layer(currentLayers[i]);
2694         result.appendFormat("%s\n", layer->getName().string());
2695     }
2696 }
2697
2698 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2699         String8& result) const
2700 {
2701     String8 name;
2702     if (index < args.size()) {
2703         name = String8(args[index]);
2704         index++;
2705     }
2706
2707     const nsecs_t period =
2708             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2709     result.appendFormat("%" PRId64 "\n", period);
2710
2711     if (name.isEmpty()) {
2712         mAnimFrameTracker.dumpStats(result);
2713     } else {
2714         const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2715         const size_t count = currentLayers.size();
2716         for (size_t i=0 ; i<count ; i++) {
2717             const sp<Layer>& layer(currentLayers[i]);
2718             if (name == layer->getName()) {
2719                 layer->dumpFrameStats(result);
2720             }
2721         }
2722     }
2723 }
2724
2725 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2726         String8& /* result */)
2727 {
2728     String8 name;
2729     if (index < args.size()) {
2730         name = String8(args[index]);
2731         index++;
2732     }
2733
2734     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2735     const size_t count = currentLayers.size();
2736     for (size_t i=0 ; i<count ; i++) {
2737         const sp<Layer>& layer(currentLayers[i]);
2738         if (name.isEmpty() || (name == layer->getName())) {
2739             layer->clearFrameStats();
2740         }
2741     }
2742
2743     mAnimFrameTracker.clearStats();
2744 }
2745
2746 // This should only be called from the main thread.  Otherwise it would need
2747 // the lock and should use mCurrentState rather than mDrawingState.
2748 void SurfaceFlinger::logFrameStats() {
2749     const LayerVector& drawingLayers = mDrawingState.layersSortedByZ;
2750     const size_t count = drawingLayers.size();
2751     for (size_t i=0 ; i<count ; i++) {
2752         const sp<Layer>& layer(drawingLayers[i]);
2753         layer->logFrameStats();
2754     }
2755
2756     mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2757 }
2758
2759 /*static*/ void SurfaceFlinger::appendSfConfigString(String8& result)
2760 {
2761     static const char* config =
2762             " [sf"
2763 #ifdef HAS_CONTEXT_PRIORITY
2764             " HAS_CONTEXT_PRIORITY"
2765 #endif
2766 #ifdef NEVER_DEFAULT_TO_ASYNC_MODE
2767             " NEVER_DEFAULT_TO_ASYNC_MODE"
2768 #endif
2769 #ifdef TARGET_DISABLE_TRIPLE_BUFFERING
2770             " TARGET_DISABLE_TRIPLE_BUFFERING"
2771 #endif
2772             "]";
2773     result.append(config);
2774 }
2775
2776 void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
2777 {
2778     result.appendFormat("Static screen stats:\n");
2779     for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
2780         float bucketTimeSec = mFrameBuckets[b] / 1e9;
2781         float percent = 100.0f *
2782                 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
2783         result.appendFormat("  < %zd frames: %.3f s (%.1f%%)\n",
2784                 b + 1, bucketTimeSec, percent);
2785     }
2786     float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
2787     float percent = 100.0f *
2788             static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
2789     result.appendFormat("  %zd+ frames: %.3f s (%.1f%%)\n",
2790             NUM_BUCKETS - 1, bucketTimeSec, percent);
2791 }
2792
2793 void SurfaceFlinger::recordBufferingStats(const char* layerName,
2794         std::vector<OccupancyTracker::Segment>&& history) {
2795     Mutex::Autolock lock(mBufferingStatsMutex);
2796     auto& stats = mBufferingStats[layerName];
2797     for (const auto& segment : history) {
2798         if (!segment.usedThirdBuffer) {
2799             stats.twoBufferTime += segment.totalTime;
2800         }
2801         if (segment.occupancyAverage < 1.0f) {
2802             stats.doubleBufferedTime += segment.totalTime;
2803         } else if (segment.occupancyAverage < 2.0f) {
2804             stats.tripleBufferedTime += segment.totalTime;
2805         }
2806         ++stats.numSegments;
2807         stats.totalTime += segment.totalTime;
2808     }
2809 }
2810
2811 void SurfaceFlinger::dumpBufferingStats(String8& result) const {
2812     result.append("Buffering stats:\n");
2813     result.append("  [Layer name] <Active time> <Two buffer> "
2814             "<Double buffered> <Triple buffered>\n");
2815     Mutex::Autolock lock(mBufferingStatsMutex);
2816     typedef std::tuple<std::string, float, float, float> BufferTuple;
2817     std::map<float, BufferTuple, std::greater<float>> sorted;
2818     for (const auto& statsPair : mBufferingStats) {
2819         const char* name = statsPair.first.c_str();
2820         const BufferingStats& stats = statsPair.second;
2821         if (stats.numSegments == 0) {
2822             continue;
2823         }
2824         float activeTime = ns2ms(stats.totalTime) / 1000.0f;
2825         float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
2826                 stats.totalTime;
2827         float doubleBufferRatio = static_cast<float>(
2828                 stats.doubleBufferedTime) / stats.totalTime;
2829         float tripleBufferRatio = static_cast<float>(
2830                 stats.tripleBufferedTime) / stats.totalTime;
2831         sorted.insert({activeTime, {name, twoBufferRatio,
2832                 doubleBufferRatio, tripleBufferRatio}});
2833     }
2834     for (const auto& sortedPair : sorted) {
2835         float activeTime = sortedPair.first;
2836         const BufferTuple& values = sortedPair.second;
2837         result.appendFormat("  [%s] %.2f %.3f %.3f %.3f\n",
2838                 std::get<0>(values).c_str(), activeTime,
2839                 std::get<1>(values), std::get<2>(values),
2840                 std::get<3>(values));
2841     }
2842     result.append("\n");
2843 }
2844
2845 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
2846         String8& result) const
2847 {
2848     bool colorize = false;
2849     if (index < args.size()
2850             && (args[index] == String16("--color"))) {
2851         colorize = true;
2852         index++;
2853     }
2854
2855     Colorizer colorizer(colorize);
2856
2857     // figure out if we're stuck somewhere
2858     const nsecs_t now = systemTime();
2859     const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
2860     const nsecs_t inTransaction(mDebugInTransaction);
2861     nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
2862     nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
2863
2864     /*
2865      * Dump library configuration.
2866      */
2867
2868     colorizer.bold(result);
2869     result.append("Build configuration:");
2870     colorizer.reset(result);
2871     appendSfConfigString(result);
2872     appendUiConfigString(result);
2873     appendGuiConfigString(result);
2874     result.append("\n");
2875
2876     colorizer.bold(result);
2877     result.append("Sync configuration: ");
2878     colorizer.reset(result);
2879     result.append(SyncFeatures::getInstance().toString());
2880     result.append("\n");
2881
2882     colorizer.bold(result);
2883     result.append("DispSync configuration: ");
2884     colorizer.reset(result);
2885     result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
2886             "present offset %d ns (refresh %" PRId64 " ns)",
2887         vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
2888         mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
2889     result.append("\n");
2890
2891     // Dump static screen stats
2892     result.append("\n");
2893     dumpStaticScreenStats(result);
2894     result.append("\n");
2895
2896     dumpBufferingStats(result);
2897
2898     /*
2899      * Dump the visible layer list
2900      */
2901     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2902     const size_t count = currentLayers.size();
2903     colorizer.bold(result);
2904     result.appendFormat("Visible layers (count = %zu)\n", count);
2905     colorizer.reset(result);
2906     for (size_t i=0 ; i<count ; i++) {
2907         const sp<Layer>& layer(currentLayers[i]);
2908         layer->dump(result, colorizer);
2909     }
2910
2911     /*
2912      * Dump Display state
2913      */
2914
2915     colorizer.bold(result);
2916     result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
2917     colorizer.reset(result);
2918     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2919         const sp<const DisplayDevice>& hw(mDisplays[dpy]);
2920         hw->dump(result);
2921     }
2922
2923     /*
2924      * Dump SurfaceFlinger global state
2925      */
2926
2927     colorizer.bold(result);
2928     result.append("SurfaceFlinger global state:\n");
2929     colorizer.reset(result);
2930
2931     HWComposer& hwc(getHwComposer());
2932     sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2933
2934     colorizer.bold(result);
2935     result.appendFormat("EGL implementation : %s\n",
2936             eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
2937     colorizer.reset(result);
2938     result.appendFormat("%s\n",
2939             eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
2940
2941     mRenderEngine->dump(result);
2942
2943     hw->undefinedRegion.dump(result, "undefinedRegion");
2944     result.appendFormat("  orientation=%d, isDisplayOn=%d\n",
2945             hw->getOrientation(), hw->isDisplayOn());
2946     result.appendFormat(
2947             "  last eglSwapBuffers() time: %f us\n"
2948             "  last transaction time     : %f us\n"
2949             "  transaction-flags         : %08x\n"
2950             "  refresh-rate              : %f fps\n"
2951             "  x-dpi                     : %f\n"
2952             "  y-dpi                     : %f\n"
2953             "  gpu_to_cpu_unsupported    : %d\n"
2954             ,
2955             mLastSwapBufferTime/1000.0,
2956             mLastTransactionTime/1000.0,
2957             mTransactionFlags,
2958             1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
2959             hwc.getDpiX(HWC_DISPLAY_PRIMARY),
2960             hwc.getDpiY(HWC_DISPLAY_PRIMARY),
2961             !mGpuToCpuSupported);
2962
2963     result.appendFormat("  eglSwapBuffers time: %f us\n",
2964             inSwapBuffersDuration/1000.0);
2965
2966     result.appendFormat("  transaction time: %f us\n",
2967             inTransactionDuration/1000.0);
2968
2969     /*
2970      * VSYNC state
2971      */
2972     mEventThread->dump(result);
2973
2974     /*
2975      * Dump HWComposer state
2976      */
2977     colorizer.bold(result);
2978     result.append("h/w composer state:\n");
2979     colorizer.reset(result);
2980     result.appendFormat("  h/w composer %s and %s\n",
2981             hwc.initCheck()==NO_ERROR ? "present" : "not present",
2982                     (mDebugDisableHWC || mDebugRegion || mDaltonize
2983                             || mHasColorMatrix) ? "disabled" : "enabled");
2984     hwc.dump(result);
2985
2986     /*
2987      * Dump gralloc state
2988      */
2989     const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
2990     alloc.dump(result);
2991 }
2992
2993 const Vector< sp<Layer> >&
2994 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
2995     // Note: mStateLock is held here
2996     wp<IBinder> dpy;
2997     for (size_t i=0 ; i<mDisplays.size() ; i++) {
2998         if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
2999             dpy = mDisplays.keyAt(i);
3000             break;
3001         }
3002     }
3003     if (dpy == NULL) {
3004         ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3005         // Just use the primary display so we have something to return
3006         dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3007     }
3008     return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3009 }
3010
3011 bool SurfaceFlinger::startDdmConnection()
3012 {
3013     void* libddmconnection_dso =
3014             dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3015     if (!libddmconnection_dso) {
3016         return false;
3017     }
3018     void (*DdmConnection_start)(const char* name);
3019     DdmConnection_start =
3020             (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3021     if (!DdmConnection_start) {
3022         dlclose(libddmconnection_dso);
3023         return false;
3024     }
3025     (*DdmConnection_start)(getServiceName());
3026     return true;
3027 }
3028
3029 status_t SurfaceFlinger::onTransact(
3030     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3031 {
3032     switch (code) {
3033         case CREATE_CONNECTION:
3034         case CREATE_DISPLAY:
3035         case SET_TRANSACTION_STATE:
3036         case BOOT_FINISHED:
3037         case CLEAR_ANIMATION_FRAME_STATS:
3038         case GET_ANIMATION_FRAME_STATS:
3039         case SET_POWER_MODE:
3040         case GET_HDR_CAPABILITIES:
3041         {
3042             // codes that require permission check
3043             IPCThreadState* ipc = IPCThreadState::self();
3044             const int pid = ipc->getCallingPid();
3045             const int uid = ipc->getCallingUid();
3046             if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3047                     !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3048                 ALOGE("Permission Denial: "
3049                         "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3050                 return PERMISSION_DENIED;
3051             }
3052             break;
3053         }
3054         case CAPTURE_SCREEN:
3055         {
3056             // codes that require permission check
3057             IPCThreadState* ipc = IPCThreadState::self();
3058             const int pid = ipc->getCallingPid();
3059             const int uid = ipc->getCallingUid();
3060             if ((uid != AID_GRAPHICS) &&
3061                     !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3062                 ALOGE("Permission Denial: "
3063                         "can't read framebuffer pid=%d, uid=%d", pid, uid);
3064                 return PERMISSION_DENIED;
3065             }
3066             break;
3067         }
3068     }
3069
3070     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3071     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3072         CHECK_INTERFACE(ISurfaceComposer, data, reply);
3073         if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3074             IPCThreadState* ipc = IPCThreadState::self();
3075             const int pid = ipc->getCallingPid();
3076             const int uid = ipc->getCallingUid();
3077             ALOGE("Permission Denial: "
3078                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3079             return PERMISSION_DENIED;
3080         }
3081         int n;
3082         switch (code) {
3083             case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3084             case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3085                 return NO_ERROR;
3086             case 1002:  // SHOW_UPDATES
3087                 n = data.readInt32();
3088                 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3089                 invalidateHwcGeometry();
3090                 repaintEverything();
3091                 return NO_ERROR;
3092             case 1004:{ // repaint everything
3093                 repaintEverything();
3094                 return NO_ERROR;
3095             }
3096             case 1005:{ // force transaction
3097                 setTransactionFlags(
3098                         eTransactionNeeded|
3099                         eDisplayTransactionNeeded|
3100                         eTraversalNeeded);
3101                 return NO_ERROR;
3102             }
3103             case 1006:{ // send empty update
3104                 signalRefresh();
3105                 return NO_ERROR;
3106             }
3107             case 1008:  // toggle use of hw composer
3108                 n = data.readInt32();
3109                 mDebugDisableHWC = n ? 1 : 0;
3110                 invalidateHwcGeometry();
3111                 repaintEverything();
3112                 return NO_ERROR;
3113             case 1009:  // toggle use of transform hint
3114                 n = data.readInt32();
3115                 mDebugDisableTransformHint = n ? 1 : 0;
3116                 invalidateHwcGeometry();
3117                 repaintEverything();
3118                 return NO_ERROR;
3119             case 1010:  // interrogate.
3120                 reply->writeInt32(0);
3121                 reply->writeInt32(0);
3122                 reply->writeInt32(mDebugRegion);
3123                 reply->writeInt32(0);
3124                 reply->writeInt32(mDebugDisableHWC);
3125                 return NO_ERROR;
3126             case 1013: {
3127                 Mutex::Autolock _l(mStateLock);
3128                 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3129                 reply->writeInt32(hw->getPageFlipCount());
3130                 return NO_ERROR;
3131             }
3132             case 1014: {
3133                 // daltonize
3134                 n = data.readInt32();
3135                 switch (n % 10) {
3136                     case 1:
3137                         mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3138                         break;
3139                     case 2:
3140                         mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3141                         break;
3142                     case 3:
3143                         mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3144                         break;
3145                 }
3146                 if (n >= 10) {
3147                     mDaltonizer.setMode(ColorBlindnessMode::Correction);
3148                 } else {
3149                     mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3150                 }
3151                 mDaltonize = n > 0;
3152                 invalidateHwcGeometry();
3153                 repaintEverything();
3154                 return NO_ERROR;
3155             }
3156             case 1015: {
3157                 // apply a color matrix
3158                 n = data.readInt32();
3159                 mHasColorMatrix = n ? 1 : 0;
3160                 if (n) {
3161                     // color matrix is sent as mat3 matrix followed by vec3
3162                     // offset, then packed into a mat4 where the last row is
3163                     // the offset and extra values are 0
3164                     for (size_t i = 0 ; i < 4; i++) {
3165                       for (size_t j = 0; j < 4; j++) {
3166                           mColorMatrix[i][j] = data.readFloat();
3167                       }
3168                     }
3169                 } else {
3170                     mColorMatrix = mat4();
3171                 }
3172                 invalidateHwcGeometry();
3173                 repaintEverything();
3174                 return NO_ERROR;
3175             }
3176             // This is an experimental interface
3177             // Needs to be shifted to proper binder interface when we productize
3178             case 1016: {
3179                 n = data.readInt32();
3180                 mPrimaryDispSync.setRefreshSkipCount(n);
3181                 return NO_ERROR;
3182             }
3183             case 1017: {
3184                 n = data.readInt32();
3185                 mForceFullDamage = static_cast<bool>(n);
3186                 return NO_ERROR;
3187             }
3188             case 1018: { // Modify Choreographer's phase offset
3189                 n = data.readInt32();
3190                 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3191                 return NO_ERROR;
3192             }
3193             case 1019: { // Modify SurfaceFlinger's phase offset
3194                 n = data.readInt32();
3195                 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3196                 return NO_ERROR;
3197             }
3198             case 1021: { // Disable HWC virtual displays
3199                 n = data.readInt32();
3200                 mUseHwcVirtualDisplays = !n;
3201                 return NO_ERROR;
3202             }
3203         }
3204     }
3205     return err;
3206 }
3207
3208 void SurfaceFlinger::repaintEverything() {
3209     android_atomic_or(1, &mRepaintEverything);
3210     signalTransaction();
3211 }
3212
3213 // ---------------------------------------------------------------------------
3214 // Capture screen into an IGraphiBufferProducer
3215 // ---------------------------------------------------------------------------
3216
3217 /* The code below is here to handle b/8734824
3218  *
3219  * We create a IGraphicBufferProducer wrapper that forwards all calls
3220  * from the surfaceflinger thread to the calling binder thread, where they
3221  * are executed. This allows the calling thread in the calling process to be
3222  * reused and not depend on having "enough" binder threads to handle the
3223  * requests.
3224  */
3225 class GraphicProducerWrapper : public BBinder, public MessageHandler {
3226     /* Parts of GraphicProducerWrapper are run on two different threads,
3227      * communicating by sending messages via Looper but also by shared member
3228      * data. Coherence maintenance is subtle and in places implicit (ugh).
3229      *
3230      * Don't rely on Looper's sendMessage/handleMessage providing
3231      * release/acquire semantics for any data not actually in the Message.
3232      * Data going from surfaceflinger to binder threads needs to be
3233      * synchronized explicitly.
3234      *
3235      * Barrier open/wait do provide release/acquire semantics. This provides
3236      * implicit synchronization for data coming back from binder to
3237      * surfaceflinger threads.
3238      */
3239
3240     sp<IGraphicBufferProducer> impl;
3241     sp<Looper> looper;
3242     status_t result;
3243     bool exitPending;
3244     bool exitRequested;
3245     Barrier barrier;
3246     uint32_t code;
3247     Parcel const* data;
3248     Parcel* reply;
3249
3250     enum {
3251         MSG_API_CALL,
3252         MSG_EXIT
3253     };
3254
3255     /*
3256      * Called on surfaceflinger thread. This is called by our "fake"
3257      * BpGraphicBufferProducer. We package the data and reply Parcel and
3258      * forward them to the binder thread.
3259      */
3260     virtual status_t transact(uint32_t code,
3261             const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3262         this->code = code;
3263         this->data = &data;
3264         this->reply = reply;
3265         if (exitPending) {
3266             // if we've exited, we run the message synchronously right here.
3267             // note (JH): as far as I can tell from looking at the code, this
3268             // never actually happens. if it does, i'm not sure if it happens
3269             // on the surfaceflinger or binder thread.
3270             handleMessage(Message(MSG_API_CALL));
3271         } else {
3272             barrier.close();
3273             // Prevent stores to this->{code, data, reply} from being
3274             // reordered later than the construction of Message.
3275             atomic_thread_fence(memory_order_release);
3276             looper->sendMessage(this, Message(MSG_API_CALL));
3277             barrier.wait();
3278         }
3279         return result;
3280     }
3281
3282     /*
3283      * here we run on the binder thread. All we've got to do is
3284      * call the real BpGraphicBufferProducer.
3285      */
3286     virtual void handleMessage(const Message& message) {
3287         int what = message.what;
3288         // Prevent reads below from happening before the read from Message
3289         atomic_thread_fence(memory_order_acquire);
3290         if (what == MSG_API_CALL) {
3291             result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3292             barrier.open();
3293         } else if (what == MSG_EXIT) {
3294             exitRequested = true;
3295         }
3296     }
3297
3298 public:
3299     GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3300     :   impl(impl),
3301         looper(new Looper(true)),
3302         result(NO_ERROR),
3303         exitPending(false),
3304         exitRequested(false),
3305         code(0),
3306         data(NULL),
3307         reply(NULL)
3308     {}
3309
3310     // Binder thread
3311     status_t waitForResponse() {
3312         do {
3313             looper->pollOnce(-1);
3314         } while (!exitRequested);
3315         return result;
3316     }
3317
3318     // Client thread
3319     void exit(status_t result) {
3320         this->result = result;
3321         exitPending = true;
3322         // Ensure this->result is visible to the binder thread before it
3323         // handles the message.
3324         atomic_thread_fence(memory_order_release);
3325         looper->sendMessage(this, Message(MSG_EXIT));
3326     }
3327 };
3328
3329
3330 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3331         const sp<IGraphicBufferProducer>& producer,
3332         Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3333         uint32_t minLayerZ, uint32_t maxLayerZ,
3334         bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3335
3336     if (CC_UNLIKELY(display == 0))
3337         return BAD_VALUE;
3338
3339     if (CC_UNLIKELY(producer == 0))
3340         return BAD_VALUE;
3341
3342     // if we have secure windows on this display, never allow the screen capture
3343     // unless the producer interface is local (i.e.: we can take a screenshot for
3344     // ourselves).
3345     bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3346
3347     // Convert to surfaceflinger's internal rotation type.
3348     Transform::orientation_flags rotationFlags;
3349     switch (rotation) {
3350         case ISurfaceComposer::eRotateNone:
3351             rotationFlags = Transform::ROT_0;
3352             break;
3353         case ISurfaceComposer::eRotate90:
3354             rotationFlags = Transform::ROT_90;
3355             break;
3356         case ISurfaceComposer::eRotate180:
3357             rotationFlags = Transform::ROT_180;
3358             break;
3359         case ISurfaceComposer::eRotate270:
3360             rotationFlags = Transform::ROT_270;
3361             break;
3362         default:
3363             rotationFlags = Transform::ROT_0;
3364             ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3365             break;
3366     }
3367
3368     class MessageCaptureScreen : public MessageBase {
3369         SurfaceFlinger* flinger;
3370         sp<IBinder> display;
3371         sp<IGraphicBufferProducer> producer;
3372         Rect sourceCrop;
3373         uint32_t reqWidth, reqHeight;
3374         uint32_t minLayerZ,maxLayerZ;
3375         bool useIdentityTransform;
3376         Transform::orientation_flags rotation;
3377         status_t result;
3378         bool isLocalScreenshot;
3379     public:
3380         MessageCaptureScreen(SurfaceFlinger* flinger,
3381                 const sp<IBinder>& display,
3382                 const sp<IGraphicBufferProducer>& producer,
3383                 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3384                 uint32_t minLayerZ, uint32_t maxLayerZ,
3385                 bool useIdentityTransform,
3386                 Transform::orientation_flags rotation,
3387                 bool isLocalScreenshot)
3388             : flinger(flinger), display(display), producer(producer),
3389               sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3390               minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3391               useIdentityTransform(useIdentityTransform),
3392               rotation(rotation), result(PERMISSION_DENIED),
3393               isLocalScreenshot(isLocalScreenshot)
3394         {
3395         }
3396         status_t getResult() const {
3397             return result;
3398         }
3399         virtual bool handler() {
3400             Mutex::Autolock _l(flinger->mStateLock);
3401             sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3402             result = flinger->captureScreenImplLocked(hw, producer,
3403                     sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3404                     useIdentityTransform, rotation, isLocalScreenshot);
3405             static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3406             return true;
3407         }
3408     };
3409
3410     // this creates a "fake" BBinder which will serve as a "fake" remote
3411     // binder to receive the marshaled calls and forward them to the
3412     // real remote (a BpGraphicBufferProducer)
3413     sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3414
3415     // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3416     // which does the marshaling work forwards to our "fake remote" above.
3417     sp<MessageBase> msg = new MessageCaptureScreen(this,
3418             display, IGraphicBufferProducer::asInterface( wrapper ),
3419             sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3420             useIdentityTransform, rotationFlags, isLocalScreenshot);
3421
3422     status_t res = postMessageAsync(msg);
3423     if (res == NO_ERROR) {
3424         res = wrapper->waitForResponse();
3425     }
3426     return res;
3427 }
3428
3429
3430 void SurfaceFlinger::renderScreenImplLocked(
3431         const sp<const DisplayDevice>& hw,
3432         Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3433         uint32_t minLayerZ, uint32_t maxLayerZ,
3434         bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3435 {
3436     ATRACE_CALL();
3437     RenderEngine& engine(getRenderEngine());
3438
3439     // get screen geometry
3440     const int32_t hw_w = hw->getWidth();
3441     const int32_t hw_h = hw->getHeight();
3442     const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3443                            static_cast<int32_t>(reqHeight) != hw_h;
3444
3445     // if a default or invalid sourceCrop is passed in, set reasonable values
3446     if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3447             !sourceCrop.isValid()) {
3448         sourceCrop.setLeftTop(Point(0, 0));
3449         sourceCrop.setRightBottom(Point(hw_w, hw_h));
3450     }
3451
3452     // ensure that sourceCrop is inside screen
3453     if (sourceCrop.left < 0) {
3454         ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3455     }
3456     if (sourceCrop.right > hw_w) {
3457         ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3458     }
3459     if (sourceCrop.top < 0) {
3460         ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3461     }
3462     if (sourceCrop.bottom > hw_h) {
3463         ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3464     }
3465
3466     // make sure to clear all GL error flags
3467     engine.checkErrors();
3468
3469     // set-up our viewport
3470     engine.setViewportAndProjection(
3471         reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3472     engine.disableTexturing();
3473
3474     // redraw the screen entirely...
3475     engine.clearWithColor(0, 0, 0, 1);
3476
3477     const LayerVector& layers( mDrawingState.layersSortedByZ );
3478     const size_t count = layers.size();
3479     for (size_t i=0 ; i<count ; ++i) {
3480         const sp<Layer>& layer(layers[i]);
3481         const Layer::State& state(layer->getDrawingState());
3482         if (state.layerStack == hw->getLayerStack()) {
3483             if (state.z >= minLayerZ && state.z <= maxLayerZ) {
3484                 if (layer->isVisible()) {
3485                     if (filtering) layer->setFiltering(true);
3486                     layer->draw(hw, useIdentityTransform);
3487                     if (filtering) layer->setFiltering(false);
3488                 }
3489             }
3490         }
3491     }
3492
3493     // compositionComplete is needed for older driver
3494     hw->compositionComplete();
3495     hw->setViewportAndProjection();
3496 }
3497
3498
3499 status_t SurfaceFlinger::captureScreenImplLocked(
3500         const sp<const DisplayDevice>& hw,
3501         const sp<IGraphicBufferProducer>& producer,
3502         Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3503         uint32_t minLayerZ, uint32_t maxLayerZ,
3504         bool useIdentityTransform, Transform::orientation_flags rotation,
3505         bool isLocalScreenshot)
3506 {
3507     ATRACE_CALL();
3508
3509     // get screen geometry
3510     uint32_t hw_w = hw->getWidth();
3511     uint32_t hw_h = hw->getHeight();
3512
3513     if (rotation & Transform::ROT_90) {
3514         std::swap(hw_w, hw_h);
3515     }
3516
3517     if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3518         ALOGE("size mismatch (%d, %d) > (%d, %d)",
3519                 reqWidth, reqHeight, hw_w, hw_h);
3520         return BAD_VALUE;
3521     }
3522
3523     reqWidth  = (!reqWidth)  ? hw_w : reqWidth;
3524     reqHeight = (!reqHeight) ? hw_h : reqHeight;
3525
3526     bool secureLayerIsVisible = false;
3527     const LayerVector& layers(mDrawingState.layersSortedByZ);
3528     const size_t count = layers.size();
3529     for (size_t i = 0 ; i < count ; ++i) {
3530         const sp<Layer>& layer(layers[i]);
3531         const Layer::State& state(layer->getDrawingState());
3532         if (state.layerStack == hw->getLayerStack() && state.z >= minLayerZ &&
3533                 state.z <= maxLayerZ && layer->isVisible() &&
3534                 layer->isSecure()) {
3535             secureLayerIsVisible = true;
3536         }
3537     }
3538
3539     if (!isLocalScreenshot && secureLayerIsVisible) {
3540         ALOGW("FB is protected: PERMISSION_DENIED");
3541         return PERMISSION_DENIED;
3542     }
3543
3544     // create a surface (because we're a producer, and we need to
3545     // dequeue/queue a buffer)
3546     sp<Surface> sur = new Surface(producer, false);
3547     ANativeWindow* window = sur.get();
3548
3549     status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3550     if (result == NO_ERROR) {
3551         uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3552                         GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3553
3554         int err = 0;
3555         err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3556         err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3557         err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3558         err |= native_window_set_usage(window, usage);
3559
3560         if (err == NO_ERROR) {
3561             ANativeWindowBuffer* buffer;
3562             /* TODO: Once we have the sync framework everywhere this can use
3563              * server-side waits on the fence that dequeueBuffer returns.
3564              */
3565             result = native_window_dequeue_buffer_and_wait(window,  &buffer);
3566             if (result == NO_ERROR) {
3567                 int syncFd = -1;
3568                 // create an EGLImage from the buffer so we can later
3569                 // turn it into a texture
3570                 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3571                         EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3572                 if (image != EGL_NO_IMAGE_KHR) {
3573                     // this binds the given EGLImage as a framebuffer for the
3574                     // duration of this scope.
3575                     RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3576                     if (imageBond.getStatus() == NO_ERROR) {
3577                         // this will in fact render into our dequeued buffer
3578                         // via an FBO, which means we didn't have to create
3579                         // an EGLSurface and therefore we're not
3580                         // dependent on the context's EGLConfig.
3581                         renderScreenImplLocked(
3582                             hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3583                             useIdentityTransform, rotation);
3584
3585                         // Attempt to create a sync khr object that can produce a sync point. If that
3586                         // isn't available, create a non-dupable sync object in the fallback path and
3587                         // wait on it directly.
3588                         EGLSyncKHR sync;
3589                         if (!DEBUG_SCREENSHOTS) {
3590                            sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3591                            // native fence fd will not be populated until flush() is done.
3592                            getRenderEngine().flush();
3593                         } else {
3594                             sync = EGL_NO_SYNC_KHR;
3595                         }
3596                         if (sync != EGL_NO_SYNC_KHR) {
3597                             // get the sync fd
3598                             syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3599                             if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3600                                 ALOGW("captureScreen: failed to dup sync khr object");
3601                                 syncFd = -1;
3602                             }
3603                             eglDestroySyncKHR(mEGLDisplay, sync);
3604                         } else {
3605                             // fallback path
3606                             sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3607                             if (sync != EGL_NO_SYNC_KHR) {
3608                                 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3609                                     EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3610                                 EGLint eglErr = eglGetError();
3611                                 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3612                                     ALOGW("captureScreen: fence wait timed out");
3613                                 } else {
3614                                     ALOGW_IF(eglErr != EGL_SUCCESS,
3615                                             "captureScreen: error waiting on EGL fence: %#x", eglErr);
3616                                 }
3617                                 eglDestroySyncKHR(mEGLDisplay, sync);
3618                             } else {
3619                                 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3620                             }
3621                         }
3622                         if (DEBUG_SCREENSHOTS) {
3623                             uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3624                             getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3625                             checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3626                                     hw, minLayerZ, maxLayerZ);
3627                             delete [] pixels;
3628                         }
3629
3630                     } else {
3631                         ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3632                         result = INVALID_OPERATION;
3633                         window->cancelBuffer(window, buffer, syncFd);
3634                         buffer = NULL;
3635                     }
3636                     // destroy our image
3637                     eglDestroyImageKHR(mEGLDisplay, image);
3638                 } else {
3639                     result = BAD_VALUE;
3640                 }
3641                 if (buffer) {
3642                     // queueBuffer takes ownership of syncFd
3643                     result = window->queueBuffer(window, buffer, syncFd);
3644                 }
3645             }
3646         } else {
3647             result = BAD_VALUE;
3648         }
3649         native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3650     }
3651
3652     return result;
3653 }
3654
3655 bool SurfaceFlinger::getFrameTimestamps(const Layer& layer,
3656         uint64_t frameNumber, FrameTimestamps* outTimestamps) {
3657     return mFenceTracker.getFrameTimestamps(layer, frameNumber, outTimestamps);
3658 }
3659
3660 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
3661         const sp<const DisplayDevice>& hw, uint32_t minLayerZ, uint32_t maxLayerZ) {
3662     if (DEBUG_SCREENSHOTS) {
3663         for (size_t y=0 ; y<h ; y++) {
3664             uint32_t const * p = (uint32_t const *)vaddr + y*s;
3665             for (size_t x=0 ; x<w ; x++) {
3666                 if (p[x] != 0xFF000000) return;
3667             }
3668         }
3669         ALOGE("*** we just took a black screenshot ***\n"
3670                 "requested minz=%d, maxz=%d, layerStack=%d",
3671                 minLayerZ, maxLayerZ, hw->getLayerStack());
3672         const LayerVector& layers( mDrawingState.layersSortedByZ );
3673         const size_t count = layers.size();
3674         for (size_t i=0 ; i<count ; ++i) {
3675             const sp<Layer>& layer(layers[i]);
3676             const Layer::State& state(layer->getDrawingState());
3677             const bool visible = (state.layerStack == hw->getLayerStack())
3678                                 && (state.z >= minLayerZ && state.z <= maxLayerZ)
3679                                 && (layer->isVisible());
3680             ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3681                     visible ? '+' : '-',
3682                             i, layer->getName().string(), state.layerStack, state.z,
3683                             layer->isVisible(), state.flags, state.alpha);
3684         }
3685     }
3686 }
3687
3688 // ---------------------------------------------------------------------------
3689
3690 SurfaceFlinger::LayerVector::LayerVector() {
3691 }
3692
3693 SurfaceFlinger::LayerVector::LayerVector(const LayerVector& rhs)
3694     : SortedVector<sp<Layer> >(rhs) {
3695 }
3696
3697 int SurfaceFlinger::LayerVector::do_compare(const void* lhs,
3698     const void* rhs) const
3699 {
3700     // sort layers per layer-stack, then by z-order and finally by sequence
3701     const sp<Layer>& l(*reinterpret_cast<const sp<Layer>*>(lhs));
3702     const sp<Layer>& r(*reinterpret_cast<const sp<Layer>*>(rhs));
3703
3704     uint32_t ls = l->getCurrentState().layerStack;
3705     uint32_t rs = r->getCurrentState().layerStack;
3706     if (ls != rs)
3707         return ls - rs;
3708
3709     uint32_t lz = l->getCurrentState().z;
3710     uint32_t rz = r->getCurrentState().z;
3711     if (lz != rz)
3712         return lz - rz;
3713
3714     return l->sequence - r->sequence;
3715 }
3716
3717 // ---------------------------------------------------------------------------
3718
3719 SurfaceFlinger::DisplayDeviceState::DisplayDeviceState()
3720     : type(DisplayDevice::DISPLAY_ID_INVALID),
3721       layerStack(DisplayDevice::NO_LAYER_STACK),
3722       orientation(0),
3723       width(0),
3724       height(0),
3725       isSecure(false) {
3726 }
3727
3728 SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(
3729     DisplayDevice::DisplayType type, bool isSecure)
3730     : type(type),
3731       layerStack(DisplayDevice::NO_LAYER_STACK),
3732       orientation(0),
3733       width(0),
3734       height(0),
3735       isSecure(isSecure) {
3736     viewport.makeInvalid();
3737     frame.makeInvalid();
3738 }
3739
3740 // ---------------------------------------------------------------------------
3741
3742 }; // namespace android
3743
3744
3745 #if defined(__gl_h_)
3746 #error "don't include gl/gl.h in this file"
3747 #endif
3748
3749 #if defined(__gl2_h_)
3750 #error "don't include gl2/gl2.h in this file"
3751 #endif