OSDN Git Service

SurfaceFlinger: give SF its own vsync phase
[android-x86/frameworks-native.git] / services / surfaceflinger / SurfaceFlinger.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
25 #include <EGL/egl.h>
26
27 #include <cutils/log.h>
28 #include <cutils/properties.h>
29
30 #include <binder/IPCThreadState.h>
31 #include <binder/IServiceManager.h>
32 #include <binder/MemoryHeapBase.h>
33 #include <binder/PermissionCache.h>
34
35 #include <ui/DisplayInfo.h>
36
37 #include <gui/BitTube.h>
38 #include <gui/BufferQueue.h>
39 #include <gui/GuiConfig.h>
40 #include <gui/IDisplayEventConnection.h>
41 #include <gui/Surface.h>
42 #include <gui/GraphicBufferAlloc.h>
43
44 #include <ui/GraphicBufferAllocator.h>
45 #include <ui/PixelFormat.h>
46 #include <ui/UiConfig.h>
47
48 #include <utils/misc.h>
49 #include <utils/String8.h>
50 #include <utils/String16.h>
51 #include <utils/StopWatch.h>
52 #include <utils/Trace.h>
53
54 #include <private/android_filesystem_config.h>
55 #include <private/gui/SyncFeatures.h>
56
57 #include "Client.h"
58 #include "clz.h"
59 #include "Colorizer.h"
60 #include "DdmConnection.h"
61 #include "DisplayDevice.h"
62 #include "DispSync.h"
63 #include "EventControlThread.h"
64 #include "EventThread.h"
65 #include "Layer.h"
66 #include "LayerDim.h"
67 #include "SurfaceFlinger.h"
68
69 #include "DisplayHardware/FramebufferSurface.h"
70 #include "DisplayHardware/HWComposer.h"
71 #include "DisplayHardware/VirtualDisplaySurface.h"
72
73 #include "Effects/Daltonizer.h"
74
75 #include "RenderEngine/RenderEngine.h"
76 #include <cutils/compiler.h>
77
78 #define DISPLAY_COUNT       1
79
80 /*
81  * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
82  * black pixels.
83  */
84 #define DEBUG_SCREENSHOTS   false
85
86 EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
87
88 namespace android {
89
90 // This works around the lack of support for the sync framework on some
91 // devices.
92 #ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK
93 static const bool runningWithoutSyncFramework = true;
94 #else
95 static const bool runningWithoutSyncFramework = false;
96 #endif
97
98 // This is the phase offset in nanoseconds of the software vsync event
99 // relative to the vsync event reported by HWComposer.  The software vsync
100 // event is when SurfaceFlinger and Choreographer-based applications run each
101 // frame.
102 //
103 // This phase offset allows adjustment of the minimum latency from application
104 // wake-up (by Choregographer) time to the time at which the resulting window
105 // image is displayed.  This value may be either positive (after the HW vsync)
106 // or negative (before the HW vsync).  Setting it to 0 will result in a
107 // minimum latency of two vsync periods because the app and SurfaceFlinger
108 // will run just after the HW vsync.  Setting it to a positive number will
109 // result in the minimum latency being:
110 //
111 //     (2 * VSYNC_PERIOD - (vsyncPhaseOffsetNs % VSYNC_PERIOD))
112 //
113 // Note that reducing this latency makes it more likely for the applications
114 // to not have their window content image ready in time.  When this happens
115 // the latency will end up being an additional vsync period, and animations
116 // will hiccup.  Therefore, this latency should be tuned somewhat
117 // conservatively (or at least with awareness of the trade-off being made).
118 static const int64_t vsyncPhaseOffsetNs = VSYNC_EVENT_PHASE_OFFSET_NS;
119
120 // This is the phase offset at which SurfaceFlinger's composition runs.
121 static const int64_t sfVsyncPhaseOffsetNs = SF_VSYNC_EVENT_PHASE_OFFSET_NS;
122
123 // ---------------------------------------------------------------------------
124
125 const String16 sHardwareTest("android.permission.HARDWARE_TEST");
126 const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
127 const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
128 const String16 sDump("android.permission.DUMP");
129
130 // ---------------------------------------------------------------------------
131
132 SurfaceFlinger::SurfaceFlinger()
133     :   BnSurfaceComposer(),
134         mTransactionFlags(0),
135         mTransactionPending(false),
136         mAnimTransactionPending(false),
137         mLayersRemoved(false),
138         mRepaintEverything(0),
139         mRenderEngine(NULL),
140         mBootTime(systemTime()),
141         mVisibleRegionsDirty(false),
142         mHwWorkListDirty(false),
143         mAnimCompositionPending(false),
144         mDebugRegion(0),
145         mDebugDDMS(0),
146         mDebugDisableHWC(0),
147         mDebugDisableTransformHint(0),
148         mDebugInSwapBuffers(0),
149         mLastSwapBufferTime(0),
150         mDebugInTransaction(0),
151         mLastTransactionTime(0),
152         mBootFinished(false),
153         mPrimaryHWVsyncEnabled(false),
154         mHWVsyncAvailable(false),
155         mDaltonize(false)
156 {
157     ALOGI("SurfaceFlinger is starting");
158
159     // debugging stuff...
160     char value[PROPERTY_VALUE_MAX];
161
162     property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
163     mGpuToCpuSupported = !atoi(value);
164
165     property_get("debug.sf.showupdates", value, "0");
166     mDebugRegion = atoi(value);
167
168     property_get("debug.sf.ddms", value, "0");
169     mDebugDDMS = atoi(value);
170     if (mDebugDDMS) {
171         if (!startDdmConnection()) {
172             // start failed, and DDMS debugging not enabled
173             mDebugDDMS = 0;
174         }
175     }
176     ALOGI_IF(mDebugRegion, "showupdates enabled");
177     ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
178 }
179
180 void SurfaceFlinger::onFirstRef()
181 {
182     mEventQueue.init(this);
183 }
184
185 SurfaceFlinger::~SurfaceFlinger()
186 {
187     EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
188     eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
189     eglTerminate(display);
190 }
191
192 void SurfaceFlinger::binderDied(const wp<IBinder>& who)
193 {
194     // the window manager died on us. prepare its eulogy.
195
196     // restore initial conditions (default device unblank, etc)
197     initializeDisplays();
198
199     // restart the boot-animation
200     startBootAnim();
201 }
202
203 sp<ISurfaceComposerClient> SurfaceFlinger::createConnection()
204 {
205     sp<ISurfaceComposerClient> bclient;
206     sp<Client> client(new Client(this));
207     status_t err = client->initCheck();
208     if (err == NO_ERROR) {
209         bclient = client;
210     }
211     return bclient;
212 }
213
214 sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
215         bool secure)
216 {
217     class DisplayToken : public BBinder {
218         sp<SurfaceFlinger> flinger;
219         virtual ~DisplayToken() {
220              // no more references, this display must be terminated
221              Mutex::Autolock _l(flinger->mStateLock);
222              flinger->mCurrentState.displays.removeItem(this);
223              flinger->setTransactionFlags(eDisplayTransactionNeeded);
224          }
225      public:
226         DisplayToken(const sp<SurfaceFlinger>& flinger)
227             : flinger(flinger) {
228         }
229     };
230
231     sp<BBinder> token = new DisplayToken(this);
232
233     Mutex::Autolock _l(mStateLock);
234     DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL);
235     info.displayName = displayName;
236     info.isSecure = secure;
237     mCurrentState.displays.add(token, info);
238
239     return token;
240 }
241
242 void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
243     Mutex::Autolock _l(mStateLock);
244
245     ssize_t idx = mCurrentState.displays.indexOfKey(display);
246     if (idx < 0) {
247         ALOGW("destroyDisplay: invalid display token");
248         return;
249     }
250
251     const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
252     if (!info.isVirtualDisplay()) {
253         ALOGE("destroyDisplay called for non-virtual display");
254         return;
255     }
256
257     mCurrentState.displays.removeItemsAt(idx);
258     setTransactionFlags(eDisplayTransactionNeeded);
259 }
260
261 void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
262     ALOGW_IF(mBuiltinDisplays[type],
263             "Overwriting display token for display type %d", type);
264     mBuiltinDisplays[type] = new BBinder();
265     DisplayDeviceState info(type);
266     // All non-virtual displays are currently considered secure.
267     info.isSecure = true;
268     mCurrentState.displays.add(mBuiltinDisplays[type], info);
269 }
270
271 sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
272     if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
273         ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
274         return NULL;
275     }
276     return mBuiltinDisplays[id];
277 }
278
279 sp<IGraphicBufferAlloc> SurfaceFlinger::createGraphicBufferAlloc()
280 {
281     sp<GraphicBufferAlloc> gba(new GraphicBufferAlloc());
282     return gba;
283 }
284
285 void SurfaceFlinger::bootFinished()
286 {
287     const nsecs_t now = systemTime();
288     const nsecs_t duration = now - mBootTime;
289     ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
290     mBootFinished = true;
291
292     // wait patiently for the window manager death
293     const String16 name("window");
294     sp<IBinder> window(defaultServiceManager()->getService(name));
295     if (window != 0) {
296         window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
297     }
298
299     // stop boot animation
300     // formerly we would just kill the process, but we now ask it to exit so it
301     // can choose where to stop the animation.
302     property_set("service.bootanim.exit", "1");
303 }
304
305 void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
306     class MessageDestroyGLTexture : public MessageBase {
307         RenderEngine& engine;
308         uint32_t texture;
309     public:
310         MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
311             : engine(engine), texture(texture) {
312         }
313         virtual bool handler() {
314             engine.deleteTextures(1, &texture);
315             return true;
316         }
317     };
318     postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
319 }
320
321 status_t SurfaceFlinger::selectConfigForAttribute(
322         EGLDisplay dpy,
323         EGLint const* attrs,
324         EGLint attribute, EGLint wanted,
325         EGLConfig* outConfig)
326 {
327     EGLConfig config = NULL;
328     EGLint numConfigs = -1, n=0;
329     eglGetConfigs(dpy, NULL, 0, &numConfigs);
330     EGLConfig* const configs = new EGLConfig[numConfigs];
331     eglChooseConfig(dpy, attrs, configs, numConfigs, &n);
332
333     if (n) {
334         if (attribute != EGL_NONE) {
335             for (int i=0 ; i<n ; i++) {
336                 EGLint value = 0;
337                 eglGetConfigAttrib(dpy, configs[i], attribute, &value);
338                 if (wanted == value) {
339                     *outConfig = configs[i];
340                     delete [] configs;
341                     return NO_ERROR;
342                 }
343             }
344         } else {
345             // just pick the first one
346             *outConfig = configs[0];
347             delete [] configs;
348             return NO_ERROR;
349         }
350     }
351     delete [] configs;
352     return NAME_NOT_FOUND;
353 }
354
355 class EGLAttributeVector {
356     struct Attribute;
357     class Adder;
358     friend class Adder;
359     KeyedVector<Attribute, EGLint> mList;
360     struct Attribute {
361         Attribute() {};
362         Attribute(EGLint v) : v(v) { }
363         EGLint v;
364         bool operator < (const Attribute& other) const {
365             // this places EGL_NONE at the end
366             EGLint lhs(v);
367             EGLint rhs(other.v);
368             if (lhs == EGL_NONE) lhs = 0x7FFFFFFF;
369             if (rhs == EGL_NONE) rhs = 0x7FFFFFFF;
370             return lhs < rhs;
371         }
372     };
373     class Adder {
374         friend class EGLAttributeVector;
375         EGLAttributeVector& v;
376         EGLint attribute;
377         Adder(EGLAttributeVector& v, EGLint attribute)
378             : v(v), attribute(attribute) {
379         }
380     public:
381         void operator = (EGLint value) {
382             if (attribute != EGL_NONE) {
383                 v.mList.add(attribute, value);
384             }
385         }
386         operator EGLint () const { return v.mList[attribute]; }
387     };
388 public:
389     EGLAttributeVector() {
390         mList.add(EGL_NONE, EGL_NONE);
391     }
392     void remove(EGLint attribute) {
393         if (attribute != EGL_NONE) {
394             mList.removeItem(attribute);
395         }
396     }
397     Adder operator [] (EGLint attribute) {
398         return Adder(*this, attribute);
399     }
400     EGLint operator [] (EGLint attribute) const {
401        return mList[attribute];
402     }
403     // cast-operator to (EGLint const*)
404     operator EGLint const* () const { return &mList.keyAt(0).v; }
405 };
406
407 status_t SurfaceFlinger::selectEGLConfig(EGLDisplay display, EGLint nativeVisualId,
408     EGLint renderableType, EGLConfig* config) {
409     // select our EGLConfig. It must support EGL_RECORDABLE_ANDROID if
410     // it is to be used with WIFI displays
411     status_t err;
412     EGLint wantedAttribute;
413     EGLint wantedAttributeValue;
414
415     EGLAttributeVector attribs;
416     if (renderableType) {
417         attribs[EGL_RENDERABLE_TYPE]            = renderableType;
418         attribs[EGL_RECORDABLE_ANDROID]         = EGL_TRUE;
419         attribs[EGL_SURFACE_TYPE]               = EGL_WINDOW_BIT|EGL_PBUFFER_BIT;
420         attribs[EGL_FRAMEBUFFER_TARGET_ANDROID] = EGL_TRUE;
421         attribs[EGL_RED_SIZE]                   = 8;
422         attribs[EGL_GREEN_SIZE]                 = 8;
423         attribs[EGL_BLUE_SIZE]                  = 8;
424         wantedAttribute                         = EGL_NONE;
425         wantedAttributeValue                    = EGL_NONE;
426
427     } else {
428         // if no renderable type specified, fallback to a simplified query
429         wantedAttribute                         = EGL_NATIVE_VISUAL_ID;
430         wantedAttributeValue                    = nativeVisualId;
431     }
432
433     err = selectConfigForAttribute(display, attribs, wantedAttribute,
434         wantedAttributeValue, config);
435     if (err == NO_ERROR) {
436         EGLint caveat;
437         if (eglGetConfigAttrib(display, *config, EGL_CONFIG_CAVEAT, &caveat))
438             ALOGW_IF(caveat == EGL_SLOW_CONFIG, "EGL_SLOW_CONFIG selected!");
439     }
440     return err;
441 }
442
443 class DispSyncSource : public VSyncSource, private DispSync::Callback {
444 public:
445     DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync) :
446             mValue(0),
447             mPhaseOffset(phaseOffset),
448             mTraceVsync(traceVsync),
449             mDispSync(dispSync) {}
450
451     virtual ~DispSyncSource() {}
452
453     virtual void setVSyncEnabled(bool enable) {
454         // Do NOT lock the mutex here so as to avoid any mutex ordering issues
455         // with locking it in the onDispSyncEvent callback.
456         if (enable) {
457             status_t err = mDispSync->addEventListener(mPhaseOffset,
458                     static_cast<DispSync::Callback*>(this));
459             if (err != NO_ERROR) {
460                 ALOGE("error registering vsync callback: %s (%d)",
461                         strerror(-err), err);
462             }
463             ATRACE_INT("VsyncOn", 1);
464         } else {
465             status_t err = mDispSync->removeEventListener(
466                     static_cast<DispSync::Callback*>(this));
467             if (err != NO_ERROR) {
468                 ALOGE("error unregistering vsync callback: %s (%d)",
469                         strerror(-err), err);
470             }
471             ATRACE_INT("VsyncOn", 0);
472         }
473     }
474
475     virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
476         Mutex::Autolock lock(mMutex);
477         mCallback = callback;
478     }
479
480 private:
481     virtual void onDispSyncEvent(nsecs_t when) {
482         sp<VSyncSource::Callback> callback;
483         {
484             Mutex::Autolock lock(mMutex);
485             callback = mCallback;
486
487             if (mTraceVsync) {
488                 mValue = (mValue + 1) % 2;
489                 ATRACE_INT("VSYNC", mValue);
490             }
491         }
492
493         if (callback != NULL) {
494             callback->onVSyncEvent(when);
495         }
496     }
497
498     int mValue;
499
500     const nsecs_t mPhaseOffset;
501     const bool mTraceVsync;
502
503     DispSync* mDispSync;
504     sp<VSyncSource::Callback> mCallback;
505     Mutex mMutex;
506 };
507
508 void SurfaceFlinger::init() {
509     ALOGI(  "SurfaceFlinger's main thread ready to run. "
510             "Initializing graphics H/W...");
511
512     status_t err;
513     Mutex::Autolock _l(mStateLock);
514
515     // initialize EGL for the default display
516     mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
517     eglInitialize(mEGLDisplay, NULL, NULL);
518
519     // Initialize the H/W composer object.  There may or may not be an
520     // actual hardware composer underneath.
521     mHwc = new HWComposer(this,
522             *static_cast<HWComposer::EventHandler *>(this));
523
524     // First try to get an ES2 config
525     err = selectEGLConfig(mEGLDisplay, mHwc->getVisualID(), EGL_OPENGL_ES2_BIT,
526             &mEGLConfig);
527
528     if (err != NO_ERROR) {
529         // If ES2 fails, try ES1
530         err = selectEGLConfig(mEGLDisplay, mHwc->getVisualID(),
531                 EGL_OPENGL_ES_BIT, &mEGLConfig);
532     }
533
534     if (err != NO_ERROR) {
535         // still didn't work, probably because we're on the emulator...
536         // try a simplified query
537         ALOGW("no suitable EGLConfig found, trying a simpler query");
538         err = selectEGLConfig(mEGLDisplay, mHwc->getVisualID(), 0, &mEGLConfig);
539     }
540
541     if (err != NO_ERROR) {
542         // this EGL is too lame for android
543         LOG_ALWAYS_FATAL("no suitable EGLConfig found, giving up");
544     }
545
546     // print some debugging info
547     EGLint r,g,b,a;
548     eglGetConfigAttrib(mEGLDisplay, mEGLConfig, EGL_RED_SIZE,   &r);
549     eglGetConfigAttrib(mEGLDisplay, mEGLConfig, EGL_GREEN_SIZE, &g);
550     eglGetConfigAttrib(mEGLDisplay, mEGLConfig, EGL_BLUE_SIZE,  &b);
551     eglGetConfigAttrib(mEGLDisplay, mEGLConfig, EGL_ALPHA_SIZE, &a);
552     ALOGI("EGL informations:");
553     ALOGI("vendor    : %s", eglQueryString(mEGLDisplay, EGL_VENDOR));
554     ALOGI("version   : %s", eglQueryString(mEGLDisplay, EGL_VERSION));
555     ALOGI("extensions: %s", eglQueryString(mEGLDisplay, EGL_EXTENSIONS));
556     ALOGI("Client API: %s", eglQueryString(mEGLDisplay, EGL_CLIENT_APIS)?:"Not Supported");
557     ALOGI("EGLSurface: %d-%d-%d-%d, config=%p", r, g, b, a, mEGLConfig);
558
559     // get a RenderEngine for the given display / config (can't fail)
560     mRenderEngine = RenderEngine::create(mEGLDisplay, mEGLConfig);
561
562     // retrieve the EGL context that was selected/created
563     mEGLContext = mRenderEngine->getEGLContext();
564
565     // figure out which format we got
566     eglGetConfigAttrib(mEGLDisplay, mEGLConfig,
567             EGL_NATIVE_VISUAL_ID, &mEGLNativeVisualId);
568
569     LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
570             "couldn't create EGLContext");
571
572     // initialize our non-virtual displays
573     for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
574         DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
575         // set-up the displays that are already connected
576         if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
577             // All non-virtual displays are currently considered secure.
578             bool isSecure = true;
579             createBuiltinDisplayLocked(type);
580             wp<IBinder> token = mBuiltinDisplays[i];
581
582             sp<BufferQueue> bq = new BufferQueue(new GraphicBufferAlloc());
583             sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i, bq);
584             sp<DisplayDevice> hw = new DisplayDevice(this,
585                     type, allocateHwcDisplayId(type), isSecure, token,
586                     fbs, bq,
587                     mEGLConfig);
588             if (i > DisplayDevice::DISPLAY_PRIMARY) {
589                 // FIXME: currently we don't get blank/unblank requests
590                 // for displays other than the main display, so we always
591                 // assume a connected display is unblanked.
592                 ALOGD("marking display %d as acquired/unblanked", i);
593                 hw->acquireScreen();
594             }
595             mDisplays.add(token, hw);
596         }
597     }
598
599     // make the GLContext current so that we can create textures when creating Layers
600     // (which may happens before we render something)
601     getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
602
603     // start the EventThread
604     sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
605             vsyncPhaseOffsetNs, true);
606     mEventThread = new EventThread(vsyncSrc);
607     sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
608             sfVsyncPhaseOffsetNs, false);
609     mSFEventThread = new EventThread(sfVsyncSrc);
610     mEventQueue.setEventThread(mSFEventThread);
611
612     mEventControlThread = new EventControlThread(this);
613     mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
614
615     // set a fake vsync period if there is no HWComposer
616     if (mHwc->initCheck() != NO_ERROR) {
617         mPrimaryDispSync.setPeriod(16666667);
618     }
619
620     // initialize our drawing state
621     mDrawingState = mCurrentState;
622
623     // set initial conditions (e.g. unblank default device)
624     initializeDisplays();
625
626     // start boot animation
627     startBootAnim();
628 }
629
630 int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
631     return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
632             type : mHwc->allocateDisplayId();
633 }
634
635 void SurfaceFlinger::startBootAnim() {
636     // start boot animation
637     property_set("service.bootanim.exit", "0");
638     property_set("ctl.start", "bootanim");
639 }
640
641 size_t SurfaceFlinger::getMaxTextureSize() const {
642     return mRenderEngine->getMaxTextureSize();
643 }
644
645 size_t SurfaceFlinger::getMaxViewportDims() const {
646     return mRenderEngine->getMaxViewportDims();
647 }
648
649 // ----------------------------------------------------------------------------
650
651 bool SurfaceFlinger::authenticateSurfaceTexture(
652         const sp<IGraphicBufferProducer>& bufferProducer) const {
653     Mutex::Autolock _l(mStateLock);
654     sp<IBinder> surfaceTextureBinder(bufferProducer->asBinder());
655     return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
656 }
657
658 status_t SurfaceFlinger::getDisplayInfo(const sp<IBinder>& display, DisplayInfo* info) {
659     int32_t type = NAME_NOT_FOUND;
660     for (int i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
661         if (display == mBuiltinDisplays[i]) {
662             type = i;
663             break;
664         }
665     }
666
667     if (type < 0) {
668         return type;
669     }
670
671     const HWComposer& hwc(getHwComposer());
672     float xdpi = hwc.getDpiX(type);
673     float ydpi = hwc.getDpiY(type);
674
675     // TODO: Not sure if display density should handled by SF any longer
676     class Density {
677         static int getDensityFromProperty(char const* propName) {
678             char property[PROPERTY_VALUE_MAX];
679             int density = 0;
680             if (property_get(propName, property, NULL) > 0) {
681                 density = atoi(property);
682             }
683             return density;
684         }
685     public:
686         static int getEmuDensity() {
687             return getDensityFromProperty("qemu.sf.lcd_density"); }
688         static int getBuildDensity()  {
689             return getDensityFromProperty("ro.sf.lcd_density"); }
690     };
691
692     if (type == DisplayDevice::DISPLAY_PRIMARY) {
693         // The density of the device is provided by a build property
694         float density = Density::getBuildDensity() / 160.0f;
695         if (density == 0) {
696             // the build doesn't provide a density -- this is wrong!
697             // use xdpi instead
698             ALOGE("ro.sf.lcd_density must be defined as a build property");
699             density = xdpi / 160.0f;
700         }
701         if (Density::getEmuDensity()) {
702             // if "qemu.sf.lcd_density" is specified, it overrides everything
703             xdpi = ydpi = density = Density::getEmuDensity();
704             density /= 160.0f;
705         }
706         info->density = density;
707
708         // TODO: this needs to go away (currently needed only by webkit)
709         sp<const DisplayDevice> hw(getDefaultDisplayDevice());
710         info->orientation = hw->getOrientation();
711     } else {
712         // TODO: where should this value come from?
713         static const int TV_DENSITY = 213;
714         info->density = TV_DENSITY / 160.0f;
715         info->orientation = 0;
716     }
717
718     info->w = hwc.getWidth(type);
719     info->h = hwc.getHeight(type);
720     info->xdpi = xdpi;
721     info->ydpi = ydpi;
722     info->fps = float(1e9 / hwc.getRefreshPeriod(type));
723
724     // All non-virtual displays are currently considered secure.
725     info->secure = true;
726
727     return NO_ERROR;
728 }
729
730 // ----------------------------------------------------------------------------
731
732 sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
733     return mEventThread->createEventConnection();
734 }
735
736 // ----------------------------------------------------------------------------
737
738 void SurfaceFlinger::waitForEvent() {
739     mEventQueue.waitMessage();
740 }
741
742 void SurfaceFlinger::signalTransaction() {
743     mEventQueue.invalidate();
744 }
745
746 void SurfaceFlinger::signalLayerUpdate() {
747     mEventQueue.invalidate();
748 }
749
750 void SurfaceFlinger::signalRefresh() {
751     mEventQueue.refresh();
752 }
753
754 status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
755         nsecs_t reltime, uint32_t flags) {
756     return mEventQueue.postMessage(msg, reltime);
757 }
758
759 status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
760         nsecs_t reltime, uint32_t flags) {
761     status_t res = mEventQueue.postMessage(msg, reltime);
762     if (res == NO_ERROR) {
763         msg->wait();
764     }
765     return res;
766 }
767
768 void SurfaceFlinger::run() {
769     do {
770         waitForEvent();
771     } while (true);
772 }
773
774 void SurfaceFlinger::enableHardwareVsync() {
775     Mutex::Autolock _l(mHWVsyncLock);
776     if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
777         mPrimaryDispSync.beginResync();
778         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
779         mEventControlThread->setVsyncEnabled(true);
780         mPrimaryHWVsyncEnabled = true;
781     }
782 }
783
784 void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
785     Mutex::Autolock _l(mHWVsyncLock);
786
787     if (makeAvailable) {
788         mHWVsyncAvailable = true;
789     } else if (!mHWVsyncAvailable) {
790         ALOGE("resyncToHardwareVsync called when HW vsync unavailable");
791         return;
792     }
793
794     const nsecs_t period =
795             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
796
797     mPrimaryDispSync.reset();
798     mPrimaryDispSync.setPeriod(period);
799
800     if (!mPrimaryHWVsyncEnabled) {
801         mPrimaryDispSync.beginResync();
802         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
803         mEventControlThread->setVsyncEnabled(true);
804         mPrimaryHWVsyncEnabled = true;
805     }
806 }
807
808 void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
809     Mutex::Autolock _l(mHWVsyncLock);
810     if (mPrimaryHWVsyncEnabled) {
811         //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
812         mEventControlThread->setVsyncEnabled(false);
813         mPrimaryDispSync.endResync();
814         mPrimaryHWVsyncEnabled = false;
815     }
816     if (makeUnavailable) {
817         mHWVsyncAvailable = false;
818     }
819 }
820
821 void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) {
822     bool needsHwVsync = false;
823
824     { // Scope for the lock
825         Mutex::Autolock _l(mHWVsyncLock);
826         if (type == 0 && mPrimaryHWVsyncEnabled) {
827             needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
828         }
829     }
830
831     if (needsHwVsync) {
832         enableHardwareVsync();
833     } else {
834         disableHardwareVsync(false);
835     }
836 }
837
838 void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
839     if (mEventThread == NULL) {
840         // This is a temporary workaround for b/7145521.  A non-null pointer
841         // does not mean EventThread has finished initializing, so this
842         // is not a correct fix.
843         ALOGW("WARNING: EventThread not started, ignoring hotplug");
844         return;
845     }
846
847     if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
848         Mutex::Autolock _l(mStateLock);
849         if (connected) {
850             createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
851         } else {
852             mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
853             mBuiltinDisplays[type].clear();
854         }
855         setTransactionFlags(eDisplayTransactionNeeded);
856
857         // Defer EventThread notification until SF has updated mDisplays.
858     }
859 }
860
861 void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
862     ATRACE_CALL();
863     getHwComposer().eventControl(disp, event, enabled);
864 }
865
866 void SurfaceFlinger::onMessageReceived(int32_t what) {
867     ATRACE_CALL();
868     switch (what) {
869     case MessageQueue::TRANSACTION:
870         handleMessageTransaction();
871         break;
872     case MessageQueue::INVALIDATE:
873         handleMessageTransaction();
874         handleMessageInvalidate();
875         signalRefresh();
876         break;
877     case MessageQueue::REFRESH:
878         handleMessageRefresh();
879         break;
880     }
881 }
882
883 void SurfaceFlinger::handleMessageTransaction() {
884     uint32_t transactionFlags = peekTransactionFlags(eTransactionMask);
885     if (transactionFlags) {
886         handleTransaction(transactionFlags);
887     }
888 }
889
890 void SurfaceFlinger::handleMessageInvalidate() {
891     ATRACE_CALL();
892     handlePageFlip();
893 }
894
895 void SurfaceFlinger::handleMessageRefresh() {
896     ATRACE_CALL();
897     preComposition();
898     rebuildLayerStacks();
899     setUpHWComposer();
900     doDebugFlashRegions();
901     doComposition();
902     postComposition();
903 }
904
905 void SurfaceFlinger::doDebugFlashRegions()
906 {
907     // is debugging enabled
908     if (CC_LIKELY(!mDebugRegion))
909         return;
910
911     const bool repaintEverything = mRepaintEverything;
912     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
913         const sp<DisplayDevice>& hw(mDisplays[dpy]);
914         if (hw->canDraw()) {
915             // transform the dirty region into this screen's coordinate space
916             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
917             if (!dirtyRegion.isEmpty()) {
918                 // redraw the whole screen
919                 doComposeSurfaces(hw, Region(hw->bounds()));
920
921                 // and draw the dirty region
922                 const int32_t height = hw->getHeight();
923                 RenderEngine& engine(getRenderEngine());
924                 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
925
926                 hw->compositionComplete();
927                 hw->swapBuffers(getHwComposer());
928             }
929         }
930     }
931
932     postFramebuffer();
933
934     if (mDebugRegion > 1) {
935         usleep(mDebugRegion * 1000);
936     }
937
938     HWComposer& hwc(getHwComposer());
939     if (hwc.initCheck() == NO_ERROR) {
940         status_t err = hwc.prepare();
941         ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
942     }
943 }
944
945 void SurfaceFlinger::preComposition()
946 {
947     bool needExtraInvalidate = false;
948     const LayerVector& layers(mDrawingState.layersSortedByZ);
949     const size_t count = layers.size();
950     for (size_t i=0 ; i<count ; i++) {
951         if (layers[i]->onPreComposition()) {
952             needExtraInvalidate = true;
953         }
954     }
955     if (needExtraInvalidate) {
956         signalLayerUpdate();
957     }
958 }
959
960 void SurfaceFlinger::postComposition()
961 {
962     const LayerVector& layers(mDrawingState.layersSortedByZ);
963     const size_t count = layers.size();
964     for (size_t i=0 ; i<count ; i++) {
965         layers[i]->onPostComposition();
966     }
967
968     const HWComposer& hwc = getHwComposer();
969     sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
970
971     if (presentFence->isValid()) {
972         if (mPrimaryDispSync.addPresentFence(presentFence)) {
973             enableHardwareVsync();
974         } else {
975             disableHardwareVsync(false);
976         }
977     }
978
979     if (runningWithoutSyncFramework) {
980         const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
981         if (hw->isScreenAcquired()) {
982             enableHardwareVsync();
983         }
984     }
985
986     if (mAnimCompositionPending) {
987         mAnimCompositionPending = false;
988
989         if (presentFence->isValid()) {
990             mAnimFrameTracker.setActualPresentFence(presentFence);
991         } else {
992             // The HWC doesn't support present fences, so use the refresh
993             // timestamp instead.
994             nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
995             mAnimFrameTracker.setActualPresentTime(presentTime);
996         }
997         mAnimFrameTracker.advanceFrame();
998     }
999 }
1000
1001 void SurfaceFlinger::rebuildLayerStacks() {
1002     // rebuild the visible layer list per screen
1003     if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1004         ATRACE_CALL();
1005         mVisibleRegionsDirty = false;
1006         invalidateHwcGeometry();
1007
1008         const LayerVector& layers(mDrawingState.layersSortedByZ);
1009         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1010             Region opaqueRegion;
1011             Region dirtyRegion;
1012             Vector< sp<Layer> > layersSortedByZ;
1013             const sp<DisplayDevice>& hw(mDisplays[dpy]);
1014             const Transform& tr(hw->getTransform());
1015             const Rect bounds(hw->getBounds());
1016             if (hw->canDraw()) {
1017                 SurfaceFlinger::computeVisibleRegions(layers,
1018                         hw->getLayerStack(), dirtyRegion, opaqueRegion);
1019
1020                 const size_t count = layers.size();
1021                 for (size_t i=0 ; i<count ; i++) {
1022                     const sp<Layer>& layer(layers[i]);
1023                     const Layer::State& s(layer->getDrawingState());
1024                     if (s.layerStack == hw->getLayerStack()) {
1025                         Region drawRegion(tr.transform(
1026                                 layer->visibleNonTransparentRegion));
1027                         drawRegion.andSelf(bounds);
1028                         if (!drawRegion.isEmpty()) {
1029                             layersSortedByZ.add(layer);
1030                         }
1031                     }
1032                 }
1033             }
1034             hw->setVisibleLayersSortedByZ(layersSortedByZ);
1035             hw->undefinedRegion.set(bounds);
1036             hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1037             hw->dirtyRegion.orSelf(dirtyRegion);
1038         }
1039     }
1040 }
1041
1042 void SurfaceFlinger::setUpHWComposer() {
1043     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1044         mDisplays[dpy]->beginFrame();
1045     }
1046
1047     HWComposer& hwc(getHwComposer());
1048     if (hwc.initCheck() == NO_ERROR) {
1049         // build the h/w work list
1050         if (CC_UNLIKELY(mHwWorkListDirty)) {
1051             mHwWorkListDirty = false;
1052             for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1053                 sp<const DisplayDevice> hw(mDisplays[dpy]);
1054                 const int32_t id = hw->getHwcDisplayId();
1055                 if (id >= 0) {
1056                     const Vector< sp<Layer> >& currentLayers(
1057                         hw->getVisibleLayersSortedByZ());
1058                     const size_t count = currentLayers.size();
1059                     if (hwc.createWorkList(id, count) == NO_ERROR) {
1060                         HWComposer::LayerListIterator cur = hwc.begin(id);
1061                         const HWComposer::LayerListIterator end = hwc.end(id);
1062                         for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1063                             const sp<Layer>& layer(currentLayers[i]);
1064                             layer->setGeometry(hw, *cur);
1065                             if (mDebugDisableHWC || mDebugRegion || mDaltonize) {
1066                                 cur->setSkip(true);
1067                             }
1068                         }
1069                     }
1070                 }
1071             }
1072         }
1073
1074         // set the per-frame data
1075         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1076             sp<const DisplayDevice> hw(mDisplays[dpy]);
1077             const int32_t id = hw->getHwcDisplayId();
1078             if (id >= 0) {
1079                 const Vector< sp<Layer> >& currentLayers(
1080                     hw->getVisibleLayersSortedByZ());
1081                 const size_t count = currentLayers.size();
1082                 HWComposer::LayerListIterator cur = hwc.begin(id);
1083                 const HWComposer::LayerListIterator end = hwc.end(id);
1084                 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1085                     /*
1086                      * update the per-frame h/w composer data for each layer
1087                      * and build the transparent region of the FB
1088                      */
1089                     const sp<Layer>& layer(currentLayers[i]);
1090                     layer->setPerFrameData(hw, *cur);
1091                 }
1092             }
1093         }
1094
1095         status_t err = hwc.prepare();
1096         ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1097
1098         for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1099             sp<const DisplayDevice> hw(mDisplays[dpy]);
1100             hw->prepareFrame(hwc);
1101         }
1102     }
1103 }
1104
1105 void SurfaceFlinger::doComposition() {
1106     ATRACE_CALL();
1107     const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1108     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1109         const sp<DisplayDevice>& hw(mDisplays[dpy]);
1110         if (hw->canDraw()) {
1111             // transform the dirty region into this screen's coordinate space
1112             const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1113
1114             // repaint the framebuffer (if needed)
1115             doDisplayComposition(hw, dirtyRegion);
1116
1117             hw->dirtyRegion.clear();
1118             hw->flip(hw->swapRegion);
1119             hw->swapRegion.clear();
1120         }
1121         // inform the h/w that we're done compositing
1122         hw->compositionComplete();
1123     }
1124     postFramebuffer();
1125 }
1126
1127 void SurfaceFlinger::postFramebuffer()
1128 {
1129     ATRACE_CALL();
1130
1131     const nsecs_t now = systemTime();
1132     mDebugInSwapBuffers = now;
1133
1134     HWComposer& hwc(getHwComposer());
1135     if (hwc.initCheck() == NO_ERROR) {
1136         if (!hwc.supportsFramebufferTarget()) {
1137             // EGL spec says:
1138             //   "surface must be bound to the calling thread's current context,
1139             //    for the current rendering API."
1140             getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1141         }
1142         hwc.commit();
1143     }
1144
1145     // make the default display current because the VirtualDisplayDevice code cannot
1146     // deal with dequeueBuffer() being called outside of the composition loop; however
1147     // the code below can call glFlush() which is allowed (and does in some case) call
1148     // dequeueBuffer().
1149     getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1150
1151     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1152         sp<const DisplayDevice> hw(mDisplays[dpy]);
1153         const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1154         hw->onSwapBuffersCompleted(hwc);
1155         const size_t count = currentLayers.size();
1156         int32_t id = hw->getHwcDisplayId();
1157         if (id >=0 && hwc.initCheck() == NO_ERROR) {
1158             HWComposer::LayerListIterator cur = hwc.begin(id);
1159             const HWComposer::LayerListIterator end = hwc.end(id);
1160             for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1161                 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1162             }
1163         } else {
1164             for (size_t i = 0; i < count; i++) {
1165                 currentLayers[i]->onLayerDisplayed(hw, NULL);
1166             }
1167         }
1168     }
1169
1170     mLastSwapBufferTime = systemTime() - now;
1171     mDebugInSwapBuffers = 0;
1172
1173     uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1174     if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1175         logFrameStats();
1176     }
1177 }
1178
1179 void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1180 {
1181     ATRACE_CALL();
1182
1183     // here we keep a copy of the drawing state (that is the state that's
1184     // going to be overwritten by handleTransactionLocked()) outside of
1185     // mStateLock so that the side-effects of the State assignment
1186     // don't happen with mStateLock held (which can cause deadlocks).
1187     State drawingState(mDrawingState);
1188
1189     Mutex::Autolock _l(mStateLock);
1190     const nsecs_t now = systemTime();
1191     mDebugInTransaction = now;
1192
1193     // Here we're guaranteed that some transaction flags are set
1194     // so we can call handleTransactionLocked() unconditionally.
1195     // We call getTransactionFlags(), which will also clear the flags,
1196     // with mStateLock held to guarantee that mCurrentState won't change
1197     // until the transaction is committed.
1198
1199     transactionFlags = getTransactionFlags(eTransactionMask);
1200     handleTransactionLocked(transactionFlags);
1201
1202     mLastTransactionTime = systemTime() - now;
1203     mDebugInTransaction = 0;
1204     invalidateHwcGeometry();
1205     // here the transaction has been committed
1206 }
1207
1208 void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1209 {
1210     const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
1211     const size_t count = currentLayers.size();
1212
1213     /*
1214      * Traversal of the children
1215      * (perform the transaction for each of them if needed)
1216      */
1217
1218     if (transactionFlags & eTraversalNeeded) {
1219         for (size_t i=0 ; i<count ; i++) {
1220             const sp<Layer>& layer(currentLayers[i]);
1221             uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
1222             if (!trFlags) continue;
1223
1224             const uint32_t flags = layer->doTransaction(0);
1225             if (flags & Layer::eVisibleRegion)
1226                 mVisibleRegionsDirty = true;
1227         }
1228     }
1229
1230     /*
1231      * Perform display own transactions if needed
1232      */
1233
1234     if (transactionFlags & eDisplayTransactionNeeded) {
1235         // here we take advantage of Vector's copy-on-write semantics to
1236         // improve performance by skipping the transaction entirely when
1237         // know that the lists are identical
1238         const KeyedVector<  wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1239         const KeyedVector<  wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1240         if (!curr.isIdenticalTo(draw)) {
1241             mVisibleRegionsDirty = true;
1242             const size_t cc = curr.size();
1243                   size_t dc = draw.size();
1244
1245             // find the displays that were removed
1246             // (ie: in drawing state but not in current state)
1247             // also handle displays that changed
1248             // (ie: displays that are in both lists)
1249             for (size_t i=0 ; i<dc ; i++) {
1250                 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1251                 if (j < 0) {
1252                     // in drawing state but not in current state
1253                     if (!draw[i].isMainDisplay()) {
1254                         // Call makeCurrent() on the primary display so we can
1255                         // be sure that nothing associated with this display
1256                         // is current.
1257                         const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1258                         defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1259                         sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1260                         if (hw != NULL)
1261                             hw->disconnect(getHwComposer());
1262                         if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1263                             mEventThread->onHotplugReceived(draw[i].type, false);
1264                         mDisplays.removeItem(draw.keyAt(i));
1265                     } else {
1266                         ALOGW("trying to remove the main display");
1267                     }
1268                 } else {
1269                     // this display is in both lists. see if something changed.
1270                     const DisplayDeviceState& state(curr[j]);
1271                     const wp<IBinder>& display(curr.keyAt(j));
1272                     if (state.surface->asBinder() != draw[i].surface->asBinder()) {
1273                         // changing the surface is like destroying and
1274                         // recreating the DisplayDevice, so we just remove it
1275                         // from the drawing state, so that it get re-added
1276                         // below.
1277                         sp<DisplayDevice> hw(getDisplayDevice(display));
1278                         if (hw != NULL)
1279                             hw->disconnect(getHwComposer());
1280                         mDisplays.removeItem(display);
1281                         mDrawingState.displays.removeItemsAt(i);
1282                         dc--; i--;
1283                         // at this point we must loop to the next item
1284                         continue;
1285                     }
1286
1287                     const sp<DisplayDevice> disp(getDisplayDevice(display));
1288                     if (disp != NULL) {
1289                         if (state.layerStack != draw[i].layerStack) {
1290                             disp->setLayerStack(state.layerStack);
1291                         }
1292                         if ((state.orientation != draw[i].orientation)
1293                                 || (state.viewport != draw[i].viewport)
1294                                 || (state.frame != draw[i].frame))
1295                         {
1296                             disp->setProjection(state.orientation,
1297                                     state.viewport, state.frame);
1298                         }
1299                     }
1300                 }
1301             }
1302
1303             // find displays that were added
1304             // (ie: in current state but not in drawing state)
1305             for (size_t i=0 ; i<cc ; i++) {
1306                 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1307                     const DisplayDeviceState& state(curr[i]);
1308
1309                     sp<DisplaySurface> dispSurface;
1310                     sp<IGraphicBufferProducer> producer;
1311                     sp<BufferQueue> bq = new BufferQueue(new GraphicBufferAlloc());
1312
1313                     int32_t hwcDisplayId = -1;
1314                     if (state.isVirtualDisplay()) {
1315                         // Virtual displays without a surface are dormant:
1316                         // they have external state (layer stack, projection,
1317                         // etc.) but no internal state (i.e. a DisplayDevice).
1318                         if (state.surface != NULL) {
1319
1320                             hwcDisplayId = allocateHwcDisplayId(state.type);
1321                             sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1322                                     *mHwc, hwcDisplayId, state.surface, bq,
1323                                     state.displayName);
1324
1325                             dispSurface = vds;
1326                             if (hwcDisplayId >= 0) {
1327                                 producer = vds;
1328                             } else {
1329                                 // There won't be any interaction with HWC for this virtual display,
1330                                 // so the GLES driver can pass buffers directly to the sink.
1331                                 producer = state.surface;
1332                             }
1333                         }
1334                     } else {
1335                         ALOGE_IF(state.surface!=NULL,
1336                                 "adding a supported display, but rendering "
1337                                 "surface is provided (%p), ignoring it",
1338                                 state.surface.get());
1339                         hwcDisplayId = allocateHwcDisplayId(state.type);
1340                         // for supported (by hwc) displays we provide our
1341                         // own rendering surface
1342                         dispSurface = new FramebufferSurface(*mHwc, state.type, bq);
1343                         producer = bq;
1344                     }
1345
1346                     const wp<IBinder>& display(curr.keyAt(i));
1347                     if (dispSurface != NULL) {
1348                         sp<DisplayDevice> hw = new DisplayDevice(this,
1349                                 state.type, hwcDisplayId, state.isSecure,
1350                                 display, dispSurface, producer, mEGLConfig);
1351                         hw->setLayerStack(state.layerStack);
1352                         hw->setProjection(state.orientation,
1353                                 state.viewport, state.frame);
1354                         hw->setDisplayName(state.displayName);
1355                         mDisplays.add(display, hw);
1356                         if (state.isVirtualDisplay()) {
1357                             if (hwcDisplayId >= 0) {
1358                                 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1359                                         hw->getWidth(), hw->getHeight(),
1360                                         hw->getFormat());
1361                             }
1362                         } else {
1363                             mEventThread->onHotplugReceived(state.type, true);
1364                         }
1365                     }
1366                 }
1367             }
1368         }
1369     }
1370
1371     if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1372         // The transform hint might have changed for some layers
1373         // (either because a display has changed, or because a layer
1374         // as changed).
1375         //
1376         // Walk through all the layers in currentLayers,
1377         // and update their transform hint.
1378         //
1379         // If a layer is visible only on a single display, then that
1380         // display is used to calculate the hint, otherwise we use the
1381         // default display.
1382         //
1383         // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1384         // the hint is set before we acquire a buffer from the surface texture.
1385         //
1386         // NOTE: layer transactions have taken place already, so we use their
1387         // drawing state. However, SurfaceFlinger's own transaction has not
1388         // happened yet, so we must use the current state layer list
1389         // (soon to become the drawing state list).
1390         //
1391         sp<const DisplayDevice> disp;
1392         uint32_t currentlayerStack = 0;
1393         for (size_t i=0; i<count; i++) {
1394             // NOTE: we rely on the fact that layers are sorted by
1395             // layerStack first (so we don't have to traverse the list
1396             // of displays for every layer).
1397             const sp<Layer>& layer(currentLayers[i]);
1398             uint32_t layerStack = layer->getDrawingState().layerStack;
1399             if (i==0 || currentlayerStack != layerStack) {
1400                 currentlayerStack = layerStack;
1401                 // figure out if this layerstack is mirrored
1402                 // (more than one display) if so, pick the default display,
1403                 // if not, pick the only display it's on.
1404                 disp.clear();
1405                 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1406                     sp<const DisplayDevice> hw(mDisplays[dpy]);
1407                     if (hw->getLayerStack() == currentlayerStack) {
1408                         if (disp == NULL) {
1409                             disp = hw;
1410                         } else {
1411                             disp = NULL;
1412                             break;
1413                         }
1414                     }
1415                 }
1416             }
1417             if (disp == NULL) {
1418                 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1419                 // redraw after transform hint changes. See bug 8508397.
1420
1421                 // could be null when this layer is using a layerStack
1422                 // that is not visible on any display. Also can occur at
1423                 // screen off/on times.
1424                 disp = getDefaultDisplayDevice();
1425             }
1426             layer->updateTransformHint(disp);
1427         }
1428     }
1429
1430
1431     /*
1432      * Perform our own transaction if needed
1433      */
1434
1435     const LayerVector& layers(mDrawingState.layersSortedByZ);
1436     if (currentLayers.size() > layers.size()) {
1437         // layers have been added
1438         mVisibleRegionsDirty = true;
1439     }
1440
1441     // some layers might have been removed, so
1442     // we need to update the regions they're exposing.
1443     if (mLayersRemoved) {
1444         mLayersRemoved = false;
1445         mVisibleRegionsDirty = true;
1446         const size_t count = layers.size();
1447         for (size_t i=0 ; i<count ; i++) {
1448             const sp<Layer>& layer(layers[i]);
1449             if (currentLayers.indexOf(layer) < 0) {
1450                 // this layer is not visible anymore
1451                 // TODO: we could traverse the tree from front to back and
1452                 //       compute the actual visible region
1453                 // TODO: we could cache the transformed region
1454                 const Layer::State& s(layer->getDrawingState());
1455                 Region visibleReg = s.transform.transform(
1456                         Region(Rect(s.active.w, s.active.h)));
1457                 invalidateLayerStack(s.layerStack, visibleReg);
1458             }
1459         }
1460     }
1461
1462     commitTransaction();
1463 }
1464
1465 void SurfaceFlinger::commitTransaction()
1466 {
1467     if (!mLayersPendingRemoval.isEmpty()) {
1468         // Notify removed layers now that they can't be drawn from
1469         for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) {
1470             mLayersPendingRemoval[i]->onRemoved();
1471         }
1472         mLayersPendingRemoval.clear();
1473     }
1474
1475     // If this transaction is part of a window animation then the next frame
1476     // we composite should be considered an animation as well.
1477     mAnimCompositionPending = mAnimTransactionPending;
1478
1479     mDrawingState = mCurrentState;
1480     mTransactionPending = false;
1481     mAnimTransactionPending = false;
1482     mTransactionCV.broadcast();
1483 }
1484
1485 void SurfaceFlinger::computeVisibleRegions(
1486         const LayerVector& currentLayers, uint32_t layerStack,
1487         Region& outDirtyRegion, Region& outOpaqueRegion)
1488 {
1489     ATRACE_CALL();
1490
1491     Region aboveOpaqueLayers;
1492     Region aboveCoveredLayers;
1493     Region dirty;
1494
1495     outDirtyRegion.clear();
1496
1497     size_t i = currentLayers.size();
1498     while (i--) {
1499         const sp<Layer>& layer = currentLayers[i];
1500
1501         // start with the whole surface at its current location
1502         const Layer::State& s(layer->getDrawingState());
1503
1504         // only consider the layers on the given layer stack
1505         if (s.layerStack != layerStack)
1506             continue;
1507
1508         /*
1509          * opaqueRegion: area of a surface that is fully opaque.
1510          */
1511         Region opaqueRegion;
1512
1513         /*
1514          * visibleRegion: area of a surface that is visible on screen
1515          * and not fully transparent. This is essentially the layer's
1516          * footprint minus the opaque regions above it.
1517          * Areas covered by a translucent surface are considered visible.
1518          */
1519         Region visibleRegion;
1520
1521         /*
1522          * coveredRegion: area of a surface that is covered by all
1523          * visible regions above it (which includes the translucent areas).
1524          */
1525         Region coveredRegion;
1526
1527         /*
1528          * transparentRegion: area of a surface that is hinted to be completely
1529          * transparent. This is only used to tell when the layer has no visible
1530          * non-transparent regions and can be removed from the layer list. It
1531          * does not affect the visibleRegion of this layer or any layers
1532          * beneath it. The hint may not be correct if apps don't respect the
1533          * SurfaceView restrictions (which, sadly, some don't).
1534          */
1535         Region transparentRegion;
1536
1537
1538         // handle hidden surfaces by setting the visible region to empty
1539         if (CC_LIKELY(layer->isVisible())) {
1540             const bool translucent = !layer->isOpaque();
1541             Rect bounds(s.transform.transform(layer->computeBounds()));
1542             visibleRegion.set(bounds);
1543             if (!visibleRegion.isEmpty()) {
1544                 // Remove the transparent area from the visible region
1545                 if (translucent) {
1546                     const Transform tr(s.transform);
1547                     if (tr.transformed()) {
1548                         if (tr.preserveRects()) {
1549                             // transform the transparent region
1550                             transparentRegion = tr.transform(s.activeTransparentRegion);
1551                         } else {
1552                             // transformation too complex, can't do the
1553                             // transparent region optimization.
1554                             transparentRegion.clear();
1555                         }
1556                     } else {
1557                         transparentRegion = s.activeTransparentRegion;
1558                     }
1559                 }
1560
1561                 // compute the opaque region
1562                 const int32_t layerOrientation = s.transform.getOrientation();
1563                 if (s.alpha==255 && !translucent &&
1564                         ((layerOrientation & Transform::ROT_INVALID) == false)) {
1565                     // the opaque region is the layer's footprint
1566                     opaqueRegion = visibleRegion;
1567                 }
1568             }
1569         }
1570
1571         // Clip the covered region to the visible region
1572         coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1573
1574         // Update aboveCoveredLayers for next (lower) layer
1575         aboveCoveredLayers.orSelf(visibleRegion);
1576
1577         // subtract the opaque region covered by the layers above us
1578         visibleRegion.subtractSelf(aboveOpaqueLayers);
1579
1580         // compute this layer's dirty region
1581         if (layer->contentDirty) {
1582             // we need to invalidate the whole region
1583             dirty = visibleRegion;
1584             // as well, as the old visible region
1585             dirty.orSelf(layer->visibleRegion);
1586             layer->contentDirty = false;
1587         } else {
1588             /* compute the exposed region:
1589              *   the exposed region consists of two components:
1590              *   1) what's VISIBLE now and was COVERED before
1591              *   2) what's EXPOSED now less what was EXPOSED before
1592              *
1593              * note that (1) is conservative, we start with the whole
1594              * visible region but only keep what used to be covered by
1595              * something -- which mean it may have been exposed.
1596              *
1597              * (2) handles areas that were not covered by anything but got
1598              * exposed because of a resize.
1599              */
1600             const Region newExposed = visibleRegion - coveredRegion;
1601             const Region oldVisibleRegion = layer->visibleRegion;
1602             const Region oldCoveredRegion = layer->coveredRegion;
1603             const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1604             dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1605         }
1606         dirty.subtractSelf(aboveOpaqueLayers);
1607
1608         // accumulate to the screen dirty region
1609         outDirtyRegion.orSelf(dirty);
1610
1611         // Update aboveOpaqueLayers for next (lower) layer
1612         aboveOpaqueLayers.orSelf(opaqueRegion);
1613
1614         // Store the visible region in screen space
1615         layer->setVisibleRegion(visibleRegion);
1616         layer->setCoveredRegion(coveredRegion);
1617         layer->setVisibleNonTransparentRegion(
1618                 visibleRegion.subtract(transparentRegion));
1619     }
1620
1621     outOpaqueRegion = aboveOpaqueLayers;
1622 }
1623
1624 void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
1625         const Region& dirty) {
1626     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1627         const sp<DisplayDevice>& hw(mDisplays[dpy]);
1628         if (hw->getLayerStack() == layerStack) {
1629             hw->dirtyRegion.orSelf(dirty);
1630         }
1631     }
1632 }
1633
1634 void SurfaceFlinger::handlePageFlip()
1635 {
1636     Region dirtyRegion;
1637
1638     bool visibleRegions = false;
1639     const LayerVector& layers(mDrawingState.layersSortedByZ);
1640     const size_t count = layers.size();
1641     for (size_t i=0 ; i<count ; i++) {
1642         const sp<Layer>& layer(layers[i]);
1643         const Region dirty(layer->latchBuffer(visibleRegions));
1644         const Layer::State& s(layer->getDrawingState());
1645         invalidateLayerStack(s.layerStack, dirty);
1646     }
1647
1648     mVisibleRegionsDirty |= visibleRegions;
1649 }
1650
1651 void SurfaceFlinger::invalidateHwcGeometry()
1652 {
1653     mHwWorkListDirty = true;
1654 }
1655
1656
1657 void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
1658         const Region& inDirtyRegion)
1659 {
1660     Region dirtyRegion(inDirtyRegion);
1661
1662     // compute the invalid region
1663     hw->swapRegion.orSelf(dirtyRegion);
1664
1665     uint32_t flags = hw->getFlags();
1666     if (flags & DisplayDevice::SWAP_RECTANGLE) {
1667         // we can redraw only what's dirty, but since SWAP_RECTANGLE only
1668         // takes a rectangle, we must make sure to update that whole
1669         // rectangle in that case
1670         dirtyRegion.set(hw->swapRegion.bounds());
1671     } else {
1672         if (flags & DisplayDevice::PARTIAL_UPDATES) {
1673             // We need to redraw the rectangle that will be updated
1674             // (pushed to the framebuffer).
1675             // This is needed because PARTIAL_UPDATES only takes one
1676             // rectangle instead of a region (see DisplayDevice::flip())
1677             dirtyRegion.set(hw->swapRegion.bounds());
1678         } else {
1679             // we need to redraw everything (the whole screen)
1680             dirtyRegion.set(hw->bounds());
1681             hw->swapRegion = dirtyRegion;
1682         }
1683     }
1684
1685     if (CC_LIKELY(!mDaltonize)) {
1686         doComposeSurfaces(hw, dirtyRegion);
1687     } else {
1688         RenderEngine& engine(getRenderEngine());
1689         engine.beginGroup(mDaltonizer());
1690         doComposeSurfaces(hw, dirtyRegion);
1691         engine.endGroup();
1692     }
1693
1694     // update the swap region and clear the dirty region
1695     hw->swapRegion.orSelf(dirtyRegion);
1696
1697     // swap buffers (presentation)
1698     hw->swapBuffers(getHwComposer());
1699 }
1700
1701 void SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
1702 {
1703     RenderEngine& engine(getRenderEngine());
1704     const int32_t id = hw->getHwcDisplayId();
1705     HWComposer& hwc(getHwComposer());
1706     HWComposer::LayerListIterator cur = hwc.begin(id);
1707     const HWComposer::LayerListIterator end = hwc.end(id);
1708
1709     bool hasGlesComposition = hwc.hasGlesComposition(id);
1710     if (hasGlesComposition) {
1711         if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
1712             ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
1713                   hw->getDisplayName().string());
1714             return;
1715         }
1716
1717         // Never touch the framebuffer if we don't have any framebuffer layers
1718         const bool hasHwcComposition = hwc.hasHwcComposition(id);
1719         if (hasHwcComposition) {
1720             // when using overlays, we assume a fully transparent framebuffer
1721             // NOTE: we could reduce how much we need to clear, for instance
1722             // remove where there are opaque FB layers. however, on some
1723             // GPUs doing a "clean slate" clear might be more efficient.
1724             // We'll revisit later if needed.
1725             engine.clearWithColor(0, 0, 0, 0);
1726         } else {
1727             // we start with the whole screen area
1728             const Region bounds(hw->getBounds());
1729
1730             // we remove the scissor part
1731             // we're left with the letterbox region
1732             // (common case is that letterbox ends-up being empty)
1733             const Region letterbox(bounds.subtract(hw->getScissor()));
1734
1735             // compute the area to clear
1736             Region region(hw->undefinedRegion.merge(letterbox));
1737
1738             // but limit it to the dirty region
1739             region.andSelf(dirty);
1740
1741             // screen is already cleared here
1742             if (!region.isEmpty()) {
1743                 // can happen with SurfaceView
1744                 drawWormhole(hw, region);
1745             }
1746         }
1747
1748         if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
1749             // just to be on the safe side, we don't set the
1750             // scissor on the main display. It should never be needed
1751             // anyways (though in theory it could since the API allows it).
1752             const Rect& bounds(hw->getBounds());
1753             const Rect& scissor(hw->getScissor());
1754             if (scissor != bounds) {
1755                 // scissor doesn't match the screen's dimensions, so we
1756                 // need to clear everything outside of it and enable
1757                 // the GL scissor so we don't draw anything where we shouldn't
1758
1759                 // enable scissor for this frame
1760                 const uint32_t height = hw->getHeight();
1761                 engine.setScissor(scissor.left, height - scissor.bottom,
1762                         scissor.getWidth(), scissor.getHeight());
1763             }
1764         }
1765     }
1766
1767     /*
1768      * and then, render the layers targeted at the framebuffer
1769      */
1770
1771     const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
1772     const size_t count = layers.size();
1773     const Transform& tr = hw->getTransform();
1774     if (cur != end) {
1775         // we're using h/w composer
1776         for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
1777             const sp<Layer>& layer(layers[i]);
1778             const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
1779             if (!clip.isEmpty()) {
1780                 switch (cur->getCompositionType()) {
1781                     case HWC_OVERLAY: {
1782                         const Layer::State& state(layer->getDrawingState());
1783                         if ((cur->getHints() & HWC_HINT_CLEAR_FB)
1784                                 && i
1785                                 && layer->isOpaque() && (state.alpha == 0xFF)
1786                                 && hasGlesComposition) {
1787                             // never clear the very first layer since we're
1788                             // guaranteed the FB is already cleared
1789                             layer->clearWithOpenGL(hw, clip);
1790                         }
1791                         break;
1792                     }
1793                     case HWC_FRAMEBUFFER: {
1794                         layer->draw(hw, clip);
1795                         break;
1796                     }
1797                     case HWC_FRAMEBUFFER_TARGET: {
1798                         // this should not happen as the iterator shouldn't
1799                         // let us get there.
1800                         ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%d)", i);
1801                         break;
1802                     }
1803                 }
1804             }
1805             layer->setAcquireFence(hw, *cur);
1806         }
1807     } else {
1808         // we're not using h/w composer
1809         for (size_t i=0 ; i<count ; ++i) {
1810             const sp<Layer>& layer(layers[i]);
1811             const Region clip(dirty.intersect(
1812                     tr.transform(layer->visibleRegion)));
1813             if (!clip.isEmpty()) {
1814                 layer->draw(hw, clip);
1815             }
1816         }
1817     }
1818
1819     // disable scissor at the end of the frame
1820     engine.disableScissor();
1821 }
1822
1823 void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
1824     const int32_t height = hw->getHeight();
1825     RenderEngine& engine(getRenderEngine());
1826     engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
1827 }
1828
1829 void SurfaceFlinger::addClientLayer(const sp<Client>& client,
1830         const sp<IBinder>& handle,
1831         const sp<IGraphicBufferProducer>& gbc,
1832         const sp<Layer>& lbc)
1833 {
1834     // attach this layer to the client
1835     client->attachLayer(handle, lbc);
1836
1837     // add this layer to the current state list
1838     Mutex::Autolock _l(mStateLock);
1839     mCurrentState.layersSortedByZ.add(lbc);
1840     mGraphicBufferProducerList.add(gbc->asBinder());
1841 }
1842
1843 status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
1844     Mutex::Autolock _l(mStateLock);
1845     ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
1846     if (index >= 0) {
1847         mLayersPendingRemoval.push(layer);
1848         mLayersRemoved = true;
1849         setTransactionFlags(eTransactionNeeded);
1850         return NO_ERROR;
1851     }
1852     return status_t(index);
1853 }
1854
1855 uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t flags) {
1856     return android_atomic_release_load(&mTransactionFlags);
1857 }
1858
1859 uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
1860     return android_atomic_and(~flags, &mTransactionFlags) & flags;
1861 }
1862
1863 uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
1864     uint32_t old = android_atomic_or(flags, &mTransactionFlags);
1865     if ((old & flags)==0) { // wake the server up
1866         signalTransaction();
1867     }
1868     return old;
1869 }
1870
1871 void SurfaceFlinger::setTransactionState(
1872         const Vector<ComposerState>& state,
1873         const Vector<DisplayState>& displays,
1874         uint32_t flags)
1875 {
1876     ATRACE_CALL();
1877     Mutex::Autolock _l(mStateLock);
1878     uint32_t transactionFlags = 0;
1879
1880     if (flags & eAnimation) {
1881         // For window updates that are part of an animation we must wait for
1882         // previous animation "frames" to be handled.
1883         while (mAnimTransactionPending) {
1884             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
1885             if (CC_UNLIKELY(err != NO_ERROR)) {
1886                 // just in case something goes wrong in SF, return to the
1887                 // caller after a few seconds.
1888                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
1889                         "waiting for previous animation frame");
1890                 mAnimTransactionPending = false;
1891                 break;
1892             }
1893         }
1894     }
1895
1896     size_t count = displays.size();
1897     for (size_t i=0 ; i<count ; i++) {
1898         const DisplayState& s(displays[i]);
1899         transactionFlags |= setDisplayStateLocked(s);
1900     }
1901
1902     count = state.size();
1903     for (size_t i=0 ; i<count ; i++) {
1904         const ComposerState& s(state[i]);
1905         // Here we need to check that the interface we're given is indeed
1906         // one of our own. A malicious client could give us a NULL
1907         // IInterface, or one of its own or even one of our own but a
1908         // different type. All these situations would cause us to crash.
1909         //
1910         // NOTE: it would be better to use RTTI as we could directly check
1911         // that we have a Client*. however, RTTI is disabled in Android.
1912         if (s.client != NULL) {
1913             sp<IBinder> binder = s.client->asBinder();
1914             if (binder != NULL) {
1915                 String16 desc(binder->getInterfaceDescriptor());
1916                 if (desc == ISurfaceComposerClient::descriptor) {
1917                     sp<Client> client( static_cast<Client *>(s.client.get()) );
1918                     transactionFlags |= setClientStateLocked(client, s.state);
1919                 }
1920             }
1921         }
1922     }
1923
1924     if (transactionFlags) {
1925         // this triggers the transaction
1926         setTransactionFlags(transactionFlags);
1927
1928         // if this is a synchronous transaction, wait for it to take effect
1929         // before returning.
1930         if (flags & eSynchronous) {
1931             mTransactionPending = true;
1932         }
1933         if (flags & eAnimation) {
1934             mAnimTransactionPending = true;
1935         }
1936         while (mTransactionPending) {
1937             status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
1938             if (CC_UNLIKELY(err != NO_ERROR)) {
1939                 // just in case something goes wrong in SF, return to the
1940                 // called after a few seconds.
1941                 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
1942                 mTransactionPending = false;
1943                 break;
1944             }
1945         }
1946     }
1947 }
1948
1949 uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
1950 {
1951     ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
1952     if (dpyIdx < 0)
1953         return 0;
1954
1955     uint32_t flags = 0;
1956     DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
1957     if (disp.isValid()) {
1958         const uint32_t what = s.what;
1959         if (what & DisplayState::eSurfaceChanged) {
1960             if (disp.surface->asBinder() != s.surface->asBinder()) {
1961                 disp.surface = s.surface;
1962                 flags |= eDisplayTransactionNeeded;
1963             }
1964         }
1965         if (what & DisplayState::eLayerStackChanged) {
1966             if (disp.layerStack != s.layerStack) {
1967                 disp.layerStack = s.layerStack;
1968                 flags |= eDisplayTransactionNeeded;
1969             }
1970         }
1971         if (what & DisplayState::eDisplayProjectionChanged) {
1972             if (disp.orientation != s.orientation) {
1973                 disp.orientation = s.orientation;
1974                 flags |= eDisplayTransactionNeeded;
1975             }
1976             if (disp.frame != s.frame) {
1977                 disp.frame = s.frame;
1978                 flags |= eDisplayTransactionNeeded;
1979             }
1980             if (disp.viewport != s.viewport) {
1981                 disp.viewport = s.viewport;
1982                 flags |= eDisplayTransactionNeeded;
1983             }
1984         }
1985     }
1986     return flags;
1987 }
1988
1989 uint32_t SurfaceFlinger::setClientStateLocked(
1990         const sp<Client>& client,
1991         const layer_state_t& s)
1992 {
1993     uint32_t flags = 0;
1994     sp<Layer> layer(client->getLayerUser(s.surface));
1995     if (layer != 0) {
1996         const uint32_t what = s.what;
1997         if (what & layer_state_t::ePositionChanged) {
1998             if (layer->setPosition(s.x, s.y))
1999                 flags |= eTraversalNeeded;
2000         }
2001         if (what & layer_state_t::eLayerChanged) {
2002             // NOTE: index needs to be calculated before we update the state
2003             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2004             if (layer->setLayer(s.z)) {
2005                 mCurrentState.layersSortedByZ.removeAt(idx);
2006                 mCurrentState.layersSortedByZ.add(layer);
2007                 // we need traversal (state changed)
2008                 // AND transaction (list changed)
2009                 flags |= eTransactionNeeded|eTraversalNeeded;
2010             }
2011         }
2012         if (what & layer_state_t::eSizeChanged) {
2013             if (layer->setSize(s.w, s.h)) {
2014                 flags |= eTraversalNeeded;
2015             }
2016         }
2017         if (what & layer_state_t::eAlphaChanged) {
2018             if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2019                 flags |= eTraversalNeeded;
2020         }
2021         if (what & layer_state_t::eMatrixChanged) {
2022             if (layer->setMatrix(s.matrix))
2023                 flags |= eTraversalNeeded;
2024         }
2025         if (what & layer_state_t::eTransparentRegionChanged) {
2026             if (layer->setTransparentRegionHint(s.transparentRegion))
2027                 flags |= eTraversalNeeded;
2028         }
2029         if (what & layer_state_t::eVisibilityChanged) {
2030             if (layer->setFlags(s.flags, s.mask))
2031                 flags |= eTraversalNeeded;
2032         }
2033         if (what & layer_state_t::eCropChanged) {
2034             if (layer->setCrop(s.crop))
2035                 flags |= eTraversalNeeded;
2036         }
2037         if (what & layer_state_t::eLayerStackChanged) {
2038             // NOTE: index needs to be calculated before we update the state
2039             ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2040             if (layer->setLayerStack(s.layerStack)) {
2041                 mCurrentState.layersSortedByZ.removeAt(idx);
2042                 mCurrentState.layersSortedByZ.add(layer);
2043                 // we need traversal (state changed)
2044                 // AND transaction (list changed)
2045                 flags |= eTransactionNeeded|eTraversalNeeded;
2046             }
2047         }
2048     }
2049     return flags;
2050 }
2051
2052 status_t SurfaceFlinger::createLayer(
2053         const String8& name,
2054         const sp<Client>& client,
2055         uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
2056         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
2057 {
2058     //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
2059     if (int32_t(w|h) < 0) {
2060         ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2061                 int(w), int(h));
2062         return BAD_VALUE;
2063     }
2064
2065     status_t result = NO_ERROR;
2066
2067     sp<Layer> layer;
2068
2069     switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2070         case ISurfaceComposerClient::eFXSurfaceNormal:
2071             result = createNormalLayer(client,
2072                     name, w, h, flags, format,
2073                     handle, gbp, &layer);
2074             break;
2075         case ISurfaceComposerClient::eFXSurfaceDim:
2076             result = createDimLayer(client,
2077                     name, w, h, flags,
2078                     handle, gbp, &layer);
2079             break;
2080         default:
2081             result = BAD_VALUE;
2082             break;
2083     }
2084
2085     if (result == NO_ERROR) {
2086         addClientLayer(client, *handle, *gbp, layer);
2087         setTransactionFlags(eTransactionNeeded);
2088     }
2089     return result;
2090 }
2091
2092 status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2093         const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2094         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2095 {
2096     // initialize the surfaces
2097     switch (format) {
2098     case PIXEL_FORMAT_TRANSPARENT:
2099     case PIXEL_FORMAT_TRANSLUCENT:
2100         format = PIXEL_FORMAT_RGBA_8888;
2101         break;
2102     case PIXEL_FORMAT_OPAQUE:
2103 #ifdef NO_RGBX_8888
2104         format = PIXEL_FORMAT_RGB_565;
2105 #else
2106         format = PIXEL_FORMAT_RGBX_8888;
2107 #endif
2108         break;
2109     }
2110
2111 #ifdef NO_RGBX_8888
2112     if (format == PIXEL_FORMAT_RGBX_8888)
2113         format = PIXEL_FORMAT_RGBA_8888;
2114 #endif
2115
2116     *outLayer = new Layer(this, client, name, w, h, flags);
2117     status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2118     if (err == NO_ERROR) {
2119         *handle = (*outLayer)->getHandle();
2120         *gbp = (*outLayer)->getBufferQueue();
2121     }
2122
2123     ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2124     return err;
2125 }
2126
2127 status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2128         const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2129         sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2130 {
2131     *outLayer = new LayerDim(this, client, name, w, h, flags);
2132     *handle = (*outLayer)->getHandle();
2133     *gbp = (*outLayer)->getBufferQueue();
2134     return NO_ERROR;
2135 }
2136
2137 status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2138 {
2139     // called by the window manager when it wants to remove a Layer
2140     status_t err = NO_ERROR;
2141     sp<Layer> l(client->getLayerUser(handle));
2142     if (l != NULL) {
2143         err = removeLayer(l);
2144         ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2145                 "error removing layer=%p (%s)", l.get(), strerror(-err));
2146     }
2147     return err;
2148 }
2149
2150 status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2151 {
2152     // called by ~LayerCleaner() when all references to the IBinder (handle)
2153     // are gone
2154     status_t err = NO_ERROR;
2155     sp<Layer> l(layer.promote());
2156     if (l != NULL) {
2157         err = removeLayer(l);
2158         ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2159                 "error removing layer=%p (%s)", l.get(), strerror(-err));
2160     }
2161     return err;
2162 }
2163
2164 // ---------------------------------------------------------------------------
2165
2166 void SurfaceFlinger::onInitializeDisplays() {
2167     // reset screen orientation and use primary layer stack
2168     Vector<ComposerState> state;
2169     Vector<DisplayState> displays;
2170     DisplayState d;
2171     d.what = DisplayState::eDisplayProjectionChanged |
2172              DisplayState::eLayerStackChanged;
2173     d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2174     d.layerStack = 0;
2175     d.orientation = DisplayState::eOrientationDefault;
2176     d.frame.makeInvalid();
2177     d.viewport.makeInvalid();
2178     displays.add(d);
2179     setTransactionState(state, displays, 0);
2180     onScreenAcquired(getDefaultDisplayDevice());
2181
2182     const nsecs_t period =
2183             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2184     mAnimFrameTracker.setDisplayRefreshPeriod(period);
2185 }
2186
2187 void SurfaceFlinger::initializeDisplays() {
2188     class MessageScreenInitialized : public MessageBase {
2189         SurfaceFlinger* flinger;
2190     public:
2191         MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2192         virtual bool handler() {
2193             flinger->onInitializeDisplays();
2194             return true;
2195         }
2196     };
2197     sp<MessageBase> msg = new MessageScreenInitialized(this);
2198     postMessageAsync(msg);  // we may be called from main thread, use async message
2199 }
2200
2201
2202 void SurfaceFlinger::onScreenAcquired(const sp<const DisplayDevice>& hw) {
2203     ALOGD("Screen acquired, type=%d flinger=%p", hw->getDisplayType(), this);
2204     if (hw->isScreenAcquired()) {
2205         // this is expected, e.g. when power manager wakes up during boot
2206         ALOGD(" screen was previously acquired");
2207         return;
2208     }
2209
2210     hw->acquireScreen();
2211     int32_t type = hw->getDisplayType();
2212     if (type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2213         // built-in display, tell the HWC
2214         getHwComposer().acquire(type);
2215
2216         if (type == DisplayDevice::DISPLAY_PRIMARY) {
2217             // FIXME: eventthread only knows about the main display right now
2218             mEventThread->onScreenAcquired();
2219
2220             resyncToHardwareVsync(true);
2221         }
2222     }
2223     mVisibleRegionsDirty = true;
2224     repaintEverything();
2225 }
2226
2227 void SurfaceFlinger::onScreenReleased(const sp<const DisplayDevice>& hw) {
2228     ALOGD("Screen released, type=%d flinger=%p", hw->getDisplayType(), this);
2229     if (!hw->isScreenAcquired()) {
2230         ALOGD(" screen was previously released");
2231         return;
2232     }
2233
2234     hw->releaseScreen();
2235     int32_t type = hw->getDisplayType();
2236     if (type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2237         if (type == DisplayDevice::DISPLAY_PRIMARY) {
2238             disableHardwareVsync(true); // also cancels any in-progress resync
2239
2240             // FIXME: eventthread only knows about the main display right now
2241             mEventThread->onScreenReleased();
2242         }
2243
2244         // built-in display, tell the HWC
2245         getHwComposer().release(type);
2246     }
2247     mVisibleRegionsDirty = true;
2248     // from this point on, SF will stop drawing on this display
2249 }
2250
2251 void SurfaceFlinger::unblank(const sp<IBinder>& display) {
2252     class MessageScreenAcquired : public MessageBase {
2253         SurfaceFlinger& mFlinger;
2254         sp<IBinder> mDisplay;
2255     public:
2256         MessageScreenAcquired(SurfaceFlinger& flinger,
2257                 const sp<IBinder>& disp) : mFlinger(flinger), mDisplay(disp) { }
2258         virtual bool handler() {
2259             const sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2260             if (hw == NULL) {
2261                 ALOGE("Attempt to unblank null display %p", mDisplay.get());
2262             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2263                 ALOGW("Attempt to unblank virtual display");
2264             } else {
2265                 mFlinger.onScreenAcquired(hw);
2266             }
2267             return true;
2268         }
2269     };
2270     sp<MessageBase> msg = new MessageScreenAcquired(*this, display);
2271     postMessageSync(msg);
2272 }
2273
2274 void SurfaceFlinger::blank(const sp<IBinder>& display) {
2275     class MessageScreenReleased : public MessageBase {
2276         SurfaceFlinger& mFlinger;
2277         sp<IBinder> mDisplay;
2278     public:
2279         MessageScreenReleased(SurfaceFlinger& flinger,
2280                 const sp<IBinder>& disp) : mFlinger(flinger), mDisplay(disp) { }
2281         virtual bool handler() {
2282             const sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2283             if (hw == NULL) {
2284                 ALOGE("Attempt to blank null display %p", mDisplay.get());
2285             } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2286                 ALOGW("Attempt to blank virtual display");
2287             } else {
2288                 mFlinger.onScreenReleased(hw);
2289             }
2290             return true;
2291         }
2292     };
2293     sp<MessageBase> msg = new MessageScreenReleased(*this, display);
2294     postMessageSync(msg);
2295 }
2296
2297 // ---------------------------------------------------------------------------
2298
2299 status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2300 {
2301     String8 result;
2302
2303     IPCThreadState* ipc = IPCThreadState::self();
2304     const int pid = ipc->getCallingPid();
2305     const int uid = ipc->getCallingUid();
2306     if ((uid != AID_SHELL) &&
2307             !PermissionCache::checkPermission(sDump, pid, uid)) {
2308         result.appendFormat("Permission Denial: "
2309                 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2310     } else {
2311         // Try to get the main lock, but don't insist if we can't
2312         // (this would indicate SF is stuck, but we want to be able to
2313         // print something in dumpsys).
2314         int retry = 3;
2315         while (mStateLock.tryLock()<0 && --retry>=0) {
2316             usleep(1000000);
2317         }
2318         const bool locked(retry >= 0);
2319         if (!locked) {
2320             result.append(
2321                     "SurfaceFlinger appears to be unresponsive, "
2322                     "dumping anyways (no locks held)\n");
2323         }
2324
2325         bool dumpAll = true;
2326         size_t index = 0;
2327         size_t numArgs = args.size();
2328         if (numArgs) {
2329             if ((index < numArgs) &&
2330                     (args[index] == String16("--list"))) {
2331                 index++;
2332                 listLayersLocked(args, index, result);
2333                 dumpAll = false;
2334             }
2335
2336             if ((index < numArgs) &&
2337                     (args[index] == String16("--latency"))) {
2338                 index++;
2339                 dumpStatsLocked(args, index, result);
2340                 dumpAll = false;
2341             }
2342
2343             if ((index < numArgs) &&
2344                     (args[index] == String16("--latency-clear"))) {
2345                 index++;
2346                 clearStatsLocked(args, index, result);
2347                 dumpAll = false;
2348             }
2349         }
2350
2351         if (dumpAll) {
2352             dumpAllLocked(args, index, result);
2353         }
2354
2355         if (locked) {
2356             mStateLock.unlock();
2357         }
2358     }
2359     write(fd, result.string(), result.size());
2360     return NO_ERROR;
2361 }
2362
2363 void SurfaceFlinger::listLayersLocked(const Vector<String16>& args, size_t& index,
2364         String8& result) const
2365 {
2366     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2367     const size_t count = currentLayers.size();
2368     for (size_t i=0 ; i<count ; i++) {
2369         const sp<Layer>& layer(currentLayers[i]);
2370         result.appendFormat("%s\n", layer->getName().string());
2371     }
2372 }
2373
2374 void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2375         String8& result) const
2376 {
2377     String8 name;
2378     if (index < args.size()) {
2379         name = String8(args[index]);
2380         index++;
2381     }
2382
2383     const nsecs_t period =
2384             getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2385     result.appendFormat("%lld\n", period);
2386
2387     if (name.isEmpty()) {
2388         mAnimFrameTracker.dump(result);
2389     } else {
2390         const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2391         const size_t count = currentLayers.size();
2392         for (size_t i=0 ; i<count ; i++) {
2393             const sp<Layer>& layer(currentLayers[i]);
2394             if (name == layer->getName()) {
2395                 layer->dumpStats(result);
2396             }
2397         }
2398     }
2399 }
2400
2401 void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2402         String8& result)
2403 {
2404     String8 name;
2405     if (index < args.size()) {
2406         name = String8(args[index]);
2407         index++;
2408     }
2409
2410     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2411     const size_t count = currentLayers.size();
2412     for (size_t i=0 ; i<count ; i++) {
2413         const sp<Layer>& layer(currentLayers[i]);
2414         if (name.isEmpty() || (name == layer->getName())) {
2415             layer->clearStats();
2416         }
2417     }
2418
2419     mAnimFrameTracker.clear();
2420 }
2421
2422 // This should only be called from the main thread.  Otherwise it would need
2423 // the lock and should use mCurrentState rather than mDrawingState.
2424 void SurfaceFlinger::logFrameStats() {
2425     const LayerVector& drawingLayers = mDrawingState.layersSortedByZ;
2426     const size_t count = drawingLayers.size();
2427     for (size_t i=0 ; i<count ; i++) {
2428         const sp<Layer>& layer(drawingLayers[i]);
2429         layer->logFrameStats();
2430     }
2431
2432     mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2433 }
2434
2435 /*static*/ void SurfaceFlinger::appendSfConfigString(String8& result)
2436 {
2437     static const char* config =
2438             " [sf"
2439 #ifdef NO_RGBX_8888
2440             " NO_RGBX_8888"
2441 #endif
2442 #ifdef HAS_CONTEXT_PRIORITY
2443             " HAS_CONTEXT_PRIORITY"
2444 #endif
2445 #ifdef NEVER_DEFAULT_TO_ASYNC_MODE
2446             " NEVER_DEFAULT_TO_ASYNC_MODE"
2447 #endif
2448 #ifdef TARGET_DISABLE_TRIPLE_BUFFERING
2449             " TARGET_DISABLE_TRIPLE_BUFFERING"
2450 #endif
2451             "]";
2452     result.append(config);
2453 }
2454
2455 void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
2456         String8& result) const
2457 {
2458     bool colorize = false;
2459     if (index < args.size()
2460             && (args[index] == String16("--color"))) {
2461         colorize = true;
2462         index++;
2463     }
2464
2465     Colorizer colorizer(colorize);
2466
2467     // figure out if we're stuck somewhere
2468     const nsecs_t now = systemTime();
2469     const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
2470     const nsecs_t inTransaction(mDebugInTransaction);
2471     nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
2472     nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
2473
2474     /*
2475      * Dump library configuration.
2476      */
2477
2478     colorizer.bold(result);
2479     result.append("Build configuration:");
2480     colorizer.reset(result);
2481     appendSfConfigString(result);
2482     appendUiConfigString(result);
2483     appendGuiConfigString(result);
2484     result.append("\n");
2485
2486     colorizer.bold(result);
2487     result.append("Sync configuration: ");
2488     colorizer.reset(result);
2489     result.append(SyncFeatures::getInstance().toString());
2490     result.append("\n");
2491
2492     /*
2493      * Dump the visible layer list
2494      */
2495     const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2496     const size_t count = currentLayers.size();
2497     colorizer.bold(result);
2498     result.appendFormat("Visible layers (count = %d)\n", count);
2499     colorizer.reset(result);
2500     for (size_t i=0 ; i<count ; i++) {
2501         const sp<Layer>& layer(currentLayers[i]);
2502         layer->dump(result, colorizer);
2503     }
2504
2505     /*
2506      * Dump Display state
2507      */
2508
2509     colorizer.bold(result);
2510     result.appendFormat("Displays (%d entries)\n", mDisplays.size());
2511     colorizer.reset(result);
2512     for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2513         const sp<const DisplayDevice>& hw(mDisplays[dpy]);
2514         hw->dump(result);
2515     }
2516
2517     /*
2518      * Dump SurfaceFlinger global state
2519      */
2520
2521     colorizer.bold(result);
2522     result.append("SurfaceFlinger global state:\n");
2523     colorizer.reset(result);
2524
2525     HWComposer& hwc(getHwComposer());
2526     sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2527
2528     colorizer.bold(result);
2529     result.appendFormat("EGL implementation : %s\n",
2530             eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
2531     colorizer.reset(result);
2532     result.appendFormat("%s\n",
2533             eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
2534
2535     mRenderEngine->dump(result);
2536
2537     hw->undefinedRegion.dump(result, "undefinedRegion");
2538     result.appendFormat("  orientation=%d, canDraw=%d\n",
2539             hw->getOrientation(), hw->canDraw());
2540     result.appendFormat(
2541             "  last eglSwapBuffers() time: %f us\n"
2542             "  last transaction time     : %f us\n"
2543             "  transaction-flags         : %08x\n"
2544             "  refresh-rate              : %f fps\n"
2545             "  x-dpi                     : %f\n"
2546             "  y-dpi                     : %f\n"
2547             "  EGL_NATIVE_VISUAL_ID      : %d\n"
2548             "  gpu_to_cpu_unsupported    : %d\n"
2549             ,
2550             mLastSwapBufferTime/1000.0,
2551             mLastTransactionTime/1000.0,
2552             mTransactionFlags,
2553             1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
2554             hwc.getDpiX(HWC_DISPLAY_PRIMARY),
2555             hwc.getDpiY(HWC_DISPLAY_PRIMARY),
2556             mEGLNativeVisualId,
2557             !mGpuToCpuSupported);
2558
2559     result.appendFormat("  eglSwapBuffers time: %f us\n",
2560             inSwapBuffersDuration/1000.0);
2561
2562     result.appendFormat("  transaction time: %f us\n",
2563             inTransactionDuration/1000.0);
2564
2565     /*
2566      * VSYNC state
2567      */
2568     mEventThread->dump(result);
2569
2570     /*
2571      * Dump HWComposer state
2572      */
2573     colorizer.bold(result);
2574     result.append("h/w composer state:\n");
2575     colorizer.reset(result);
2576     result.appendFormat("  h/w composer %s and %s\n",
2577             hwc.initCheck()==NO_ERROR ? "present" : "not present",
2578                     (mDebugDisableHWC || mDebugRegion || mDaltonize) ? "disabled" : "enabled");
2579     hwc.dump(result);
2580
2581     /*
2582      * Dump gralloc state
2583      */
2584     const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
2585     alloc.dump(result);
2586 }
2587
2588 const Vector< sp<Layer> >&
2589 SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
2590     // Note: mStateLock is held here
2591     wp<IBinder> dpy;
2592     for (size_t i=0 ; i<mDisplays.size() ; i++) {
2593         if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
2594             dpy = mDisplays.keyAt(i);
2595             break;
2596         }
2597     }
2598     if (dpy == NULL) {
2599         ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
2600         // Just use the primary display so we have something to return
2601         dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
2602     }
2603     return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
2604 }
2605
2606 bool SurfaceFlinger::startDdmConnection()
2607 {
2608     void* libddmconnection_dso =
2609             dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
2610     if (!libddmconnection_dso) {
2611         return false;
2612     }
2613     void (*DdmConnection_start)(const char* name);
2614     DdmConnection_start =
2615             (typeof DdmConnection_start)dlsym(libddmconnection_dso, "DdmConnection_start");
2616     if (!DdmConnection_start) {
2617         dlclose(libddmconnection_dso);
2618         return false;
2619     }
2620     (*DdmConnection_start)(getServiceName());
2621     return true;
2622 }
2623
2624 status_t SurfaceFlinger::onTransact(
2625     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2626 {
2627     switch (code) {
2628         case CREATE_CONNECTION:
2629         case CREATE_DISPLAY:
2630         case SET_TRANSACTION_STATE:
2631         case BOOT_FINISHED:
2632         case BLANK:
2633         case UNBLANK:
2634         {
2635             // codes that require permission check
2636             IPCThreadState* ipc = IPCThreadState::self();
2637             const int pid = ipc->getCallingPid();
2638             const int uid = ipc->getCallingUid();
2639             if ((uid != AID_GRAPHICS) &&
2640                     !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
2641                 ALOGE("Permission Denial: "
2642                         "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2643                 return PERMISSION_DENIED;
2644             }
2645             break;
2646         }
2647         case CAPTURE_SCREEN:
2648         {
2649             // codes that require permission check
2650             IPCThreadState* ipc = IPCThreadState::self();
2651             const int pid = ipc->getCallingPid();
2652             const int uid = ipc->getCallingUid();
2653             if ((uid != AID_GRAPHICS) &&
2654                     !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
2655                 ALOGE("Permission Denial: "
2656                         "can't read framebuffer pid=%d, uid=%d", pid, uid);
2657                 return PERMISSION_DENIED;
2658             }
2659             break;
2660         }
2661     }
2662
2663     status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
2664     if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
2665         CHECK_INTERFACE(ISurfaceComposer, data, reply);
2666         if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
2667             IPCThreadState* ipc = IPCThreadState::self();
2668             const int pid = ipc->getCallingPid();
2669             const int uid = ipc->getCallingUid();
2670             ALOGE("Permission Denial: "
2671                     "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2672             return PERMISSION_DENIED;
2673         }
2674         int n;
2675         switch (code) {
2676             case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
2677             case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
2678                 return NO_ERROR;
2679             case 1002:  // SHOW_UPDATES
2680                 n = data.readInt32();
2681                 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
2682                 invalidateHwcGeometry();
2683                 repaintEverything();
2684                 return NO_ERROR;
2685             case 1004:{ // repaint everything
2686                 repaintEverything();
2687                 return NO_ERROR;
2688             }
2689             case 1005:{ // force transaction
2690                 setTransactionFlags(
2691                         eTransactionNeeded|
2692                         eDisplayTransactionNeeded|
2693                         eTraversalNeeded);
2694                 return NO_ERROR;
2695             }
2696             case 1006:{ // send empty update
2697                 signalRefresh();
2698                 return NO_ERROR;
2699             }
2700             case 1008:  // toggle use of hw composer
2701                 n = data.readInt32();
2702                 mDebugDisableHWC = n ? 1 : 0;
2703                 invalidateHwcGeometry();
2704                 repaintEverything();
2705                 return NO_ERROR;
2706             case 1009:  // toggle use of transform hint
2707                 n = data.readInt32();
2708                 mDebugDisableTransformHint = n ? 1 : 0;
2709                 invalidateHwcGeometry();
2710                 repaintEverything();
2711                 return NO_ERROR;
2712             case 1010:  // interrogate.
2713                 reply->writeInt32(0);
2714                 reply->writeInt32(0);
2715                 reply->writeInt32(mDebugRegion);
2716                 reply->writeInt32(0);
2717                 reply->writeInt32(mDebugDisableHWC);
2718                 return NO_ERROR;
2719             case 1013: {
2720                 Mutex::Autolock _l(mStateLock);
2721                 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2722                 reply->writeInt32(hw->getPageFlipCount());
2723                 return NO_ERROR;
2724             }
2725             case 1014: {
2726                 // daltonize
2727                 n = data.readInt32();
2728                 switch (n % 10) {
2729                     case 1: mDaltonizer.setType(Daltonizer::protanomaly);   break;
2730                     case 2: mDaltonizer.setType(Daltonizer::deuteranomaly); break;
2731                     case 3: mDaltonizer.setType(Daltonizer::tritanomaly);   break;
2732                 }
2733                 if (n >= 10) {
2734                     mDaltonizer.setMode(Daltonizer::correction);
2735                 } else {
2736                     mDaltonizer.setMode(Daltonizer::simulation);
2737                 }
2738                 mDaltonize = n > 0;
2739                 invalidateHwcGeometry();
2740                 repaintEverything();
2741             }
2742             return NO_ERROR;
2743         }
2744     }
2745     return err;
2746 }
2747
2748 void SurfaceFlinger::repaintEverything() {
2749     android_atomic_or(1, &mRepaintEverything);
2750     signalTransaction();
2751 }
2752
2753 // ---------------------------------------------------------------------------
2754 // Capture screen into an IGraphiBufferProducer
2755 // ---------------------------------------------------------------------------
2756
2757 /* The code below is here to handle b/8734824
2758  *
2759  * We create a IGraphicBufferProducer wrapper that forwards all calls
2760  * to the calling binder thread, where they are executed. This allows
2761  * the calling thread to be reused (on the other side) and not
2762  * depend on having "enough" binder threads to handle the requests.
2763  *
2764  */
2765
2766 class GraphicProducerWrapper : public BBinder, public MessageHandler {
2767     sp<IGraphicBufferProducer> impl;
2768     sp<Looper> looper;
2769     status_t result;
2770     bool exitPending;
2771     bool exitRequested;
2772     mutable Barrier barrier;
2773     volatile int32_t memoryBarrier;
2774     uint32_t code;
2775     Parcel const* data;
2776     Parcel* reply;
2777
2778     enum {
2779         MSG_API_CALL,
2780         MSG_EXIT
2781     };
2782
2783     /*
2784      * this is called by our "fake" BpGraphicBufferProducer. We package the
2785      * data and reply Parcel and forward them to the calling thread.
2786      */
2787     virtual status_t transact(uint32_t code,
2788             const Parcel& data, Parcel* reply, uint32_t flags) {
2789         this->code = code;
2790         this->data = &data;
2791         this->reply = reply;
2792         android_atomic_acquire_store(0, &memoryBarrier);
2793         if (exitPending) {
2794             // if we've exited, we run the message synchronously right here
2795             handleMessage(Message(MSG_API_CALL));
2796         } else {
2797             barrier.close();
2798             looper->sendMessage(this, Message(MSG_API_CALL));
2799             barrier.wait();
2800         }
2801         return NO_ERROR;
2802     }
2803
2804     /*
2805      * here we run on the binder calling thread. All we've got to do is
2806      * call the real BpGraphicBufferProducer.
2807      */
2808     virtual void handleMessage(const Message& message) {
2809         android_atomic_release_load(&memoryBarrier);
2810         if (message.what == MSG_API_CALL) {
2811             impl->asBinder()->transact(code, data[0], reply);
2812             barrier.open();
2813         } else if (message.what == MSG_EXIT) {
2814             exitRequested = true;
2815         }
2816     }
2817
2818 public:
2819     GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl) :
2820         impl(impl), looper(new Looper(true)), result(NO_ERROR),
2821         exitPending(false), exitRequested(false) {
2822     }
2823
2824     status_t waitForResponse() {
2825         do {
2826             looper->pollOnce(-1);
2827         } while (!exitRequested);
2828         return result;
2829     }
2830
2831     void exit(status_t result) {
2832         this->result = result;
2833         exitPending = true;
2834         looper->sendMessage(this, Message(MSG_EXIT));
2835     }
2836 };
2837
2838
2839 status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
2840         const sp<IGraphicBufferProducer>& producer,
2841         uint32_t reqWidth, uint32_t reqHeight,
2842         uint32_t minLayerZ, uint32_t maxLayerZ) {
2843
2844     if (CC_UNLIKELY(display == 0))
2845         return BAD_VALUE;
2846
2847     if (CC_UNLIKELY(producer == 0))
2848         return BAD_VALUE;
2849
2850     // if we have secure windows on this display, never allow the screen capture
2851     // unless the producer interface is local (i.e.: we can take a screenshot for
2852     // ourselves).
2853     if (!producer->asBinder()->localBinder()) {
2854         Mutex::Autolock _l(mStateLock);
2855         sp<const DisplayDevice> hw(getDisplayDevice(display));
2856         if (hw->getSecureLayerVisible()) {
2857             ALOGW("FB is protected: PERMISSION_DENIED");
2858             return PERMISSION_DENIED;
2859         }
2860     }
2861
2862     class MessageCaptureScreen : public MessageBase {
2863         SurfaceFlinger* flinger;
2864         sp<IBinder> display;
2865         sp<IGraphicBufferProducer> producer;
2866         uint32_t reqWidth, reqHeight;
2867         uint32_t minLayerZ,maxLayerZ;
2868         status_t result;
2869     public:
2870         MessageCaptureScreen(SurfaceFlinger* flinger,
2871                 const sp<IBinder>& display,
2872                 const sp<IGraphicBufferProducer>& producer,
2873                 uint32_t reqWidth, uint32_t reqHeight,
2874                 uint32_t minLayerZ, uint32_t maxLayerZ)
2875             : flinger(flinger), display(display), producer(producer),
2876               reqWidth(reqWidth), reqHeight(reqHeight),
2877               minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
2878               result(PERMISSION_DENIED)
2879         {
2880         }
2881         status_t getResult() const {
2882             return result;
2883         }
2884         virtual bool handler() {
2885             Mutex::Autolock _l(flinger->mStateLock);
2886             sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
2887             result = flinger->captureScreenImplLocked(hw,
2888                     producer, reqWidth, reqHeight, minLayerZ, maxLayerZ);
2889             static_cast<GraphicProducerWrapper*>(producer->asBinder().get())->exit(result);
2890             return true;
2891         }
2892     };
2893
2894     // make sure to process transactions before screenshots -- a transaction
2895     // might already be pending but scheduled for VSYNC; this guarantees we
2896     // will handle it before the screenshot. When VSYNC finally arrives
2897     // the scheduled transaction will be a no-op. If no transactions are
2898     // scheduled at this time, this will end-up being a no-op as well.
2899     mEventQueue.invalidateTransactionNow();
2900
2901     // this creates a "fake" BBinder which will serve as a "fake" remote
2902     // binder to receive the marshaled calls and forward them to the
2903     // real remote (a BpGraphicBufferProducer)
2904     sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
2905
2906     // the asInterface() call below creates our "fake" BpGraphicBufferProducer
2907     // which does the marshaling work forwards to our "fake remote" above.
2908     sp<MessageBase> msg = new MessageCaptureScreen(this,
2909             display, IGraphicBufferProducer::asInterface( wrapper ),
2910             reqWidth, reqHeight, minLayerZ, maxLayerZ);
2911
2912     status_t res = postMessageAsync(msg);
2913     if (res == NO_ERROR) {
2914         res = wrapper->waitForResponse();
2915     }
2916     return res;
2917 }
2918
2919
2920 void SurfaceFlinger::renderScreenImplLocked(
2921         const sp<const DisplayDevice>& hw,
2922         uint32_t reqWidth, uint32_t reqHeight,
2923         uint32_t minLayerZ, uint32_t maxLayerZ,
2924         bool yswap)
2925 {
2926     ATRACE_CALL();
2927     RenderEngine& engine(getRenderEngine());
2928
2929     // get screen geometry
2930     const uint32_t hw_w = hw->getWidth();
2931     const uint32_t hw_h = hw->getHeight();
2932     const bool filtering = reqWidth != hw_w || reqWidth != hw_h;
2933
2934     // make sure to clear all GL error flags
2935     engine.checkErrors();
2936
2937     // set-up our viewport
2938     engine.setViewportAndProjection(reqWidth, reqHeight, hw_w, hw_h, yswap);
2939     engine.disableTexturing();
2940
2941     // redraw the screen entirely...
2942     engine.clearWithColor(0, 0, 0, 1);
2943
2944     const LayerVector& layers( mDrawingState.layersSortedByZ );
2945     const size_t count = layers.size();
2946     for (size_t i=0 ; i<count ; ++i) {
2947         const sp<Layer>& layer(layers[i]);
2948         const Layer::State& state(layer->getDrawingState());
2949         if (state.layerStack == hw->getLayerStack()) {
2950             if (state.z >= minLayerZ && state.z <= maxLayerZ) {
2951                 if (layer->isVisible()) {
2952                     if (filtering) layer->setFiltering(true);
2953                     layer->draw(hw);
2954                     if (filtering) layer->setFiltering(false);
2955                 }
2956             }
2957         }
2958     }
2959
2960     // compositionComplete is needed for older driver
2961     hw->compositionComplete();
2962     hw->setViewportAndProjection();
2963 }
2964
2965
2966 status_t SurfaceFlinger::captureScreenImplLocked(
2967         const sp<const DisplayDevice>& hw,
2968         const sp<IGraphicBufferProducer>& producer,
2969         uint32_t reqWidth, uint32_t reqHeight,
2970         uint32_t minLayerZ, uint32_t maxLayerZ)
2971 {
2972     ATRACE_CALL();
2973
2974     // get screen geometry
2975     const uint32_t hw_w = hw->getWidth();
2976     const uint32_t hw_h = hw->getHeight();
2977
2978     if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
2979         ALOGE("size mismatch (%d, %d) > (%d, %d)",
2980                 reqWidth, reqHeight, hw_w, hw_h);
2981         return BAD_VALUE;
2982     }
2983
2984     reqWidth  = (!reqWidth)  ? hw_w : reqWidth;
2985     reqHeight = (!reqHeight) ? hw_h : reqHeight;
2986
2987     // create a surface (because we're a producer, and we need to
2988     // dequeue/queue a buffer)
2989     sp<Surface> sur = new Surface(producer, false);
2990     ANativeWindow* window = sur.get();
2991
2992     status_t result = NO_ERROR;
2993     if (native_window_api_connect(window, NATIVE_WINDOW_API_EGL) == NO_ERROR) {
2994         uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
2995                         GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
2996
2997         int err = 0;
2998         err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
2999         err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3000         err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3001         err |= native_window_set_usage(window, usage);
3002
3003         if (err == NO_ERROR) {
3004             ANativeWindowBuffer* buffer;
3005             /* TODO: Once we have the sync framework everywhere this can use
3006              * server-side waits on the fence that dequeueBuffer returns.
3007              */
3008             result = native_window_dequeue_buffer_and_wait(window,  &buffer);
3009             if (result == NO_ERROR) {
3010                 // create an EGLImage from the buffer so we can later
3011                 // turn it into a texture
3012                 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3013                         EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3014                 if (image != EGL_NO_IMAGE_KHR) {
3015                     // this binds the given EGLImage as a framebuffer for the
3016                     // duration of this scope.
3017                     RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3018                     if (imageBond.getStatus() == NO_ERROR) {
3019                         // this will in fact render into our dequeued buffer
3020                         // via an FBO, which means we didn't have to create
3021                         // an EGLSurface and therefore we're not
3022                         // dependent on the context's EGLConfig.
3023                         renderScreenImplLocked(hw, reqWidth, reqHeight,
3024                                 minLayerZ, maxLayerZ, true);
3025
3026                         // Create a sync point and wait on it, so we know the buffer is
3027                         // ready before we pass it along.  We can't trivially call glFlush(),
3028                         // so we use a wait flag instead.
3029                         // TODO: pass a sync fd to queueBuffer() and let the consumer wait.
3030                         EGLSyncKHR sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3031                         if (sync != EGL_NO_SYNC_KHR) {
3032                             EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3033                                     EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3034                             EGLint eglErr = eglGetError();
3035                             eglDestroySyncKHR(mEGLDisplay, sync);
3036                             if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3037                                 ALOGW("captureScreen: fence wait timed out");
3038                             } else {
3039                                 ALOGW_IF(eglErr != EGL_SUCCESS,
3040                                         "captureScreen: error waiting on EGL fence: %#x", eglErr);
3041                             }
3042                         } else {
3043                             ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3044                             // not fatal
3045                         }
3046
3047                         if (DEBUG_SCREENSHOTS) {
3048                             uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3049                             getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3050                             checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3051                                     hw, minLayerZ, maxLayerZ);
3052                             delete [] pixels;
3053                         }
3054
3055                     } else {
3056                         ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3057                         result = INVALID_OPERATION;
3058                     }
3059                     // destroy our image
3060                     eglDestroyImageKHR(mEGLDisplay, image);
3061                 } else {
3062                     result = BAD_VALUE;
3063                 }
3064                 window->queueBuffer(window, buffer, -1);
3065             }
3066         } else {
3067             result = BAD_VALUE;
3068         }
3069         native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3070     }
3071
3072     return result;
3073 }
3074
3075 void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
3076         const sp<const DisplayDevice>& hw, uint32_t minLayerZ, uint32_t maxLayerZ) {
3077     if (DEBUG_SCREENSHOTS) {
3078         for (size_t y=0 ; y<h ; y++) {
3079             uint32_t const * p = (uint32_t const *)vaddr + y*s;
3080             for (size_t x=0 ; x<w ; x++) {
3081                 if (p[x] != 0xFF000000) return;
3082             }
3083         }
3084         ALOGE("*** we just took a black screenshot ***\n"
3085                 "requested minz=%d, maxz=%d, layerStack=%d",
3086                 minLayerZ, maxLayerZ, hw->getLayerStack());
3087         const LayerVector& layers( mDrawingState.layersSortedByZ );
3088         const size_t count = layers.size();
3089         for (size_t i=0 ; i<count ; ++i) {
3090             const sp<Layer>& layer(layers[i]);
3091             const Layer::State& state(layer->getDrawingState());
3092             const bool visible = (state.layerStack == hw->getLayerStack())
3093                                 && (state.z >= minLayerZ && state.z <= maxLayerZ)
3094                                 && (layer->isVisible());
3095             ALOGE("%c index=%d, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3096                     visible ? '+' : '-',
3097                             i, layer->getName().string(), state.layerStack, state.z,
3098                             layer->isVisible(), state.flags, state.alpha);
3099         }
3100     }
3101 }
3102
3103 // ---------------------------------------------------------------------------
3104
3105 SurfaceFlinger::LayerVector::LayerVector() {
3106 }
3107
3108 SurfaceFlinger::LayerVector::LayerVector(const LayerVector& rhs)
3109     : SortedVector<sp<Layer> >(rhs) {
3110 }
3111
3112 int SurfaceFlinger::LayerVector::do_compare(const void* lhs,
3113     const void* rhs) const
3114 {
3115     // sort layers per layer-stack, then by z-order and finally by sequence
3116     const sp<Layer>& l(*reinterpret_cast<const sp<Layer>*>(lhs));
3117     const sp<Layer>& r(*reinterpret_cast<const sp<Layer>*>(rhs));
3118
3119     uint32_t ls = l->getCurrentState().layerStack;
3120     uint32_t rs = r->getCurrentState().layerStack;
3121     if (ls != rs)
3122         return ls - rs;
3123
3124     uint32_t lz = l->getCurrentState().z;
3125     uint32_t rz = r->getCurrentState().z;
3126     if (lz != rz)
3127         return lz - rz;
3128
3129     return l->sequence - r->sequence;
3130 }
3131
3132 // ---------------------------------------------------------------------------
3133
3134 SurfaceFlinger::DisplayDeviceState::DisplayDeviceState()
3135     : type(DisplayDevice::DISPLAY_ID_INVALID) {
3136 }
3137
3138 SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(DisplayDevice::DisplayType type)
3139     : type(type), layerStack(DisplayDevice::NO_LAYER_STACK), orientation(0) {
3140     viewport.makeInvalid();
3141     frame.makeInvalid();
3142 }
3143
3144 // ---------------------------------------------------------------------------
3145
3146 }; // namespace android
3147
3148
3149 #if defined(__gl_h_)
3150 #error "don't include gl/gl.h in this file"
3151 #endif
3152
3153 #if defined(__gl2_h_)
3154 #error "don't include gl2/gl2.h in this file"
3155 #endif