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