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