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