blob: 00700ab59032d533f6a624007fef4b409a9ea27d [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 Stoza9e56aa02015-11-02 13:00:03 -08001750 if (tr.transformed()) {
1751 if (tr.preserveRects()) {
1752 // transform the transparent region
1753 transparentRegion = tr.transform(s.activeTransparentRegion);
1754 } else {
1755 // transformation too complex, can't do the
1756 // transparent region optimization.
1757 transparentRegion.clear();
1758 }
1759 } else {
1760 transparentRegion = s.activeTransparentRegion;
1761 }
1762 }
1763
1764 // compute the opaque region
Robert Carr3dcabfa2016-03-01 18:36:58 -08001765 const int32_t layerOrientation = s.active.transform.getOrientation();
Dan Stoza9e56aa02015-11-02 13:00:03 -08001766 if (s.alpha==255 && !translucent &&
1767 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1768 // the opaque region is the layer's footprint
1769 opaqueRegion = visibleRegion;
1770 }
1771 }
1772 }
1773
1774 // Clip the covered region to the visible region
1775 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1776
1777 // Update aboveCoveredLayers for next (lower) layer
1778 aboveCoveredLayers.orSelf(visibleRegion);
1779
1780 // subtract the opaque region covered by the layers above us
1781 visibleRegion.subtractSelf(aboveOpaqueLayers);
1782
1783 // compute this layer's dirty region
1784 if (layer->contentDirty) {
1785 // we need to invalidate the whole region
1786 dirty = visibleRegion;
1787 // as well, as the old visible region
1788 dirty.orSelf(layer->visibleRegion);
1789 layer->contentDirty = false;
1790 } else {
1791 /* compute the exposed region:
1792 * the exposed region consists of two components:
1793 * 1) what's VISIBLE now and was COVERED before
1794 * 2) what's EXPOSED now less what was EXPOSED before
1795 *
1796 * note that (1) is conservative, we start with the whole
1797 * visible region but only keep what used to be covered by
1798 * something -- which mean it may have been exposed.
1799 *
1800 * (2) handles areas that were not covered by anything but got
1801 * exposed because of a resize.
1802 */
1803 const Region newExposed = visibleRegion - coveredRegion;
1804 const Region oldVisibleRegion = layer->visibleRegion;
1805 const Region oldCoveredRegion = layer->coveredRegion;
1806 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1807 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1808 }
1809 dirty.subtractSelf(aboveOpaqueLayers);
1810
1811 // accumulate to the screen dirty region
1812 outDirtyRegion.orSelf(dirty);
1813
1814 // Update aboveOpaqueLayers for next (lower) layer
1815 aboveOpaqueLayers.orSelf(opaqueRegion);
1816
1817 // Store the visible region in screen space
1818 layer->setVisibleRegion(visibleRegion);
1819 layer->setCoveredRegion(coveredRegion);
1820 layer->setVisibleNonTransparentRegion(
1821 visibleRegion.subtract(transparentRegion));
1822 }
1823
1824 outOpaqueRegion = aboveOpaqueLayers;
1825}
1826
1827void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
1828 const Region& dirty) {
1829 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1830 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1831 if (hw->getLayerStack() == layerStack) {
1832 hw->dirtyRegion.orSelf(dirty);
1833 }
1834 }
1835}
1836
1837bool SurfaceFlinger::handlePageFlip()
1838{
1839 Region dirtyRegion;
1840
1841 bool visibleRegions = false;
1842 const LayerVector& layers(mDrawingState.layersSortedByZ);
1843 bool frameQueued = false;
1844
1845 // Store the set of layers that need updates. This set must not change as
1846 // buffers are being latched, as this could result in a deadlock.
1847 // Example: Two producers share the same command stream and:
1848 // 1.) Layer 0 is latched
1849 // 2.) Layer 0 gets a new frame
1850 // 2.) Layer 1 gets a new frame
1851 // 3.) Layer 1 is latched.
1852 // Display is now waiting on Layer 1's frame, which is behind layer 0's
1853 // second frame. But layer 0's second frame could be waiting on display.
1854 Vector<Layer*> layersWithQueuedFrames;
1855 for (size_t i = 0, count = layers.size(); i<count ; i++) {
1856 const sp<Layer>& layer(layers[i]);
1857 if (layer->hasQueuedFrame()) {
1858 frameQueued = true;
1859 if (layer->shouldPresentNow(mPrimaryDispSync)) {
1860 layersWithQueuedFrames.push_back(layer.get());
1861 } else {
1862 layer->useEmptyDamage();
1863 }
1864 } else {
1865 layer->useEmptyDamage();
1866 }
1867 }
1868 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
1869 Layer* layer = layersWithQueuedFrames[i];
1870 const Region dirty(layer->latchBuffer(visibleRegions));
1871 layer->useSurfaceDamage();
1872 const Layer::State& s(layer->getDrawingState());
1873 invalidateLayerStack(s.layerStack, dirty);
1874 }
1875
1876 mVisibleRegionsDirty |= visibleRegions;
1877
1878 // If we will need to wake up at some time in the future to deal with a
1879 // queued frame that shouldn't be displayed during this vsync period, wake
1880 // up during the next vsync period to check again.
1881 if (frameQueued && layersWithQueuedFrames.empty()) {
1882 signalLayerUpdate();
1883 }
1884
1885 // Only continue with the refresh if there is actually new work to do
1886 return !layersWithQueuedFrames.empty();
1887}
1888
1889void SurfaceFlinger::invalidateHwcGeometry()
1890{
1891 mHwWorkListDirty = true;
1892}
1893
1894
1895void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
1896 const Region& inDirtyRegion)
1897{
1898 // We only need to actually compose the display if:
1899 // 1) It is being handled by hardware composer, which may need this to
1900 // keep its virtual display state machine in sync, or
1901 // 2) There is work to be done (the dirty region isn't empty)
1902 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
1903 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
1904 return;
1905 }
1906
1907 Region dirtyRegion(inDirtyRegion);
1908
1909 // compute the invalid region
1910 hw->swapRegion.orSelf(dirtyRegion);
1911
1912 uint32_t flags = hw->getFlags();
1913 if (flags & DisplayDevice::SWAP_RECTANGLE) {
1914 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
1915 // takes a rectangle, we must make sure to update that whole
1916 // rectangle in that case
1917 dirtyRegion.set(hw->swapRegion.bounds());
1918 } else {
1919 if (flags & DisplayDevice::PARTIAL_UPDATES) {
1920 // We need to redraw the rectangle that will be updated
1921 // (pushed to the framebuffer).
1922 // This is needed because PARTIAL_UPDATES only takes one
1923 // rectangle instead of a region (see DisplayDevice::flip())
1924 dirtyRegion.set(hw->swapRegion.bounds());
1925 } else {
1926 // we need to redraw everything (the whole screen)
1927 dirtyRegion.set(hw->bounds());
1928 hw->swapRegion = dirtyRegion;
1929 }
1930 }
1931
1932 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
1933 if (!doComposeSurfaces(hw, dirtyRegion)) return;
1934 } else {
1935 RenderEngine& engine(getRenderEngine());
1936 mat4 colorMatrix = mColorMatrix;
1937 if (mDaltonize) {
1938 colorMatrix = colorMatrix * mDaltonizer();
1939 }
1940 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
1941 doComposeSurfaces(hw, dirtyRegion);
1942 engine.setupColorTransform(oldMatrix);
1943 }
1944
1945 // update the swap region and clear the dirty region
1946 hw->swapRegion.orSelf(dirtyRegion);
1947
1948 // swap buffers (presentation)
1949 hw->swapBuffers(getHwComposer());
1950}
1951
1952bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
1953{
1954 RenderEngine& engine(getRenderEngine());
1955 const int32_t id = hw->getHwcDisplayId();
1956 HWComposer& hwc(getHwComposer());
1957 HWComposer::LayerListIterator cur = hwc.begin(id);
1958 const HWComposer::LayerListIterator end = hwc.end(id);
1959
1960 bool hasGlesComposition = hwc.hasGlesComposition(id);
1961 if (hasGlesComposition) {
1962 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
1963 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
1964 hw->getDisplayName().string());
1965 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
1966 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
1967 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
1968 }
1969 return false;
1970 }
1971
1972 // Never touch the framebuffer if we don't have any framebuffer layers
1973 const bool hasHwcComposition = hwc.hasHwcComposition(id);
1974 if (hasHwcComposition) {
1975 // when using overlays, we assume a fully transparent framebuffer
1976 // NOTE: we could reduce how much we need to clear, for instance
1977 // remove where there are opaque FB layers. however, on some
1978 // GPUs doing a "clean slate" clear might be more efficient.
1979 // We'll revisit later if needed.
1980 engine.clearWithColor(0, 0, 0, 0);
1981 } else {
1982 // we start with the whole screen area
1983 const Region bounds(hw->getBounds());
1984
1985 // we remove the scissor part
1986 // we're left with the letterbox region
1987 // (common case is that letterbox ends-up being empty)
1988 const Region letterbox(bounds.subtract(hw->getScissor()));
1989
1990 // compute the area to clear
1991 Region region(hw->undefinedRegion.merge(letterbox));
1992
1993 // but limit it to the dirty region
1994 region.andSelf(dirty);
1995
1996 // screen is already cleared here
1997 if (!region.isEmpty()) {
1998 // can happen with SurfaceView
1999 drawWormhole(hw, region);
2000 }
2001 }
2002
2003 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2004 // just to be on the safe side, we don't set the
2005 // scissor on the main display. It should never be needed
2006 // anyways (though in theory it could since the API allows it).
2007 const Rect& bounds(hw->getBounds());
2008 const Rect& scissor(hw->getScissor());
2009 if (scissor != bounds) {
2010 // scissor doesn't match the screen's dimensions, so we
2011 // need to clear everything outside of it and enable
2012 // the GL scissor so we don't draw anything where we shouldn't
2013
2014 // enable scissor for this frame
2015 const uint32_t height = hw->getHeight();
2016 engine.setScissor(scissor.left, height - scissor.bottom,
2017 scissor.getWidth(), scissor.getHeight());
2018 }
2019 }
2020 }
2021
2022 /*
2023 * and then, render the layers targeted at the framebuffer
2024 */
2025
2026 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2027 const size_t count = layers.size();
2028 const Transform& tr = hw->getTransform();
2029 if (cur != end) {
2030 // we're using h/w composer
2031 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2032 const sp<Layer>& layer(layers[i]);
2033 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2034 if (!clip.isEmpty()) {
2035 switch (cur->getCompositionType()) {
2036 case HWC_CURSOR_OVERLAY:
2037 case HWC_OVERLAY: {
2038 const Layer::State& state(layer->getDrawingState());
2039 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2040 && i
2041 && layer->isOpaque(state) && (state.alpha == 0xFF)
2042 && hasGlesComposition) {
2043 // never clear the very first layer since we're
2044 // guaranteed the FB is already cleared
2045 layer->clearWithOpenGL(hw, clip);
2046 }
2047 break;
2048 }
2049 case HWC_FRAMEBUFFER: {
2050 layer->draw(hw, clip);
2051 break;
2052 }
2053 case HWC_FRAMEBUFFER_TARGET: {
2054 // this should not happen as the iterator shouldn't
2055 // let us get there.
2056 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2057 break;
2058 }
2059 }
2060 }
2061 layer->setAcquireFence(hw, *cur);
2062 }
2063 } else {
2064 // we're not using h/w composer
2065 for (size_t i=0 ; i<count ; ++i) {
2066 const sp<Layer>& layer(layers[i]);
2067 const Region clip(dirty.intersect(
2068 tr.transform(layer->visibleRegion)));
2069 if (!clip.isEmpty()) {
2070 layer->draw(hw, clip);
2071 }
2072 }
2073 }
2074
2075 // disable scissor at the end of the frame
2076 engine.disableScissor();
2077 return true;
2078}
2079
2080void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2081 const int32_t height = hw->getHeight();
2082 RenderEngine& engine(getRenderEngine());
2083 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2084}
2085
2086status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2087 const sp<IBinder>& handle,
2088 const sp<IGraphicBufferProducer>& gbc,
2089 const sp<Layer>& lbc)
2090{
2091 // add this layer to the current state list
2092 {
2093 Mutex::Autolock _l(mStateLock);
2094 if (mCurrentState.layersSortedByZ.size() >= MAX_LAYERS) {
2095 return NO_MEMORY;
2096 }
2097 mCurrentState.layersSortedByZ.add(lbc);
2098 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2099 }
2100
2101 // attach this layer to the client
2102 client->attachLayer(handle, lbc);
2103
2104 return NO_ERROR;
2105}
2106
2107status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
2108 Mutex::Autolock _l(mStateLock);
2109 ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
2110 if (index >= 0) {
2111 mLayersPendingRemoval.push(layer);
2112 mLayersRemoved = true;
2113 setTransactionFlags(eTransactionNeeded);
2114 return NO_ERROR;
2115 }
2116 return status_t(index);
2117}
2118
2119uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t /* flags */) {
2120 return android_atomic_release_load(&mTransactionFlags);
2121}
2122
2123uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2124 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2125}
2126
2127uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2128 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2129 if ((old & flags)==0) { // wake the server up
2130 signalTransaction();
2131 }
2132 return old;
2133}
2134
2135void SurfaceFlinger::setTransactionState(
2136 const Vector<ComposerState>& state,
2137 const Vector<DisplayState>& displays,
2138 uint32_t flags)
2139{
2140 ATRACE_CALL();
2141 Mutex::Autolock _l(mStateLock);
2142 uint32_t transactionFlags = 0;
2143
2144 if (flags & eAnimation) {
2145 // For window updates that are part of an animation we must wait for
2146 // previous animation "frames" to be handled.
2147 while (mAnimTransactionPending) {
2148 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2149 if (CC_UNLIKELY(err != NO_ERROR)) {
2150 // just in case something goes wrong in SF, return to the
2151 // caller after a few seconds.
2152 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2153 "waiting for previous animation frame");
2154 mAnimTransactionPending = false;
2155 break;
2156 }
2157 }
2158 }
2159
2160 size_t count = displays.size();
2161 for (size_t i=0 ; i<count ; i++) {
2162 const DisplayState& s(displays[i]);
2163 transactionFlags |= setDisplayStateLocked(s);
2164 }
2165
2166 count = state.size();
2167 for (size_t i=0 ; i<count ; i++) {
2168 const ComposerState& s(state[i]);
2169 // Here we need to check that the interface we're given is indeed
2170 // one of our own. A malicious client could give us a NULL
2171 // IInterface, or one of its own or even one of our own but a
2172 // different type. All these situations would cause us to crash.
2173 //
2174 // NOTE: it would be better to use RTTI as we could directly check
2175 // that we have a Client*. however, RTTI is disabled in Android.
2176 if (s.client != NULL) {
2177 sp<IBinder> binder = IInterface::asBinder(s.client);
2178 if (binder != NULL) {
2179 String16 desc(binder->getInterfaceDescriptor());
2180 if (desc == ISurfaceComposerClient::descriptor) {
2181 sp<Client> client( static_cast<Client *>(s.client.get()) );
2182 transactionFlags |= setClientStateLocked(client, s.state);
2183 }
2184 }
2185 }
2186 }
2187
2188 if (transactionFlags) {
2189 // this triggers the transaction
2190 setTransactionFlags(transactionFlags);
2191
2192 // if this is a synchronous transaction, wait for it to take effect
2193 // before returning.
2194 if (flags & eSynchronous) {
2195 mTransactionPending = true;
2196 }
2197 if (flags & eAnimation) {
2198 mAnimTransactionPending = true;
2199 }
2200 while (mTransactionPending) {
2201 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2202 if (CC_UNLIKELY(err != NO_ERROR)) {
2203 // just in case something goes wrong in SF, return to the
2204 // called after a few seconds.
2205 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2206 mTransactionPending = false;
2207 break;
2208 }
2209 }
2210 }
2211}
2212
2213uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2214{
2215 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2216 if (dpyIdx < 0)
2217 return 0;
2218
2219 uint32_t flags = 0;
2220 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2221 if (disp.isValid()) {
2222 const uint32_t what = s.what;
2223 if (what & DisplayState::eSurfaceChanged) {
2224 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2225 disp.surface = s.surface;
2226 flags |= eDisplayTransactionNeeded;
2227 }
2228 }
2229 if (what & DisplayState::eLayerStackChanged) {
2230 if (disp.layerStack != s.layerStack) {
2231 disp.layerStack = s.layerStack;
2232 flags |= eDisplayTransactionNeeded;
2233 }
2234 }
2235 if (what & DisplayState::eDisplayProjectionChanged) {
2236 if (disp.orientation != s.orientation) {
2237 disp.orientation = s.orientation;
2238 flags |= eDisplayTransactionNeeded;
2239 }
2240 if (disp.frame != s.frame) {
2241 disp.frame = s.frame;
2242 flags |= eDisplayTransactionNeeded;
2243 }
2244 if (disp.viewport != s.viewport) {
2245 disp.viewport = s.viewport;
2246 flags |= eDisplayTransactionNeeded;
2247 }
2248 }
2249 if (what & DisplayState::eDisplaySizeChanged) {
2250 if (disp.width != s.width) {
2251 disp.width = s.width;
2252 flags |= eDisplayTransactionNeeded;
2253 }
2254 if (disp.height != s.height) {
2255 disp.height = s.height;
2256 flags |= eDisplayTransactionNeeded;
2257 }
2258 }
2259 }
2260 return flags;
2261}
2262
2263uint32_t SurfaceFlinger::setClientStateLocked(
2264 const sp<Client>& client,
2265 const layer_state_t& s)
2266{
2267 uint32_t flags = 0;
2268 sp<Layer> layer(client->getLayerUser(s.surface));
2269 if (layer != 0) {
2270 const uint32_t what = s.what;
2271 if (what & layer_state_t::ePositionChanged) {
2272 if (layer->setPosition(s.x, s.y))
2273 flags |= eTraversalNeeded;
2274 }
2275 if (what & layer_state_t::eLayerChanged) {
2276 // NOTE: index needs to be calculated before we update the state
2277 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2278 if (layer->setLayer(s.z) && idx >= 0) {
2279 mCurrentState.layersSortedByZ.removeAt(idx);
2280 mCurrentState.layersSortedByZ.add(layer);
2281 // we need traversal (state changed)
2282 // AND transaction (list changed)
2283 flags |= eTransactionNeeded|eTraversalNeeded;
2284 }
2285 }
2286 if (what & layer_state_t::eSizeChanged) {
2287 if (layer->setSize(s.w, s.h)) {
2288 flags |= eTraversalNeeded;
2289 }
2290 }
2291 if (what & layer_state_t::eAlphaChanged) {
2292 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2293 flags |= eTraversalNeeded;
2294 }
2295 if (what & layer_state_t::eMatrixChanged) {
2296 if (layer->setMatrix(s.matrix))
2297 flags |= eTraversalNeeded;
2298 }
2299 if (what & layer_state_t::eTransparentRegionChanged) {
2300 if (layer->setTransparentRegionHint(s.transparentRegion))
2301 flags |= eTraversalNeeded;
2302 }
2303 if (what & layer_state_t::eFlagsChanged) {
2304 if (layer->setFlags(s.flags, s.mask))
2305 flags |= eTraversalNeeded;
2306 }
2307 if (what & layer_state_t::eCropChanged) {
2308 if (layer->setCrop(s.crop))
2309 flags |= eTraversalNeeded;
2310 }
Pablo Ceballosacbe6782016-03-04 17:54:21 +00002311 if (what & layer_state_t::eFinalCropChanged) {
2312 if (layer->setFinalCrop(s.finalCrop))
2313 flags |= eTraversalNeeded;
2314 }
Dan Stoza9e56aa02015-11-02 13:00:03 -08002315 if (what & layer_state_t::eLayerStackChanged) {
2316 // NOTE: index needs to be calculated before we update the state
2317 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2318 if (layer->setLayerStack(s.layerStack) && idx >= 0) {
2319 mCurrentState.layersSortedByZ.removeAt(idx);
2320 mCurrentState.layersSortedByZ.add(layer);
2321 // we need traversal (state changed)
2322 // AND transaction (list changed)
2323 flags |= eTransactionNeeded|eTraversalNeeded;
2324 }
2325 }
2326 if (what & layer_state_t::eDeferTransaction) {
2327 layer->deferTransactionUntil(s.handle, s.frameNumber);
2328 // We don't trigger a traversal here because if no other state is
2329 // changed, we don't want this to cause any more work
2330 }
Robert Carrc3574f72016-03-24 12:19:32 -07002331 if (what & layer_state_t::eOverrideScalingModeChanged) {
2332 layer->setOverrideScalingMode(s.overrideScalingMode);
2333 // We don't trigger a traversal here because if no other state is
2334 // changed, we don't want this to cause any more work
2335 }
Dan Stoza9e56aa02015-11-02 13:00:03 -08002336 }
2337 return flags;
2338}
2339
2340status_t SurfaceFlinger::createLayer(
2341 const String8& name,
2342 const sp<Client>& client,
2343 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
2344 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
2345{
2346 //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
2347 if (int32_t(w|h) < 0) {
2348 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2349 int(w), int(h));
2350 return BAD_VALUE;
2351 }
2352
2353 status_t result = NO_ERROR;
2354
2355 sp<Layer> layer;
2356
2357 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2358 case ISurfaceComposerClient::eFXSurfaceNormal:
2359 result = createNormalLayer(client,
2360 name, w, h, flags, format,
2361 handle, gbp, &layer);
2362 break;
2363 case ISurfaceComposerClient::eFXSurfaceDim:
2364 result = createDimLayer(client,
2365 name, w, h, flags,
2366 handle, gbp, &layer);
2367 break;
2368 default:
2369 result = BAD_VALUE;
2370 break;
2371 }
2372
2373 if (result != NO_ERROR) {
2374 return result;
2375 }
2376
2377 result = addClientLayer(client, *handle, *gbp, layer);
2378 if (result != NO_ERROR) {
2379 return result;
2380 }
2381
2382 setTransactionFlags(eTransactionNeeded);
2383 return result;
2384}
2385
2386status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2387 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2388 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2389{
2390 // initialize the surfaces
2391 switch (format) {
2392 case PIXEL_FORMAT_TRANSPARENT:
2393 case PIXEL_FORMAT_TRANSLUCENT:
2394 format = PIXEL_FORMAT_RGBA_8888;
2395 break;
2396 case PIXEL_FORMAT_OPAQUE:
2397 format = PIXEL_FORMAT_RGBX_8888;
2398 break;
2399 }
2400
2401 *outLayer = new Layer(this, client, name, w, h, flags);
2402 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2403 if (err == NO_ERROR) {
2404 *handle = (*outLayer)->getHandle();
2405 *gbp = (*outLayer)->getProducer();
2406 }
2407
2408 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2409 return err;
2410}
2411
2412status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2413 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2414 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2415{
2416 *outLayer = new LayerDim(this, client, name, w, h, flags);
2417 *handle = (*outLayer)->getHandle();
2418 *gbp = (*outLayer)->getProducer();
2419 return NO_ERROR;
2420}
2421
2422status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2423{
2424 // called by the window manager when it wants to remove a Layer
2425 status_t err = NO_ERROR;
2426 sp<Layer> l(client->getLayerUser(handle));
2427 if (l != NULL) {
2428 err = removeLayer(l);
2429 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2430 "error removing layer=%p (%s)", l.get(), strerror(-err));
2431 }
2432 return err;
2433}
2434
2435status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2436{
2437 // called by ~LayerCleaner() when all references to the IBinder (handle)
2438 // are gone
2439 status_t err = NO_ERROR;
2440 sp<Layer> l(layer.promote());
2441 if (l != NULL) {
2442 err = removeLayer(l);
2443 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2444 "error removing layer=%p (%s)", l.get(), strerror(-err));
2445 }
2446 return err;
2447}
2448
2449// ---------------------------------------------------------------------------
2450
2451void SurfaceFlinger::onInitializeDisplays() {
2452 // reset screen orientation and use primary layer stack
2453 Vector<ComposerState> state;
2454 Vector<DisplayState> displays;
2455 DisplayState d;
2456 d.what = DisplayState::eDisplayProjectionChanged |
2457 DisplayState::eLayerStackChanged;
2458 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2459 d.layerStack = 0;
2460 d.orientation = DisplayState::eOrientationDefault;
2461 d.frame.makeInvalid();
2462 d.viewport.makeInvalid();
2463 d.width = 0;
2464 d.height = 0;
2465 displays.add(d);
2466 setTransactionState(state, displays, 0);
2467 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2468
2469 const nsecs_t period =
2470 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2471 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2472}
2473
2474void SurfaceFlinger::initializeDisplays() {
2475 class MessageScreenInitialized : public MessageBase {
2476 SurfaceFlinger* flinger;
2477 public:
2478 MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2479 virtual bool handler() {
2480 flinger->onInitializeDisplays();
2481 return true;
2482 }
2483 };
2484 sp<MessageBase> msg = new MessageScreenInitialized(this);
2485 postMessageAsync(msg); // we may be called from main thread, use async message
2486}
2487
2488void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2489 int mode) {
2490 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2491 this);
2492 int32_t type = hw->getDisplayType();
2493 int currentMode = hw->getPowerMode();
2494
2495 if (mode == currentMode) {
2496 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2497 return;
2498 }
2499
2500 hw->setPowerMode(mode);
2501 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2502 ALOGW("Trying to set power mode for virtual display");
2503 return;
2504 }
2505
2506 if (currentMode == HWC_POWER_MODE_OFF) {
2507 getHwComposer().setPowerMode(type, mode);
2508 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2509 // FIXME: eventthread only knows about the main display right now
2510 mEventThread->onScreenAcquired();
2511 resyncToHardwareVsync(true);
2512 }
2513
2514 mVisibleRegionsDirty = true;
2515 mHasPoweredOff = true;
2516 repaintEverything();
2517 } else if (mode == HWC_POWER_MODE_OFF) {
2518 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2519 disableHardwareVsync(true); // also cancels any in-progress resync
2520
2521 // FIXME: eventthread only knows about the main display right now
2522 mEventThread->onScreenReleased();
2523 }
2524
2525 getHwComposer().setPowerMode(type, mode);
2526 mVisibleRegionsDirty = true;
2527 // from this point on, SF will stop drawing on this display
2528 } else {
2529 getHwComposer().setPowerMode(type, mode);
2530 }
2531}
2532
2533void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2534 class MessageSetPowerMode: public MessageBase {
2535 SurfaceFlinger& mFlinger;
2536 sp<IBinder> mDisplay;
2537 int mMode;
2538 public:
2539 MessageSetPowerMode(SurfaceFlinger& flinger,
2540 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2541 mDisplay(disp) { mMode = mode; }
2542 virtual bool handler() {
2543 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2544 if (hw == NULL) {
2545 ALOGE("Attempt to set power mode = %d for null display %p",
2546 mMode, mDisplay.get());
2547 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2548 ALOGW("Attempt to set power mode = %d for virtual display",
2549 mMode);
2550 } else {
2551 mFlinger.setPowerModeInternal(hw, mMode);
2552 }
2553 return true;
2554 }
2555 };
2556 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2557 postMessageSync(msg);
2558}
2559
2560// ---------------------------------------------------------------------------
2561
2562status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2563{
2564 String8 result;
2565
2566 IPCThreadState* ipc = IPCThreadState::self();
2567 const int pid = ipc->getCallingPid();
2568 const int uid = ipc->getCallingUid();
2569 if ((uid != AID_SHELL) &&
2570 !PermissionCache::checkPermission(sDump, pid, uid)) {
2571 result.appendFormat("Permission Denial: "
2572 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2573 } else {
2574 // Try to get the main lock, but give up after one second
2575 // (this would indicate SF is stuck, but we want to be able to
2576 // print something in dumpsys).
2577 status_t err = mStateLock.timedLock(s2ns(1));
2578 bool locked = (err == NO_ERROR);
2579 if (!locked) {
2580 result.appendFormat(
2581 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2582 "dumping anyways (no locks held)\n", strerror(-err), err);
2583 }
2584
2585 bool dumpAll = true;
2586 size_t index = 0;
2587 size_t numArgs = args.size();
2588 if (numArgs) {
2589 if ((index < numArgs) &&
2590 (args[index] == String16("--list"))) {
2591 index++;
2592 listLayersLocked(args, index, result);
2593 dumpAll = false;
2594 }
2595
2596 if ((index < numArgs) &&
2597 (args[index] == String16("--latency"))) {
2598 index++;
2599 dumpStatsLocked(args, index, result);
2600 dumpAll = false;
2601 }
2602
2603 if ((index < numArgs) &&
2604 (args[index] == String16("--latency-clear"))) {
2605 index++;
2606 clearStatsLocked(args, index, result);
2607 dumpAll = false;
2608 }
2609
2610 if ((index < numArgs) &&
2611 (args[index] == String16("--dispsync"))) {
2612 index++;
2613 mPrimaryDispSync.dump(result);
2614 dumpAll = false;
2615 }
2616
2617 if ((index < numArgs) &&
2618 (args[index] == String16("--static-screen"))) {
2619 index++;
2620 dumpStaticScreenStats(result);
2621 dumpAll = false;
2622 }
Pablo Ceballos40845df2016-01-25 17:41:15 -08002623
Pablo Ceballos69a1a382016-03-30 15:28:05 -07002624#ifdef ENABLE_FENCE_TRACKING
Pablo Ceballos40845df2016-01-25 17:41:15 -08002625 if ((index < numArgs) &&
2626 (args[index] == String16("--fences"))) {
2627 index++;
2628 mFenceTracker.dump(&result);
2629 dumpAll = false;
2630 }
Pablo Ceballos69a1a382016-03-30 15:28:05 -07002631#endif
Dan Stoza9e56aa02015-11-02 13:00:03 -08002632 }
2633
2634 if (dumpAll) {
2635 dumpAllLocked(args, index, result);
2636 }
2637
2638 if (locked) {
2639 mStateLock.unlock();
2640 }
2641 }
2642 write(fd, result.string(), result.size());
2643 return NO_ERROR;
2644}
2645
2646void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2647 size_t& /* index */, String8& result) const
2648{
2649 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2650 const size_t count = currentLayers.size();
2651 for (size_t i=0 ; i<count ; i++) {
2652 const sp<Layer>& layer(currentLayers[i]);
2653 result.appendFormat("%s\n", layer->getName().string());
2654 }
2655}
2656
2657void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2658 String8& result) const
2659{
2660 String8 name;
2661 if (index < args.size()) {
2662 name = String8(args[index]);
2663 index++;
2664 }
2665
2666 const nsecs_t period =
2667 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2668 result.appendFormat("%" PRId64 "\n", period);
2669
2670 if (name.isEmpty()) {
2671 mAnimFrameTracker.dumpStats(result);
2672 } else {
2673 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2674 const size_t count = currentLayers.size();
2675 for (size_t i=0 ; i<count ; i++) {
2676 const sp<Layer>& layer(currentLayers[i]);
2677 if (name == layer->getName()) {
2678 layer->dumpFrameStats(result);
2679 }
2680 }
2681 }
2682}
2683
2684void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2685 String8& /* result */)
2686{
2687 String8 name;
2688 if (index < args.size()) {
2689 name = String8(args[index]);
2690 index++;
2691 }
2692
2693 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2694 const size_t count = currentLayers.size();
2695 for (size_t i=0 ; i<count ; i++) {
2696 const sp<Layer>& layer(currentLayers[i]);
2697 if (name.isEmpty() || (name == layer->getName())) {
2698 layer->clearFrameStats();
2699 }
2700 }
2701
2702 mAnimFrameTracker.clearStats();
2703}
2704
2705// This should only be called from the main thread. Otherwise it would need
2706// the lock and should use mCurrentState rather than mDrawingState.
2707void SurfaceFlinger::logFrameStats() {
2708 const LayerVector& drawingLayers = mDrawingState.layersSortedByZ;
2709 const size_t count = drawingLayers.size();
2710 for (size_t i=0 ; i<count ; i++) {
2711 const sp<Layer>& layer(drawingLayers[i]);
2712 layer->logFrameStats();
2713 }
2714
2715 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2716}
2717
2718/*static*/ void SurfaceFlinger::appendSfConfigString(String8& result)
2719{
2720 static const char* config =
2721 " [sf"
2722#ifdef HAS_CONTEXT_PRIORITY
2723 " HAS_CONTEXT_PRIORITY"
2724#endif
2725#ifdef NEVER_DEFAULT_TO_ASYNC_MODE
2726 " NEVER_DEFAULT_TO_ASYNC_MODE"
2727#endif
2728#ifdef TARGET_DISABLE_TRIPLE_BUFFERING
2729 " TARGET_DISABLE_TRIPLE_BUFFERING"
2730#endif
2731 "]";
2732 result.append(config);
2733}
2734
2735void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
2736{
2737 result.appendFormat("Static screen stats:\n");
2738 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
2739 float bucketTimeSec = mFrameBuckets[b] / 1e9;
2740 float percent = 100.0f *
2741 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
2742 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
2743 b + 1, bucketTimeSec, percent);
2744 }
2745 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
2746 float percent = 100.0f *
2747 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
2748 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
2749 NUM_BUCKETS - 1, bucketTimeSec, percent);
2750}
2751
2752void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
2753 String8& result) const
2754{
2755 bool colorize = false;
2756 if (index < args.size()
2757 && (args[index] == String16("--color"))) {
2758 colorize = true;
2759 index++;
2760 }
2761
2762 Colorizer colorizer(colorize);
2763
2764 // figure out if we're stuck somewhere
2765 const nsecs_t now = systemTime();
2766 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
2767 const nsecs_t inTransaction(mDebugInTransaction);
2768 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
2769 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
2770
2771 /*
2772 * Dump library configuration.
2773 */
2774
2775 colorizer.bold(result);
2776 result.append("Build configuration:");
2777 colorizer.reset(result);
2778 appendSfConfigString(result);
2779 appendUiConfigString(result);
2780 appendGuiConfigString(result);
2781 result.append("\n");
2782
2783 colorizer.bold(result);
2784 result.append("Sync configuration: ");
2785 colorizer.reset(result);
2786 result.append(SyncFeatures::getInstance().toString());
2787 result.append("\n");
2788
2789 colorizer.bold(result);
2790 result.append("DispSync configuration: ");
2791 colorizer.reset(result);
2792 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
2793 "present offset %d ns (refresh %" PRId64 " ns)",
2794 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
2795 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
2796 result.append("\n");
2797
2798 // Dump static screen stats
2799 result.append("\n");
2800 dumpStaticScreenStats(result);
2801 result.append("\n");
2802
2803 /*
2804 * Dump the visible layer list
2805 */
2806 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2807 const size_t count = currentLayers.size();
2808 colorizer.bold(result);
2809 result.appendFormat("Visible layers (count = %zu)\n", count);
2810 colorizer.reset(result);
2811 for (size_t i=0 ; i<count ; i++) {
2812 const sp<Layer>& layer(currentLayers[i]);
2813 layer->dump(result, colorizer);
2814 }
2815
2816 /*
2817 * Dump Display state
2818 */
2819
2820 colorizer.bold(result);
2821 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
2822 colorizer.reset(result);
2823 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2824 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
2825 hw->dump(result);
2826 }
2827
2828 /*
2829 * Dump SurfaceFlinger global state
2830 */
2831
2832 colorizer.bold(result);
2833 result.append("SurfaceFlinger global state:\n");
2834 colorizer.reset(result);
2835
2836 HWComposer& hwc(getHwComposer());
2837 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2838
2839 colorizer.bold(result);
2840 result.appendFormat("EGL implementation : %s\n",
2841 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
2842 colorizer.reset(result);
2843 result.appendFormat("%s\n",
2844 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
2845
2846 mRenderEngine->dump(result);
2847
2848 hw->undefinedRegion.dump(result, "undefinedRegion");
2849 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
2850 hw->getOrientation(), hw->isDisplayOn());
2851 result.appendFormat(
2852 " last eglSwapBuffers() time: %f us\n"
2853 " last transaction time : %f us\n"
2854 " transaction-flags : %08x\n"
2855 " refresh-rate : %f fps\n"
2856 " x-dpi : %f\n"
2857 " y-dpi : %f\n"
2858 " gpu_to_cpu_unsupported : %d\n"
2859 ,
2860 mLastSwapBufferTime/1000.0,
2861 mLastTransactionTime/1000.0,
2862 mTransactionFlags,
2863 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
2864 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
2865 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
2866 !mGpuToCpuSupported);
2867
2868 result.appendFormat(" eglSwapBuffers time: %f us\n",
2869 inSwapBuffersDuration/1000.0);
2870
2871 result.appendFormat(" transaction time: %f us\n",
2872 inTransactionDuration/1000.0);
2873
2874 /*
2875 * VSYNC state
2876 */
2877 mEventThread->dump(result);
2878
2879 /*
2880 * Dump HWComposer state
2881 */
2882 colorizer.bold(result);
2883 result.append("h/w composer state:\n");
2884 colorizer.reset(result);
2885 result.appendFormat(" h/w composer %s and %s\n",
2886 hwc.initCheck()==NO_ERROR ? "present" : "not present",
2887 (mDebugDisableHWC || mDebugRegion || mDaltonize
2888 || mHasColorMatrix) ? "disabled" : "enabled");
2889 hwc.dump(result);
2890
2891 /*
2892 * Dump gralloc state
2893 */
2894 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
2895 alloc.dump(result);
2896}
2897
2898const Vector< sp<Layer> >&
2899SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
2900 // Note: mStateLock is held here
2901 wp<IBinder> dpy;
2902 for (size_t i=0 ; i<mDisplays.size() ; i++) {
2903 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
2904 dpy = mDisplays.keyAt(i);
2905 break;
2906 }
2907 }
2908 if (dpy == NULL) {
2909 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
2910 // Just use the primary display so we have something to return
2911 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
2912 }
2913 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
2914}
2915
2916bool SurfaceFlinger::startDdmConnection()
2917{
2918 void* libddmconnection_dso =
2919 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
2920 if (!libddmconnection_dso) {
2921 return false;
2922 }
2923 void (*DdmConnection_start)(const char* name);
2924 DdmConnection_start =
2925 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
2926 if (!DdmConnection_start) {
2927 dlclose(libddmconnection_dso);
2928 return false;
2929 }
2930 (*DdmConnection_start)(getServiceName());
2931 return true;
2932}
2933
2934status_t SurfaceFlinger::onTransact(
2935 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2936{
2937 switch (code) {
2938 case CREATE_CONNECTION:
2939 case CREATE_DISPLAY:
2940 case SET_TRANSACTION_STATE:
2941 case BOOT_FINISHED:
2942 case CLEAR_ANIMATION_FRAME_STATS:
2943 case GET_ANIMATION_FRAME_STATS:
2944 case SET_POWER_MODE:
Dan Stozac4f471e2016-03-24 09:31:08 -07002945 case GET_HDR_CAPABILITIES:
Dan Stoza9e56aa02015-11-02 13:00:03 -08002946 {
2947 // codes that require permission check
2948 IPCThreadState* ipc = IPCThreadState::self();
2949 const int pid = ipc->getCallingPid();
2950 const int uid = ipc->getCallingUid();
2951 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
2952 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
2953 ALOGE("Permission Denial: "
2954 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2955 return PERMISSION_DENIED;
2956 }
2957 break;
2958 }
2959 case CAPTURE_SCREEN:
2960 {
2961 // codes that require permission check
2962 IPCThreadState* ipc = IPCThreadState::self();
2963 const int pid = ipc->getCallingPid();
2964 const int uid = ipc->getCallingUid();
2965 if ((uid != AID_GRAPHICS) &&
2966 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
2967 ALOGE("Permission Denial: "
2968 "can't read framebuffer pid=%d, uid=%d", pid, uid);
2969 return PERMISSION_DENIED;
2970 }
2971 break;
2972 }
2973 }
2974
2975 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
2976 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
2977 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2978 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
2979 IPCThreadState* ipc = IPCThreadState::self();
2980 const int pid = ipc->getCallingPid();
2981 const int uid = ipc->getCallingUid();
2982 ALOGE("Permission Denial: "
2983 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2984 return PERMISSION_DENIED;
2985 }
2986 int n;
2987 switch (code) {
2988 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
2989 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
2990 return NO_ERROR;
2991 case 1002: // SHOW_UPDATES
2992 n = data.readInt32();
2993 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
2994 invalidateHwcGeometry();
2995 repaintEverything();
2996 return NO_ERROR;
2997 case 1004:{ // repaint everything
2998 repaintEverything();
2999 return NO_ERROR;
3000 }
3001 case 1005:{ // force transaction
3002 setTransactionFlags(
3003 eTransactionNeeded|
3004 eDisplayTransactionNeeded|
3005 eTraversalNeeded);
3006 return NO_ERROR;
3007 }
3008 case 1006:{ // send empty update
3009 signalRefresh();
3010 return NO_ERROR;
3011 }
3012 case 1008: // toggle use of hw composer
3013 n = data.readInt32();
3014 mDebugDisableHWC = n ? 1 : 0;
3015 invalidateHwcGeometry();
3016 repaintEverything();
3017 return NO_ERROR;
3018 case 1009: // toggle use of transform hint
3019 n = data.readInt32();
3020 mDebugDisableTransformHint = n ? 1 : 0;
3021 invalidateHwcGeometry();
3022 repaintEverything();
3023 return NO_ERROR;
3024 case 1010: // interrogate.
3025 reply->writeInt32(0);
3026 reply->writeInt32(0);
3027 reply->writeInt32(mDebugRegion);
3028 reply->writeInt32(0);
3029 reply->writeInt32(mDebugDisableHWC);
3030 return NO_ERROR;
3031 case 1013: {
3032 Mutex::Autolock _l(mStateLock);
3033 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3034 reply->writeInt32(hw->getPageFlipCount());
3035 return NO_ERROR;
3036 }
3037 case 1014: {
3038 // daltonize
3039 n = data.readInt32();
3040 switch (n % 10) {
3041 case 1: mDaltonizer.setType(Daltonizer::protanomaly); break;
3042 case 2: mDaltonizer.setType(Daltonizer::deuteranomaly); break;
3043 case 3: mDaltonizer.setType(Daltonizer::tritanomaly); break;
3044 }
3045 if (n >= 10) {
3046 mDaltonizer.setMode(Daltonizer::correction);
3047 } else {
3048 mDaltonizer.setMode(Daltonizer::simulation);
3049 }
3050 mDaltonize = n > 0;
3051 invalidateHwcGeometry();
3052 repaintEverything();
3053 return NO_ERROR;
3054 }
3055 case 1015: {
3056 // apply a color matrix
3057 n = data.readInt32();
3058 mHasColorMatrix = n ? 1 : 0;
3059 if (n) {
3060 // color matrix is sent as mat3 matrix followed by vec3
3061 // offset, then packed into a mat4 where the last row is
3062 // the offset and extra values are 0
3063 for (size_t i = 0 ; i < 4; i++) {
3064 for (size_t j = 0; j < 4; j++) {
3065 mColorMatrix[i][j] = data.readFloat();
3066 }
3067 }
3068 } else {
3069 mColorMatrix = mat4();
3070 }
3071 invalidateHwcGeometry();
3072 repaintEverything();
3073 return NO_ERROR;
3074 }
3075 // This is an experimental interface
3076 // Needs to be shifted to proper binder interface when we productize
3077 case 1016: {
3078 n = data.readInt32();
3079 mPrimaryDispSync.setRefreshSkipCount(n);
3080 return NO_ERROR;
3081 }
3082 case 1017: {
3083 n = data.readInt32();
3084 mForceFullDamage = static_cast<bool>(n);
3085 return NO_ERROR;
3086 }
3087 case 1018: { // Modify Choreographer's phase offset
3088 n = data.readInt32();
3089 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3090 return NO_ERROR;
3091 }
3092 case 1019: { // Modify SurfaceFlinger's phase offset
3093 n = data.readInt32();
3094 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3095 return NO_ERROR;
3096 }
3097 }
3098 }
3099 return err;
3100}
3101
3102void SurfaceFlinger::repaintEverything() {
3103 android_atomic_or(1, &mRepaintEverything);
3104 signalTransaction();
3105}
3106
3107// ---------------------------------------------------------------------------
3108// Capture screen into an IGraphiBufferProducer
3109// ---------------------------------------------------------------------------
3110
3111/* The code below is here to handle b/8734824
3112 *
3113 * We create a IGraphicBufferProducer wrapper that forwards all calls
3114 * from the surfaceflinger thread to the calling binder thread, where they
3115 * are executed. This allows the calling thread in the calling process to be
3116 * reused and not depend on having "enough" binder threads to handle the
3117 * requests.
3118 */
3119class GraphicProducerWrapper : public BBinder, public MessageHandler {
3120 /* Parts of GraphicProducerWrapper are run on two different threads,
3121 * communicating by sending messages via Looper but also by shared member
3122 * data. Coherence maintenance is subtle and in places implicit (ugh).
3123 *
3124 * Don't rely on Looper's sendMessage/handleMessage providing
3125 * release/acquire semantics for any data not actually in the Message.
3126 * Data going from surfaceflinger to binder threads needs to be
3127 * synchronized explicitly.
3128 *
3129 * Barrier open/wait do provide release/acquire semantics. This provides
3130 * implicit synchronization for data coming back from binder to
3131 * surfaceflinger threads.
3132 */
3133
3134 sp<IGraphicBufferProducer> impl;
3135 sp<Looper> looper;
3136 status_t result;
3137 bool exitPending;
3138 bool exitRequested;
3139 Barrier barrier;
3140 uint32_t code;
3141 Parcel const* data;
3142 Parcel* reply;
3143
3144 enum {
3145 MSG_API_CALL,
3146 MSG_EXIT
3147 };
3148
3149 /*
3150 * Called on surfaceflinger thread. This is called by our "fake"
3151 * BpGraphicBufferProducer. We package the data and reply Parcel and
3152 * forward them to the binder thread.
3153 */
3154 virtual status_t transact(uint32_t code,
3155 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3156 this->code = code;
3157 this->data = &data;
3158 this->reply = reply;
3159 if (exitPending) {
3160 // if we've exited, we run the message synchronously right here.
3161 // note (JH): as far as I can tell from looking at the code, this
3162 // never actually happens. if it does, i'm not sure if it happens
3163 // on the surfaceflinger or binder thread.
3164 handleMessage(Message(MSG_API_CALL));
3165 } else {
3166 barrier.close();
3167 // Prevent stores to this->{code, data, reply} from being
3168 // reordered later than the construction of Message.
3169 atomic_thread_fence(memory_order_release);
3170 looper->sendMessage(this, Message(MSG_API_CALL));
3171 barrier.wait();
3172 }
3173 return result;
3174 }
3175
3176 /*
3177 * here we run on the binder thread. All we've got to do is
3178 * call the real BpGraphicBufferProducer.
3179 */
3180 virtual void handleMessage(const Message& message) {
3181 int what = message.what;
3182 // Prevent reads below from happening before the read from Message
3183 atomic_thread_fence(memory_order_acquire);
3184 if (what == MSG_API_CALL) {
3185 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3186 barrier.open();
3187 } else if (what == MSG_EXIT) {
3188 exitRequested = true;
3189 }
3190 }
3191
3192public:
3193 GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3194 : impl(impl),
3195 looper(new Looper(true)),
3196 result(NO_ERROR),
3197 exitPending(false),
3198 exitRequested(false),
3199 code(0),
3200 data(NULL),
3201 reply(NULL)
3202 {}
3203
3204 // Binder thread
3205 status_t waitForResponse() {
3206 do {
3207 looper->pollOnce(-1);
3208 } while (!exitRequested);
3209 return result;
3210 }
3211
3212 // Client thread
3213 void exit(status_t result) {
3214 this->result = result;
3215 exitPending = true;
3216 // Ensure this->result is visible to the binder thread before it
3217 // handles the message.
3218 atomic_thread_fence(memory_order_release);
3219 looper->sendMessage(this, Message(MSG_EXIT));
3220 }
3221};
3222
3223
3224status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3225 const sp<IGraphicBufferProducer>& producer,
3226 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3227 uint32_t minLayerZ, uint32_t maxLayerZ,
3228 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3229
3230 if (CC_UNLIKELY(display == 0))
3231 return BAD_VALUE;
3232
3233 if (CC_UNLIKELY(producer == 0))
3234 return BAD_VALUE;
3235
3236 // if we have secure windows on this display, never allow the screen capture
3237 // unless the producer interface is local (i.e.: we can take a screenshot for
3238 // ourselves).
3239 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3240
3241 // Convert to surfaceflinger's internal rotation type.
3242 Transform::orientation_flags rotationFlags;
3243 switch (rotation) {
3244 case ISurfaceComposer::eRotateNone:
3245 rotationFlags = Transform::ROT_0;
3246 break;
3247 case ISurfaceComposer::eRotate90:
3248 rotationFlags = Transform::ROT_90;
3249 break;
3250 case ISurfaceComposer::eRotate180:
3251 rotationFlags = Transform::ROT_180;
3252 break;
3253 case ISurfaceComposer::eRotate270:
3254 rotationFlags = Transform::ROT_270;
3255 break;
3256 default:
3257 rotationFlags = Transform::ROT_0;
3258 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3259 break;
3260 }
3261
3262 class MessageCaptureScreen : public MessageBase {
3263 SurfaceFlinger* flinger;
3264 sp<IBinder> display;
3265 sp<IGraphicBufferProducer> producer;
3266 Rect sourceCrop;
3267 uint32_t reqWidth, reqHeight;
3268 uint32_t minLayerZ,maxLayerZ;
3269 bool useIdentityTransform;
3270 Transform::orientation_flags rotation;
3271 status_t result;
3272 bool isLocalScreenshot;
3273 public:
3274 MessageCaptureScreen(SurfaceFlinger* flinger,
3275 const sp<IBinder>& display,
3276 const sp<IGraphicBufferProducer>& producer,
3277 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3278 uint32_t minLayerZ, uint32_t maxLayerZ,
3279 bool useIdentityTransform,
3280 Transform::orientation_flags rotation,
3281 bool isLocalScreenshot)
3282 : flinger(flinger), display(display), producer(producer),
3283 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3284 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3285 useIdentityTransform(useIdentityTransform),
3286 rotation(rotation), result(PERMISSION_DENIED),
3287 isLocalScreenshot(isLocalScreenshot)
3288 {
3289 }
3290 status_t getResult() const {
3291 return result;
3292 }
3293 virtual bool handler() {
3294 Mutex::Autolock _l(flinger->mStateLock);
3295 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3296 result = flinger->captureScreenImplLocked(hw, producer,
3297 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3298 useIdentityTransform, rotation, isLocalScreenshot);
3299 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3300 return true;
3301 }
3302 };
3303
3304 // make sure to process transactions before screenshots -- a transaction
3305 // might already be pending but scheduled for VSYNC; this guarantees we
3306 // will handle it before the screenshot. When VSYNC finally arrives
3307 // the scheduled transaction will be a no-op. If no transactions are
3308 // scheduled at this time, this will end-up being a no-op as well.
3309 mEventQueue.invalidateTransactionNow();
3310
3311 // this creates a "fake" BBinder which will serve as a "fake" remote
3312 // binder to receive the marshaled calls and forward them to the
3313 // real remote (a BpGraphicBufferProducer)
3314 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3315
3316 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3317 // which does the marshaling work forwards to our "fake remote" above.
3318 sp<MessageBase> msg = new MessageCaptureScreen(this,
3319 display, IGraphicBufferProducer::asInterface( wrapper ),
3320 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3321 useIdentityTransform, rotationFlags, isLocalScreenshot);
3322
3323 status_t res = postMessageAsync(msg);
3324 if (res == NO_ERROR) {
3325 res = wrapper->waitForResponse();
3326 }
3327 return res;
3328}
3329
3330
3331void SurfaceFlinger::renderScreenImplLocked(
3332 const sp<const DisplayDevice>& hw,
3333 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3334 uint32_t minLayerZ, uint32_t maxLayerZ,
3335 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3336{
3337 ATRACE_CALL();
3338 RenderEngine& engine(getRenderEngine());
3339
3340 // get screen geometry
3341 const int32_t hw_w = hw->getWidth();
3342 const int32_t hw_h = hw->getHeight();
3343 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3344 static_cast<int32_t>(reqHeight) != hw_h;
3345
3346 // if a default or invalid sourceCrop is passed in, set reasonable values
3347 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3348 !sourceCrop.isValid()) {
3349 sourceCrop.setLeftTop(Point(0, 0));
3350 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3351 }
3352
3353 // ensure that sourceCrop is inside screen
3354 if (sourceCrop.left < 0) {
3355 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3356 }
3357 if (sourceCrop.right > hw_w) {
3358 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3359 }
3360 if (sourceCrop.top < 0) {
3361 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3362 }
3363 if (sourceCrop.bottom > hw_h) {
3364 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3365 }
3366
3367 // make sure to clear all GL error flags
3368 engine.checkErrors();
3369
3370 // set-up our viewport
3371 engine.setViewportAndProjection(
3372 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3373 engine.disableTexturing();
3374
3375 // redraw the screen entirely...
3376 engine.clearWithColor(0, 0, 0, 1);
3377
3378 const LayerVector& layers( mDrawingState.layersSortedByZ );
3379 const size_t count = layers.size();
3380 for (size_t i=0 ; i<count ; ++i) {
3381 const sp<Layer>& layer(layers[i]);
3382 const Layer::State& state(layer->getDrawingState());
3383 if (state.layerStack == hw->getLayerStack()) {
3384 if (state.z >= minLayerZ && state.z <= maxLayerZ) {
3385 if (layer->isVisible()) {
3386 if (filtering) layer->setFiltering(true);
3387 layer->draw(hw, useIdentityTransform);
3388 if (filtering) layer->setFiltering(false);
3389 }
3390 }
3391 }
3392 }
3393
3394 // compositionComplete is needed for older driver
3395 hw->compositionComplete();
3396 hw->setViewportAndProjection();
3397}
3398
3399
3400status_t SurfaceFlinger::captureScreenImplLocked(
3401 const sp<const DisplayDevice>& hw,
3402 const sp<IGraphicBufferProducer>& producer,
3403 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3404 uint32_t minLayerZ, uint32_t maxLayerZ,
3405 bool useIdentityTransform, Transform::orientation_flags rotation,
3406 bool isLocalScreenshot)
3407{
3408 ATRACE_CALL();
3409
3410 // get screen geometry
3411 uint32_t hw_w = hw->getWidth();
3412 uint32_t hw_h = hw->getHeight();
3413
3414 if (rotation & Transform::ROT_90) {
3415 std::swap(hw_w, hw_h);
3416 }
3417
3418 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3419 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3420 reqWidth, reqHeight, hw_w, hw_h);
3421 return BAD_VALUE;
3422 }
3423
3424 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3425 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3426
3427 bool secureLayerIsVisible = false;
3428 const LayerVector& layers(mDrawingState.layersSortedByZ);
3429 const size_t count = layers.size();
3430 for (size_t i = 0 ; i < count ; ++i) {
3431 const sp<Layer>& layer(layers[i]);
3432 const Layer::State& state(layer->getDrawingState());
3433 if (state.layerStack == hw->getLayerStack() && state.z >= minLayerZ &&
3434 state.z <= maxLayerZ && layer->isVisible() &&
3435 layer->isSecure()) {
3436 secureLayerIsVisible = true;
3437 }
3438 }
3439
3440 if (!isLocalScreenshot && secureLayerIsVisible) {
3441 ALOGW("FB is protected: PERMISSION_DENIED");
3442 return PERMISSION_DENIED;
3443 }
3444
3445 // create a surface (because we're a producer, and we need to
3446 // dequeue/queue a buffer)
3447 sp<Surface> sur = new Surface(producer, false);
3448 ANativeWindow* window = sur.get();
3449
3450 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3451 if (result == NO_ERROR) {
3452 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3453 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3454
3455 int err = 0;
3456 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3457 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3458 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3459 err |= native_window_set_usage(window, usage);
3460
3461 if (err == NO_ERROR) {
3462 ANativeWindowBuffer* buffer;
3463 /* TODO: Once we have the sync framework everywhere this can use
3464 * server-side waits on the fence that dequeueBuffer returns.
3465 */
3466 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3467 if (result == NO_ERROR) {
3468 int syncFd = -1;
3469 // create an EGLImage from the buffer so we can later
3470 // turn it into a texture
3471 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3472 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3473 if (image != EGL_NO_IMAGE_KHR) {
3474 // this binds the given EGLImage as a framebuffer for the
3475 // duration of this scope.
3476 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3477 if (imageBond.getStatus() == NO_ERROR) {
3478 // this will in fact render into our dequeued buffer
3479 // via an FBO, which means we didn't have to create
3480 // an EGLSurface and therefore we're not
3481 // dependent on the context's EGLConfig.
3482 renderScreenImplLocked(
3483 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3484 useIdentityTransform, rotation);
3485
3486 // Attempt to create a sync khr object that can produce a sync point. If that
3487 // isn't available, create a non-dupable sync object in the fallback path and
3488 // wait on it directly.
3489 EGLSyncKHR sync;
3490 if (!DEBUG_SCREENSHOTS) {
3491 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3492 // native fence fd will not be populated until flush() is done.
3493 getRenderEngine().flush();
3494 } else {
3495 sync = EGL_NO_SYNC_KHR;
3496 }
3497 if (sync != EGL_NO_SYNC_KHR) {
3498 // get the sync fd
3499 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3500 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3501 ALOGW("captureScreen: failed to dup sync khr object");
3502 syncFd = -1;
3503 }
3504 eglDestroySyncKHR(mEGLDisplay, sync);
3505 } else {
3506 // fallback path
3507 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3508 if (sync != EGL_NO_SYNC_KHR) {
3509 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3510 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3511 EGLint eglErr = eglGetError();
3512 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3513 ALOGW("captureScreen: fence wait timed out");
3514 } else {
3515 ALOGW_IF(eglErr != EGL_SUCCESS,
3516 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3517 }
3518 eglDestroySyncKHR(mEGLDisplay, sync);
3519 } else {
3520 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3521 }
3522 }
3523 if (DEBUG_SCREENSHOTS) {
3524 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3525 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3526 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3527 hw, minLayerZ, maxLayerZ);
3528 delete [] pixels;
3529 }
3530
3531 } else {
3532 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3533 result = INVALID_OPERATION;
Prathmesh Prabhuf3209b02016-03-09 16:54:45 -08003534 window->cancelBuffer(window, buffer, syncFd);
3535 buffer = NULL;
Dan Stoza9e56aa02015-11-02 13:00:03 -08003536 }
3537 // destroy our image
3538 eglDestroyImageKHR(mEGLDisplay, image);
3539 } else {
3540 result = BAD_VALUE;
3541 }
Prathmesh Prabhuf3209b02016-03-09 16:54:45 -08003542 if (buffer) {
3543 // queueBuffer takes ownership of syncFd
3544 result = window->queueBuffer(window, buffer, syncFd);
3545 }
Dan Stoza9e56aa02015-11-02 13:00:03 -08003546 }
3547 } else {
3548 result = BAD_VALUE;
3549 }
3550 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3551 }
3552
3553 return result;
3554}
3555
3556void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
3557 const sp<const DisplayDevice>& hw, uint32_t minLayerZ, uint32_t maxLayerZ) {
3558 if (DEBUG_SCREENSHOTS) {
3559 for (size_t y=0 ; y<h ; y++) {
3560 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3561 for (size_t x=0 ; x<w ; x++) {
3562 if (p[x] != 0xFF000000) return;
3563 }
3564 }
3565 ALOGE("*** we just took a black screenshot ***\n"
3566 "requested minz=%d, maxz=%d, layerStack=%d",
3567 minLayerZ, maxLayerZ, hw->getLayerStack());
3568 const LayerVector& layers( mDrawingState.layersSortedByZ );
3569 const size_t count = layers.size();
3570 for (size_t i=0 ; i<count ; ++i) {
3571 const sp<Layer>& layer(layers[i]);
3572 const Layer::State& state(layer->getDrawingState());
3573 const bool visible = (state.layerStack == hw->getLayerStack())
3574 && (state.z >= minLayerZ && state.z <= maxLayerZ)
3575 && (layer->isVisible());
3576 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3577 visible ? '+' : '-',
3578 i, layer->getName().string(), state.layerStack, state.z,
3579 layer->isVisible(), state.flags, state.alpha);
3580 }
3581 }
3582}
3583
3584// ---------------------------------------------------------------------------
3585
3586SurfaceFlinger::LayerVector::LayerVector() {
3587}
3588
3589SurfaceFlinger::LayerVector::LayerVector(const LayerVector& rhs)
3590 : SortedVector<sp<Layer> >(rhs) {
3591}
3592
3593int SurfaceFlinger::LayerVector::do_compare(const void* lhs,
3594 const void* rhs) const
3595{
3596 // sort layers per layer-stack, then by z-order and finally by sequence
3597 const sp<Layer>& l(*reinterpret_cast<const sp<Layer>*>(lhs));
3598 const sp<Layer>& r(*reinterpret_cast<const sp<Layer>*>(rhs));
3599
3600 uint32_t ls = l->getCurrentState().layerStack;
3601 uint32_t rs = r->getCurrentState().layerStack;
3602 if (ls != rs)
3603 return ls - rs;
3604
3605 uint32_t lz = l->getCurrentState().z;
3606 uint32_t rz = r->getCurrentState().z;
3607 if (lz != rz)
3608 return lz - rz;
3609
3610 return l->sequence - r->sequence;
3611}
3612
3613// ---------------------------------------------------------------------------
3614
3615SurfaceFlinger::DisplayDeviceState::DisplayDeviceState()
3616 : type(DisplayDevice::DISPLAY_ID_INVALID),
3617 layerStack(DisplayDevice::NO_LAYER_STACK),
3618 orientation(0),
3619 width(0),
3620 height(0),
3621 isSecure(false) {
3622}
3623
3624SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(
3625 DisplayDevice::DisplayType type, bool isSecure)
3626 : type(type),
3627 layerStack(DisplayDevice::NO_LAYER_STACK),
3628 orientation(0),
3629 width(0),
3630 height(0),
3631 isSecure(isSecure) {
3632 viewport.makeInvalid();
3633 frame.makeInvalid();
3634}
3635
3636// ---------------------------------------------------------------------------
3637
3638}; // namespace android
3639
3640
3641#if defined(__gl_h_)
3642#error "don't include gl/gl.h in this file"
3643#endif
3644
3645#if defined(__gl2_h_)
3646#error "don't include gl2/gl2.h in this file"
3647#endif