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