blob: b0115988ef5cbf6b8a6f47bcc455c128fb77a5d3 [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) {
823 ALOGE("resyncToHardwareVsync called when HW vsync unavailable");
824 return;
825 }
826
827 const nsecs_t period =
828 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
829
830 mPrimaryDispSync.reset();
831 mPrimaryDispSync.setPeriod(period);
832
833 if (!mPrimaryHWVsyncEnabled) {
834 mPrimaryDispSync.beginResync();
835 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
836 mEventControlThread->setVsyncEnabled(true);
837 mPrimaryHWVsyncEnabled = true;
838 }
839}
840
841void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
842 Mutex::Autolock _l(mHWVsyncLock);
843 if (mPrimaryHWVsyncEnabled) {
844 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
845 mEventControlThread->setVsyncEnabled(false);
846 mPrimaryDispSync.endResync();
847 mPrimaryHWVsyncEnabled = false;
848 }
849 if (makeUnavailable) {
850 mHWVsyncAvailable = false;
851 }
852}
853
Tim Murray4a4e4a22016-04-19 16:29:23 +0000854void SurfaceFlinger::resyncWithRateLimit() {
855 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
856 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
857 resyncToHardwareVsync(true);
858 }
859}
860
Dan Stoza9e56aa02015-11-02 13:00:03 -0800861void SurfaceFlinger::onVSyncReceived(int type, nsecs_t timestamp) {
862 bool needsHwVsync = false;
863
864 { // Scope for the lock
865 Mutex::Autolock _l(mHWVsyncLock);
866 if (type == 0 && mPrimaryHWVsyncEnabled) {
867 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
868 }
869 }
870
871 if (needsHwVsync) {
872 enableHardwareVsync();
873 } else {
874 disableHardwareVsync(false);
875 }
876}
877
878void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
879 if (mEventThread == NULL) {
880 // This is a temporary workaround for b/7145521. A non-null pointer
881 // does not mean EventThread has finished initializing, so this
882 // is not a correct fix.
883 ALOGW("WARNING: EventThread not started, ignoring hotplug");
884 return;
885 }
886
887 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
888 Mutex::Autolock _l(mStateLock);
889 if (connected) {
890 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
891 } else {
892 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
893 mBuiltinDisplays[type].clear();
894 }
895 setTransactionFlags(eDisplayTransactionNeeded);
896
897 // Defer EventThread notification until SF has updated mDisplays.
898 }
899}
900
901void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
902 ATRACE_CALL();
903 getHwComposer().eventControl(disp, event, enabled);
904}
905
906void SurfaceFlinger::onMessageReceived(int32_t what) {
907 ATRACE_CALL();
908 switch (what) {
909 case MessageQueue::TRANSACTION: {
910 handleMessageTransaction();
911 break;
912 }
913 case MessageQueue::INVALIDATE: {
914 bool refreshNeeded = handleMessageTransaction();
915 refreshNeeded |= handleMessageInvalidate();
916 refreshNeeded |= mRepaintEverything;
917 if (refreshNeeded) {
918 // Signal a refresh if a transaction modified the window state,
919 // a new buffer was latched, or if HWC has requested a full
920 // repaint
921 signalRefresh();
922 }
923 break;
924 }
925 case MessageQueue::REFRESH: {
926 handleMessageRefresh();
927 break;
928 }
929 }
930}
931
932bool SurfaceFlinger::handleMessageTransaction() {
933 uint32_t transactionFlags = peekTransactionFlags(eTransactionMask);
934 if (transactionFlags) {
935 handleTransaction(transactionFlags);
936 return true;
937 }
938 return false;
939}
940
941bool SurfaceFlinger::handleMessageInvalidate() {
942 ATRACE_CALL();
943 return handlePageFlip();
944}
945
946void SurfaceFlinger::handleMessageRefresh() {
947 ATRACE_CALL();
948
Pablo Ceballos69a1a382016-03-30 15:28:05 -0700949#ifdef ENABLE_FENCE_TRACKING
Pablo Ceballos40845df2016-01-25 17:41:15 -0800950 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
Pablo Ceballos69a1a382016-03-30 15:28:05 -0700951#else
952 nsecs_t refreshStartTime = 0;
953#endif
Dan Stoza9e56aa02015-11-02 13:00:03 -0800954 static nsecs_t previousExpectedPresent = 0;
955 nsecs_t expectedPresent = mPrimaryDispSync.computeNextRefresh(0);
956 static bool previousFrameMissed = false;
957 bool frameMissed = (expectedPresent == previousExpectedPresent);
958 if (frameMissed != previousFrameMissed) {
959 ATRACE_INT("FrameMissed", static_cast<int>(frameMissed));
960 }
961 previousFrameMissed = frameMissed;
962
963 if (CC_UNLIKELY(mDropMissedFrames && frameMissed)) {
964 // Latch buffers, but don't send anything to HWC, then signal another
965 // wakeup for the next vsync
966 preComposition();
967 repaintEverything();
968 } else {
969 preComposition();
970 rebuildLayerStacks();
971 setUpHWComposer();
972 doDebugFlashRegions();
973 doComposition();
Pablo Ceballos40845df2016-01-25 17:41:15 -0800974 postComposition(refreshStartTime);
Dan Stoza9e56aa02015-11-02 13:00:03 -0800975 }
976
977 previousExpectedPresent = mPrimaryDispSync.computeNextRefresh(0);
978}
979
980void SurfaceFlinger::doDebugFlashRegions()
981{
982 // is debugging enabled
983 if (CC_LIKELY(!mDebugRegion))
984 return;
985
986 const bool repaintEverything = mRepaintEverything;
987 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
988 const sp<DisplayDevice>& hw(mDisplays[dpy]);
989 if (hw->isDisplayOn()) {
990 // transform the dirty region into this screen's coordinate space
991 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
992 if (!dirtyRegion.isEmpty()) {
993 // redraw the whole screen
994 doComposeSurfaces(hw, Region(hw->bounds()));
995
996 // and draw the dirty region
997 const int32_t height = hw->getHeight();
998 RenderEngine& engine(getRenderEngine());
999 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1000
1001 hw->compositionComplete();
1002 hw->swapBuffers(getHwComposer());
1003 }
1004 }
1005 }
1006
1007 postFramebuffer();
1008
1009 if (mDebugRegion > 1) {
1010 usleep(mDebugRegion * 1000);
1011 }
1012
1013 HWComposer& hwc(getHwComposer());
1014 if (hwc.initCheck() == NO_ERROR) {
1015 status_t err = hwc.prepare();
1016 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1017 }
1018}
1019
1020void SurfaceFlinger::preComposition()
1021{
1022 bool needExtraInvalidate = false;
1023 const LayerVector& layers(mDrawingState.layersSortedByZ);
1024 const size_t count = layers.size();
1025 for (size_t i=0 ; i<count ; i++) {
1026 if (layers[i]->onPreComposition()) {
1027 needExtraInvalidate = true;
1028 }
1029 }
1030 if (needExtraInvalidate) {
1031 signalLayerUpdate();
1032 }
1033}
1034
Pablo Ceballos69a1a382016-03-30 15:28:05 -07001035#ifdef ENABLE_FENCE_TRACKING
Pablo Ceballos40845df2016-01-25 17:41:15 -08001036void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Pablo Ceballos69a1a382016-03-30 15:28:05 -07001037#else
1038void SurfaceFlinger::postComposition(nsecs_t /*refreshStartTime*/)
1039#endif
Dan Stoza9e56aa02015-11-02 13:00:03 -08001040{
1041 const LayerVector& layers(mDrawingState.layersSortedByZ);
1042 const size_t count = layers.size();
1043 for (size_t i=0 ; i<count ; i++) {
1044 layers[i]->onPostComposition();
1045 }
1046
1047 const HWComposer& hwc = getHwComposer();
1048 sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY);
1049
1050 if (presentFence->isValid()) {
1051 if (mPrimaryDispSync.addPresentFence(presentFence)) {
1052 enableHardwareVsync();
1053 } else {
1054 disableHardwareVsync(false);
1055 }
1056 }
1057
1058 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1059 if (kIgnorePresentFences) {
1060 if (hw->isDisplayOn()) {
1061 enableHardwareVsync();
1062 }
1063 }
1064
Pablo Ceballos69a1a382016-03-30 15:28:05 -07001065#ifdef ENABLE_FENCE_TRACKING
Pablo Ceballos40845df2016-01-25 17:41:15 -08001066 mFenceTracker.addFrame(refreshStartTime, presentFence,
1067 hw->getVisibleLayersSortedByZ(), hw->getClientTargetAcquireFence());
Pablo Ceballos69a1a382016-03-30 15:28:05 -07001068#endif
Pablo Ceballos40845df2016-01-25 17:41:15 -08001069
Dan Stoza9e56aa02015-11-02 13:00:03 -08001070 if (mAnimCompositionPending) {
1071 mAnimCompositionPending = false;
1072
1073 if (presentFence->isValid()) {
1074 mAnimFrameTracker.setActualPresentFence(presentFence);
1075 } else {
1076 // The HWC doesn't support present fences, so use the refresh
1077 // timestamp instead.
1078 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1079 mAnimFrameTracker.setActualPresentTime(presentTime);
1080 }
1081 mAnimFrameTracker.advanceFrame();
1082 }
1083
1084 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1085 return;
1086 }
1087
1088 nsecs_t currentTime = systemTime();
1089 if (mHasPoweredOff) {
1090 mHasPoweredOff = false;
1091 } else {
1092 nsecs_t period = mPrimaryDispSync.getPeriod();
1093 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1094 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1095 if (numPeriods < NUM_BUCKETS - 1) {
1096 mFrameBuckets[numPeriods] += elapsedTime;
1097 } else {
1098 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1099 }
1100 mTotalTime += elapsedTime;
1101 }
1102 mLastSwapTime = currentTime;
1103}
1104
1105void SurfaceFlinger::rebuildLayerStacks() {
1106 // rebuild the visible layer list per screen
1107 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1108 ATRACE_CALL();
1109 mVisibleRegionsDirty = false;
1110 invalidateHwcGeometry();
1111
1112 const LayerVector& layers(mDrawingState.layersSortedByZ);
1113 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1114 Region opaqueRegion;
1115 Region dirtyRegion;
1116 Vector< sp<Layer> > layersSortedByZ;
1117 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1118 const Transform& tr(hw->getTransform());
1119 const Rect bounds(hw->getBounds());
1120 if (hw->isDisplayOn()) {
1121 SurfaceFlinger::computeVisibleRegions(layers,
1122 hw->getLayerStack(), dirtyRegion, opaqueRegion);
1123
1124 const size_t count = layers.size();
1125 for (size_t i=0 ; i<count ; i++) {
1126 const sp<Layer>& layer(layers[i]);
1127 const Layer::State& s(layer->getDrawingState());
1128 if (s.layerStack == hw->getLayerStack()) {
1129 Region drawRegion(tr.transform(
1130 layer->visibleNonTransparentRegion));
1131 drawRegion.andSelf(bounds);
1132 if (!drawRegion.isEmpty()) {
1133 layersSortedByZ.add(layer);
1134 }
1135 }
1136 }
1137 }
1138 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1139 hw->undefinedRegion.set(bounds);
1140 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1141 hw->dirtyRegion.orSelf(dirtyRegion);
1142 }
1143 }
1144}
1145
1146void SurfaceFlinger::setUpHWComposer() {
1147 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1148 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1149 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1150 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1151
1152 // If nothing has changed (!dirty), don't recompose.
1153 // If something changed, but we don't currently have any visible layers,
1154 // and didn't when we last did a composition, then skip it this time.
1155 // The second rule does two things:
1156 // - When all layers are removed from a display, we'll emit one black
1157 // frame, then nothing more until we get new layers.
1158 // - When a display is created with a private layer stack, we won't
1159 // emit any black frames until a layer is added to the layer stack.
1160 bool mustRecompose = dirty && !(empty && wasEmpty);
1161
1162 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1163 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1164 mustRecompose ? "doing" : "skipping",
1165 dirty ? "+" : "-",
1166 empty ? "+" : "-",
1167 wasEmpty ? "+" : "-");
1168
1169 mDisplays[dpy]->beginFrame(mustRecompose);
1170
1171 if (mustRecompose) {
1172 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1173 }
1174 }
1175
1176 HWComposer& hwc(getHwComposer());
1177 if (hwc.initCheck() == NO_ERROR) {
1178 // build the h/w work list
1179 if (CC_UNLIKELY(mHwWorkListDirty)) {
1180 mHwWorkListDirty = false;
1181 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1182 sp<const DisplayDevice> hw(mDisplays[dpy]);
1183 const int32_t id = hw->getHwcDisplayId();
1184 if (id >= 0) {
1185 const Vector< sp<Layer> >& currentLayers(
1186 hw->getVisibleLayersSortedByZ());
1187 const size_t count = currentLayers.size();
1188 if (hwc.createWorkList(id, count) == NO_ERROR) {
1189 HWComposer::LayerListIterator cur = hwc.begin(id);
1190 const HWComposer::LayerListIterator end = hwc.end(id);
1191 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1192 const sp<Layer>& layer(currentLayers[i]);
1193 layer->setGeometry(hw, *cur);
1194 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1195 cur->setSkip(true);
1196 }
1197 }
1198 }
1199 }
1200 }
1201 }
1202
1203 // set the per-frame data
1204 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1205 sp<const DisplayDevice> hw(mDisplays[dpy]);
1206 const int32_t id = hw->getHwcDisplayId();
1207 if (id >= 0) {
1208 const Vector< sp<Layer> >& currentLayers(
1209 hw->getVisibleLayersSortedByZ());
1210 const size_t count = currentLayers.size();
1211 HWComposer::LayerListIterator cur = hwc.begin(id);
1212 const HWComposer::LayerListIterator end = hwc.end(id);
1213 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1214 /*
1215 * update the per-frame h/w composer data for each layer
1216 * and build the transparent region of the FB
1217 */
1218 const sp<Layer>& layer(currentLayers[i]);
1219 layer->setPerFrameData(hw, *cur);
1220 }
1221 }
1222 }
1223
1224 // If possible, attempt to use the cursor overlay on each display.
1225 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1226 sp<const DisplayDevice> hw(mDisplays[dpy]);
1227 const int32_t id = hw->getHwcDisplayId();
1228 if (id >= 0) {
1229 const Vector< sp<Layer> >& currentLayers(
1230 hw->getVisibleLayersSortedByZ());
1231 const size_t count = currentLayers.size();
1232 HWComposer::LayerListIterator cur = hwc.begin(id);
1233 const HWComposer::LayerListIterator end = hwc.end(id);
1234 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1235 const sp<Layer>& layer(currentLayers[i]);
1236 if (layer->isPotentialCursor()) {
1237 cur->setIsCursorLayerHint();
1238 break;
1239 }
1240 }
1241 }
1242 }
1243
1244 status_t err = hwc.prepare();
1245 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1246
1247 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1248 sp<const DisplayDevice> hw(mDisplays[dpy]);
1249 hw->prepareFrame(hwc);
1250 }
1251 }
1252}
1253
1254void SurfaceFlinger::doComposition() {
1255 ATRACE_CALL();
1256 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1257 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1258 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1259 if (hw->isDisplayOn()) {
1260 // transform the dirty region into this screen's coordinate space
1261 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1262
1263 // repaint the framebuffer (if needed)
1264 doDisplayComposition(hw, dirtyRegion);
1265
1266 hw->dirtyRegion.clear();
1267 hw->flip(hw->swapRegion);
1268 hw->swapRegion.clear();
1269 }
1270 // inform the h/w that we're done compositing
1271 hw->compositionComplete();
1272 }
1273 postFramebuffer();
1274}
1275
1276void SurfaceFlinger::postFramebuffer()
1277{
1278 ATRACE_CALL();
1279
1280 const nsecs_t now = systemTime();
1281 mDebugInSwapBuffers = now;
1282
1283 HWComposer& hwc(getHwComposer());
1284 if (hwc.initCheck() == NO_ERROR) {
1285 if (!hwc.supportsFramebufferTarget()) {
1286 // EGL spec says:
1287 // "surface must be bound to the calling thread's current context,
1288 // for the current rendering API."
1289 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1290 }
1291 hwc.commit();
1292 }
1293
1294 // make the default display current because the VirtualDisplayDevice code cannot
1295 // deal with dequeueBuffer() being called outside of the composition loop; however
1296 // the code below can call glFlush() which is allowed (and does in some case) call
1297 // dequeueBuffer().
1298 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1299
1300 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1301 sp<const DisplayDevice> hw(mDisplays[dpy]);
1302 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1303 hw->onSwapBuffersCompleted(hwc);
1304 const size_t count = currentLayers.size();
1305 int32_t id = hw->getHwcDisplayId();
1306 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1307 HWComposer::LayerListIterator cur = hwc.begin(id);
1308 const HWComposer::LayerListIterator end = hwc.end(id);
1309 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1310 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1311 }
1312 } else {
1313 for (size_t i = 0; i < count; i++) {
1314 currentLayers[i]->onLayerDisplayed(hw, NULL);
1315 }
1316 }
1317 }
1318
1319 mLastSwapBufferTime = systemTime() - now;
1320 mDebugInSwapBuffers = 0;
1321
1322 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1323 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1324 logFrameStats();
1325 }
1326}
1327
1328void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1329{
1330 ATRACE_CALL();
1331
1332 // here we keep a copy of the drawing state (that is the state that's
1333 // going to be overwritten by handleTransactionLocked()) outside of
1334 // mStateLock so that the side-effects of the State assignment
1335 // don't happen with mStateLock held (which can cause deadlocks).
1336 State drawingState(mDrawingState);
1337
1338 Mutex::Autolock _l(mStateLock);
1339 const nsecs_t now = systemTime();
1340 mDebugInTransaction = now;
1341
1342 // Here we're guaranteed that some transaction flags are set
1343 // so we can call handleTransactionLocked() unconditionally.
1344 // We call getTransactionFlags(), which will also clear the flags,
1345 // with mStateLock held to guarantee that mCurrentState won't change
1346 // until the transaction is committed.
1347
1348 transactionFlags = getTransactionFlags(eTransactionMask);
1349 handleTransactionLocked(transactionFlags);
1350
1351 mLastTransactionTime = systemTime() - now;
1352 mDebugInTransaction = 0;
1353 invalidateHwcGeometry();
1354 // here the transaction has been committed
1355}
1356
1357void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1358{
1359 const LayerVector& currentLayers(mCurrentState.layersSortedByZ);
1360 const size_t count = currentLayers.size();
1361
1362 // Notify all layers of available frames
1363 for (size_t i = 0; i < count; ++i) {
1364 currentLayers[i]->notifyAvailableFrames();
1365 }
1366
1367 /*
1368 * Traversal of the children
1369 * (perform the transaction for each of them if needed)
1370 */
1371
1372 if (transactionFlags & eTraversalNeeded) {
1373 for (size_t i=0 ; i<count ; i++) {
1374 const sp<Layer>& layer(currentLayers[i]);
1375 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
1376 if (!trFlags) continue;
1377
1378 const uint32_t flags = layer->doTransaction(0);
1379 if (flags & Layer::eVisibleRegion)
1380 mVisibleRegionsDirty = true;
1381 }
1382 }
1383
1384 /*
1385 * Perform display own transactions if needed
1386 */
1387
1388 if (transactionFlags & eDisplayTransactionNeeded) {
1389 // here we take advantage of Vector's copy-on-write semantics to
1390 // improve performance by skipping the transaction entirely when
1391 // know that the lists are identical
1392 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1393 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1394 if (!curr.isIdenticalTo(draw)) {
1395 mVisibleRegionsDirty = true;
1396 const size_t cc = curr.size();
1397 size_t dc = draw.size();
1398
1399 // find the displays that were removed
1400 // (ie: in drawing state but not in current state)
1401 // also handle displays that changed
1402 // (ie: displays that are in both lists)
1403 for (size_t i=0 ; i<dc ; i++) {
1404 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1405 if (j < 0) {
1406 // in drawing state but not in current state
1407 if (!draw[i].isMainDisplay()) {
1408 // Call makeCurrent() on the primary display so we can
1409 // be sure that nothing associated with this display
1410 // is current.
1411 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1412 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1413 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1414 if (hw != NULL)
1415 hw->disconnect(getHwComposer());
1416 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1417 mEventThread->onHotplugReceived(draw[i].type, false);
1418 mDisplays.removeItem(draw.keyAt(i));
1419 } else {
1420 ALOGW("trying to remove the main display");
1421 }
1422 } else {
1423 // this display is in both lists. see if something changed.
1424 const DisplayDeviceState& state(curr[j]);
1425 const wp<IBinder>& display(curr.keyAt(j));
1426 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1427 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1428 if (state_binder != draw_binder) {
1429 // changing the surface is like destroying and
1430 // recreating the DisplayDevice, so we just remove it
1431 // from the drawing state, so that it get re-added
1432 // below.
1433 sp<DisplayDevice> hw(getDisplayDevice(display));
1434 if (hw != NULL)
1435 hw->disconnect(getHwComposer());
1436 mDisplays.removeItem(display);
1437 mDrawingState.displays.removeItemsAt(i);
1438 dc--; i--;
1439 // at this point we must loop to the next item
1440 continue;
1441 }
1442
1443 const sp<DisplayDevice> disp(getDisplayDevice(display));
1444 if (disp != NULL) {
1445 if (state.layerStack != draw[i].layerStack) {
1446 disp->setLayerStack(state.layerStack);
1447 }
1448 if ((state.orientation != draw[i].orientation)
1449 || (state.viewport != draw[i].viewport)
1450 || (state.frame != draw[i].frame))
1451 {
1452 disp->setProjection(state.orientation,
1453 state.viewport, state.frame);
1454 }
1455 if (state.width != draw[i].width || state.height != draw[i].height) {
1456 disp->setDisplaySize(state.width, state.height);
1457 }
1458 }
1459 }
1460 }
1461
1462 // find displays that were added
1463 // (ie: in current state but not in drawing state)
1464 for (size_t i=0 ; i<cc ; i++) {
1465 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1466 const DisplayDeviceState& state(curr[i]);
1467
1468 sp<DisplaySurface> dispSurface;
1469 sp<IGraphicBufferProducer> producer;
1470 sp<IGraphicBufferProducer> bqProducer;
1471 sp<IGraphicBufferConsumer> bqConsumer;
1472 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer,
1473 new GraphicBufferAlloc());
1474
1475 int32_t hwcDisplayId = -1;
1476 if (state.isVirtualDisplay()) {
1477 // Virtual displays without a surface are dormant:
1478 // they have external state (layer stack, projection,
1479 // etc.) but no internal state (i.e. a DisplayDevice).
1480 if (state.surface != NULL) {
1481
1482 int width = 0;
1483 int status = state.surface->query(
1484 NATIVE_WINDOW_WIDTH, &width);
1485 ALOGE_IF(status != NO_ERROR,
1486 "Unable to query width (%d)", status);
1487 int height = 0;
1488 status = state.surface->query(
1489 NATIVE_WINDOW_HEIGHT, &height);
1490 ALOGE_IF(status != NO_ERROR,
1491 "Unable to query height (%d)", status);
1492 if (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
1493 (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
1494 height <= MAX_VIRTUAL_DISPLAY_DIMENSION)) {
1495 hwcDisplayId = allocateHwcDisplayId(state.type);
1496 }
1497
1498 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1499 *mHwc, hwcDisplayId, state.surface,
1500 bqProducer, bqConsumer, state.displayName);
1501
1502 dispSurface = vds;
1503 producer = vds;
1504 }
1505 } else {
1506 ALOGE_IF(state.surface!=NULL,
1507 "adding a supported display, but rendering "
1508 "surface is provided (%p), ignoring it",
1509 state.surface.get());
1510 hwcDisplayId = allocateHwcDisplayId(state.type);
1511 // for supported (by hwc) displays we provide our
1512 // own rendering surface
1513 dispSurface = new FramebufferSurface(*mHwc, state.type,
1514 bqConsumer);
1515 producer = bqProducer;
1516 }
1517
1518 const wp<IBinder>& display(curr.keyAt(i));
1519 if (dispSurface != NULL) {
1520 sp<DisplayDevice> hw = new DisplayDevice(this,
1521 state.type, hwcDisplayId,
1522 mHwc->getFormat(hwcDisplayId), state.isSecure,
1523 display, dispSurface, producer,
1524 mRenderEngine->getEGLConfig());
1525 hw->setLayerStack(state.layerStack);
1526 hw->setProjection(state.orientation,
1527 state.viewport, state.frame);
1528 hw->setDisplayName(state.displayName);
1529 mDisplays.add(display, hw);
1530 if (state.isVirtualDisplay()) {
1531 if (hwcDisplayId >= 0) {
1532 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1533 hw->getWidth(), hw->getHeight(),
1534 hw->getFormat());
1535 }
1536 } else {
1537 mEventThread->onHotplugReceived(state.type, true);
1538 }
1539 }
1540 }
1541 }
1542 }
1543 }
1544
1545 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1546 // The transform hint might have changed for some layers
1547 // (either because a display has changed, or because a layer
1548 // as changed).
1549 //
1550 // Walk through all the layers in currentLayers,
1551 // and update their transform hint.
1552 //
1553 // If a layer is visible only on a single display, then that
1554 // display is used to calculate the hint, otherwise we use the
1555 // default display.
1556 //
1557 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1558 // the hint is set before we acquire a buffer from the surface texture.
1559 //
1560 // NOTE: layer transactions have taken place already, so we use their
1561 // drawing state. However, SurfaceFlinger's own transaction has not
1562 // happened yet, so we must use the current state layer list
1563 // (soon to become the drawing state list).
1564 //
1565 sp<const DisplayDevice> disp;
1566 uint32_t currentlayerStack = 0;
1567 for (size_t i=0; i<count; i++) {
1568 // NOTE: we rely on the fact that layers are sorted by
1569 // layerStack first (so we don't have to traverse the list
1570 // of displays for every layer).
1571 const sp<Layer>& layer(currentLayers[i]);
1572 uint32_t layerStack = layer->getDrawingState().layerStack;
1573 if (i==0 || currentlayerStack != layerStack) {
1574 currentlayerStack = layerStack;
1575 // figure out if this layerstack is mirrored
1576 // (more than one display) if so, pick the default display,
1577 // if not, pick the only display it's on.
1578 disp.clear();
1579 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1580 sp<const DisplayDevice> hw(mDisplays[dpy]);
1581 if (hw->getLayerStack() == currentlayerStack) {
1582 if (disp == NULL) {
1583 disp = hw;
1584 } else {
1585 disp = NULL;
1586 break;
1587 }
1588 }
1589 }
1590 }
1591 if (disp == NULL) {
1592 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1593 // redraw after transform hint changes. See bug 8508397.
1594
1595 // could be null when this layer is using a layerStack
1596 // that is not visible on any display. Also can occur at
1597 // screen off/on times.
1598 disp = getDefaultDisplayDevice();
1599 }
1600 layer->updateTransformHint(disp);
1601 }
1602 }
1603
1604
1605 /*
1606 * Perform our own transaction if needed
1607 */
1608
1609 const LayerVector& layers(mDrawingState.layersSortedByZ);
1610 if (currentLayers.size() > layers.size()) {
1611 // layers have been added
1612 mVisibleRegionsDirty = true;
1613 }
1614
1615 // some layers might have been removed, so
1616 // we need to update the regions they're exposing.
1617 if (mLayersRemoved) {
1618 mLayersRemoved = false;
1619 mVisibleRegionsDirty = true;
1620 const size_t count = layers.size();
1621 for (size_t i=0 ; i<count ; i++) {
1622 const sp<Layer>& layer(layers[i]);
1623 if (currentLayers.indexOf(layer) < 0) {
1624 // this layer is not visible anymore
1625 // TODO: we could traverse the tree from front to back and
1626 // compute the actual visible region
1627 // TODO: we could cache the transformed region
1628 const Layer::State& s(layer->getDrawingState());
Robert Carr3dcabfa2016-03-01 18:36:58 -08001629 Region visibleReg = s.active.transform.transform(
Dan Stoza9e56aa02015-11-02 13:00:03 -08001630 Region(Rect(s.active.w, s.active.h)));
1631 invalidateLayerStack(s.layerStack, visibleReg);
1632 }
1633 }
1634 }
1635
1636 commitTransaction();
1637
1638 updateCursorAsync();
1639}
1640
1641void SurfaceFlinger::updateCursorAsync()
1642{
1643 HWComposer& hwc(getHwComposer());
1644 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1645 sp<const DisplayDevice> hw(mDisplays[dpy]);
1646 const int32_t id = hw->getHwcDisplayId();
1647 if (id < 0) {
1648 continue;
1649 }
1650 const Vector< sp<Layer> >& currentLayers(
1651 hw->getVisibleLayersSortedByZ());
1652 const size_t count = currentLayers.size();
1653 HWComposer::LayerListIterator cur = hwc.begin(id);
1654 const HWComposer::LayerListIterator end = hwc.end(id);
1655 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1656 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1657 continue;
1658 }
1659 const sp<Layer>& layer(currentLayers[i]);
1660 Rect cursorPos = layer->getPosition(hw);
1661 hwc.setCursorPositionAsync(id, cursorPos);
1662 break;
1663 }
1664 }
1665}
1666
1667void SurfaceFlinger::commitTransaction()
1668{
1669 if (!mLayersPendingRemoval.isEmpty()) {
1670 // Notify removed layers now that they can't be drawn from
1671 for (size_t i = 0; i < mLayersPendingRemoval.size(); i++) {
1672 mLayersPendingRemoval[i]->onRemoved();
1673 }
1674 mLayersPendingRemoval.clear();
1675 }
1676
1677 // If this transaction is part of a window animation then the next frame
1678 // we composite should be considered an animation as well.
1679 mAnimCompositionPending = mAnimTransactionPending;
1680
1681 mDrawingState = mCurrentState;
1682 mTransactionPending = false;
1683 mAnimTransactionPending = false;
1684 mTransactionCV.broadcast();
1685}
1686
1687void SurfaceFlinger::computeVisibleRegions(
1688 const LayerVector& currentLayers, uint32_t layerStack,
1689 Region& outDirtyRegion, Region& outOpaqueRegion)
1690{
1691 ATRACE_CALL();
1692
1693 Region aboveOpaqueLayers;
1694 Region aboveCoveredLayers;
1695 Region dirty;
1696
1697 outDirtyRegion.clear();
1698
1699 size_t i = currentLayers.size();
1700 while (i--) {
1701 const sp<Layer>& layer = currentLayers[i];
1702
1703 // start with the whole surface at its current location
1704 const Layer::State& s(layer->getDrawingState());
1705
1706 // only consider the layers on the given layer stack
1707 if (s.layerStack != layerStack)
1708 continue;
1709
1710 /*
1711 * opaqueRegion: area of a surface that is fully opaque.
1712 */
1713 Region opaqueRegion;
1714
1715 /*
1716 * visibleRegion: area of a surface that is visible on screen
1717 * and not fully transparent. This is essentially the layer's
1718 * footprint minus the opaque regions above it.
1719 * Areas covered by a translucent surface are considered visible.
1720 */
1721 Region visibleRegion;
1722
1723 /*
1724 * coveredRegion: area of a surface that is covered by all
1725 * visible regions above it (which includes the translucent areas).
1726 */
1727 Region coveredRegion;
1728
1729 /*
1730 * transparentRegion: area of a surface that is hinted to be completely
1731 * transparent. This is only used to tell when the layer has no visible
1732 * non-transparent regions and can be removed from the layer list. It
1733 * does not affect the visibleRegion of this layer or any layers
1734 * beneath it. The hint may not be correct if apps don't respect the
1735 * SurfaceView restrictions (which, sadly, some don't).
1736 */
1737 Region transparentRegion;
1738
1739
1740 // handle hidden surfaces by setting the visible region to empty
1741 if (CC_LIKELY(layer->isVisible())) {
1742 const bool translucent = !layer->isOpaque(s);
Robert Carr3dcabfa2016-03-01 18:36:58 -08001743 Rect bounds(s.active.transform.transform(layer->computeBounds()));
Dan Stoza9e56aa02015-11-02 13:00:03 -08001744 visibleRegion.set(bounds);
1745 if (!visibleRegion.isEmpty()) {
1746 // Remove the transparent area from the visible region
1747 if (translucent) {
Robert Carr3dcabfa2016-03-01 18:36:58 -08001748 const Transform tr(s.active.transform);
Dan Stoza9e56aa02015-11-02 13:00:03 -08001749 if (tr.transformed()) {
1750 if (tr.preserveRects()) {
1751 // transform the transparent region
1752 transparentRegion = tr.transform(s.activeTransparentRegion);
1753 } else {
1754 // transformation too complex, can't do the
1755 // transparent region optimization.
1756 transparentRegion.clear();
1757 }
1758 } else {
1759 transparentRegion = s.activeTransparentRegion;
1760 }
1761 }
1762
1763 // compute the opaque region
Robert Carr3dcabfa2016-03-01 18:36:58 -08001764 const int32_t layerOrientation = s.active.transform.getOrientation();
Dan Stoza9e56aa02015-11-02 13:00:03 -08001765 if (s.alpha==255 && !translucent &&
1766 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1767 // the opaque region is the layer's footprint
1768 opaqueRegion = visibleRegion;
1769 }
1770 }
1771 }
1772
1773 // Clip the covered region to the visible region
1774 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1775
1776 // Update aboveCoveredLayers for next (lower) layer
1777 aboveCoveredLayers.orSelf(visibleRegion);
1778
1779 // subtract the opaque region covered by the layers above us
1780 visibleRegion.subtractSelf(aboveOpaqueLayers);
1781
1782 // compute this layer's dirty region
1783 if (layer->contentDirty) {
1784 // we need to invalidate the whole region
1785 dirty = visibleRegion;
1786 // as well, as the old visible region
1787 dirty.orSelf(layer->visibleRegion);
1788 layer->contentDirty = false;
1789 } else {
1790 /* compute the exposed region:
1791 * the exposed region consists of two components:
1792 * 1) what's VISIBLE now and was COVERED before
1793 * 2) what's EXPOSED now less what was EXPOSED before
1794 *
1795 * note that (1) is conservative, we start with the whole
1796 * visible region but only keep what used to be covered by
1797 * something -- which mean it may have been exposed.
1798 *
1799 * (2) handles areas that were not covered by anything but got
1800 * exposed because of a resize.
1801 */
1802 const Region newExposed = visibleRegion - coveredRegion;
1803 const Region oldVisibleRegion = layer->visibleRegion;
1804 const Region oldCoveredRegion = layer->coveredRegion;
1805 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1806 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1807 }
1808 dirty.subtractSelf(aboveOpaqueLayers);
1809
1810 // accumulate to the screen dirty region
1811 outDirtyRegion.orSelf(dirty);
1812
1813 // Update aboveOpaqueLayers for next (lower) layer
1814 aboveOpaqueLayers.orSelf(opaqueRegion);
1815
1816 // Store the visible region in screen space
1817 layer->setVisibleRegion(visibleRegion);
1818 layer->setCoveredRegion(coveredRegion);
1819 layer->setVisibleNonTransparentRegion(
1820 visibleRegion.subtract(transparentRegion));
1821 }
1822
1823 outOpaqueRegion = aboveOpaqueLayers;
1824}
1825
1826void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
1827 const Region& dirty) {
1828 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1829 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1830 if (hw->getLayerStack() == layerStack) {
1831 hw->dirtyRegion.orSelf(dirty);
1832 }
1833 }
1834}
1835
1836bool SurfaceFlinger::handlePageFlip()
1837{
1838 Region dirtyRegion;
1839
1840 bool visibleRegions = false;
1841 const LayerVector& layers(mDrawingState.layersSortedByZ);
1842 bool frameQueued = false;
1843
1844 // Store the set of layers that need updates. This set must not change as
1845 // buffers are being latched, as this could result in a deadlock.
1846 // Example: Two producers share the same command stream and:
1847 // 1.) Layer 0 is latched
1848 // 2.) Layer 0 gets a new frame
1849 // 2.) Layer 1 gets a new frame
1850 // 3.) Layer 1 is latched.
1851 // Display is now waiting on Layer 1's frame, which is behind layer 0's
1852 // second frame. But layer 0's second frame could be waiting on display.
1853 Vector<Layer*> layersWithQueuedFrames;
1854 for (size_t i = 0, count = layers.size(); i<count ; i++) {
1855 const sp<Layer>& layer(layers[i]);
1856 if (layer->hasQueuedFrame()) {
1857 frameQueued = true;
1858 if (layer->shouldPresentNow(mPrimaryDispSync)) {
1859 layersWithQueuedFrames.push_back(layer.get());
1860 } else {
1861 layer->useEmptyDamage();
1862 }
1863 } else {
1864 layer->useEmptyDamage();
1865 }
1866 }
1867 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
1868 Layer* layer = layersWithQueuedFrames[i];
1869 const Region dirty(layer->latchBuffer(visibleRegions));
1870 layer->useSurfaceDamage();
1871 const Layer::State& s(layer->getDrawingState());
1872 invalidateLayerStack(s.layerStack, dirty);
1873 }
1874
1875 mVisibleRegionsDirty |= visibleRegions;
1876
1877 // If we will need to wake up at some time in the future to deal with a
1878 // queued frame that shouldn't be displayed during this vsync period, wake
1879 // up during the next vsync period to check again.
1880 if (frameQueued && layersWithQueuedFrames.empty()) {
1881 signalLayerUpdate();
1882 }
1883
1884 // Only continue with the refresh if there is actually new work to do
1885 return !layersWithQueuedFrames.empty();
1886}
1887
1888void SurfaceFlinger::invalidateHwcGeometry()
1889{
1890 mHwWorkListDirty = true;
1891}
1892
1893
1894void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
1895 const Region& inDirtyRegion)
1896{
1897 // We only need to actually compose the display if:
1898 // 1) It is being handled by hardware composer, which may need this to
1899 // keep its virtual display state machine in sync, or
1900 // 2) There is work to be done (the dirty region isn't empty)
1901 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
1902 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
1903 return;
1904 }
1905
1906 Region dirtyRegion(inDirtyRegion);
1907
1908 // compute the invalid region
1909 hw->swapRegion.orSelf(dirtyRegion);
1910
1911 uint32_t flags = hw->getFlags();
1912 if (flags & DisplayDevice::SWAP_RECTANGLE) {
1913 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
1914 // takes a rectangle, we must make sure to update that whole
1915 // rectangle in that case
1916 dirtyRegion.set(hw->swapRegion.bounds());
1917 } else {
1918 if (flags & DisplayDevice::PARTIAL_UPDATES) {
1919 // We need to redraw the rectangle that will be updated
1920 // (pushed to the framebuffer).
1921 // This is needed because PARTIAL_UPDATES only takes one
1922 // rectangle instead of a region (see DisplayDevice::flip())
1923 dirtyRegion.set(hw->swapRegion.bounds());
1924 } else {
1925 // we need to redraw everything (the whole screen)
1926 dirtyRegion.set(hw->bounds());
1927 hw->swapRegion = dirtyRegion;
1928 }
1929 }
1930
1931 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
1932 if (!doComposeSurfaces(hw, dirtyRegion)) return;
1933 } else {
1934 RenderEngine& engine(getRenderEngine());
1935 mat4 colorMatrix = mColorMatrix;
1936 if (mDaltonize) {
1937 colorMatrix = colorMatrix * mDaltonizer();
1938 }
1939 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
1940 doComposeSurfaces(hw, dirtyRegion);
1941 engine.setupColorTransform(oldMatrix);
1942 }
1943
1944 // update the swap region and clear the dirty region
1945 hw->swapRegion.orSelf(dirtyRegion);
1946
1947 // swap buffers (presentation)
1948 hw->swapBuffers(getHwComposer());
1949}
1950
1951bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
1952{
1953 RenderEngine& engine(getRenderEngine());
1954 const int32_t id = hw->getHwcDisplayId();
1955 HWComposer& hwc(getHwComposer());
1956 HWComposer::LayerListIterator cur = hwc.begin(id);
1957 const HWComposer::LayerListIterator end = hwc.end(id);
1958
1959 bool hasGlesComposition = hwc.hasGlesComposition(id);
1960 if (hasGlesComposition) {
1961 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
1962 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
1963 hw->getDisplayName().string());
1964 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
1965 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
1966 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
1967 }
1968 return false;
1969 }
1970
1971 // Never touch the framebuffer if we don't have any framebuffer layers
1972 const bool hasHwcComposition = hwc.hasHwcComposition(id);
1973 if (hasHwcComposition) {
1974 // when using overlays, we assume a fully transparent framebuffer
1975 // NOTE: we could reduce how much we need to clear, for instance
1976 // remove where there are opaque FB layers. however, on some
1977 // GPUs doing a "clean slate" clear might be more efficient.
1978 // We'll revisit later if needed.
1979 engine.clearWithColor(0, 0, 0, 0);
1980 } else {
1981 // we start with the whole screen area
1982 const Region bounds(hw->getBounds());
1983
1984 // we remove the scissor part
1985 // we're left with the letterbox region
1986 // (common case is that letterbox ends-up being empty)
1987 const Region letterbox(bounds.subtract(hw->getScissor()));
1988
1989 // compute the area to clear
1990 Region region(hw->undefinedRegion.merge(letterbox));
1991
1992 // but limit it to the dirty region
1993 region.andSelf(dirty);
1994
1995 // screen is already cleared here
1996 if (!region.isEmpty()) {
1997 // can happen with SurfaceView
1998 drawWormhole(hw, region);
1999 }
2000 }
2001
2002 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2003 // just to be on the safe side, we don't set the
2004 // scissor on the main display. It should never be needed
2005 // anyways (though in theory it could since the API allows it).
2006 const Rect& bounds(hw->getBounds());
2007 const Rect& scissor(hw->getScissor());
2008 if (scissor != bounds) {
2009 // scissor doesn't match the screen's dimensions, so we
2010 // need to clear everything outside of it and enable
2011 // the GL scissor so we don't draw anything where we shouldn't
2012
2013 // enable scissor for this frame
2014 const uint32_t height = hw->getHeight();
2015 engine.setScissor(scissor.left, height - scissor.bottom,
2016 scissor.getWidth(), scissor.getHeight());
2017 }
2018 }
2019 }
2020
2021 /*
2022 * and then, render the layers targeted at the framebuffer
2023 */
2024
2025 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2026 const size_t count = layers.size();
2027 const Transform& tr = hw->getTransform();
2028 if (cur != end) {
2029 // we're using h/w composer
2030 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2031 const sp<Layer>& layer(layers[i]);
2032 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2033 if (!clip.isEmpty()) {
2034 switch (cur->getCompositionType()) {
2035 case HWC_CURSOR_OVERLAY:
2036 case HWC_OVERLAY: {
2037 const Layer::State& state(layer->getDrawingState());
2038 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2039 && i
2040 && layer->isOpaque(state) && (state.alpha == 0xFF)
2041 && hasGlesComposition) {
2042 // never clear the very first layer since we're
2043 // guaranteed the FB is already cleared
2044 layer->clearWithOpenGL(hw, clip);
2045 }
2046 break;
2047 }
2048 case HWC_FRAMEBUFFER: {
2049 layer->draw(hw, clip);
2050 break;
2051 }
2052 case HWC_FRAMEBUFFER_TARGET: {
2053 // this should not happen as the iterator shouldn't
2054 // let us get there.
2055 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2056 break;
2057 }
2058 }
2059 }
2060 layer->setAcquireFence(hw, *cur);
2061 }
2062 } else {
2063 // we're not using h/w composer
2064 for (size_t i=0 ; i<count ; ++i) {
2065 const sp<Layer>& layer(layers[i]);
2066 const Region clip(dirty.intersect(
2067 tr.transform(layer->visibleRegion)));
2068 if (!clip.isEmpty()) {
2069 layer->draw(hw, clip);
2070 }
2071 }
2072 }
2073
2074 // disable scissor at the end of the frame
2075 engine.disableScissor();
2076 return true;
2077}
2078
2079void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2080 const int32_t height = hw->getHeight();
2081 RenderEngine& engine(getRenderEngine());
2082 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2083}
2084
2085status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2086 const sp<IBinder>& handle,
2087 const sp<IGraphicBufferProducer>& gbc,
2088 const sp<Layer>& lbc)
2089{
2090 // add this layer to the current state list
2091 {
2092 Mutex::Autolock _l(mStateLock);
2093 if (mCurrentState.layersSortedByZ.size() >= MAX_LAYERS) {
2094 return NO_MEMORY;
2095 }
2096 mCurrentState.layersSortedByZ.add(lbc);
2097 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
2098 }
2099
2100 // attach this layer to the client
2101 client->attachLayer(handle, lbc);
2102
2103 return NO_ERROR;
2104}
2105
2106status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
2107 Mutex::Autolock _l(mStateLock);
2108 ssize_t index = mCurrentState.layersSortedByZ.remove(layer);
2109 if (index >= 0) {
2110 mLayersPendingRemoval.push(layer);
2111 mLayersRemoved = true;
2112 setTransactionFlags(eTransactionNeeded);
2113 return NO_ERROR;
2114 }
2115 return status_t(index);
2116}
2117
2118uint32_t SurfaceFlinger::peekTransactionFlags(uint32_t /* flags */) {
2119 return android_atomic_release_load(&mTransactionFlags);
2120}
2121
2122uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2123 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2124}
2125
2126uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2127 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2128 if ((old & flags)==0) { // wake the server up
2129 signalTransaction();
2130 }
2131 return old;
2132}
2133
2134void SurfaceFlinger::setTransactionState(
2135 const Vector<ComposerState>& state,
2136 const Vector<DisplayState>& displays,
2137 uint32_t flags)
2138{
2139 ATRACE_CALL();
2140 Mutex::Autolock _l(mStateLock);
2141 uint32_t transactionFlags = 0;
2142
2143 if (flags & eAnimation) {
2144 // For window updates that are part of an animation we must wait for
2145 // previous animation "frames" to be handled.
2146 while (mAnimTransactionPending) {
2147 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2148 if (CC_UNLIKELY(err != NO_ERROR)) {
2149 // just in case something goes wrong in SF, return to the
2150 // caller after a few seconds.
2151 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2152 "waiting for previous animation frame");
2153 mAnimTransactionPending = false;
2154 break;
2155 }
2156 }
2157 }
2158
2159 size_t count = displays.size();
2160 for (size_t i=0 ; i<count ; i++) {
2161 const DisplayState& s(displays[i]);
2162 transactionFlags |= setDisplayStateLocked(s);
2163 }
2164
2165 count = state.size();
2166 for (size_t i=0 ; i<count ; i++) {
2167 const ComposerState& s(state[i]);
2168 // Here we need to check that the interface we're given is indeed
2169 // one of our own. A malicious client could give us a NULL
2170 // IInterface, or one of its own or even one of our own but a
2171 // different type. All these situations would cause us to crash.
2172 //
2173 // NOTE: it would be better to use RTTI as we could directly check
2174 // that we have a Client*. however, RTTI is disabled in Android.
2175 if (s.client != NULL) {
2176 sp<IBinder> binder = IInterface::asBinder(s.client);
2177 if (binder != NULL) {
2178 String16 desc(binder->getInterfaceDescriptor());
2179 if (desc == ISurfaceComposerClient::descriptor) {
2180 sp<Client> client( static_cast<Client *>(s.client.get()) );
2181 transactionFlags |= setClientStateLocked(client, s.state);
2182 }
2183 }
2184 }
2185 }
2186
2187 if (transactionFlags) {
2188 // this triggers the transaction
2189 setTransactionFlags(transactionFlags);
2190
2191 // if this is a synchronous transaction, wait for it to take effect
2192 // before returning.
2193 if (flags & eSynchronous) {
2194 mTransactionPending = true;
2195 }
2196 if (flags & eAnimation) {
2197 mAnimTransactionPending = true;
2198 }
2199 while (mTransactionPending) {
2200 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2201 if (CC_UNLIKELY(err != NO_ERROR)) {
2202 // just in case something goes wrong in SF, return to the
2203 // called after a few seconds.
2204 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2205 mTransactionPending = false;
2206 break;
2207 }
2208 }
2209 }
2210}
2211
2212uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2213{
2214 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2215 if (dpyIdx < 0)
2216 return 0;
2217
2218 uint32_t flags = 0;
2219 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2220 if (disp.isValid()) {
2221 const uint32_t what = s.what;
2222 if (what & DisplayState::eSurfaceChanged) {
2223 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2224 disp.surface = s.surface;
2225 flags |= eDisplayTransactionNeeded;
2226 }
2227 }
2228 if (what & DisplayState::eLayerStackChanged) {
2229 if (disp.layerStack != s.layerStack) {
2230 disp.layerStack = s.layerStack;
2231 flags |= eDisplayTransactionNeeded;
2232 }
2233 }
2234 if (what & DisplayState::eDisplayProjectionChanged) {
2235 if (disp.orientation != s.orientation) {
2236 disp.orientation = s.orientation;
2237 flags |= eDisplayTransactionNeeded;
2238 }
2239 if (disp.frame != s.frame) {
2240 disp.frame = s.frame;
2241 flags |= eDisplayTransactionNeeded;
2242 }
2243 if (disp.viewport != s.viewport) {
2244 disp.viewport = s.viewport;
2245 flags |= eDisplayTransactionNeeded;
2246 }
2247 }
2248 if (what & DisplayState::eDisplaySizeChanged) {
2249 if (disp.width != s.width) {
2250 disp.width = s.width;
2251 flags |= eDisplayTransactionNeeded;
2252 }
2253 if (disp.height != s.height) {
2254 disp.height = s.height;
2255 flags |= eDisplayTransactionNeeded;
2256 }
2257 }
2258 }
2259 return flags;
2260}
2261
2262uint32_t SurfaceFlinger::setClientStateLocked(
2263 const sp<Client>& client,
2264 const layer_state_t& s)
2265{
2266 uint32_t flags = 0;
2267 sp<Layer> layer(client->getLayerUser(s.surface));
2268 if (layer != 0) {
2269 const uint32_t what = s.what;
2270 if (what & layer_state_t::ePositionChanged) {
2271 if (layer->setPosition(s.x, s.y))
2272 flags |= eTraversalNeeded;
2273 }
2274 if (what & layer_state_t::eLayerChanged) {
2275 // NOTE: index needs to be calculated before we update the state
2276 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2277 if (layer->setLayer(s.z) && idx >= 0) {
2278 mCurrentState.layersSortedByZ.removeAt(idx);
2279 mCurrentState.layersSortedByZ.add(layer);
2280 // we need traversal (state changed)
2281 // AND transaction (list changed)
2282 flags |= eTransactionNeeded|eTraversalNeeded;
2283 }
2284 }
2285 if (what & layer_state_t::eSizeChanged) {
2286 if (layer->setSize(s.w, s.h)) {
2287 flags |= eTraversalNeeded;
2288 }
2289 }
2290 if (what & layer_state_t::eAlphaChanged) {
2291 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2292 flags |= eTraversalNeeded;
2293 }
2294 if (what & layer_state_t::eMatrixChanged) {
2295 if (layer->setMatrix(s.matrix))
2296 flags |= eTraversalNeeded;
2297 }
2298 if (what & layer_state_t::eTransparentRegionChanged) {
2299 if (layer->setTransparentRegionHint(s.transparentRegion))
2300 flags |= eTraversalNeeded;
2301 }
2302 if (what & layer_state_t::eFlagsChanged) {
2303 if (layer->setFlags(s.flags, s.mask))
2304 flags |= eTraversalNeeded;
2305 }
2306 if (what & layer_state_t::eCropChanged) {
2307 if (layer->setCrop(s.crop))
2308 flags |= eTraversalNeeded;
2309 }
Pablo Ceballosacbe6782016-03-04 17:54:21 +00002310 if (what & layer_state_t::eFinalCropChanged) {
2311 if (layer->setFinalCrop(s.finalCrop))
2312 flags |= eTraversalNeeded;
2313 }
Dan Stoza9e56aa02015-11-02 13:00:03 -08002314 if (what & layer_state_t::eLayerStackChanged) {
2315 // NOTE: index needs to be calculated before we update the state
2316 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2317 if (layer->setLayerStack(s.layerStack) && idx >= 0) {
2318 mCurrentState.layersSortedByZ.removeAt(idx);
2319 mCurrentState.layersSortedByZ.add(layer);
2320 // we need traversal (state changed)
2321 // AND transaction (list changed)
2322 flags |= eTransactionNeeded|eTraversalNeeded;
2323 }
2324 }
2325 if (what & layer_state_t::eDeferTransaction) {
2326 layer->deferTransactionUntil(s.handle, s.frameNumber);
2327 // We don't trigger a traversal here because if no other state is
2328 // changed, we don't want this to cause any more work
2329 }
Robert Carrc3574f72016-03-24 12:19:32 -07002330 if (what & layer_state_t::eOverrideScalingModeChanged) {
2331 layer->setOverrideScalingMode(s.overrideScalingMode);
2332 // We don't trigger a traversal here because if no other state is
2333 // changed, we don't want this to cause any more work
2334 }
Dan Stoza9e56aa02015-11-02 13:00:03 -08002335 }
2336 return flags;
2337}
2338
2339status_t SurfaceFlinger::createLayer(
2340 const String8& name,
2341 const sp<Client>& client,
2342 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
2343 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp)
2344{
2345 //ALOGD("createLayer for (%d x %d), name=%s", w, h, name.string());
2346 if (int32_t(w|h) < 0) {
2347 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2348 int(w), int(h));
2349 return BAD_VALUE;
2350 }
2351
2352 status_t result = NO_ERROR;
2353
2354 sp<Layer> layer;
2355
2356 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2357 case ISurfaceComposerClient::eFXSurfaceNormal:
2358 result = createNormalLayer(client,
2359 name, w, h, flags, format,
2360 handle, gbp, &layer);
2361 break;
2362 case ISurfaceComposerClient::eFXSurfaceDim:
2363 result = createDimLayer(client,
2364 name, w, h, flags,
2365 handle, gbp, &layer);
2366 break;
2367 default:
2368 result = BAD_VALUE;
2369 break;
2370 }
2371
2372 if (result != NO_ERROR) {
2373 return result;
2374 }
2375
2376 result = addClientLayer(client, *handle, *gbp, layer);
2377 if (result != NO_ERROR) {
2378 return result;
2379 }
2380
2381 setTransactionFlags(eTransactionNeeded);
2382 return result;
2383}
2384
2385status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2386 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2387 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2388{
2389 // initialize the surfaces
2390 switch (format) {
2391 case PIXEL_FORMAT_TRANSPARENT:
2392 case PIXEL_FORMAT_TRANSLUCENT:
2393 format = PIXEL_FORMAT_RGBA_8888;
2394 break;
2395 case PIXEL_FORMAT_OPAQUE:
2396 format = PIXEL_FORMAT_RGBX_8888;
2397 break;
2398 }
2399
2400 *outLayer = new Layer(this, client, name, w, h, flags);
2401 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2402 if (err == NO_ERROR) {
2403 *handle = (*outLayer)->getHandle();
2404 *gbp = (*outLayer)->getProducer();
2405 }
2406
2407 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2408 return err;
2409}
2410
2411status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2412 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2413 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2414{
2415 *outLayer = new LayerDim(this, client, name, w, h, flags);
2416 *handle = (*outLayer)->getHandle();
2417 *gbp = (*outLayer)->getProducer();
2418 return NO_ERROR;
2419}
2420
2421status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2422{
2423 // called by the window manager when it wants to remove a Layer
2424 status_t err = NO_ERROR;
2425 sp<Layer> l(client->getLayerUser(handle));
2426 if (l != NULL) {
2427 err = removeLayer(l);
2428 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2429 "error removing layer=%p (%s)", l.get(), strerror(-err));
2430 }
2431 return err;
2432}
2433
2434status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2435{
2436 // called by ~LayerCleaner() when all references to the IBinder (handle)
2437 // are gone
2438 status_t err = NO_ERROR;
2439 sp<Layer> l(layer.promote());
2440 if (l != NULL) {
2441 err = removeLayer(l);
2442 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2443 "error removing layer=%p (%s)", l.get(), strerror(-err));
2444 }
2445 return err;
2446}
2447
2448// ---------------------------------------------------------------------------
2449
2450void SurfaceFlinger::onInitializeDisplays() {
2451 // reset screen orientation and use primary layer stack
2452 Vector<ComposerState> state;
2453 Vector<DisplayState> displays;
2454 DisplayState d;
2455 d.what = DisplayState::eDisplayProjectionChanged |
2456 DisplayState::eLayerStackChanged;
2457 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2458 d.layerStack = 0;
2459 d.orientation = DisplayState::eOrientationDefault;
2460 d.frame.makeInvalid();
2461 d.viewport.makeInvalid();
2462 d.width = 0;
2463 d.height = 0;
2464 displays.add(d);
2465 setTransactionState(state, displays, 0);
2466 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2467
2468 const nsecs_t period =
2469 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2470 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2471}
2472
2473void SurfaceFlinger::initializeDisplays() {
2474 class MessageScreenInitialized : public MessageBase {
2475 SurfaceFlinger* flinger;
2476 public:
2477 MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2478 virtual bool handler() {
2479 flinger->onInitializeDisplays();
2480 return true;
2481 }
2482 };
2483 sp<MessageBase> msg = new MessageScreenInitialized(this);
2484 postMessageAsync(msg); // we may be called from main thread, use async message
2485}
2486
2487void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2488 int mode) {
2489 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2490 this);
2491 int32_t type = hw->getDisplayType();
2492 int currentMode = hw->getPowerMode();
2493
2494 if (mode == currentMode) {
2495 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2496 return;
2497 }
2498
2499 hw->setPowerMode(mode);
2500 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2501 ALOGW("Trying to set power mode for virtual display");
2502 return;
2503 }
2504
2505 if (currentMode == HWC_POWER_MODE_OFF) {
2506 getHwComposer().setPowerMode(type, mode);
2507 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2508 // FIXME: eventthread only knows about the main display right now
2509 mEventThread->onScreenAcquired();
2510 resyncToHardwareVsync(true);
2511 }
2512
2513 mVisibleRegionsDirty = true;
2514 mHasPoweredOff = true;
2515 repaintEverything();
2516 } else if (mode == HWC_POWER_MODE_OFF) {
2517 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2518 disableHardwareVsync(true); // also cancels any in-progress resync
2519
2520 // FIXME: eventthread only knows about the main display right now
2521 mEventThread->onScreenReleased();
2522 }
2523
2524 getHwComposer().setPowerMode(type, mode);
2525 mVisibleRegionsDirty = true;
2526 // from this point on, SF will stop drawing on this display
2527 } else {
2528 getHwComposer().setPowerMode(type, mode);
2529 }
2530}
2531
2532void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2533 class MessageSetPowerMode: public MessageBase {
2534 SurfaceFlinger& mFlinger;
2535 sp<IBinder> mDisplay;
2536 int mMode;
2537 public:
2538 MessageSetPowerMode(SurfaceFlinger& flinger,
2539 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2540 mDisplay(disp) { mMode = mode; }
2541 virtual bool handler() {
2542 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2543 if (hw == NULL) {
2544 ALOGE("Attempt to set power mode = %d for null display %p",
2545 mMode, mDisplay.get());
2546 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2547 ALOGW("Attempt to set power mode = %d for virtual display",
2548 mMode);
2549 } else {
2550 mFlinger.setPowerModeInternal(hw, mMode);
2551 }
2552 return true;
2553 }
2554 };
2555 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2556 postMessageSync(msg);
2557}
2558
2559// ---------------------------------------------------------------------------
2560
2561status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2562{
2563 String8 result;
2564
2565 IPCThreadState* ipc = IPCThreadState::self();
2566 const int pid = ipc->getCallingPid();
2567 const int uid = ipc->getCallingUid();
2568 if ((uid != AID_SHELL) &&
2569 !PermissionCache::checkPermission(sDump, pid, uid)) {
2570 result.appendFormat("Permission Denial: "
2571 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2572 } else {
2573 // Try to get the main lock, but give up after one second
2574 // (this would indicate SF is stuck, but we want to be able to
2575 // print something in dumpsys).
2576 status_t err = mStateLock.timedLock(s2ns(1));
2577 bool locked = (err == NO_ERROR);
2578 if (!locked) {
2579 result.appendFormat(
2580 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2581 "dumping anyways (no locks held)\n", strerror(-err), err);
2582 }
2583
2584 bool dumpAll = true;
2585 size_t index = 0;
2586 size_t numArgs = args.size();
2587 if (numArgs) {
2588 if ((index < numArgs) &&
2589 (args[index] == String16("--list"))) {
2590 index++;
2591 listLayersLocked(args, index, result);
2592 dumpAll = false;
2593 }
2594
2595 if ((index < numArgs) &&
2596 (args[index] == String16("--latency"))) {
2597 index++;
2598 dumpStatsLocked(args, index, result);
2599 dumpAll = false;
2600 }
2601
2602 if ((index < numArgs) &&
2603 (args[index] == String16("--latency-clear"))) {
2604 index++;
2605 clearStatsLocked(args, index, result);
2606 dumpAll = false;
2607 }
2608
2609 if ((index < numArgs) &&
2610 (args[index] == String16("--dispsync"))) {
2611 index++;
2612 mPrimaryDispSync.dump(result);
2613 dumpAll = false;
2614 }
2615
2616 if ((index < numArgs) &&
2617 (args[index] == String16("--static-screen"))) {
2618 index++;
2619 dumpStaticScreenStats(result);
2620 dumpAll = false;
2621 }
Pablo Ceballos40845df2016-01-25 17:41:15 -08002622
Pablo Ceballos69a1a382016-03-30 15:28:05 -07002623#ifdef ENABLE_FENCE_TRACKING
Pablo Ceballos40845df2016-01-25 17:41:15 -08002624 if ((index < numArgs) &&
2625 (args[index] == String16("--fences"))) {
2626 index++;
2627 mFenceTracker.dump(&result);
2628 dumpAll = false;
2629 }
Pablo Ceballos69a1a382016-03-30 15:28:05 -07002630#endif
Dan Stoza9e56aa02015-11-02 13:00:03 -08002631 }
2632
2633 if (dumpAll) {
2634 dumpAllLocked(args, index, result);
2635 }
2636
2637 if (locked) {
2638 mStateLock.unlock();
2639 }
2640 }
2641 write(fd, result.string(), result.size());
2642 return NO_ERROR;
2643}
2644
2645void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2646 size_t& /* index */, String8& result) const
2647{
2648 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2649 const size_t count = currentLayers.size();
2650 for (size_t i=0 ; i<count ; i++) {
2651 const sp<Layer>& layer(currentLayers[i]);
2652 result.appendFormat("%s\n", layer->getName().string());
2653 }
2654}
2655
2656void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2657 String8& result) const
2658{
2659 String8 name;
2660 if (index < args.size()) {
2661 name = String8(args[index]);
2662 index++;
2663 }
2664
2665 const nsecs_t period =
2666 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2667 result.appendFormat("%" PRId64 "\n", period);
2668
2669 if (name.isEmpty()) {
2670 mAnimFrameTracker.dumpStats(result);
2671 } else {
2672 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2673 const size_t count = currentLayers.size();
2674 for (size_t i=0 ; i<count ; i++) {
2675 const sp<Layer>& layer(currentLayers[i]);
2676 if (name == layer->getName()) {
2677 layer->dumpFrameStats(result);
2678 }
2679 }
2680 }
2681}
2682
2683void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2684 String8& /* result */)
2685{
2686 String8 name;
2687 if (index < args.size()) {
2688 name = String8(args[index]);
2689 index++;
2690 }
2691
2692 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2693 const size_t count = currentLayers.size();
2694 for (size_t i=0 ; i<count ; i++) {
2695 const sp<Layer>& layer(currentLayers[i]);
2696 if (name.isEmpty() || (name == layer->getName())) {
2697 layer->clearFrameStats();
2698 }
2699 }
2700
2701 mAnimFrameTracker.clearStats();
2702}
2703
2704// This should only be called from the main thread. Otherwise it would need
2705// the lock and should use mCurrentState rather than mDrawingState.
2706void SurfaceFlinger::logFrameStats() {
2707 const LayerVector& drawingLayers = mDrawingState.layersSortedByZ;
2708 const size_t count = drawingLayers.size();
2709 for (size_t i=0 ; i<count ; i++) {
2710 const sp<Layer>& layer(drawingLayers[i]);
2711 layer->logFrameStats();
2712 }
2713
2714 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2715}
2716
2717/*static*/ void SurfaceFlinger::appendSfConfigString(String8& result)
2718{
2719 static const char* config =
2720 " [sf"
2721#ifdef HAS_CONTEXT_PRIORITY
2722 " HAS_CONTEXT_PRIORITY"
2723#endif
2724#ifdef NEVER_DEFAULT_TO_ASYNC_MODE
2725 " NEVER_DEFAULT_TO_ASYNC_MODE"
2726#endif
2727#ifdef TARGET_DISABLE_TRIPLE_BUFFERING
2728 " TARGET_DISABLE_TRIPLE_BUFFERING"
2729#endif
2730 "]";
2731 result.append(config);
2732}
2733
2734void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
2735{
2736 result.appendFormat("Static screen stats:\n");
2737 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
2738 float bucketTimeSec = mFrameBuckets[b] / 1e9;
2739 float percent = 100.0f *
2740 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
2741 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
2742 b + 1, bucketTimeSec, percent);
2743 }
2744 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
2745 float percent = 100.0f *
2746 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
2747 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
2748 NUM_BUCKETS - 1, bucketTimeSec, percent);
2749}
2750
2751void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
2752 String8& result) const
2753{
2754 bool colorize = false;
2755 if (index < args.size()
2756 && (args[index] == String16("--color"))) {
2757 colorize = true;
2758 index++;
2759 }
2760
2761 Colorizer colorizer(colorize);
2762
2763 // figure out if we're stuck somewhere
2764 const nsecs_t now = systemTime();
2765 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
2766 const nsecs_t inTransaction(mDebugInTransaction);
2767 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
2768 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
2769
2770 /*
2771 * Dump library configuration.
2772 */
2773
2774 colorizer.bold(result);
2775 result.append("Build configuration:");
2776 colorizer.reset(result);
2777 appendSfConfigString(result);
2778 appendUiConfigString(result);
2779 appendGuiConfigString(result);
2780 result.append("\n");
2781
2782 colorizer.bold(result);
2783 result.append("Sync configuration: ");
2784 colorizer.reset(result);
2785 result.append(SyncFeatures::getInstance().toString());
2786 result.append("\n");
2787
2788 colorizer.bold(result);
2789 result.append("DispSync configuration: ");
2790 colorizer.reset(result);
2791 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
2792 "present offset %d ns (refresh %" PRId64 " ns)",
2793 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
2794 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
2795 result.append("\n");
2796
2797 // Dump static screen stats
2798 result.append("\n");
2799 dumpStaticScreenStats(result);
2800 result.append("\n");
2801
2802 /*
2803 * Dump the visible layer list
2804 */
2805 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
2806 const size_t count = currentLayers.size();
2807 colorizer.bold(result);
2808 result.appendFormat("Visible layers (count = %zu)\n", count);
2809 colorizer.reset(result);
2810 for (size_t i=0 ; i<count ; i++) {
2811 const sp<Layer>& layer(currentLayers[i]);
2812 layer->dump(result, colorizer);
2813 }
2814
2815 /*
2816 * Dump Display state
2817 */
2818
2819 colorizer.bold(result);
2820 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
2821 colorizer.reset(result);
2822 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2823 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
2824 hw->dump(result);
2825 }
2826
2827 /*
2828 * Dump SurfaceFlinger global state
2829 */
2830
2831 colorizer.bold(result);
2832 result.append("SurfaceFlinger global state:\n");
2833 colorizer.reset(result);
2834
2835 HWComposer& hwc(getHwComposer());
2836 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
2837
2838 colorizer.bold(result);
2839 result.appendFormat("EGL implementation : %s\n",
2840 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
2841 colorizer.reset(result);
2842 result.appendFormat("%s\n",
2843 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
2844
2845 mRenderEngine->dump(result);
2846
2847 hw->undefinedRegion.dump(result, "undefinedRegion");
2848 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
2849 hw->getOrientation(), hw->isDisplayOn());
2850 result.appendFormat(
2851 " last eglSwapBuffers() time: %f us\n"
2852 " last transaction time : %f us\n"
2853 " transaction-flags : %08x\n"
2854 " refresh-rate : %f fps\n"
2855 " x-dpi : %f\n"
2856 " y-dpi : %f\n"
2857 " gpu_to_cpu_unsupported : %d\n"
2858 ,
2859 mLastSwapBufferTime/1000.0,
2860 mLastTransactionTime/1000.0,
2861 mTransactionFlags,
2862 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
2863 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
2864 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
2865 !mGpuToCpuSupported);
2866
2867 result.appendFormat(" eglSwapBuffers time: %f us\n",
2868 inSwapBuffersDuration/1000.0);
2869
2870 result.appendFormat(" transaction time: %f us\n",
2871 inTransactionDuration/1000.0);
2872
2873 /*
2874 * VSYNC state
2875 */
2876 mEventThread->dump(result);
2877
2878 /*
2879 * Dump HWComposer state
2880 */
2881 colorizer.bold(result);
2882 result.append("h/w composer state:\n");
2883 colorizer.reset(result);
2884 result.appendFormat(" h/w composer %s and %s\n",
2885 hwc.initCheck()==NO_ERROR ? "present" : "not present",
2886 (mDebugDisableHWC || mDebugRegion || mDaltonize
2887 || mHasColorMatrix) ? "disabled" : "enabled");
2888 hwc.dump(result);
2889
2890 /*
2891 * Dump gralloc state
2892 */
2893 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
2894 alloc.dump(result);
2895}
2896
2897const Vector< sp<Layer> >&
2898SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
2899 // Note: mStateLock is held here
2900 wp<IBinder> dpy;
2901 for (size_t i=0 ; i<mDisplays.size() ; i++) {
2902 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
2903 dpy = mDisplays.keyAt(i);
2904 break;
2905 }
2906 }
2907 if (dpy == NULL) {
2908 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
2909 // Just use the primary display so we have something to return
2910 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
2911 }
2912 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
2913}
2914
2915bool SurfaceFlinger::startDdmConnection()
2916{
2917 void* libddmconnection_dso =
2918 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
2919 if (!libddmconnection_dso) {
2920 return false;
2921 }
2922 void (*DdmConnection_start)(const char* name);
2923 DdmConnection_start =
2924 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
2925 if (!DdmConnection_start) {
2926 dlclose(libddmconnection_dso);
2927 return false;
2928 }
2929 (*DdmConnection_start)(getServiceName());
2930 return true;
2931}
2932
2933status_t SurfaceFlinger::onTransact(
2934 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
2935{
2936 switch (code) {
2937 case CREATE_CONNECTION:
2938 case CREATE_DISPLAY:
2939 case SET_TRANSACTION_STATE:
2940 case BOOT_FINISHED:
2941 case CLEAR_ANIMATION_FRAME_STATS:
2942 case GET_ANIMATION_FRAME_STATS:
2943 case SET_POWER_MODE:
Dan Stozac4f471e2016-03-24 09:31:08 -07002944 case GET_HDR_CAPABILITIES:
Dan Stoza9e56aa02015-11-02 13:00:03 -08002945 {
2946 // codes that require permission check
2947 IPCThreadState* ipc = IPCThreadState::self();
2948 const int pid = ipc->getCallingPid();
2949 const int uid = ipc->getCallingUid();
2950 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
2951 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
2952 ALOGE("Permission Denial: "
2953 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2954 return PERMISSION_DENIED;
2955 }
2956 break;
2957 }
2958 case CAPTURE_SCREEN:
2959 {
2960 // codes that require permission check
2961 IPCThreadState* ipc = IPCThreadState::self();
2962 const int pid = ipc->getCallingPid();
2963 const int uid = ipc->getCallingUid();
2964 if ((uid != AID_GRAPHICS) &&
2965 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
2966 ALOGE("Permission Denial: "
2967 "can't read framebuffer pid=%d, uid=%d", pid, uid);
2968 return PERMISSION_DENIED;
2969 }
2970 break;
2971 }
2972 }
2973
2974 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
2975 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
2976 CHECK_INTERFACE(ISurfaceComposer, data, reply);
2977 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
2978 IPCThreadState* ipc = IPCThreadState::self();
2979 const int pid = ipc->getCallingPid();
2980 const int uid = ipc->getCallingUid();
2981 ALOGE("Permission Denial: "
2982 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
2983 return PERMISSION_DENIED;
2984 }
2985 int n;
2986 switch (code) {
2987 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
2988 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
2989 return NO_ERROR;
2990 case 1002: // SHOW_UPDATES
2991 n = data.readInt32();
2992 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
2993 invalidateHwcGeometry();
2994 repaintEverything();
2995 return NO_ERROR;
2996 case 1004:{ // repaint everything
2997 repaintEverything();
2998 return NO_ERROR;
2999 }
3000 case 1005:{ // force transaction
3001 setTransactionFlags(
3002 eTransactionNeeded|
3003 eDisplayTransactionNeeded|
3004 eTraversalNeeded);
3005 return NO_ERROR;
3006 }
3007 case 1006:{ // send empty update
3008 signalRefresh();
3009 return NO_ERROR;
3010 }
3011 case 1008: // toggle use of hw composer
3012 n = data.readInt32();
3013 mDebugDisableHWC = n ? 1 : 0;
3014 invalidateHwcGeometry();
3015 repaintEverything();
3016 return NO_ERROR;
3017 case 1009: // toggle use of transform hint
3018 n = data.readInt32();
3019 mDebugDisableTransformHint = n ? 1 : 0;
3020 invalidateHwcGeometry();
3021 repaintEverything();
3022 return NO_ERROR;
3023 case 1010: // interrogate.
3024 reply->writeInt32(0);
3025 reply->writeInt32(0);
3026 reply->writeInt32(mDebugRegion);
3027 reply->writeInt32(0);
3028 reply->writeInt32(mDebugDisableHWC);
3029 return NO_ERROR;
3030 case 1013: {
3031 Mutex::Autolock _l(mStateLock);
3032 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3033 reply->writeInt32(hw->getPageFlipCount());
3034 return NO_ERROR;
3035 }
3036 case 1014: {
3037 // daltonize
3038 n = data.readInt32();
3039 switch (n % 10) {
3040 case 1: mDaltonizer.setType(Daltonizer::protanomaly); break;
3041 case 2: mDaltonizer.setType(Daltonizer::deuteranomaly); break;
3042 case 3: mDaltonizer.setType(Daltonizer::tritanomaly); break;
3043 }
3044 if (n >= 10) {
3045 mDaltonizer.setMode(Daltonizer::correction);
3046 } else {
3047 mDaltonizer.setMode(Daltonizer::simulation);
3048 }
3049 mDaltonize = n > 0;
3050 invalidateHwcGeometry();
3051 repaintEverything();
3052 return NO_ERROR;
3053 }
3054 case 1015: {
3055 // apply a color matrix
3056 n = data.readInt32();
3057 mHasColorMatrix = n ? 1 : 0;
3058 if (n) {
3059 // color matrix is sent as mat3 matrix followed by vec3
3060 // offset, then packed into a mat4 where the last row is
3061 // the offset and extra values are 0
3062 for (size_t i = 0 ; i < 4; i++) {
3063 for (size_t j = 0; j < 4; j++) {
3064 mColorMatrix[i][j] = data.readFloat();
3065 }
3066 }
3067 } else {
3068 mColorMatrix = mat4();
3069 }
3070 invalidateHwcGeometry();
3071 repaintEverything();
3072 return NO_ERROR;
3073 }
3074 // This is an experimental interface
3075 // Needs to be shifted to proper binder interface when we productize
3076 case 1016: {
3077 n = data.readInt32();
3078 mPrimaryDispSync.setRefreshSkipCount(n);
3079 return NO_ERROR;
3080 }
3081 case 1017: {
3082 n = data.readInt32();
3083 mForceFullDamage = static_cast<bool>(n);
3084 return NO_ERROR;
3085 }
3086 case 1018: { // Modify Choreographer's phase offset
3087 n = data.readInt32();
3088 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3089 return NO_ERROR;
3090 }
3091 case 1019: { // Modify SurfaceFlinger's phase offset
3092 n = data.readInt32();
3093 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3094 return NO_ERROR;
3095 }
3096 }
3097 }
3098 return err;
3099}
3100
3101void SurfaceFlinger::repaintEverything() {
3102 android_atomic_or(1, &mRepaintEverything);
3103 signalTransaction();
3104}
3105
3106// ---------------------------------------------------------------------------
3107// Capture screen into an IGraphiBufferProducer
3108// ---------------------------------------------------------------------------
3109
3110/* The code below is here to handle b/8734824
3111 *
3112 * We create a IGraphicBufferProducer wrapper that forwards all calls
3113 * from the surfaceflinger thread to the calling binder thread, where they
3114 * are executed. This allows the calling thread in the calling process to be
3115 * reused and not depend on having "enough" binder threads to handle the
3116 * requests.
3117 */
3118class GraphicProducerWrapper : public BBinder, public MessageHandler {
3119 /* Parts of GraphicProducerWrapper are run on two different threads,
3120 * communicating by sending messages via Looper but also by shared member
3121 * data. Coherence maintenance is subtle and in places implicit (ugh).
3122 *
3123 * Don't rely on Looper's sendMessage/handleMessage providing
3124 * release/acquire semantics for any data not actually in the Message.
3125 * Data going from surfaceflinger to binder threads needs to be
3126 * synchronized explicitly.
3127 *
3128 * Barrier open/wait do provide release/acquire semantics. This provides
3129 * implicit synchronization for data coming back from binder to
3130 * surfaceflinger threads.
3131 */
3132
3133 sp<IGraphicBufferProducer> impl;
3134 sp<Looper> looper;
3135 status_t result;
3136 bool exitPending;
3137 bool exitRequested;
3138 Barrier barrier;
3139 uint32_t code;
3140 Parcel const* data;
3141 Parcel* reply;
3142
3143 enum {
3144 MSG_API_CALL,
3145 MSG_EXIT
3146 };
3147
3148 /*
3149 * Called on surfaceflinger thread. This is called by our "fake"
3150 * BpGraphicBufferProducer. We package the data and reply Parcel and
3151 * forward them to the binder thread.
3152 */
3153 virtual status_t transact(uint32_t code,
3154 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3155 this->code = code;
3156 this->data = &data;
3157 this->reply = reply;
3158 if (exitPending) {
3159 // if we've exited, we run the message synchronously right here.
3160 // note (JH): as far as I can tell from looking at the code, this
3161 // never actually happens. if it does, i'm not sure if it happens
3162 // on the surfaceflinger or binder thread.
3163 handleMessage(Message(MSG_API_CALL));
3164 } else {
3165 barrier.close();
3166 // Prevent stores to this->{code, data, reply} from being
3167 // reordered later than the construction of Message.
3168 atomic_thread_fence(memory_order_release);
3169 looper->sendMessage(this, Message(MSG_API_CALL));
3170 barrier.wait();
3171 }
3172 return result;
3173 }
3174
3175 /*
3176 * here we run on the binder thread. All we've got to do is
3177 * call the real BpGraphicBufferProducer.
3178 */
3179 virtual void handleMessage(const Message& message) {
3180 int what = message.what;
3181 // Prevent reads below from happening before the read from Message
3182 atomic_thread_fence(memory_order_acquire);
3183 if (what == MSG_API_CALL) {
3184 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3185 barrier.open();
3186 } else if (what == MSG_EXIT) {
3187 exitRequested = true;
3188 }
3189 }
3190
3191public:
3192 GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3193 : impl(impl),
3194 looper(new Looper(true)),
3195 result(NO_ERROR),
3196 exitPending(false),
3197 exitRequested(false),
3198 code(0),
3199 data(NULL),
3200 reply(NULL)
3201 {}
3202
3203 // Binder thread
3204 status_t waitForResponse() {
3205 do {
3206 looper->pollOnce(-1);
3207 } while (!exitRequested);
3208 return result;
3209 }
3210
3211 // Client thread
3212 void exit(status_t result) {
3213 this->result = result;
3214 exitPending = true;
3215 // Ensure this->result is visible to the binder thread before it
3216 // handles the message.
3217 atomic_thread_fence(memory_order_release);
3218 looper->sendMessage(this, Message(MSG_EXIT));
3219 }
3220};
3221
3222
3223status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3224 const sp<IGraphicBufferProducer>& producer,
3225 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3226 uint32_t minLayerZ, uint32_t maxLayerZ,
3227 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3228
3229 if (CC_UNLIKELY(display == 0))
3230 return BAD_VALUE;
3231
3232 if (CC_UNLIKELY(producer == 0))
3233 return BAD_VALUE;
3234
3235 // if we have secure windows on this display, never allow the screen capture
3236 // unless the producer interface is local (i.e.: we can take a screenshot for
3237 // ourselves).
3238 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3239
3240 // Convert to surfaceflinger's internal rotation type.
3241 Transform::orientation_flags rotationFlags;
3242 switch (rotation) {
3243 case ISurfaceComposer::eRotateNone:
3244 rotationFlags = Transform::ROT_0;
3245 break;
3246 case ISurfaceComposer::eRotate90:
3247 rotationFlags = Transform::ROT_90;
3248 break;
3249 case ISurfaceComposer::eRotate180:
3250 rotationFlags = Transform::ROT_180;
3251 break;
3252 case ISurfaceComposer::eRotate270:
3253 rotationFlags = Transform::ROT_270;
3254 break;
3255 default:
3256 rotationFlags = Transform::ROT_0;
3257 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3258 break;
3259 }
3260
3261 class MessageCaptureScreen : public MessageBase {
3262 SurfaceFlinger* flinger;
3263 sp<IBinder> display;
3264 sp<IGraphicBufferProducer> producer;
3265 Rect sourceCrop;
3266 uint32_t reqWidth, reqHeight;
3267 uint32_t minLayerZ,maxLayerZ;
3268 bool useIdentityTransform;
3269 Transform::orientation_flags rotation;
3270 status_t result;
3271 bool isLocalScreenshot;
3272 public:
3273 MessageCaptureScreen(SurfaceFlinger* flinger,
3274 const sp<IBinder>& display,
3275 const sp<IGraphicBufferProducer>& producer,
3276 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3277 uint32_t minLayerZ, uint32_t maxLayerZ,
3278 bool useIdentityTransform,
3279 Transform::orientation_flags rotation,
3280 bool isLocalScreenshot)
3281 : flinger(flinger), display(display), producer(producer),
3282 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3283 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3284 useIdentityTransform(useIdentityTransform),
3285 rotation(rotation), result(PERMISSION_DENIED),
3286 isLocalScreenshot(isLocalScreenshot)
3287 {
3288 }
3289 status_t getResult() const {
3290 return result;
3291 }
3292 virtual bool handler() {
3293 Mutex::Autolock _l(flinger->mStateLock);
3294 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3295 result = flinger->captureScreenImplLocked(hw, producer,
3296 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3297 useIdentityTransform, rotation, isLocalScreenshot);
3298 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3299 return true;
3300 }
3301 };
3302
3303 // make sure to process transactions before screenshots -- a transaction
3304 // might already be pending but scheduled for VSYNC; this guarantees we
3305 // will handle it before the screenshot. When VSYNC finally arrives
3306 // the scheduled transaction will be a no-op. If no transactions are
3307 // scheduled at this time, this will end-up being a no-op as well.
3308 mEventQueue.invalidateTransactionNow();
3309
3310 // this creates a "fake" BBinder which will serve as a "fake" remote
3311 // binder to receive the marshaled calls and forward them to the
3312 // real remote (a BpGraphicBufferProducer)
3313 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3314
3315 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3316 // which does the marshaling work forwards to our "fake remote" above.
3317 sp<MessageBase> msg = new MessageCaptureScreen(this,
3318 display, IGraphicBufferProducer::asInterface( wrapper ),
3319 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3320 useIdentityTransform, rotationFlags, isLocalScreenshot);
3321
3322 status_t res = postMessageAsync(msg);
3323 if (res == NO_ERROR) {
3324 res = wrapper->waitForResponse();
3325 }
3326 return res;
3327}
3328
3329
3330void SurfaceFlinger::renderScreenImplLocked(
3331 const sp<const DisplayDevice>& hw,
3332 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3333 uint32_t minLayerZ, uint32_t maxLayerZ,
3334 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3335{
3336 ATRACE_CALL();
3337 RenderEngine& engine(getRenderEngine());
3338
3339 // get screen geometry
3340 const int32_t hw_w = hw->getWidth();
3341 const int32_t hw_h = hw->getHeight();
3342 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3343 static_cast<int32_t>(reqHeight) != hw_h;
3344
3345 // if a default or invalid sourceCrop is passed in, set reasonable values
3346 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3347 !sourceCrop.isValid()) {
3348 sourceCrop.setLeftTop(Point(0, 0));
3349 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3350 }
3351
3352 // ensure that sourceCrop is inside screen
3353 if (sourceCrop.left < 0) {
3354 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3355 }
3356 if (sourceCrop.right > hw_w) {
3357 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3358 }
3359 if (sourceCrop.top < 0) {
3360 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3361 }
3362 if (sourceCrop.bottom > hw_h) {
3363 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3364 }
3365
3366 // make sure to clear all GL error flags
3367 engine.checkErrors();
3368
3369 // set-up our viewport
3370 engine.setViewportAndProjection(
3371 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3372 engine.disableTexturing();
3373
3374 // redraw the screen entirely...
3375 engine.clearWithColor(0, 0, 0, 1);
3376
3377 const LayerVector& layers( mDrawingState.layersSortedByZ );
3378 const size_t count = layers.size();
3379 for (size_t i=0 ; i<count ; ++i) {
3380 const sp<Layer>& layer(layers[i]);
3381 const Layer::State& state(layer->getDrawingState());
3382 if (state.layerStack == hw->getLayerStack()) {
3383 if (state.z >= minLayerZ && state.z <= maxLayerZ) {
3384 if (layer->isVisible()) {
3385 if (filtering) layer->setFiltering(true);
3386 layer->draw(hw, useIdentityTransform);
3387 if (filtering) layer->setFiltering(false);
3388 }
3389 }
3390 }
3391 }
3392
3393 // compositionComplete is needed for older driver
3394 hw->compositionComplete();
3395 hw->setViewportAndProjection();
3396}
3397
3398
3399status_t SurfaceFlinger::captureScreenImplLocked(
3400 const sp<const DisplayDevice>& hw,
3401 const sp<IGraphicBufferProducer>& producer,
3402 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
3403 uint32_t minLayerZ, uint32_t maxLayerZ,
3404 bool useIdentityTransform, Transform::orientation_flags rotation,
3405 bool isLocalScreenshot)
3406{
3407 ATRACE_CALL();
3408
3409 // get screen geometry
3410 uint32_t hw_w = hw->getWidth();
3411 uint32_t hw_h = hw->getHeight();
3412
3413 if (rotation & Transform::ROT_90) {
3414 std::swap(hw_w, hw_h);
3415 }
3416
3417 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3418 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3419 reqWidth, reqHeight, hw_w, hw_h);
3420 return BAD_VALUE;
3421 }
3422
3423 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3424 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3425
3426 bool secureLayerIsVisible = false;
3427 const LayerVector& layers(mDrawingState.layersSortedByZ);
3428 const size_t count = layers.size();
3429 for (size_t i = 0 ; i < count ; ++i) {
3430 const sp<Layer>& layer(layers[i]);
3431 const Layer::State& state(layer->getDrawingState());
3432 if (state.layerStack == hw->getLayerStack() && state.z >= minLayerZ &&
3433 state.z <= maxLayerZ && layer->isVisible() &&
3434 layer->isSecure()) {
3435 secureLayerIsVisible = true;
3436 }
3437 }
3438
3439 if (!isLocalScreenshot && secureLayerIsVisible) {
3440 ALOGW("FB is protected: PERMISSION_DENIED");
3441 return PERMISSION_DENIED;
3442 }
3443
3444 // create a surface (because we're a producer, and we need to
3445 // dequeue/queue a buffer)
3446 sp<Surface> sur = new Surface(producer, false);
3447 ANativeWindow* window = sur.get();
3448
3449 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3450 if (result == NO_ERROR) {
3451 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3452 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3453
3454 int err = 0;
3455 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3456 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3457 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3458 err |= native_window_set_usage(window, usage);
3459
3460 if (err == NO_ERROR) {
3461 ANativeWindowBuffer* buffer;
3462 /* TODO: Once we have the sync framework everywhere this can use
3463 * server-side waits on the fence that dequeueBuffer returns.
3464 */
3465 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3466 if (result == NO_ERROR) {
3467 int syncFd = -1;
3468 // create an EGLImage from the buffer so we can later
3469 // turn it into a texture
3470 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3471 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3472 if (image != EGL_NO_IMAGE_KHR) {
3473 // this binds the given EGLImage as a framebuffer for the
3474 // duration of this scope.
3475 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3476 if (imageBond.getStatus() == NO_ERROR) {
3477 // this will in fact render into our dequeued buffer
3478 // via an FBO, which means we didn't have to create
3479 // an EGLSurface and therefore we're not
3480 // dependent on the context's EGLConfig.
3481 renderScreenImplLocked(
3482 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3483 useIdentityTransform, rotation);
3484
3485 // Attempt to create a sync khr object that can produce a sync point. If that
3486 // isn't available, create a non-dupable sync object in the fallback path and
3487 // wait on it directly.
3488 EGLSyncKHR sync;
3489 if (!DEBUG_SCREENSHOTS) {
3490 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3491 // native fence fd will not be populated until flush() is done.
3492 getRenderEngine().flush();
3493 } else {
3494 sync = EGL_NO_SYNC_KHR;
3495 }
3496 if (sync != EGL_NO_SYNC_KHR) {
3497 // get the sync fd
3498 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3499 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3500 ALOGW("captureScreen: failed to dup sync khr object");
3501 syncFd = -1;
3502 }
3503 eglDestroySyncKHR(mEGLDisplay, sync);
3504 } else {
3505 // fallback path
3506 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3507 if (sync != EGL_NO_SYNC_KHR) {
3508 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3509 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3510 EGLint eglErr = eglGetError();
3511 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3512 ALOGW("captureScreen: fence wait timed out");
3513 } else {
3514 ALOGW_IF(eglErr != EGL_SUCCESS,
3515 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3516 }
3517 eglDestroySyncKHR(mEGLDisplay, sync);
3518 } else {
3519 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3520 }
3521 }
3522 if (DEBUG_SCREENSHOTS) {
3523 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3524 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3525 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3526 hw, minLayerZ, maxLayerZ);
3527 delete [] pixels;
3528 }
3529
3530 } else {
3531 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3532 result = INVALID_OPERATION;
Prathmesh Prabhuf3209b02016-03-09 16:54:45 -08003533 window->cancelBuffer(window, buffer, syncFd);
3534 buffer = NULL;
Dan Stoza9e56aa02015-11-02 13:00:03 -08003535 }
3536 // destroy our image
3537 eglDestroyImageKHR(mEGLDisplay, image);
3538 } else {
3539 result = BAD_VALUE;
3540 }
Prathmesh Prabhuf3209b02016-03-09 16:54:45 -08003541 if (buffer) {
3542 // queueBuffer takes ownership of syncFd
3543 result = window->queueBuffer(window, buffer, syncFd);
3544 }
Dan Stoza9e56aa02015-11-02 13:00:03 -08003545 }
3546 } else {
3547 result = BAD_VALUE;
3548 }
3549 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3550 }
3551
3552 return result;
3553}
3554
3555void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
3556 const sp<const DisplayDevice>& hw, uint32_t minLayerZ, uint32_t maxLayerZ) {
3557 if (DEBUG_SCREENSHOTS) {
3558 for (size_t y=0 ; y<h ; y++) {
3559 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3560 for (size_t x=0 ; x<w ; x++) {
3561 if (p[x] != 0xFF000000) return;
3562 }
3563 }
3564 ALOGE("*** we just took a black screenshot ***\n"
3565 "requested minz=%d, maxz=%d, layerStack=%d",
3566 minLayerZ, maxLayerZ, hw->getLayerStack());
3567 const LayerVector& layers( mDrawingState.layersSortedByZ );
3568 const size_t count = layers.size();
3569 for (size_t i=0 ; i<count ; ++i) {
3570 const sp<Layer>& layer(layers[i]);
3571 const Layer::State& state(layer->getDrawingState());
3572 const bool visible = (state.layerStack == hw->getLayerStack())
3573 && (state.z >= minLayerZ && state.z <= maxLayerZ)
3574 && (layer->isVisible());
3575 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3576 visible ? '+' : '-',
3577 i, layer->getName().string(), state.layerStack, state.z,
3578 layer->isVisible(), state.flags, state.alpha);
3579 }
3580 }
3581}
3582
3583// ---------------------------------------------------------------------------
3584
3585SurfaceFlinger::LayerVector::LayerVector() {
3586}
3587
3588SurfaceFlinger::LayerVector::LayerVector(const LayerVector& rhs)
3589 : SortedVector<sp<Layer> >(rhs) {
3590}
3591
3592int SurfaceFlinger::LayerVector::do_compare(const void* lhs,
3593 const void* rhs) const
3594{
3595 // sort layers per layer-stack, then by z-order and finally by sequence
3596 const sp<Layer>& l(*reinterpret_cast<const sp<Layer>*>(lhs));
3597 const sp<Layer>& r(*reinterpret_cast<const sp<Layer>*>(rhs));
3598
3599 uint32_t ls = l->getCurrentState().layerStack;
3600 uint32_t rs = r->getCurrentState().layerStack;
3601 if (ls != rs)
3602 return ls - rs;
3603
3604 uint32_t lz = l->getCurrentState().z;
3605 uint32_t rz = r->getCurrentState().z;
3606 if (lz != rz)
3607 return lz - rz;
3608
3609 return l->sequence - r->sequence;
3610}
3611
3612// ---------------------------------------------------------------------------
3613
3614SurfaceFlinger::DisplayDeviceState::DisplayDeviceState()
3615 : type(DisplayDevice::DISPLAY_ID_INVALID),
3616 layerStack(DisplayDevice::NO_LAYER_STACK),
3617 orientation(0),
3618 width(0),
3619 height(0),
3620 isSecure(false) {
3621}
3622
3623SurfaceFlinger::DisplayDeviceState::DisplayDeviceState(
3624 DisplayDevice::DisplayType type, bool isSecure)
3625 : type(type),
3626 layerStack(DisplayDevice::NO_LAYER_STACK),
3627 orientation(0),
3628 width(0),
3629 height(0),
3630 isSecure(isSecure) {
3631 viewport.makeInvalid();
3632 frame.makeInvalid();
3633}
3634
3635// ---------------------------------------------------------------------------
3636
3637}; // namespace android
3638
3639
3640#if defined(__gl_h_)
3641#error "don't include gl/gl.h in this file"
3642#endif
3643
3644#if defined(__gl2_h_)
3645#error "don't include gl2/gl2.h in this file"
3646#endif