blob: 147232c4483c64a325c5aea78bd8eb09805c6bdf [file] [log] [blame]
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001/*
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
Mark Salyzyn7823e122016-09-29 08:08:05 -070019#include <dlfcn.h>
20#include <errno.h>
21#include <inttypes.h>
22#include <math.h>
23#include <stdatomic.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000024#include <stdint.h>
25#include <sys/types.h>
Dan Stoza9e56aa02015-11-02 13:00:03 -080026
Fabien Sanglard9d96de42016-10-11 00:15:18 +000027#include <mutex>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000028
29#include <EGL/egl.h>
30
Fabien Sanglard9d96de42016-10-11 00:15:18 +000031#include <cutils/properties.h>
Mark Salyzyn7823e122016-09-29 08:08:05 -070032#include <log/log.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000033
34#include <binder/IPCThreadState.h>
35#include <binder/IServiceManager.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000036#include <binder/PermissionCache.h>
37
38#include <ui/DisplayInfo.h>
39#include <ui/DisplayStatInfo.h>
40
Fabien Sanglard9d96de42016-10-11 00:15:18 +000041#include <gui/BufferQueue.h>
42#include <gui/GuiConfig.h>
43#include <gui/IDisplayEventConnection.h>
44#include <gui/Surface.h>
Fabien Sanglard9d96de42016-10-11 00:15:18 +000045
46#include <ui/GraphicBufferAllocator.h>
47#include <ui/HdrCapabilities.h>
48#include <ui/PixelFormat.h>
49#include <ui/UiConfig.h>
50
51#include <utils/misc.h>
52#include <utils/String8.h>
53#include <utils/String16.h>
54#include <utils/StopWatch.h>
55#include <utils/Timers.h>
56#include <utils/Trace.h>
57
58#include <private/android_filesystem_config.h>
59#include <private/gui/SyncFeatures.h>
60
61#include <set>
62
63#include "Client.h"
64#include "clz.h"
65#include "Colorizer.h"
66#include "DdmConnection.h"
67#include "DisplayDevice.h"
68#include "DispSync.h"
69#include "EventControlThread.h"
70#include "EventThread.h"
71#include "Layer.h"
Robert Carr1f0a16a2016-10-24 16:27:39 -070072#include "LayerVector.h"
Fabien Sanglard9d96de42016-10-11 00:15:18 +000073#include "LayerDim.h"
Robert Carr1db73f62016-12-21 12:58:51 -080074#include "MonitoredProducer.h"
Fabien Sanglard9d96de42016-10-11 00:15:18 +000075#include "SurfaceFlinger.h"
76
77#include "DisplayHardware/FramebufferSurface.h"
78#include "DisplayHardware/HWComposer.h"
79#include "DisplayHardware/VirtualDisplaySurface.h"
80
81#include "Effects/Daltonizer.h"
82
83#include "RenderEngine/RenderEngine.h"
84#include <cutils/compiler.h>
85
Fabien Sanglard0cc19382017-03-06 11:54:40 -080086#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
87#include <configstore/Utils.h>
88
Fabien Sanglard9d96de42016-10-11 00:15:18 +000089#define DISPLAY_COUNT 1
90
91/*
92 * DEBUG_SCREENSHOTS: set to true to check that screenshots are not all
93 * black pixels.
94 */
95#define DEBUG_SCREENSHOTS false
96
97EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
98
Fabien Sanglard9d96de42016-10-11 00:15:18 +000099namespace android {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000100// ---------------------------------------------------------------------------
101
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800102using namespace android::hardware::configstore;
103using namespace android::hardware::configstore::V1_0;
104
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000105const String16 sHardwareTest("android.permission.HARDWARE_TEST");
106const String16 sAccessSurfaceFlinger("android.permission.ACCESS_SURFACE_FLINGER");
107const String16 sReadFramebuffer("android.permission.READ_FRAME_BUFFER");
108const String16 sDump("android.permission.DUMP");
109
110// ---------------------------------------------------------------------------
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800111int64_t SurfaceFlinger::vsyncPhaseOffsetNs;
112int64_t SurfaceFlinger::sfVsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000113
114SurfaceFlinger::SurfaceFlinger()
115 : BnSurfaceComposer(),
116 mTransactionFlags(0),
117 mTransactionPending(false),
118 mAnimTransactionPending(false),
119 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700120 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000121 mRepaintEverything(0),
122 mRenderEngine(NULL),
123 mBootTime(systemTime()),
124 mVisibleRegionsDirty(false),
125 mHwWorkListDirty(false),
126 mAnimCompositionPending(false),
127 mDebugRegion(0),
128 mDebugDDMS(0),
129 mDebugDisableHWC(0),
130 mDebugDisableTransformHint(0),
131 mDebugInSwapBuffers(0),
132 mLastSwapBufferTime(0),
133 mDebugInTransaction(0),
134 mLastTransactionTime(0),
135 mBootFinished(false),
136 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800137 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000138 mPrimaryDispSync("PrimaryDispSync"),
139 mPrimaryHWVsyncEnabled(false),
140 mHWVsyncAvailable(false),
141 mDaltonize(false),
142 mHasColorMatrix(false),
143 mHasPoweredOff(false),
144 mFrameBuckets(),
145 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700146 mLastSwapTime(0),
147 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000148{
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800149 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
150 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
151
152 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
153 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
154
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000155 ALOGI("SurfaceFlinger is starting");
156
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000157 char value[PROPERTY_VALUE_MAX];
158
159 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
160 mGpuToCpuSupported = !atoi(value);
161
162 property_get("debug.sf.showupdates", value, "0");
163 mDebugRegion = atoi(value);
164
165 property_get("debug.sf.ddms", value, "0");
166 mDebugDDMS = atoi(value);
167 if (mDebugDDMS) {
168 if (!startDdmConnection()) {
169 // start failed, and DDMS debugging not enabled
170 mDebugDDMS = 0;
171 }
172 }
173 ALOGI_IF(mDebugRegion, "showupdates enabled");
174 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
175
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800176 property_get("debug.sf.enable_hwc_vds", value, "0");
177 mUseHwcVirtualDisplays = atoi(value);
178 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800179
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800180 property_get("ro.sf.disable_triple_buffer", value, "1");
181 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800182 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000183}
184
185void SurfaceFlinger::onFirstRef()
186{
187 mEventQueue.init(this);
188}
189
190SurfaceFlinger::~SurfaceFlinger()
191{
192 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
193 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
194 eglTerminate(display);
195}
196
197void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
198{
199 // the window manager died on us. prepare its eulogy.
200
201 // restore initial conditions (default device unblank, etc)
202 initializeDisplays();
203
204 // restart the boot-animation
205 startBootAnim();
206}
207
Robert Carr1db73f62016-12-21 12:58:51 -0800208static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000209 status_t err = client->initCheck();
210 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800211 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000212 }
Robert Carr1db73f62016-12-21 12:58:51 -0800213 return nullptr;
214}
215
216sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
217 return initClient(new Client(this));
218}
219
220sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
221 const sp<IGraphicBufferProducer>& gbp) {
222 if (authenticateSurfaceTexture(gbp) == false) {
223 return nullptr;
224 }
225 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
226 if (layer == nullptr) {
227 return nullptr;
228 }
229
230 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000231}
232
233sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
234 bool secure)
235{
236 class DisplayToken : public BBinder {
237 sp<SurfaceFlinger> flinger;
238 virtual ~DisplayToken() {
239 // no more references, this display must be terminated
240 Mutex::Autolock _l(flinger->mStateLock);
241 flinger->mCurrentState.displays.removeItem(this);
242 flinger->setTransactionFlags(eDisplayTransactionNeeded);
243 }
244 public:
245 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
246 : flinger(flinger) {
247 }
248 };
249
250 sp<BBinder> token = new DisplayToken(this);
251
252 Mutex::Autolock _l(mStateLock);
253 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
254 info.displayName = displayName;
255 mCurrentState.displays.add(token, info);
256 mInterceptor.saveDisplayCreation(info);
257 return token;
258}
259
260void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
261 Mutex::Autolock _l(mStateLock);
262
263 ssize_t idx = mCurrentState.displays.indexOfKey(display);
264 if (idx < 0) {
265 ALOGW("destroyDisplay: invalid display token");
266 return;
267 }
268
269 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
270 if (!info.isVirtualDisplay()) {
271 ALOGE("destroyDisplay called for non-virtual display");
272 return;
273 }
274 mInterceptor.saveDisplayDeletion(info.displayId);
275 mCurrentState.displays.removeItemsAt(idx);
276 setTransactionFlags(eDisplayTransactionNeeded);
277}
278
279void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
280 ALOGW_IF(mBuiltinDisplays[type],
281 "Overwriting display token for display type %d", type);
282 mBuiltinDisplays[type] = new BBinder();
283 // All non-virtual displays are currently considered secure.
284 DisplayDeviceState info(type, true);
285 mCurrentState.displays.add(mBuiltinDisplays[type], info);
286 mInterceptor.saveDisplayCreation(info);
287}
288
289sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
290 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
291 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
292 return NULL;
293 }
294 return mBuiltinDisplays[id];
295}
296
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000297void SurfaceFlinger::bootFinished()
298{
Wei Wangb254fa32017-01-31 17:43:23 -0800299 if (mStartBootAnimThread->join() != NO_ERROR) {
300 ALOGE("Join StartBootAnimThread failed!");
301 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000302 const nsecs_t now = systemTime();
303 const nsecs_t duration = now - mBootTime;
304 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
305 mBootFinished = true;
306
307 // wait patiently for the window manager death
308 const String16 name("window");
309 sp<IBinder> window(defaultServiceManager()->getService(name));
310 if (window != 0) {
311 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
312 }
313
314 // stop boot animation
315 // formerly we would just kill the process, but we now ask it to exit so it
316 // can choose where to stop the animation.
317 property_set("service.bootanim.exit", "1");
318
319 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
320 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
321 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
322}
323
324void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
325 class MessageDestroyGLTexture : public MessageBase {
326 RenderEngine& engine;
327 uint32_t texture;
328 public:
329 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
330 : engine(engine), texture(texture) {
331 }
332 virtual bool handler() {
333 engine.deleteTextures(1, &texture);
334 return true;
335 }
336 };
337 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
338}
339
340class DispSyncSource : public VSyncSource, private DispSync::Callback {
341public:
342 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
343 const char* name) :
344 mName(name),
345 mValue(0),
346 mTraceVsync(traceVsync),
347 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
348 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
349 mDispSync(dispSync),
350 mCallbackMutex(),
351 mCallback(),
352 mVsyncMutex(),
353 mPhaseOffset(phaseOffset),
354 mEnabled(false) {}
355
356 virtual ~DispSyncSource() {}
357
358 virtual void setVSyncEnabled(bool enable) {
359 Mutex::Autolock lock(mVsyncMutex);
360 if (enable) {
361 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
362 static_cast<DispSync::Callback*>(this));
363 if (err != NO_ERROR) {
364 ALOGE("error registering vsync callback: %s (%d)",
365 strerror(-err), err);
366 }
367 //ATRACE_INT(mVsyncOnLabel.string(), 1);
368 } else {
369 status_t err = mDispSync->removeEventListener(
370 static_cast<DispSync::Callback*>(this));
371 if (err != NO_ERROR) {
372 ALOGE("error unregistering vsync callback: %s (%d)",
373 strerror(-err), err);
374 }
375 //ATRACE_INT(mVsyncOnLabel.string(), 0);
376 }
377 mEnabled = enable;
378 }
379
380 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
381 Mutex::Autolock lock(mCallbackMutex);
382 mCallback = callback;
383 }
384
385 virtual void setPhaseOffset(nsecs_t phaseOffset) {
386 Mutex::Autolock lock(mVsyncMutex);
387
388 // Normalize phaseOffset to [0, period)
389 auto period = mDispSync->getPeriod();
390 phaseOffset %= period;
391 if (phaseOffset < 0) {
392 // If we're here, then phaseOffset is in (-period, 0). After this
393 // operation, it will be in (0, period)
394 phaseOffset += period;
395 }
396 mPhaseOffset = phaseOffset;
397
398 // If we're not enabled, we don't need to mess with the listeners
399 if (!mEnabled) {
400 return;
401 }
402
403 // Remove the listener with the old offset
404 status_t err = mDispSync->removeEventListener(
405 static_cast<DispSync::Callback*>(this));
406 if (err != NO_ERROR) {
407 ALOGE("error unregistering vsync callback: %s (%d)",
408 strerror(-err), err);
409 }
410
411 // Add a listener with the new offset
412 err = mDispSync->addEventListener(mName, mPhaseOffset,
413 static_cast<DispSync::Callback*>(this));
414 if (err != NO_ERROR) {
415 ALOGE("error registering vsync callback: %s (%d)",
416 strerror(-err), err);
417 }
418 }
419
420private:
421 virtual void onDispSyncEvent(nsecs_t when) {
422 sp<VSyncSource::Callback> callback;
423 {
424 Mutex::Autolock lock(mCallbackMutex);
425 callback = mCallback;
426
427 if (mTraceVsync) {
428 mValue = (mValue + 1) % 2;
429 ATRACE_INT(mVsyncEventLabel.string(), mValue);
430 }
431 }
432
433 if (callback != NULL) {
434 callback->onVSyncEvent(when);
435 }
436 }
437
438 const char* const mName;
439
440 int mValue;
441
442 const bool mTraceVsync;
443 const String8 mVsyncOnLabel;
444 const String8 mVsyncEventLabel;
445
446 DispSync* mDispSync;
447
448 Mutex mCallbackMutex; // Protects the following
449 sp<VSyncSource::Callback> mCallback;
450
451 Mutex mVsyncMutex; // Protects the following
452 nsecs_t mPhaseOffset;
453 bool mEnabled;
454};
455
456class InjectVSyncSource : public VSyncSource {
457public:
458 InjectVSyncSource() {}
459
460 virtual ~InjectVSyncSource() {}
461
462 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
463 std::lock_guard<std::mutex> lock(mCallbackMutex);
464 mCallback = callback;
465 }
466
467 virtual void onInjectSyncEvent(nsecs_t when) {
468 std::lock_guard<std::mutex> lock(mCallbackMutex);
469 mCallback->onVSyncEvent(when);
470 }
471
472 virtual void setVSyncEnabled(bool) {}
473 virtual void setPhaseOffset(nsecs_t) {}
474
475private:
476 std::mutex mCallbackMutex; // Protects the following
477 sp<VSyncSource::Callback> mCallback;
478};
479
480void SurfaceFlinger::init() {
481 ALOGI( "SurfaceFlinger's main thread ready to run. "
482 "Initializing graphics H/W...");
483
484 Mutex::Autolock _l(mStateLock);
485
486 // initialize EGL for the default display
487 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
488 eglInitialize(mEGLDisplay, NULL, NULL);
489
490 // start the EventThread
491 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
492 vsyncPhaseOffsetNs, true, "app");
493 mEventThread = new EventThread(vsyncSrc, *this, false);
494 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
495 sfVsyncPhaseOffsetNs, true, "sf");
496 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
497 mEventQueue.setEventThread(mSFEventThread);
498
499 // set SFEventThread to SCHED_FIFO to minimize jitter
500 struct sched_param param = {0};
501 param.sched_priority = 2;
502 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
503 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
504 }
505
506
507 // Initialize the H/W composer object. There may or may not be an
508 // actual hardware composer underneath.
509 mHwc = new HWComposer(this,
510 *static_cast<HWComposer::EventHandler *>(this));
511
512 // get a RenderEngine for the given display / config (can't fail)
513 mRenderEngine = RenderEngine::create(mEGLDisplay, mHwc->getVisualID());
514
515 // retrieve the EGL context that was selected/created
516 mEGLContext = mRenderEngine->getEGLContext();
517
518 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
519 "couldn't create EGLContext");
520
521 // initialize our non-virtual displays
522 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
523 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
524 // set-up the displays that are already connected
525 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
526 // All non-virtual displays are currently considered secure.
527 bool isSecure = true;
528 createBuiltinDisplayLocked(type);
529 wp<IBinder> token = mBuiltinDisplays[i];
530
531 sp<IGraphicBufferProducer> producer;
532 sp<IGraphicBufferConsumer> consumer;
Mathias Agopian1da94df2017-02-27 18:17:44 -0800533 BufferQueue::createBufferQueue(&producer, &consumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000534
535 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
536 consumer);
537 int32_t hwcId = allocateHwcDisplayId(type);
538 sp<DisplayDevice> hw = new DisplayDevice(this,
539 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
540 fbs, producer,
541 mRenderEngine->getEGLConfig());
542 if (i > DisplayDevice::DISPLAY_PRIMARY) {
543 // FIXME: currently we don't get blank/unblank requests
544 // for displays other than the main display, so we always
545 // assume a connected display is unblanked.
546 ALOGD("marking display %zu as acquired/unblanked", i);
547 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
548 }
549 mDisplays.add(token, hw);
550 }
551 }
552
553 // make the GLContext current so that we can create textures when creating Layers
554 // (which may happens before we render something)
555 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
556
557 mEventControlThread = new EventControlThread(this);
558 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
559
560 // set a fake vsync period if there is no HWComposer
561 if (mHwc->initCheck() != NO_ERROR) {
562 mPrimaryDispSync.setPeriod(16666667);
563 }
564
565 // initialize our drawing state
566 mDrawingState = mCurrentState;
567
568 // set initial conditions (e.g. unblank default device)
569 initializeDisplays();
570
571 mRenderEngine->primeCache();
572
Wei Wangb254fa32017-01-31 17:43:23 -0800573 mStartBootAnimThread = new StartBootAnimThread();
574 if (mStartBootAnimThread->Start() != NO_ERROR) {
575 ALOGE("Run StartBootAnimThread failed!");
576 }
577
578 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000579}
580
581int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
582 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
583 type : mHwc->allocateDisplayId();
584}
585
586void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800587 // Start boot animation service by setting a property mailbox
588 // if property setting thread is already running, Start() will be just a NOP
589 mStartBootAnimThread->Start();
590 // Wait until property was set
591 if (mStartBootAnimThread->join() != NO_ERROR) {
592 ALOGE("Join StartBootAnimThread failed!");
593 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000594}
595
596size_t SurfaceFlinger::getMaxTextureSize() const {
597 return mRenderEngine->getMaxTextureSize();
598}
599
600size_t SurfaceFlinger::getMaxViewportDims() const {
601 return mRenderEngine->getMaxViewportDims();
602}
603
604// ----------------------------------------------------------------------------
605
606bool SurfaceFlinger::authenticateSurfaceTexture(
607 const sp<IGraphicBufferProducer>& bufferProducer) const {
608 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800609 return authenticateSurfaceTextureLocked(bufferProducer);
610}
611
612bool SurfaceFlinger::authenticateSurfaceTextureLocked(
613 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000614 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
615 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
616}
617
Brian Anderson069b3652016-07-22 10:32:47 -0700618status_t SurfaceFlinger::getSupportedFrameTimestamps(
Brian Anderson3890c392016-07-25 12:48:08 -0700619 std::vector<FrameEvent>* outSupported) const {
Brian Anderson069b3652016-07-22 10:32:47 -0700620 *outSupported = {
Brian Anderson3890c392016-07-25 12:48:08 -0700621 FrameEvent::REQUESTED_PRESENT,
622 FrameEvent::ACQUIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700623 FrameEvent::LATCH,
Brian Anderson3890c392016-07-25 12:48:08 -0700624 FrameEvent::FIRST_REFRESH_START,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700625 FrameEvent::LAST_REFRESH_START,
Brian Andersonb04c6f02016-10-21 12:57:46 -0700626 FrameEvent::GPU_COMPOSITION_DONE,
Brian Anderson3890c392016-07-25 12:48:08 -0700627 FrameEvent::DISPLAY_RETIRE,
Brian Andersonf7fd56a2016-09-02 10:10:04 -0700628 FrameEvent::DEQUEUE_READY,
Brian Anderson3890c392016-07-25 12:48:08 -0700629 FrameEvent::RELEASE,
Brian Anderson069b3652016-07-22 10:32:47 -0700630 };
631 return NO_ERROR;
632}
633
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000634status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
635 Vector<DisplayInfo>* configs) {
636 if ((configs == NULL) || (display.get() == NULL)) {
637 return BAD_VALUE;
638 }
639
640 int32_t type = getDisplayType(display);
641 if (type < 0) return type;
642
643 // TODO: Not sure if display density should handled by SF any longer
644 class Density {
645 static int getDensityFromProperty(char const* propName) {
646 char property[PROPERTY_VALUE_MAX];
647 int density = 0;
648 if (property_get(propName, property, NULL) > 0) {
649 density = atoi(property);
650 }
651 return density;
652 }
653 public:
654 static int getEmuDensity() {
655 return getDensityFromProperty("qemu.sf.lcd_density"); }
656 static int getBuildDensity() {
657 return getDensityFromProperty("ro.sf.lcd_density"); }
658 };
659
660 configs->clear();
661
662 const Vector<HWComposer::DisplayConfig>& hwConfigs =
663 getHwComposer().getConfigs(type);
664 for (size_t c = 0; c < hwConfigs.size(); ++c) {
665 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
666 DisplayInfo info = DisplayInfo();
667
668 float xdpi = hwConfig.xdpi;
669 float ydpi = hwConfig.ydpi;
670
671 if (type == DisplayDevice::DISPLAY_PRIMARY) {
672 // The density of the device is provided by a build property
673 float density = Density::getBuildDensity() / 160.0f;
674 if (density == 0) {
675 // the build doesn't provide a density -- this is wrong!
676 // use xdpi instead
677 ALOGE("ro.sf.lcd_density must be defined as a build property");
678 density = xdpi / 160.0f;
679 }
680 if (Density::getEmuDensity()) {
681 // if "qemu.sf.lcd_density" is specified, it overrides everything
682 xdpi = ydpi = density = Density::getEmuDensity();
683 density /= 160.0f;
684 }
685 info.density = density;
686
687 // TODO: this needs to go away (currently needed only by webkit)
688 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
689 info.orientation = hw->getOrientation();
690 } else {
691 // TODO: where should this value come from?
692 static const int TV_DENSITY = 213;
693 info.density = TV_DENSITY / 160.0f;
694 info.orientation = 0;
695 }
696
697 info.w = hwConfig.width;
698 info.h = hwConfig.height;
699 info.xdpi = xdpi;
700 info.ydpi = ydpi;
701 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800702 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000703
704 // This is how far in advance a buffer must be queued for
705 // presentation at a given time. If you want a buffer to appear
706 // on the screen at time N, you must submit the buffer before
707 // (N - presentationDeadline).
708 //
709 // Normally it's one full refresh period (to give SF a chance to
710 // latch the buffer), but this can be reduced by configuring a
711 // DispSync offset. Any additional delays introduced by the hardware
712 // composer or panel must be accounted for here.
713 //
714 // We add an additional 1ms to allow for processing time and
715 // differences between the ideal and actual refresh rate.
716 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800717 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000718
719 // All non-virtual displays are currently considered secure.
720 info.secure = true;
721
722 configs->push_back(info);
723 }
724
725 return NO_ERROR;
726}
727
728status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
729 DisplayStatInfo* stats) {
730 if (stats == NULL) {
731 return BAD_VALUE;
732 }
733
734 // FIXME for now we always return stats for the primary display
735 memset(stats, 0, sizeof(*stats));
736 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
737 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
738 return NO_ERROR;
739}
740
741int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
742 sp<DisplayDevice> device(getDisplayDevice(display));
743 if (device != NULL) {
744 return device->getActiveConfig();
745 }
746 return BAD_VALUE;
747}
748
749void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
750 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
751 this);
752 int32_t type = hw->getDisplayType();
753 int currentMode = hw->getActiveConfig();
754
755 if (mode == currentMode) {
756 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
757 return;
758 }
759
760 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
761 ALOGW("Trying to set config for virtual display");
762 return;
763 }
764
765 hw->setActiveConfig(mode);
766 getHwComposer().setActiveConfig(type, mode);
767}
768
769status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
770 class MessageSetActiveConfig: public MessageBase {
771 SurfaceFlinger& mFlinger;
772 sp<IBinder> mDisplay;
773 int mMode;
774 public:
775 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
776 int mode) :
777 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
778 virtual bool handler() {
779 Vector<DisplayInfo> configs;
780 mFlinger.getDisplayConfigs(mDisplay, &configs);
781 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
782 ALOGE("Attempt to set active config = %d for display with %zu configs",
783 mMode, configs.size());
784 }
785 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
786 if (hw == NULL) {
787 ALOGE("Attempt to set active config = %d for null display %p",
788 mMode, mDisplay.get());
789 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
790 ALOGW("Attempt to set active config = %d for virtual display",
791 mMode);
792 } else {
793 mFlinger.setActiveConfigInternal(hw, mMode);
794 }
795 return true;
796 }
797 };
798 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
799 postMessageSync(msg);
800 return NO_ERROR;
801}
802
803status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
804 Vector<android_color_mode_t>* outColorModes) {
805 if (outColorModes == nullptr || display.get() == nullptr) {
806 return BAD_VALUE;
807 }
808
809 int32_t type = getDisplayType(display);
810 if (type < 0) return type;
811
812 std::set<android_color_mode_t> colorModes;
813 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
814 colorModes.insert(hwConfig.colorMode);
815 }
816
817 outColorModes->clear();
818 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
819
820 return NO_ERROR;
821}
822
823android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
824 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
825
826 int32_t type = getDisplayType(display);
827 if (type < 0) return static_cast<android_color_mode_t>(type);
828
829 return getHwComposer().getColorMode(type);
830}
831
832status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
833 android_color_mode_t colorMode) {
834 if (display.get() == nullptr || colorMode < 0) {
835 return BAD_VALUE;
836 }
837
838 int32_t type = getDisplayType(display);
839 if (type < 0) return type;
840 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
841 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
842 desiredConfig.colorMode = colorMode;
843 for (size_t c = 0; c < hwConfigs.size(); ++c) {
844 const HWComposer::DisplayConfig config = hwConfigs[c];
845 if (config == desiredConfig) {
846 return setActiveConfig(display, c);
847 }
848 }
849 return BAD_VALUE;
850}
851
852status_t SurfaceFlinger::clearAnimationFrameStats() {
853 Mutex::Autolock _l(mStateLock);
854 mAnimFrameTracker.clearStats();
855 return NO_ERROR;
856}
857
858status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
859 Mutex::Autolock _l(mStateLock);
860 mAnimFrameTracker.getStats(outStats);
861 return NO_ERROR;
862}
863
864status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
865 HdrCapabilities* outCapabilities) const {
866 // HWC1 does not provide HDR capabilities
867 *outCapabilities = HdrCapabilities();
868 return NO_ERROR;
869}
870
871status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
872 if (enable == mInjectVSyncs) {
873 return NO_ERROR;
874 }
875
876 if (enable) {
877 mInjectVSyncs = enable;
878 ALOGV("VSync Injections enabled");
879 if (mVSyncInjector.get() == nullptr) {
880 mVSyncInjector = new InjectVSyncSource();
881 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
882 }
883 mEventQueue.setEventThread(mInjectorEventThread);
884 } else {
885 mInjectVSyncs = enable;
886 ALOGV("VSync Injections disabled");
887 mEventQueue.setEventThread(mSFEventThread);
888 mVSyncInjector.clear();
889 }
890 return NO_ERROR;
891}
892
893status_t SurfaceFlinger::injectVSync(nsecs_t when) {
894 if (!mInjectVSyncs) {
895 ALOGE("VSync Injections not enabled");
896 return BAD_VALUE;
897 }
898 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
899 ALOGV("Injecting VSync inside SurfaceFlinger");
900 mVSyncInjector->onInjectSyncEvent(when);
901 }
902 return NO_ERROR;
903}
904
905// ----------------------------------------------------------------------------
906
907sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection() {
908 return mEventThread->createEventConnection();
909}
910
911// ----------------------------------------------------------------------------
912
913void SurfaceFlinger::waitForEvent() {
914 mEventQueue.waitMessage();
915}
916
917void SurfaceFlinger::signalTransaction() {
918 mEventQueue.invalidate();
919}
920
921void SurfaceFlinger::signalLayerUpdate() {
922 mEventQueue.invalidate();
923}
924
925void SurfaceFlinger::signalRefresh() {
926 mEventQueue.refresh();
927}
928
929status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
930 nsecs_t reltime, uint32_t /* flags */) {
931 return mEventQueue.postMessage(msg, reltime);
932}
933
934status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
935 nsecs_t reltime, uint32_t /* flags */) {
936 status_t res = mEventQueue.postMessage(msg, reltime);
937 if (res == NO_ERROR) {
938 msg->wait();
939 }
940 return res;
941}
942
943void SurfaceFlinger::run() {
944 do {
945 waitForEvent();
946 } while (true);
947}
948
949void SurfaceFlinger::enableHardwareVsync() {
950 Mutex::Autolock _l(mHWVsyncLock);
951 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
952 mPrimaryDispSync.beginResync();
953 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
954 mEventControlThread->setVsyncEnabled(true);
955 mPrimaryHWVsyncEnabled = true;
956 }
957}
958
959void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
960 Mutex::Autolock _l(mHWVsyncLock);
961
962 if (makeAvailable) {
963 mHWVsyncAvailable = true;
964 } else if (!mHWVsyncAvailable) {
965 // Hardware vsync is not currently available, so abort the resync
966 // attempt for now
967 return;
968 }
969
970 const nsecs_t period =
971 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
972
973 mPrimaryDispSync.reset();
974 mPrimaryDispSync.setPeriod(period);
975
976 if (!mPrimaryHWVsyncEnabled) {
977 mPrimaryDispSync.beginResync();
978 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
979 mEventControlThread->setVsyncEnabled(true);
980 mPrimaryHWVsyncEnabled = true;
981 }
982}
983
984void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
985 Mutex::Autolock _l(mHWVsyncLock);
986 if (mPrimaryHWVsyncEnabled) {
987 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
988 mEventControlThread->setVsyncEnabled(false);
989 mPrimaryDispSync.endResync();
990 mPrimaryHWVsyncEnabled = false;
991 }
992 if (makeUnavailable) {
993 mHWVsyncAvailable = false;
994 }
995}
996
997void SurfaceFlinger::resyncWithRateLimit() {
998 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
999 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1000 resyncToHardwareVsync(false);
1001 }
1002}
1003
Steven Thomas3cfac282017-02-06 12:29:30 -08001004void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1005 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001006 bool needsHwVsync = false;
1007
1008 { // Scope for the lock
1009 Mutex::Autolock _l(mHWVsyncLock);
1010 if (type == 0 && mPrimaryHWVsyncEnabled) {
1011 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1012 }
1013 }
1014
1015 if (needsHwVsync) {
1016 enableHardwareVsync();
1017 } else {
1018 disableHardwareVsync(false);
1019 }
1020}
1021
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001022void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
1023 std::lock_guard<std::mutex> lock(mCompositeTimingLock);
1024 *compositorTiming = mCompositorTiming;
1025}
1026
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001027void SurfaceFlinger::onHotplugReceived(int type, bool connected) {
1028 if (mEventThread == NULL) {
1029 // This is a temporary workaround for b/7145521. A non-null pointer
1030 // does not mean EventThread has finished initializing, so this
1031 // is not a correct fix.
1032 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1033 return;
1034 }
1035
1036 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1037 Mutex::Autolock _l(mStateLock);
1038 if (connected) {
1039 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1040 } else {
1041 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1042 mBuiltinDisplays[type].clear();
1043 }
1044 setTransactionFlags(eDisplayTransactionNeeded);
1045
1046 // Defer EventThread notification until SF has updated mDisplays.
1047 }
1048}
1049
Steven Thomas3cfac282017-02-06 12:29:30 -08001050void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1051 repaintEverything();
1052}
1053
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001054void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1055 ATRACE_CALL();
1056 getHwComposer().eventControl(disp, event, enabled);
1057}
1058
1059void SurfaceFlinger::onMessageReceived(int32_t what) {
1060 ATRACE_CALL();
1061 switch (what) {
1062 case MessageQueue::INVALIDATE: {
1063 bool refreshNeeded = handleMessageTransaction();
1064 refreshNeeded |= handleMessageInvalidate();
1065 refreshNeeded |= mRepaintEverything;
1066 if (refreshNeeded) {
1067 // Signal a refresh if a transaction modified the window state,
1068 // a new buffer was latched, or if HWC has requested a full
1069 // repaint
1070 signalRefresh();
1071 }
1072 break;
1073 }
1074 case MessageQueue::REFRESH: {
1075 handleMessageRefresh();
1076 break;
1077 }
1078 }
1079}
1080
1081bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001082 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001083 if (transactionFlags) {
1084 handleTransaction(transactionFlags);
1085 return true;
1086 }
1087 return false;
1088}
1089
1090bool SurfaceFlinger::handleMessageInvalidate() {
1091 ATRACE_CALL();
1092 return handlePageFlip();
1093}
1094
1095void SurfaceFlinger::handleMessageRefresh() {
1096 ATRACE_CALL();
1097
1098 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1099
Brian Andersond6927fb2016-07-23 23:37:30 -07001100 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001101 rebuildLayerStacks();
1102 setUpHWComposer();
1103 doDebugFlashRegions();
1104 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001105 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001106}
1107
1108void SurfaceFlinger::doDebugFlashRegions()
1109{
1110 // is debugging enabled
1111 if (CC_LIKELY(!mDebugRegion))
1112 return;
1113
1114 const bool repaintEverything = mRepaintEverything;
1115 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1116 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1117 if (hw->isDisplayOn()) {
1118 // transform the dirty region into this screen's coordinate space
1119 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1120 if (!dirtyRegion.isEmpty()) {
1121 // redraw the whole screen
1122 doComposeSurfaces(hw, Region(hw->bounds()));
1123
1124 // and draw the dirty region
1125 const int32_t height = hw->getHeight();
1126 RenderEngine& engine(getRenderEngine());
1127 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1128
1129 hw->compositionComplete();
1130 hw->swapBuffers(getHwComposer());
1131 }
1132 }
1133 }
1134
1135 postFramebuffer();
1136
1137 if (mDebugRegion > 1) {
1138 usleep(mDebugRegion * 1000);
1139 }
1140
1141 HWComposer& hwc(getHwComposer());
1142 if (hwc.initCheck() == NO_ERROR) {
1143 status_t err = hwc.prepare();
1144 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1145 }
1146}
1147
Brian Andersond6927fb2016-07-23 23:37:30 -07001148void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001149{
1150 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001151 mDrawingState.traverseInZOrder([&](Layer* layer) {
1152 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001153 needExtraInvalidate = true;
1154 }
Robert Carr2047fae2016-11-28 14:09:09 -08001155 });
1156
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001157 if (needExtraInvalidate) {
1158 signalLayerUpdate();
1159 }
1160}
1161
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001162void SurfaceFlinger::updateCompositorTiming(
1163 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1164 std::shared_ptr<FenceTime>& presentFenceTime) {
1165 // Update queue of past composite+present times and determine the
1166 // most recently known composite to present latency.
1167 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1168 nsecs_t compositeToPresentLatency = -1;
1169 while (!mCompositePresentTimes.empty()) {
1170 CompositePresentTime& cpt = mCompositePresentTimes.front();
1171 // Cached values should have been updated before calling this method,
1172 // which helps avoid duplicate syscalls.
1173 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1174 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1175 break;
1176 }
1177 compositeToPresentLatency = displayTime - cpt.composite;
1178 mCompositePresentTimes.pop();
1179 }
1180
1181 // Don't let mCompositePresentTimes grow unbounded, just in case.
1182 while (mCompositePresentTimes.size() > 16) {
1183 mCompositePresentTimes.pop();
1184 }
1185
1186 // Integer division and modulo round toward 0 not -inf, so we need to
1187 // treat negative and positive offsets differently.
1188 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs >= 0) ?
1189 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1190 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1191
1192 // Snap the latency to a value that removes scheduling jitter from the
1193 // composition and present times, which often have >1ms of jitter.
1194 // Reducing jitter is important if an app attempts to extrapolate
1195 // something (such as user input) to an accurate diasplay time.
1196 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1197 // with (presentLatency % interval).
1198 nsecs_t snappedCompositeToPresentLatency = -1;
1199 if (compositeToPresentLatency >= 0) {
1200 nsecs_t bias = vsyncInterval / 2;
1201 int64_t extraVsyncs =
1202 (compositeToPresentLatency - idealLatency + bias) /
1203 vsyncInterval;
1204 nsecs_t extraLatency = extraVsyncs * vsyncInterval;
1205 snappedCompositeToPresentLatency = idealLatency + extraLatency;
1206 }
1207
1208 std::lock_guard<std::mutex> lock(mCompositeTimingLock);
1209 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1210 mCompositorTiming.interval = vsyncInterval;
1211 if (snappedCompositeToPresentLatency >= 0) {
1212 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
1213 }
1214}
1215
1216void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001217{
Brian Andersond6927fb2016-07-23 23:37:30 -07001218 const HWComposer& hwc = getHwComposer();
1219 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1220
Brian Anderson3d4039d2016-09-23 16:31:30 -07001221 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1222 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1223 glCompositionDoneFenceTime =
1224 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1225 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1226 } else {
1227 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1228 }
1229 mGlCompositionDoneTimeline.updateSignalTimes();
1230
1231 sp<Fence> displayFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1232 const std::shared_ptr<FenceTime>& presentFenceTime = FenceTime::NO_FENCE;
1233 auto retireFenceTime = std::make_shared<FenceTime>(displayFence);
1234 mDisplayTimeline.push(retireFenceTime);
1235 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001236
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001237 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1238 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1239
1240 // We use the refreshStartTime which might be sampled a little later than
1241 // when we started doing work for this frame, but that should be okay
1242 // since updateCompositorTiming has snapping logic.
1243 updateCompositorTiming(
1244 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
1245
Robert Carr2047fae2016-11-28 14:09:09 -08001246 mDrawingState.traverseInZOrder([&](Layer* layer) {
1247 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001248 presentFenceTime, retireFenceTime, mCompositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001249 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001250 recordBufferingStats(layer->getName().string(),
1251 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001252 }
Robert Carr2047fae2016-11-28 14:09:09 -08001253 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001254
Brian Anderson3d4039d2016-09-23 16:31:30 -07001255 if (displayFence->isValid()) {
1256 if (mPrimaryDispSync.addPresentFence(displayFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001257 enableHardwareVsync();
1258 } else {
1259 disableHardwareVsync(false);
1260 }
1261 }
1262
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001263 if (kIgnorePresentFences) {
1264 if (hw->isDisplayOn()) {
1265 enableHardwareVsync();
1266 }
1267 }
1268
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001269 if (mAnimCompositionPending) {
1270 mAnimCompositionPending = false;
1271
Brian Anderson3d4039d2016-09-23 16:31:30 -07001272 if (retireFenceTime->isValid()) {
1273 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001274 } else {
1275 // The HWC doesn't support present fences, so use the refresh
1276 // timestamp instead.
1277 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1278 mAnimFrameTracker.setActualPresentTime(presentTime);
1279 }
1280 mAnimFrameTracker.advanceFrame();
1281 }
1282
1283 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1284 return;
1285 }
1286
1287 nsecs_t currentTime = systemTime();
1288 if (mHasPoweredOff) {
1289 mHasPoweredOff = false;
1290 } else {
1291 nsecs_t period = mPrimaryDispSync.getPeriod();
1292 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1293 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1294 if (numPeriods < NUM_BUCKETS - 1) {
1295 mFrameBuckets[numPeriods] += elapsedTime;
1296 } else {
1297 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1298 }
1299 mTotalTime += elapsedTime;
1300 }
1301 mLastSwapTime = currentTime;
1302}
1303
1304void SurfaceFlinger::rebuildLayerStacks() {
1305 // rebuild the visible layer list per screen
1306 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1307 ATRACE_CALL();
1308 mVisibleRegionsDirty = false;
1309 invalidateHwcGeometry();
1310
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001311 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1312 Region opaqueRegion;
1313 Region dirtyRegion;
1314 Vector< sp<Layer> > layersSortedByZ;
1315 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1316 const Transform& tr(hw->getTransform());
1317 const Rect bounds(hw->getBounds());
1318 if (hw->isDisplayOn()) {
Robert Carr2047fae2016-11-28 14:09:09 -08001319 computeVisibleRegions(hw->getLayerStack(), dirtyRegion,
1320 opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001321
Robert Carr2047fae2016-11-28 14:09:09 -08001322 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001323 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001324 Region drawRegion(tr.transform(
1325 layer->visibleNonTransparentRegion));
1326 drawRegion.andSelf(bounds);
1327 if (!drawRegion.isEmpty()) {
1328 layersSortedByZ.add(layer);
1329 }
1330 }
Robert Carr2047fae2016-11-28 14:09:09 -08001331 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001332 }
1333 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1334 hw->undefinedRegion.set(bounds);
1335 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1336 hw->dirtyRegion.orSelf(dirtyRegion);
1337 }
1338 }
1339}
1340
1341void SurfaceFlinger::setUpHWComposer() {
1342 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1343 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1344 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1345 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1346
1347 // If nothing has changed (!dirty), don't recompose.
1348 // If something changed, but we don't currently have any visible layers,
1349 // and didn't when we last did a composition, then skip it this time.
1350 // The second rule does two things:
1351 // - When all layers are removed from a display, we'll emit one black
1352 // frame, then nothing more until we get new layers.
1353 // - When a display is created with a private layer stack, we won't
1354 // emit any black frames until a layer is added to the layer stack.
1355 bool mustRecompose = dirty && !(empty && wasEmpty);
1356
1357 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1358 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1359 mustRecompose ? "doing" : "skipping",
1360 dirty ? "+" : "-",
1361 empty ? "+" : "-",
1362 wasEmpty ? "+" : "-");
1363
1364 mDisplays[dpy]->beginFrame(mustRecompose);
1365
1366 if (mustRecompose) {
1367 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1368 }
1369 }
1370
1371 HWComposer& hwc(getHwComposer());
1372 if (hwc.initCheck() == NO_ERROR) {
1373 // build the h/w work list
1374 if (CC_UNLIKELY(mHwWorkListDirty)) {
1375 mHwWorkListDirty = false;
1376 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1377 sp<const DisplayDevice> hw(mDisplays[dpy]);
1378 const int32_t id = hw->getHwcDisplayId();
1379 if (id >= 0) {
1380 const Vector< sp<Layer> >& currentLayers(
1381 hw->getVisibleLayersSortedByZ());
1382 const size_t count = currentLayers.size();
1383 if (hwc.createWorkList(id, count) == NO_ERROR) {
1384 HWComposer::LayerListIterator cur = hwc.begin(id);
1385 const HWComposer::LayerListIterator end = hwc.end(id);
1386 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1387 const sp<Layer>& layer(currentLayers[i]);
1388 layer->setGeometry(hw, *cur);
1389 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1390 cur->setSkip(true);
1391 }
1392 }
1393 }
1394 }
1395 }
1396 }
1397
1398 // set the per-frame data
1399 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1400 sp<const DisplayDevice> hw(mDisplays[dpy]);
1401 const int32_t id = hw->getHwcDisplayId();
1402 if (id >= 0) {
1403 const Vector< sp<Layer> >& currentLayers(
1404 hw->getVisibleLayersSortedByZ());
1405 const size_t count = currentLayers.size();
1406 HWComposer::LayerListIterator cur = hwc.begin(id);
1407 const HWComposer::LayerListIterator end = hwc.end(id);
1408 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1409 /*
1410 * update the per-frame h/w composer data for each layer
1411 * and build the transparent region of the FB
1412 */
1413 const sp<Layer>& layer(currentLayers[i]);
1414 layer->setPerFrameData(hw, *cur);
1415 }
1416 }
1417 }
1418
1419 // If possible, attempt to use the cursor overlay on each display.
1420 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1421 sp<const DisplayDevice> hw(mDisplays[dpy]);
1422 const int32_t id = hw->getHwcDisplayId();
1423 if (id >= 0) {
1424 const Vector< sp<Layer> >& currentLayers(
1425 hw->getVisibleLayersSortedByZ());
1426 const size_t count = currentLayers.size();
1427 HWComposer::LayerListIterator cur = hwc.begin(id);
1428 const HWComposer::LayerListIterator end = hwc.end(id);
1429 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1430 const sp<Layer>& layer(currentLayers[i]);
1431 if (layer->isPotentialCursor()) {
1432 cur->setIsCursorLayerHint();
1433 break;
1434 }
1435 }
1436 }
1437 }
1438
1439 status_t err = hwc.prepare();
1440 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1441
1442 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1443 sp<const DisplayDevice> hw(mDisplays[dpy]);
1444 hw->prepareFrame(hwc);
1445 }
1446 }
1447}
1448
1449void SurfaceFlinger::doComposition() {
1450 ATRACE_CALL();
1451 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1452 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1453 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1454 if (hw->isDisplayOn()) {
1455 // transform the dirty region into this screen's coordinate space
1456 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1457
1458 // repaint the framebuffer (if needed)
1459 doDisplayComposition(hw, dirtyRegion);
1460
1461 hw->dirtyRegion.clear();
1462 hw->flip(hw->swapRegion);
1463 hw->swapRegion.clear();
1464 }
1465 // inform the h/w that we're done compositing
1466 hw->compositionComplete();
1467 }
1468 postFramebuffer();
1469}
1470
1471void SurfaceFlinger::postFramebuffer()
1472{
1473 ATRACE_CALL();
1474
1475 const nsecs_t now = systemTime();
1476 mDebugInSwapBuffers = now;
1477
1478 HWComposer& hwc(getHwComposer());
1479 if (hwc.initCheck() == NO_ERROR) {
1480 if (!hwc.supportsFramebufferTarget()) {
1481 // EGL spec says:
1482 // "surface must be bound to the calling thread's current context,
1483 // for the current rendering API."
1484 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1485 }
1486 hwc.commit();
1487 }
1488
1489 // make the default display current because the VirtualDisplayDevice code cannot
1490 // deal with dequeueBuffer() being called outside of the composition loop; however
1491 // the code below can call glFlush() which is allowed (and does in some case) call
1492 // dequeueBuffer().
1493 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1494
1495 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1496 sp<const DisplayDevice> hw(mDisplays[dpy]);
1497 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1498 hw->onSwapBuffersCompleted(hwc);
1499 const size_t count = currentLayers.size();
1500 int32_t id = hw->getHwcDisplayId();
1501 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1502 HWComposer::LayerListIterator cur = hwc.begin(id);
1503 const HWComposer::LayerListIterator end = hwc.end(id);
1504 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1505 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1506 }
1507 } else {
1508 for (size_t i = 0; i < count; i++) {
1509 currentLayers[i]->onLayerDisplayed(hw, NULL);
1510 }
1511 }
1512 }
1513
1514 mLastSwapBufferTime = systemTime() - now;
1515 mDebugInSwapBuffers = 0;
1516
1517 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1518 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1519 logFrameStats();
1520 }
1521}
1522
1523void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1524{
1525 ATRACE_CALL();
1526
1527 // here we keep a copy of the drawing state (that is the state that's
1528 // going to be overwritten by handleTransactionLocked()) outside of
1529 // mStateLock so that the side-effects of the State assignment
1530 // don't happen with mStateLock held (which can cause deadlocks).
1531 State drawingState(mDrawingState);
1532
1533 Mutex::Autolock _l(mStateLock);
1534 const nsecs_t now = systemTime();
1535 mDebugInTransaction = now;
1536
1537 // Here we're guaranteed that some transaction flags are set
1538 // so we can call handleTransactionLocked() unconditionally.
1539 // We call getTransactionFlags(), which will also clear the flags,
1540 // with mStateLock held to guarantee that mCurrentState won't change
1541 // until the transaction is committed.
1542
1543 transactionFlags = getTransactionFlags(eTransactionMask);
1544 handleTransactionLocked(transactionFlags);
1545
1546 mLastTransactionTime = systemTime() - now;
1547 mDebugInTransaction = 0;
1548 invalidateHwcGeometry();
1549 // here the transaction has been committed
1550}
1551
1552void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1553{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001554 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001555 mCurrentState.traverseInZOrder([](Layer* layer) {
1556 layer->notifyAvailableFrames();
1557 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001558
1559 /*
1560 * Traversal of the children
1561 * (perform the transaction for each of them if needed)
1562 */
1563
1564 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001565 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001566 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001567 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001568
1569 const uint32_t flags = layer->doTransaction(0);
1570 if (flags & Layer::eVisibleRegion)
1571 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001572 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001573 }
1574
1575 /*
1576 * Perform display own transactions if needed
1577 */
1578
1579 if (transactionFlags & eDisplayTransactionNeeded) {
1580 // here we take advantage of Vector's copy-on-write semantics to
1581 // improve performance by skipping the transaction entirely when
1582 // know that the lists are identical
1583 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1584 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1585 if (!curr.isIdenticalTo(draw)) {
1586 mVisibleRegionsDirty = true;
1587 const size_t cc = curr.size();
1588 size_t dc = draw.size();
1589
1590 // find the displays that were removed
1591 // (ie: in drawing state but not in current state)
1592 // also handle displays that changed
1593 // (ie: displays that are in both lists)
1594 for (size_t i=0 ; i<dc ; i++) {
1595 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1596 if (j < 0) {
1597 // in drawing state but not in current state
1598 if (!draw[i].isMainDisplay()) {
1599 // Call makeCurrent() on the primary display so we can
1600 // be sure that nothing associated with this display
1601 // is current.
1602 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDevice());
1603 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
1604 sp<DisplayDevice> hw(getDisplayDevice(draw.keyAt(i)));
1605 if (hw != NULL)
1606 hw->disconnect(getHwComposer());
1607 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1608 mEventThread->onHotplugReceived(draw[i].type, false);
1609 mDisplays.removeItem(draw.keyAt(i));
1610 } else {
1611 ALOGW("trying to remove the main display");
1612 }
1613 } else {
1614 // this display is in both lists. see if something changed.
1615 const DisplayDeviceState& state(curr[j]);
1616 const wp<IBinder>& display(curr.keyAt(j));
1617 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1618 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1619 if (state_binder != draw_binder) {
1620 // changing the surface is like destroying and
1621 // recreating the DisplayDevice, so we just remove it
1622 // from the drawing state, so that it get re-added
1623 // below.
1624 sp<DisplayDevice> hw(getDisplayDevice(display));
1625 if (hw != NULL)
1626 hw->disconnect(getHwComposer());
1627 mDisplays.removeItem(display);
1628 mDrawingState.displays.removeItemsAt(i);
1629 dc--; i--;
1630 // at this point we must loop to the next item
1631 continue;
1632 }
1633
1634 const sp<DisplayDevice> disp(getDisplayDevice(display));
1635 if (disp != NULL) {
1636 if (state.layerStack != draw[i].layerStack) {
1637 disp->setLayerStack(state.layerStack);
1638 }
1639 if ((state.orientation != draw[i].orientation)
1640 || (state.viewport != draw[i].viewport)
1641 || (state.frame != draw[i].frame))
1642 {
1643 disp->setProjection(state.orientation,
1644 state.viewport, state.frame);
1645 }
1646 if (state.width != draw[i].width || state.height != draw[i].height) {
1647 disp->setDisplaySize(state.width, state.height);
1648 }
1649 }
1650 }
1651 }
1652
1653 // find displays that were added
1654 // (ie: in current state but not in drawing state)
1655 for (size_t i=0 ; i<cc ; i++) {
1656 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1657 const DisplayDeviceState& state(curr[i]);
1658
1659 sp<DisplaySurface> dispSurface;
1660 sp<IGraphicBufferProducer> producer;
1661 sp<IGraphicBufferProducer> bqProducer;
1662 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian1da94df2017-02-27 18:17:44 -08001663 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001664
1665 int32_t hwcDisplayId = -1;
1666 if (state.isVirtualDisplay()) {
1667 // Virtual displays without a surface are dormant:
1668 // they have external state (layer stack, projection,
1669 // etc.) but no internal state (i.e. a DisplayDevice).
1670 if (state.surface != NULL) {
1671
1672 int width = 0;
1673 int status = state.surface->query(
1674 NATIVE_WINDOW_WIDTH, &width);
1675 ALOGE_IF(status != NO_ERROR,
1676 "Unable to query width (%d)", status);
1677 int height = 0;
1678 status = state.surface->query(
1679 NATIVE_WINDOW_HEIGHT, &height);
1680 ALOGE_IF(status != NO_ERROR,
1681 "Unable to query height (%d)", status);
1682 if (mUseHwcVirtualDisplays &&
1683 (MAX_VIRTUAL_DISPLAY_DIMENSION == 0 ||
1684 (width <= MAX_VIRTUAL_DISPLAY_DIMENSION &&
1685 height <= MAX_VIRTUAL_DISPLAY_DIMENSION))) {
1686 hwcDisplayId = allocateHwcDisplayId(state.type);
1687 }
1688
1689 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1690 *mHwc, hwcDisplayId, state.surface,
1691 bqProducer, bqConsumer, state.displayName);
1692
1693 dispSurface = vds;
1694 producer = vds;
1695 }
1696 } else {
1697 ALOGE_IF(state.surface!=NULL,
1698 "adding a supported display, but rendering "
1699 "surface is provided (%p), ignoring it",
1700 state.surface.get());
1701 hwcDisplayId = allocateHwcDisplayId(state.type);
1702 // for supported (by hwc) displays we provide our
1703 // own rendering surface
1704 dispSurface = new FramebufferSurface(*mHwc, state.type,
1705 bqConsumer);
1706 producer = bqProducer;
1707 }
1708
1709 const wp<IBinder>& display(curr.keyAt(i));
1710 if (dispSurface != NULL) {
1711 sp<DisplayDevice> hw = new DisplayDevice(this,
1712 state.type, hwcDisplayId,
1713 mHwc->getFormat(hwcDisplayId), state.isSecure,
1714 display, dispSurface, producer,
1715 mRenderEngine->getEGLConfig());
1716 hw->setLayerStack(state.layerStack);
1717 hw->setProjection(state.orientation,
1718 state.viewport, state.frame);
1719 hw->setDisplayName(state.displayName);
1720 mDisplays.add(display, hw);
1721 if (state.isVirtualDisplay()) {
1722 if (hwcDisplayId >= 0) {
1723 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1724 hw->getWidth(), hw->getHeight(),
1725 hw->getFormat());
1726 }
1727 } else {
1728 mEventThread->onHotplugReceived(state.type, true);
1729 }
1730 }
1731 }
1732 }
1733 }
1734 }
1735
1736 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1737 // The transform hint might have changed for some layers
1738 // (either because a display has changed, or because a layer
1739 // as changed).
1740 //
1741 // Walk through all the layers in currentLayers,
1742 // and update their transform hint.
1743 //
1744 // If a layer is visible only on a single display, then that
1745 // display is used to calculate the hint, otherwise we use the
1746 // default display.
1747 //
1748 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1749 // the hint is set before we acquire a buffer from the surface texture.
1750 //
1751 // NOTE: layer transactions have taken place already, so we use their
1752 // drawing state. However, SurfaceFlinger's own transaction has not
1753 // happened yet, so we must use the current state layer list
1754 // (soon to become the drawing state list).
1755 //
1756 sp<const DisplayDevice> disp;
1757 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001758 bool first = true;
1759 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001760 // NOTE: we rely on the fact that layers are sorted by
1761 // layerStack first (so we don't have to traverse the list
1762 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001763 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001764 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001765 currentlayerStack = layerStack;
1766 // figure out if this layerstack is mirrored
1767 // (more than one display) if so, pick the default display,
1768 // if not, pick the only display it's on.
1769 disp.clear();
1770 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1771 sp<const DisplayDevice> hw(mDisplays[dpy]);
1772 if (hw->getLayerStack() == currentlayerStack) {
1773 if (disp == NULL) {
1774 disp = hw;
1775 } else {
1776 disp = NULL;
1777 break;
1778 }
1779 }
1780 }
1781 }
1782 if (disp == NULL) {
1783 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1784 // redraw after transform hint changes. See bug 8508397.
1785
1786 // could be null when this layer is using a layerStack
1787 // that is not visible on any display. Also can occur at
1788 // screen off/on times.
1789 disp = getDefaultDisplayDevice();
1790 }
1791 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001792
1793 first = false;
1794 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001795 }
1796
1797
1798 /*
1799 * Perform our own transaction if needed
1800 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001801
1802 if (mLayersAdded) {
1803 mLayersAdded = false;
1804 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001805 mVisibleRegionsDirty = true;
1806 }
1807
1808 // some layers might have been removed, so
1809 // we need to update the regions they're exposing.
1810 if (mLayersRemoved) {
1811 mLayersRemoved = false;
1812 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001813 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001814 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001815 // this layer is not visible anymore
1816 // TODO: we could traverse the tree from front to back and
1817 // compute the actual visible region
1818 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001819 Region visibleReg;
1820 visibleReg.set(layer->computeScreenBounds());
1821 invalidateLayerStack(layer->getLayerStack(), visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001822 }
Robert Carr2047fae2016-11-28 14:09:09 -08001823 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001824 }
1825
1826 commitTransaction();
1827
1828 updateCursorAsync();
1829}
1830
1831void SurfaceFlinger::updateCursorAsync()
1832{
1833 HWComposer& hwc(getHwComposer());
1834 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1835 sp<const DisplayDevice> hw(mDisplays[dpy]);
1836 const int32_t id = hw->getHwcDisplayId();
1837 if (id < 0) {
1838 continue;
1839 }
1840 const Vector< sp<Layer> >& currentLayers(
1841 hw->getVisibleLayersSortedByZ());
1842 const size_t count = currentLayers.size();
1843 HWComposer::LayerListIterator cur = hwc.begin(id);
1844 const HWComposer::LayerListIterator end = hwc.end(id);
1845 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1846 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1847 continue;
1848 }
1849 const sp<Layer>& layer(currentLayers[i]);
1850 Rect cursorPos = layer->getPosition(hw);
1851 hwc.setCursorPositionAsync(id, cursorPos);
1852 break;
1853 }
1854 }
1855}
1856
1857void SurfaceFlinger::commitTransaction()
1858{
1859 if (!mLayersPendingRemoval.isEmpty()) {
1860 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001861 for (const auto& l : mLayersPendingRemoval) {
1862 recordBufferingStats(l->getName().string(),
1863 l->getOccupancyHistory(true));
1864 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001865 }
1866 mLayersPendingRemoval.clear();
1867 }
1868
1869 // If this transaction is part of a window animation then the next frame
1870 // we composite should be considered an animation as well.
1871 mAnimCompositionPending = mAnimTransactionPending;
1872
1873 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001874 mDrawingState.traverseInZOrder([](Layer* layer) {
1875 layer->commitChildList();
1876 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001877 mTransactionPending = false;
1878 mAnimTransactionPending = false;
1879 mTransactionCV.broadcast();
1880}
1881
Robert Carr2047fae2016-11-28 14:09:09 -08001882void SurfaceFlinger::computeVisibleRegions(uint32_t layerStack,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001883 Region& outDirtyRegion, Region& outOpaqueRegion)
1884{
1885 ATRACE_CALL();
1886
1887 Region aboveOpaqueLayers;
1888 Region aboveCoveredLayers;
1889 Region dirty;
1890
1891 outDirtyRegion.clear();
1892
Robert Carr2047fae2016-11-28 14:09:09 -08001893 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001894 // start with the whole surface at its current location
1895 const Layer::State& s(layer->getDrawingState());
1896
1897 // only consider the layers on the given layer stack
Robert Carr1f0a16a2016-10-24 16:27:39 -07001898 if (layer->getLayerStack() != layerStack)
Robert Carr2047fae2016-11-28 14:09:09 -08001899 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001900
1901 /*
1902 * opaqueRegion: area of a surface that is fully opaque.
1903 */
1904 Region opaqueRegion;
1905
1906 /*
1907 * visibleRegion: area of a surface that is visible on screen
1908 * and not fully transparent. This is essentially the layer's
1909 * footprint minus the opaque regions above it.
1910 * Areas covered by a translucent surface are considered visible.
1911 */
1912 Region visibleRegion;
1913
1914 /*
1915 * coveredRegion: area of a surface that is covered by all
1916 * visible regions above it (which includes the translucent areas).
1917 */
1918 Region coveredRegion;
1919
1920 /*
1921 * transparentRegion: area of a surface that is hinted to be completely
1922 * transparent. This is only used to tell when the layer has no visible
1923 * non-transparent regions and can be removed from the layer list. It
1924 * does not affect the visibleRegion of this layer or any layers
1925 * beneath it. The hint may not be correct if apps don't respect the
1926 * SurfaceView restrictions (which, sadly, some don't).
1927 */
1928 Region transparentRegion;
1929
1930
1931 // handle hidden surfaces by setting the visible region to empty
1932 if (CC_LIKELY(layer->isVisible())) {
1933 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001934 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001935 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001936 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001937 if (!visibleRegion.isEmpty()) {
1938 // Remove the transparent area from the visible region
1939 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001940 if (tr.preserveRects()) {
1941 // transform the transparent region
1942 transparentRegion = tr.transform(s.activeTransparentRegion);
1943 } else {
1944 // transformation too complex, can't do the
1945 // transparent region optimization.
1946 transparentRegion.clear();
1947 }
1948 }
1949
1950 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001951 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001952 if (s.alpha==255 && !translucent &&
1953 ((layerOrientation & Transform::ROT_INVALID) == false)) {
1954 // the opaque region is the layer's footprint
1955 opaqueRegion = visibleRegion;
1956 }
1957 }
1958 }
1959
1960 // Clip the covered region to the visible region
1961 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
1962
1963 // Update aboveCoveredLayers for next (lower) layer
1964 aboveCoveredLayers.orSelf(visibleRegion);
1965
1966 // subtract the opaque region covered by the layers above us
1967 visibleRegion.subtractSelf(aboveOpaqueLayers);
1968
1969 // compute this layer's dirty region
1970 if (layer->contentDirty) {
1971 // we need to invalidate the whole region
1972 dirty = visibleRegion;
1973 // as well, as the old visible region
1974 dirty.orSelf(layer->visibleRegion);
1975 layer->contentDirty = false;
1976 } else {
1977 /* compute the exposed region:
1978 * the exposed region consists of two components:
1979 * 1) what's VISIBLE now and was COVERED before
1980 * 2) what's EXPOSED now less what was EXPOSED before
1981 *
1982 * note that (1) is conservative, we start with the whole
1983 * visible region but only keep what used to be covered by
1984 * something -- which mean it may have been exposed.
1985 *
1986 * (2) handles areas that were not covered by anything but got
1987 * exposed because of a resize.
1988 */
1989 const Region newExposed = visibleRegion - coveredRegion;
1990 const Region oldVisibleRegion = layer->visibleRegion;
1991 const Region oldCoveredRegion = layer->coveredRegion;
1992 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
1993 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
1994 }
1995 dirty.subtractSelf(aboveOpaqueLayers);
1996
1997 // accumulate to the screen dirty region
1998 outDirtyRegion.orSelf(dirty);
1999
2000 // Update aboveOpaqueLayers for next (lower) layer
2001 aboveOpaqueLayers.orSelf(opaqueRegion);
2002
2003 // Store the visible region in screen space
2004 layer->setVisibleRegion(visibleRegion);
2005 layer->setCoveredRegion(coveredRegion);
2006 layer->setVisibleNonTransparentRegion(
2007 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002008 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002009
2010 outOpaqueRegion = aboveOpaqueLayers;
2011}
2012
2013void SurfaceFlinger::invalidateLayerStack(uint32_t layerStack,
2014 const Region& dirty) {
2015 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2016 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2017 if (hw->getLayerStack() == layerStack) {
2018 hw->dirtyRegion.orSelf(dirty);
2019 }
2020 }
2021}
2022
2023bool SurfaceFlinger::handlePageFlip()
2024{
Brian Andersond6927fb2016-07-23 23:37:30 -07002025 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002026 Region dirtyRegion;
2027
2028 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002029 bool frameQueued = false;
2030
2031 // Store the set of layers that need updates. This set must not change as
2032 // buffers are being latched, as this could result in a deadlock.
2033 // Example: Two producers share the same command stream and:
2034 // 1.) Layer 0 is latched
2035 // 2.) Layer 0 gets a new frame
2036 // 2.) Layer 1 gets a new frame
2037 // 3.) Layer 1 is latched.
2038 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2039 // second frame. But layer 0's second frame could be waiting on display.
2040 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002041 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002042 if (layer->hasQueuedFrame()) {
2043 frameQueued = true;
2044 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002045 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002046 } else {
2047 layer->useEmptyDamage();
2048 }
2049 } else {
2050 layer->useEmptyDamage();
2051 }
Robert Carr2047fae2016-11-28 14:09:09 -08002052 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002053 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2054 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002055 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002056 layer->useSurfaceDamage();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002057 invalidateLayerStack(layer->getLayerStack(), dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002058 }
2059
2060 mVisibleRegionsDirty |= visibleRegions;
2061
2062 // If we will need to wake up at some time in the future to deal with a
2063 // queued frame that shouldn't be displayed during this vsync period, wake
2064 // up during the next vsync period to check again.
2065 if (frameQueued && layersWithQueuedFrames.empty()) {
2066 signalLayerUpdate();
2067 }
2068
2069 // Only continue with the refresh if there is actually new work to do
2070 return !layersWithQueuedFrames.empty();
2071}
2072
2073void SurfaceFlinger::invalidateHwcGeometry()
2074{
2075 mHwWorkListDirty = true;
2076}
2077
2078
2079void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2080 const Region& inDirtyRegion)
2081{
2082 // We only need to actually compose the display if:
2083 // 1) It is being handled by hardware composer, which may need this to
2084 // keep its virtual display state machine in sync, or
2085 // 2) There is work to be done (the dirty region isn't empty)
2086 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2087 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2088 return;
2089 }
2090
2091 Region dirtyRegion(inDirtyRegion);
2092
2093 // compute the invalid region
2094 hw->swapRegion.orSelf(dirtyRegion);
2095
2096 uint32_t flags = hw->getFlags();
2097 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2098 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2099 // takes a rectangle, we must make sure to update that whole
2100 // rectangle in that case
2101 dirtyRegion.set(hw->swapRegion.bounds());
2102 } else {
2103 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2104 // We need to redraw the rectangle that will be updated
2105 // (pushed to the framebuffer).
2106 // This is needed because PARTIAL_UPDATES only takes one
2107 // rectangle instead of a region (see DisplayDevice::flip())
2108 dirtyRegion.set(hw->swapRegion.bounds());
2109 } else {
2110 // we need to redraw everything (the whole screen)
2111 dirtyRegion.set(hw->bounds());
2112 hw->swapRegion = dirtyRegion;
2113 }
2114 }
2115
2116 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2117 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2118 } else {
2119 RenderEngine& engine(getRenderEngine());
2120 mat4 colorMatrix = mColorMatrix;
2121 if (mDaltonize) {
2122 colorMatrix = colorMatrix * mDaltonizer();
2123 }
2124 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2125 doComposeSurfaces(hw, dirtyRegion);
2126 engine.setupColorTransform(oldMatrix);
2127 }
2128
2129 // update the swap region and clear the dirty region
2130 hw->swapRegion.orSelf(dirtyRegion);
2131
2132 // swap buffers (presentation)
2133 hw->swapBuffers(getHwComposer());
2134}
2135
2136bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2137{
2138 RenderEngine& engine(getRenderEngine());
2139 const int32_t id = hw->getHwcDisplayId();
2140 HWComposer& hwc(getHwComposer());
2141 HWComposer::LayerListIterator cur = hwc.begin(id);
2142 const HWComposer::LayerListIterator end = hwc.end(id);
2143
2144 bool hasGlesComposition = hwc.hasGlesComposition(id);
2145 if (hasGlesComposition) {
2146 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2147 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2148 hw->getDisplayName().string());
2149 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2150 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2151 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2152 }
2153 return false;
2154 }
2155
2156 // Never touch the framebuffer if we don't have any framebuffer layers
2157 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2158 if (hasHwcComposition) {
2159 // when using overlays, we assume a fully transparent framebuffer
2160 // NOTE: we could reduce how much we need to clear, for instance
2161 // remove where there are opaque FB layers. however, on some
2162 // GPUs doing a "clean slate" clear might be more efficient.
2163 // We'll revisit later if needed.
2164 engine.clearWithColor(0, 0, 0, 0);
2165 } else {
2166 // we start with the whole screen area
2167 const Region bounds(hw->getBounds());
2168
2169 // we remove the scissor part
2170 // we're left with the letterbox region
2171 // (common case is that letterbox ends-up being empty)
2172 const Region letterbox(bounds.subtract(hw->getScissor()));
2173
2174 // compute the area to clear
2175 Region region(hw->undefinedRegion.merge(letterbox));
2176
2177 // but limit it to the dirty region
2178 region.andSelf(dirty);
2179
2180 // screen is already cleared here
2181 if (!region.isEmpty()) {
2182 // can happen with SurfaceView
2183 drawWormhole(hw, region);
2184 }
2185 }
2186
2187 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2188 // just to be on the safe side, we don't set the
2189 // scissor on the main display. It should never be needed
2190 // anyways (though in theory it could since the API allows it).
2191 const Rect& bounds(hw->getBounds());
2192 const Rect& scissor(hw->getScissor());
2193 if (scissor != bounds) {
2194 // scissor doesn't match the screen's dimensions, so we
2195 // need to clear everything outside of it and enable
2196 // the GL scissor so we don't draw anything where we shouldn't
2197
2198 // enable scissor for this frame
2199 const uint32_t height = hw->getHeight();
2200 engine.setScissor(scissor.left, height - scissor.bottom,
2201 scissor.getWidth(), scissor.getHeight());
2202 }
2203 }
2204 }
2205
2206 /*
2207 * and then, render the layers targeted at the framebuffer
2208 */
2209
2210 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2211 const size_t count = layers.size();
2212 const Transform& tr = hw->getTransform();
2213 if (cur != end) {
2214 // we're using h/w composer
2215 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2216 const sp<Layer>& layer(layers[i]);
2217 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2218 if (!clip.isEmpty()) {
2219 switch (cur->getCompositionType()) {
2220 case HWC_CURSOR_OVERLAY:
2221 case HWC_OVERLAY: {
2222 const Layer::State& state(layer->getDrawingState());
2223 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2224 && i
2225 && layer->isOpaque(state) && (state.alpha == 0xFF)
2226 && hasGlesComposition) {
2227 // never clear the very first layer since we're
2228 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002229 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002230 }
2231 break;
2232 }
2233 case HWC_FRAMEBUFFER: {
2234 layer->draw(hw, clip);
2235 break;
2236 }
2237 case HWC_FRAMEBUFFER_TARGET: {
2238 // this should not happen as the iterator shouldn't
2239 // let us get there.
2240 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2241 break;
2242 }
2243 }
2244 }
2245 layer->setAcquireFence(hw, *cur);
2246 }
2247 } else {
2248 // we're not using h/w composer
2249 for (size_t i=0 ; i<count ; ++i) {
2250 const sp<Layer>& layer(layers[i]);
2251 const Region clip(dirty.intersect(
2252 tr.transform(layer->visibleRegion)));
2253 if (!clip.isEmpty()) {
2254 layer->draw(hw, clip);
2255 }
2256 }
2257 }
2258
2259 // disable scissor at the end of the frame
2260 engine.disableScissor();
2261 return true;
2262}
2263
2264void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2265 const int32_t height = hw->getHeight();
2266 RenderEngine& engine(getRenderEngine());
2267 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2268}
2269
2270status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2271 const sp<IBinder>& handle,
2272 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002273 const sp<Layer>& lbc,
2274 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002275{
2276 // add this layer to the current state list
2277 {
2278 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002279 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002280 return NO_MEMORY;
2281 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002282 if (parent == nullptr) {
2283 mCurrentState.layersSortedByZ.add(lbc);
2284 } else {
2285 parent->addChild(lbc);
2286 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002287 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002288 mLayersAdded = true;
2289 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002290 }
2291
2292 // attach this layer to the client
2293 client->attachLayer(handle, lbc);
2294
2295 return NO_ERROR;
2296}
2297
Robert Carr9524cb32017-02-13 11:32:32 -08002298status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002299 Mutex::Autolock _l(mStateLock);
2300
Robert Carr1f0a16a2016-10-24 16:27:39 -07002301 const auto& p = layer->getParent();
2302 const ssize_t index = (p != nullptr) ? p->removeChild(layer) :
2303 mCurrentState.layersSortedByZ.remove(layer);
2304
Robert Carr136e2f62017-02-08 17:54:29 -08002305 // As a matter of normal operation, the LayerCleaner will produce a second
2306 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2307 // so we will succeed in promoting it, but it's already been removed
2308 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2309 // otherwise something has gone wrong and we are leaking the layer.
2310 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002311 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2312 layer->getName().string(),
2313 (p != nullptr) ? p->getName().string() : "no-parent");
2314 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002315 } else if (index < 0) {
2316 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002317 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002318
2319 mLayersPendingRemoval.add(layer);
2320 mLayersRemoved = true;
2321 mNumLayers--;
2322 setTransactionFlags(eTransactionNeeded);
2323 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002324}
2325
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002326uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002327 return android_atomic_release_load(&mTransactionFlags);
2328}
2329
2330uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2331 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2332}
2333
2334uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2335 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2336 if ((old & flags)==0) { // wake the server up
2337 signalTransaction();
2338 }
2339 return old;
2340}
2341
2342void SurfaceFlinger::setTransactionState(
2343 const Vector<ComposerState>& state,
2344 const Vector<DisplayState>& displays,
2345 uint32_t flags)
2346{
2347 ATRACE_CALL();
2348 Mutex::Autolock _l(mStateLock);
2349 uint32_t transactionFlags = 0;
2350
2351 if (flags & eAnimation) {
2352 // For window updates that are part of an animation we must wait for
2353 // previous animation "frames" to be handled.
2354 while (mAnimTransactionPending) {
2355 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2356 if (CC_UNLIKELY(err != NO_ERROR)) {
2357 // just in case something goes wrong in SF, return to the
2358 // caller after a few seconds.
2359 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2360 "waiting for previous animation frame");
2361 mAnimTransactionPending = false;
2362 break;
2363 }
2364 }
2365 }
2366
2367 size_t count = displays.size();
2368 for (size_t i=0 ; i<count ; i++) {
2369 const DisplayState& s(displays[i]);
2370 transactionFlags |= setDisplayStateLocked(s);
2371 }
2372
2373 count = state.size();
2374 for (size_t i=0 ; i<count ; i++) {
2375 const ComposerState& s(state[i]);
2376 // Here we need to check that the interface we're given is indeed
2377 // one of our own. A malicious client could give us a NULL
2378 // IInterface, or one of its own or even one of our own but a
2379 // different type. All these situations would cause us to crash.
2380 //
2381 // NOTE: it would be better to use RTTI as we could directly check
2382 // that we have a Client*. however, RTTI is disabled in Android.
2383 if (s.client != NULL) {
2384 sp<IBinder> binder = IInterface::asBinder(s.client);
2385 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002386 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002387 sp<Client> client( static_cast<Client *>(s.client.get()) );
2388 transactionFlags |= setClientStateLocked(client, s.state);
2389 }
2390 }
2391 }
2392 }
2393
2394 // If a synchronous transaction is explicitly requested without any changes,
2395 // force a transaction anyway. This can be used as a flush mechanism for
2396 // previous async transactions.
2397 if (transactionFlags == 0 && (flags & eSynchronous)) {
2398 transactionFlags = eTransactionNeeded;
2399 }
2400
2401 if (transactionFlags) {
2402 if (mInterceptor.isEnabled()) {
2403 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2404 }
2405
2406 // this triggers the transaction
2407 setTransactionFlags(transactionFlags);
2408
2409 // if this is a synchronous transaction, wait for it to take effect
2410 // before returning.
2411 if (flags & eSynchronous) {
2412 mTransactionPending = true;
2413 }
2414 if (flags & eAnimation) {
2415 mAnimTransactionPending = true;
2416 }
2417 while (mTransactionPending) {
2418 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2419 if (CC_UNLIKELY(err != NO_ERROR)) {
2420 // just in case something goes wrong in SF, return to the
2421 // called after a few seconds.
2422 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2423 mTransactionPending = false;
2424 break;
2425 }
2426 }
2427 }
2428}
2429
2430uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2431{
2432 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2433 if (dpyIdx < 0)
2434 return 0;
2435
2436 uint32_t flags = 0;
2437 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2438 if (disp.isValid()) {
2439 const uint32_t what = s.what;
2440 if (what & DisplayState::eSurfaceChanged) {
2441 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2442 disp.surface = s.surface;
2443 flags |= eDisplayTransactionNeeded;
2444 }
2445 }
2446 if (what & DisplayState::eLayerStackChanged) {
2447 if (disp.layerStack != s.layerStack) {
2448 disp.layerStack = s.layerStack;
2449 flags |= eDisplayTransactionNeeded;
2450 }
2451 }
2452 if (what & DisplayState::eDisplayProjectionChanged) {
2453 if (disp.orientation != s.orientation) {
2454 disp.orientation = s.orientation;
2455 flags |= eDisplayTransactionNeeded;
2456 }
2457 if (disp.frame != s.frame) {
2458 disp.frame = s.frame;
2459 flags |= eDisplayTransactionNeeded;
2460 }
2461 if (disp.viewport != s.viewport) {
2462 disp.viewport = s.viewport;
2463 flags |= eDisplayTransactionNeeded;
2464 }
2465 }
2466 if (what & DisplayState::eDisplaySizeChanged) {
2467 if (disp.width != s.width) {
2468 disp.width = s.width;
2469 flags |= eDisplayTransactionNeeded;
2470 }
2471 if (disp.height != s.height) {
2472 disp.height = s.height;
2473 flags |= eDisplayTransactionNeeded;
2474 }
2475 }
2476 }
2477 return flags;
2478}
2479
2480uint32_t SurfaceFlinger::setClientStateLocked(
2481 const sp<Client>& client,
2482 const layer_state_t& s)
2483{
2484 uint32_t flags = 0;
2485 sp<Layer> layer(client->getLayerUser(s.surface));
2486 if (layer != 0) {
2487 const uint32_t what = s.what;
2488 bool geometryAppliesWithResize =
2489 what & layer_state_t::eGeometryAppliesWithResize;
2490 if (what & layer_state_t::ePositionChanged) {
2491 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2492 flags |= eTraversalNeeded;
2493 }
2494 }
2495 if (what & layer_state_t::eLayerChanged) {
2496 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002497 const auto& p = layer->getParent();
2498 if (p == nullptr) {
2499 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2500 if (layer->setLayer(s.z) && idx >= 0) {
2501 mCurrentState.layersSortedByZ.removeAt(idx);
2502 mCurrentState.layersSortedByZ.add(layer);
2503 // we need traversal (state changed)
2504 // AND transaction (list changed)
2505 flags |= eTransactionNeeded|eTraversalNeeded;
2506 }
2507 } else {
2508 if (p->setChildLayer(layer, s.z)) {
2509 flags |= eTransactionNeeded|eTraversalNeeded;
2510 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002511 }
2512 }
2513 if (what & layer_state_t::eSizeChanged) {
2514 if (layer->setSize(s.w, s.h)) {
2515 flags |= eTraversalNeeded;
2516 }
2517 }
2518 if (what & layer_state_t::eAlphaChanged) {
2519 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2520 flags |= eTraversalNeeded;
2521 }
2522 if (what & layer_state_t::eMatrixChanged) {
2523 if (layer->setMatrix(s.matrix))
2524 flags |= eTraversalNeeded;
2525 }
2526 if (what & layer_state_t::eTransparentRegionChanged) {
2527 if (layer->setTransparentRegionHint(s.transparentRegion))
2528 flags |= eTraversalNeeded;
2529 }
2530 if (what & layer_state_t::eFlagsChanged) {
2531 if (layer->setFlags(s.flags, s.mask))
2532 flags |= eTraversalNeeded;
2533 }
2534 if (what & layer_state_t::eCropChanged) {
2535 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2536 flags |= eTraversalNeeded;
2537 }
2538 if (what & layer_state_t::eFinalCropChanged) {
2539 if (layer->setFinalCrop(s.finalCrop))
2540 flags |= eTraversalNeeded;
2541 }
2542 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002543 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002544 // We only allow setting layer stacks for top level layers,
2545 // everything else inherits layer stack from its parent.
2546 if (layer->hasParent()) {
2547 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2548 layer->getName().string());
2549 } else if (idx < 0) {
2550 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2551 "that also does not appear in the top level layer list. Something"
2552 " has gone wrong.", layer->getName().string());
2553 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002554 mCurrentState.layersSortedByZ.removeAt(idx);
2555 mCurrentState.layersSortedByZ.add(layer);
2556 // we need traversal (state changed)
2557 // AND transaction (list changed)
2558 flags |= eTransactionNeeded|eTraversalNeeded;
2559 }
2560 }
2561 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002562 if (s.barrierHandle != nullptr) {
2563 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2564 } else if (s.barrierGbp != nullptr) {
2565 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2566 if (authenticateSurfaceTextureLocked(gbp)) {
2567 const auto& otherLayer =
2568 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2569 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2570 } else {
2571 ALOGE("Attempt to defer transaction to to an"
2572 " unrecognized GraphicBufferProducer");
2573 }
2574 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002575 // We don't trigger a traversal here because if no other state is
2576 // changed, we don't want this to cause any more work
2577 }
Robert Carr1db73f62016-12-21 12:58:51 -08002578 if (what & layer_state_t::eReparentChildren) {
2579 if (layer->reparentChildren(s.reparentHandle)) {
2580 flags |= eTransactionNeeded|eTraversalNeeded;
2581 }
2582 }
Robert Carr9524cb32017-02-13 11:32:32 -08002583 if (what & layer_state_t::eDetachChildren) {
2584 layer->detachChildren();
2585 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002586 if (what & layer_state_t::eOverrideScalingModeChanged) {
2587 layer->setOverrideScalingMode(s.overrideScalingMode);
2588 // We don't trigger a traversal here because if no other state is
2589 // changed, we don't want this to cause any more work
2590 }
2591 }
2592 return flags;
2593}
2594
2595status_t SurfaceFlinger::createLayer(
2596 const String8& name,
2597 const sp<Client>& client,
2598 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002599 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2600 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002601{
2602 if (int32_t(w|h) < 0) {
2603 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2604 int(w), int(h));
2605 return BAD_VALUE;
2606 }
2607
2608 status_t result = NO_ERROR;
2609
2610 sp<Layer> layer;
2611
2612 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2613 case ISurfaceComposerClient::eFXSurfaceNormal:
2614 result = createNormalLayer(client,
2615 name, w, h, flags, format,
2616 handle, gbp, &layer);
2617 break;
2618 case ISurfaceComposerClient::eFXSurfaceDim:
2619 result = createDimLayer(client,
2620 name, w, h, flags,
2621 handle, gbp, &layer);
2622 break;
2623 default:
2624 result = BAD_VALUE;
2625 break;
2626 }
2627
2628 if (result != NO_ERROR) {
2629 return result;
2630 }
2631
Albert Chaulk479c60c2017-01-27 14:21:34 -05002632 layer->setInfo(windowType, ownerUid);
2633
Robert Carr1f0a16a2016-10-24 16:27:39 -07002634 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002635 if (result != NO_ERROR) {
2636 return result;
2637 }
2638 mInterceptor.saveSurfaceCreation(layer);
2639
2640 setTransactionFlags(eTransactionNeeded);
2641 return result;
2642}
2643
2644status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2645 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2646 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2647{
2648 // initialize the surfaces
2649 switch (format) {
2650 case PIXEL_FORMAT_TRANSPARENT:
2651 case PIXEL_FORMAT_TRANSLUCENT:
2652 format = PIXEL_FORMAT_RGBA_8888;
2653 break;
2654 case PIXEL_FORMAT_OPAQUE:
2655 format = PIXEL_FORMAT_RGBX_8888;
2656 break;
2657 }
2658
2659 *outLayer = new Layer(this, client, name, w, h, flags);
2660 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2661 if (err == NO_ERROR) {
2662 *handle = (*outLayer)->getHandle();
2663 *gbp = (*outLayer)->getProducer();
2664 }
2665
2666 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2667 return err;
2668}
2669
2670status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2671 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2672 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2673{
2674 *outLayer = new LayerDim(this, client, name, w, h, flags);
2675 *handle = (*outLayer)->getHandle();
2676 *gbp = (*outLayer)->getProducer();
2677 return NO_ERROR;
2678}
2679
2680status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2681{
Robert Carr9524cb32017-02-13 11:32:32 -08002682 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002683 status_t err = NO_ERROR;
2684 sp<Layer> l(client->getLayerUser(handle));
2685 if (l != NULL) {
2686 mInterceptor.saveSurfaceDeletion(l);
2687 err = removeLayer(l);
2688 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2689 "error removing layer=%p (%s)", l.get(), strerror(-err));
2690 }
2691 return err;
2692}
2693
2694status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2695{
2696 // called by ~LayerCleaner() when all references to the IBinder (handle)
2697 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002698 sp<Layer> l = layer.promote();
2699 if (l == nullptr) {
2700 // The layer has already been removed, carry on
2701 return NO_ERROR;
2702 } if (l->getParent() != nullptr) {
2703 // If we have a parent, then we can continue to live as long as it does.
2704 return NO_ERROR;
2705 }
2706 return removeLayer(l);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002707}
2708
2709// ---------------------------------------------------------------------------
2710
2711void SurfaceFlinger::onInitializeDisplays() {
2712 // reset screen orientation and use primary layer stack
2713 Vector<ComposerState> state;
2714 Vector<DisplayState> displays;
2715 DisplayState d;
2716 d.what = DisplayState::eDisplayProjectionChanged |
2717 DisplayState::eLayerStackChanged;
2718 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2719 d.layerStack = 0;
2720 d.orientation = DisplayState::eOrientationDefault;
2721 d.frame.makeInvalid();
2722 d.viewport.makeInvalid();
2723 d.width = 0;
2724 d.height = 0;
2725 displays.add(d);
2726 setTransactionState(state, displays, 0);
2727 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2728
2729 const nsecs_t period =
2730 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2731 mAnimFrameTracker.setDisplayRefreshPeriod(period);
2732}
2733
2734void SurfaceFlinger::initializeDisplays() {
2735 class MessageScreenInitialized : public MessageBase {
2736 SurfaceFlinger* flinger;
2737 public:
2738 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2739 virtual bool handler() {
2740 flinger->onInitializeDisplays();
2741 return true;
2742 }
2743 };
2744 sp<MessageBase> msg = new MessageScreenInitialized(this);
2745 postMessageAsync(msg); // we may be called from main thread, use async message
2746}
2747
2748void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2749 int mode) {
2750 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2751 this);
2752 int32_t type = hw->getDisplayType();
2753 int currentMode = hw->getPowerMode();
2754
2755 if (mode == currentMode) {
2756 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2757 return;
2758 }
2759
2760 hw->setPowerMode(mode);
2761 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2762 ALOGW("Trying to set power mode for virtual display");
2763 return;
2764 }
2765
2766 if (mInterceptor.isEnabled()) {
2767 Mutex::Autolock _l(mStateLock);
2768 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2769 if (idx < 0) {
2770 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2771 return;
2772 }
2773 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2774 }
2775
2776 if (currentMode == HWC_POWER_MODE_OFF) {
2777 // Turn on the display
2778 getHwComposer().setPowerMode(type, mode);
2779 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2780 // FIXME: eventthread only knows about the main display right now
2781 mEventThread->onScreenAcquired();
2782 resyncToHardwareVsync(true);
2783 }
2784
2785 mVisibleRegionsDirty = true;
2786 mHasPoweredOff = true;
2787 repaintEverything();
2788
2789 struct sched_param param = {0};
2790 param.sched_priority = 1;
2791 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2792 ALOGW("Couldn't set SCHED_FIFO on display on");
2793 }
2794 } else if (mode == HWC_POWER_MODE_OFF) {
2795 // Turn off the display
2796 struct sched_param param = {0};
2797 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2798 ALOGW("Couldn't set SCHED_OTHER on display off");
2799 }
2800
2801 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2802 disableHardwareVsync(true); // also cancels any in-progress resync
2803
2804 // FIXME: eventthread only knows about the main display right now
2805 mEventThread->onScreenReleased();
2806 }
2807
2808 getHwComposer().setPowerMode(type, mode);
2809 mVisibleRegionsDirty = true;
2810 // from this point on, SF will stop drawing on this display
2811 } else {
2812 getHwComposer().setPowerMode(type, mode);
2813 }
2814}
2815
2816void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2817 class MessageSetPowerMode: public MessageBase {
2818 SurfaceFlinger& mFlinger;
2819 sp<IBinder> mDisplay;
2820 int mMode;
2821 public:
2822 MessageSetPowerMode(SurfaceFlinger& flinger,
2823 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2824 mDisplay(disp) { mMode = mode; }
2825 virtual bool handler() {
2826 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2827 if (hw == NULL) {
2828 ALOGE("Attempt to set power mode = %d for null display %p",
2829 mMode, mDisplay.get());
2830 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2831 ALOGW("Attempt to set power mode = %d for virtual display",
2832 mMode);
2833 } else {
2834 mFlinger.setPowerModeInternal(hw, mMode);
2835 }
2836 return true;
2837 }
2838 };
2839 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2840 postMessageSync(msg);
2841}
2842
2843// ---------------------------------------------------------------------------
2844
2845status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2846{
2847 String8 result;
2848
2849 IPCThreadState* ipc = IPCThreadState::self();
2850 const int pid = ipc->getCallingPid();
2851 const int uid = ipc->getCallingUid();
2852 if ((uid != AID_SHELL) &&
2853 !PermissionCache::checkPermission(sDump, pid, uid)) {
2854 result.appendFormat("Permission Denial: "
2855 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2856 } else {
2857 // Try to get the main lock, but give up after one second
2858 // (this would indicate SF is stuck, but we want to be able to
2859 // print something in dumpsys).
2860 status_t err = mStateLock.timedLock(s2ns(1));
2861 bool locked = (err == NO_ERROR);
2862 if (!locked) {
2863 result.appendFormat(
2864 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2865 "dumping anyways (no locks held)\n", strerror(-err), err);
2866 }
2867
2868 bool dumpAll = true;
2869 size_t index = 0;
2870 size_t numArgs = args.size();
2871 if (numArgs) {
2872 if ((index < numArgs) &&
2873 (args[index] == String16("--list"))) {
2874 index++;
2875 listLayersLocked(args, index, result);
2876 dumpAll = false;
2877 }
2878
2879 if ((index < numArgs) &&
2880 (args[index] == String16("--latency"))) {
2881 index++;
2882 dumpStatsLocked(args, index, result);
2883 dumpAll = false;
2884 }
2885
2886 if ((index < numArgs) &&
2887 (args[index] == String16("--latency-clear"))) {
2888 index++;
2889 clearStatsLocked(args, index, result);
2890 dumpAll = false;
2891 }
2892
2893 if ((index < numArgs) &&
2894 (args[index] == String16("--dispsync"))) {
2895 index++;
2896 mPrimaryDispSync.dump(result);
2897 dumpAll = false;
2898 }
2899
2900 if ((index < numArgs) &&
2901 (args[index] == String16("--static-screen"))) {
2902 index++;
2903 dumpStaticScreenStats(result);
2904 dumpAll = false;
2905 }
2906
2907 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07002908 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002909 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07002910 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002911 dumpAll = false;
2912 }
2913 }
2914
2915 if (dumpAll) {
2916 dumpAllLocked(args, index, result);
2917 }
2918
2919 if (locked) {
2920 mStateLock.unlock();
2921 }
2922 }
2923 write(fd, result.string(), result.size());
2924 return NO_ERROR;
2925}
2926
2927void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
2928 size_t& /* index */, String8& result) const
2929{
Robert Carr2047fae2016-11-28 14:09:09 -08002930 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002931 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08002932 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002933}
2934
2935void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
2936 String8& result) const
2937{
2938 String8 name;
2939 if (index < args.size()) {
2940 name = String8(args[index]);
2941 index++;
2942 }
2943
2944 const nsecs_t period =
2945 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2946 result.appendFormat("%" PRId64 "\n", period);
2947
2948 if (name.isEmpty()) {
2949 mAnimFrameTracker.dumpStats(result);
2950 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08002951 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002952 if (name == layer->getName()) {
2953 layer->dumpFrameStats(result);
2954 }
Robert Carr2047fae2016-11-28 14:09:09 -08002955 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002956 }
2957}
2958
2959void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
2960 String8& /* result */)
2961{
2962 String8 name;
2963 if (index < args.size()) {
2964 name = String8(args[index]);
2965 index++;
2966 }
2967
Robert Carr2047fae2016-11-28 14:09:09 -08002968 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002969 if (name.isEmpty() || (name == layer->getName())) {
2970 layer->clearFrameStats();
2971 }
Robert Carr2047fae2016-11-28 14:09:09 -08002972 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002973
2974 mAnimFrameTracker.clearStats();
2975}
2976
2977// This should only be called from the main thread. Otherwise it would need
2978// the lock and should use mCurrentState rather than mDrawingState.
2979void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08002980 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002981 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08002982 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002983
2984 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
2985}
2986
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002987void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002988{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002989 result.append(" [sf");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002990#ifdef HAS_CONTEXT_PRIORITY
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002991 result.append(" HAS_CONTEXT_PRIORITY");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002992#endif
2993#ifdef NEVER_DEFAULT_TO_ASYNC_MODE
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002994 result.append(" NEVER_DEFAULT_TO_ASYNC_MODE");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002995#endif
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08002996 if (isLayerTripleBufferingDisabled())
2997 result.append(" DISABLE_TRIPLE_BUFFERING");
2998 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002999}
3000
3001void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3002{
3003 result.appendFormat("Static screen stats:\n");
3004 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3005 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3006 float percent = 100.0f *
3007 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3008 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3009 b + 1, bucketTimeSec, percent);
3010 }
3011 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3012 float percent = 100.0f *
3013 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3014 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3015 NUM_BUCKETS - 1, bucketTimeSec, percent);
3016}
3017
Brian Andersond6927fb2016-07-23 23:37:30 -07003018void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3019 result.appendFormat("Layer frame timestamps:\n");
3020
3021 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3022 const size_t count = currentLayers.size();
3023 for (size_t i=0 ; i<count ; i++) {
3024 currentLayers[i]->dumpFrameEvents(result);
3025 }
3026}
3027
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003028void SurfaceFlinger::recordBufferingStats(const char* layerName,
3029 std::vector<OccupancyTracker::Segment>&& history) {
3030 Mutex::Autolock lock(mBufferingStatsMutex);
3031 auto& stats = mBufferingStats[layerName];
3032 for (const auto& segment : history) {
3033 if (!segment.usedThirdBuffer) {
3034 stats.twoBufferTime += segment.totalTime;
3035 }
3036 if (segment.occupancyAverage < 1.0f) {
3037 stats.doubleBufferedTime += segment.totalTime;
3038 } else if (segment.occupancyAverage < 2.0f) {
3039 stats.tripleBufferedTime += segment.totalTime;
3040 }
3041 ++stats.numSegments;
3042 stats.totalTime += segment.totalTime;
3043 }
3044}
3045
3046void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3047 result.append("Buffering stats:\n");
3048 result.append(" [Layer name] <Active time> <Two buffer> "
3049 "<Double buffered> <Triple buffered>\n");
3050 Mutex::Autolock lock(mBufferingStatsMutex);
3051 typedef std::tuple<std::string, float, float, float> BufferTuple;
3052 std::map<float, BufferTuple, std::greater<float>> sorted;
3053 for (const auto& statsPair : mBufferingStats) {
3054 const char* name = statsPair.first.c_str();
3055 const BufferingStats& stats = statsPair.second;
3056 if (stats.numSegments == 0) {
3057 continue;
3058 }
3059 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3060 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3061 stats.totalTime;
3062 float doubleBufferRatio = static_cast<float>(
3063 stats.doubleBufferedTime) / stats.totalTime;
3064 float tripleBufferRatio = static_cast<float>(
3065 stats.tripleBufferedTime) / stats.totalTime;
3066 sorted.insert({activeTime, {name, twoBufferRatio,
3067 doubleBufferRatio, tripleBufferRatio}});
3068 }
3069 for (const auto& sortedPair : sorted) {
3070 float activeTime = sortedPair.first;
3071 const BufferTuple& values = sortedPair.second;
3072 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3073 std::get<0>(values).c_str(), activeTime,
3074 std::get<1>(values), std::get<2>(values),
3075 std::get<3>(values));
3076 }
3077 result.append("\n");
3078}
3079
3080void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3081 String8& result) const
3082{
3083 bool colorize = false;
3084 if (index < args.size()
3085 && (args[index] == String16("--color"))) {
3086 colorize = true;
3087 index++;
3088 }
3089
3090 Colorizer colorizer(colorize);
3091
3092 // figure out if we're stuck somewhere
3093 const nsecs_t now = systemTime();
3094 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3095 const nsecs_t inTransaction(mDebugInTransaction);
3096 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3097 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3098
3099 /*
3100 * Dump library configuration.
3101 */
3102
3103 colorizer.bold(result);
3104 result.append("Build configuration:");
3105 colorizer.reset(result);
3106 appendSfConfigString(result);
3107 appendUiConfigString(result);
3108 appendGuiConfigString(result);
3109 result.append("\n");
3110
3111 colorizer.bold(result);
3112 result.append("Sync configuration: ");
3113 colorizer.reset(result);
3114 result.append(SyncFeatures::getInstance().toString());
3115 result.append("\n");
3116
3117 colorizer.bold(result);
3118 result.append("DispSync configuration: ");
3119 colorizer.reset(result);
3120 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
3121 "present offset %d ns (refresh %" PRId64 " ns)",
3122 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, PRESENT_TIME_OFFSET_FROM_VSYNC_NS,
3123 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3124 result.append("\n");
3125
3126 // Dump static screen stats
3127 result.append("\n");
3128 dumpStaticScreenStats(result);
3129 result.append("\n");
3130
3131 dumpBufferingStats(result);
3132
3133 /*
3134 * Dump the visible layer list
3135 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003136 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003137 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003138 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003139 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003140 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003141 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003142
3143 /*
3144 * Dump Display state
3145 */
3146
3147 colorizer.bold(result);
3148 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3149 colorizer.reset(result);
3150 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3151 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3152 hw->dump(result);
3153 }
3154
3155 /*
3156 * Dump SurfaceFlinger global state
3157 */
3158
3159 colorizer.bold(result);
3160 result.append("SurfaceFlinger global state:\n");
3161 colorizer.reset(result);
3162
3163 HWComposer& hwc(getHwComposer());
3164 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3165
3166 colorizer.bold(result);
3167 result.appendFormat("EGL implementation : %s\n",
3168 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3169 colorizer.reset(result);
3170 result.appendFormat("%s\n",
3171 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3172
3173 mRenderEngine->dump(result);
3174
3175 hw->undefinedRegion.dump(result, "undefinedRegion");
3176 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3177 hw->getOrientation(), hw->isDisplayOn());
3178 result.appendFormat(
3179 " last eglSwapBuffers() time: %f us\n"
3180 " last transaction time : %f us\n"
3181 " transaction-flags : %08x\n"
3182 " refresh-rate : %f fps\n"
3183 " x-dpi : %f\n"
3184 " y-dpi : %f\n"
3185 " gpu_to_cpu_unsupported : %d\n"
3186 ,
3187 mLastSwapBufferTime/1000.0,
3188 mLastTransactionTime/1000.0,
3189 mTransactionFlags,
3190 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3191 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3192 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3193 !mGpuToCpuSupported);
3194
3195 result.appendFormat(" eglSwapBuffers time: %f us\n",
3196 inSwapBuffersDuration/1000.0);
3197
3198 result.appendFormat(" transaction time: %f us\n",
3199 inTransactionDuration/1000.0);
3200
3201 /*
3202 * VSYNC state
3203 */
3204 mEventThread->dump(result);
3205
3206 /*
3207 * Dump HWComposer state
3208 */
3209 colorizer.bold(result);
3210 result.append("h/w composer state:\n");
3211 colorizer.reset(result);
3212 result.appendFormat(" h/w composer %s and %s\n",
3213 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3214 (mDebugDisableHWC || mDebugRegion || mDaltonize
3215 || mHasColorMatrix) ? "disabled" : "enabled");
3216 hwc.dump(result);
3217
3218 /*
3219 * Dump gralloc state
3220 */
3221 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3222 alloc.dump(result);
3223}
3224
3225const Vector< sp<Layer> >&
3226SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3227 // Note: mStateLock is held here
3228 wp<IBinder> dpy;
3229 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3230 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3231 dpy = mDisplays.keyAt(i);
3232 break;
3233 }
3234 }
3235 if (dpy == NULL) {
3236 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3237 // Just use the primary display so we have something to return
3238 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3239 }
3240 return getDisplayDevice(dpy)->getVisibleLayersSortedByZ();
3241}
3242
3243bool SurfaceFlinger::startDdmConnection()
3244{
3245 void* libddmconnection_dso =
3246 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3247 if (!libddmconnection_dso) {
3248 return false;
3249 }
3250 void (*DdmConnection_start)(const char* name);
3251 DdmConnection_start =
3252 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3253 if (!DdmConnection_start) {
3254 dlclose(libddmconnection_dso);
3255 return false;
3256 }
3257 (*DdmConnection_start)(getServiceName());
3258 return true;
3259}
3260
3261status_t SurfaceFlinger::onTransact(
3262 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3263{
3264 switch (code) {
3265 case CREATE_CONNECTION:
3266 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003267 case BOOT_FINISHED:
3268 case CLEAR_ANIMATION_FRAME_STATS:
3269 case GET_ANIMATION_FRAME_STATS:
3270 case SET_POWER_MODE:
3271 case GET_HDR_CAPABILITIES:
3272 {
3273 // codes that require permission check
3274 IPCThreadState* ipc = IPCThreadState::self();
3275 const int pid = ipc->getCallingPid();
3276 const int uid = ipc->getCallingUid();
3277 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3278 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3279 ALOGE("Permission Denial: "
3280 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3281 return PERMISSION_DENIED;
3282 }
3283 break;
3284 }
Robert Carr1db73f62016-12-21 12:58:51 -08003285 /*
3286 * Calling setTransactionState is safe, because you need to have been
3287 * granted a reference to Client* and Handle* to do anything with it.
3288 *
3289 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3290 */
3291 case SET_TRANSACTION_STATE:
3292 case CREATE_SCOPED_CONNECTION:
3293 {
3294 break;
3295 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003296 case CAPTURE_SCREEN:
3297 {
3298 // codes that require permission check
3299 IPCThreadState* ipc = IPCThreadState::self();
3300 const int pid = ipc->getCallingPid();
3301 const int uid = ipc->getCallingUid();
3302 if ((uid != AID_GRAPHICS) &&
3303 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3304 ALOGE("Permission Denial: "
3305 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3306 return PERMISSION_DENIED;
3307 }
3308 break;
3309 }
3310 }
3311
3312 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3313 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3314 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3315 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3316 IPCThreadState* ipc = IPCThreadState::self();
3317 const int pid = ipc->getCallingPid();
3318 const int uid = ipc->getCallingUid();
3319 ALOGE("Permission Denial: "
3320 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3321 return PERMISSION_DENIED;
3322 }
3323 int n;
3324 switch (code) {
3325 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3326 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3327 return NO_ERROR;
3328 case 1002: // SHOW_UPDATES
3329 n = data.readInt32();
3330 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3331 invalidateHwcGeometry();
3332 repaintEverything();
3333 return NO_ERROR;
3334 case 1004:{ // repaint everything
3335 repaintEverything();
3336 return NO_ERROR;
3337 }
3338 case 1005:{ // force transaction
3339 setTransactionFlags(
3340 eTransactionNeeded|
3341 eDisplayTransactionNeeded|
3342 eTraversalNeeded);
3343 return NO_ERROR;
3344 }
3345 case 1006:{ // send empty update
3346 signalRefresh();
3347 return NO_ERROR;
3348 }
3349 case 1008: // toggle use of hw composer
3350 n = data.readInt32();
3351 mDebugDisableHWC = n ? 1 : 0;
3352 invalidateHwcGeometry();
3353 repaintEverything();
3354 return NO_ERROR;
3355 case 1009: // toggle use of transform hint
3356 n = data.readInt32();
3357 mDebugDisableTransformHint = n ? 1 : 0;
3358 invalidateHwcGeometry();
3359 repaintEverything();
3360 return NO_ERROR;
3361 case 1010: // interrogate.
3362 reply->writeInt32(0);
3363 reply->writeInt32(0);
3364 reply->writeInt32(mDebugRegion);
3365 reply->writeInt32(0);
3366 reply->writeInt32(mDebugDisableHWC);
3367 return NO_ERROR;
3368 case 1013: {
3369 Mutex::Autolock _l(mStateLock);
3370 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3371 reply->writeInt32(hw->getPageFlipCount());
3372 return NO_ERROR;
3373 }
3374 case 1014: {
3375 // daltonize
3376 n = data.readInt32();
3377 switch (n % 10) {
3378 case 1:
3379 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3380 break;
3381 case 2:
3382 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3383 break;
3384 case 3:
3385 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3386 break;
3387 }
3388 if (n >= 10) {
3389 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3390 } else {
3391 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3392 }
3393 mDaltonize = n > 0;
3394 invalidateHwcGeometry();
3395 repaintEverything();
3396 return NO_ERROR;
3397 }
3398 case 1015: {
3399 // apply a color matrix
3400 n = data.readInt32();
3401 mHasColorMatrix = n ? 1 : 0;
3402 if (n) {
3403 // color matrix is sent as mat3 matrix followed by vec3
3404 // offset, then packed into a mat4 where the last row is
3405 // the offset and extra values are 0
3406 for (size_t i = 0 ; i < 4; i++) {
3407 for (size_t j = 0; j < 4; j++) {
3408 mColorMatrix[i][j] = data.readFloat();
3409 }
3410 }
3411 } else {
3412 mColorMatrix = mat4();
3413 }
3414 invalidateHwcGeometry();
3415 repaintEverything();
3416 return NO_ERROR;
3417 }
3418 // This is an experimental interface
3419 // Needs to be shifted to proper binder interface when we productize
3420 case 1016: {
3421 n = data.readInt32();
3422 mPrimaryDispSync.setRefreshSkipCount(n);
3423 return NO_ERROR;
3424 }
3425 case 1017: {
3426 n = data.readInt32();
3427 mForceFullDamage = static_cast<bool>(n);
3428 return NO_ERROR;
3429 }
3430 case 1018: { // Modify Choreographer's phase offset
3431 n = data.readInt32();
3432 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3433 return NO_ERROR;
3434 }
3435 case 1019: { // Modify SurfaceFlinger's phase offset
3436 n = data.readInt32();
3437 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3438 return NO_ERROR;
3439 }
3440 case 1020: { // Layer updates interceptor
3441 n = data.readInt32();
3442 if (n) {
3443 ALOGV("Interceptor enabled");
3444 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3445 }
3446 else{
3447 ALOGV("Interceptor disabled");
3448 mInterceptor.disable();
3449 }
3450 return NO_ERROR;
3451 }
3452 case 1021: { // Disable HWC virtual displays
3453 n = data.readInt32();
3454 mUseHwcVirtualDisplays = !n;
3455 return NO_ERROR;
3456 }
3457 }
3458 }
3459 return err;
3460}
3461
3462void SurfaceFlinger::repaintEverything() {
3463 android_atomic_or(1, &mRepaintEverything);
3464 signalTransaction();
3465}
3466
3467// ---------------------------------------------------------------------------
3468// Capture screen into an IGraphiBufferProducer
3469// ---------------------------------------------------------------------------
3470
3471/* The code below is here to handle b/8734824
3472 *
3473 * We create a IGraphicBufferProducer wrapper that forwards all calls
3474 * from the surfaceflinger thread to the calling binder thread, where they
3475 * are executed. This allows the calling thread in the calling process to be
3476 * reused and not depend on having "enough" binder threads to handle the
3477 * requests.
3478 */
3479class GraphicProducerWrapper : public BBinder, public MessageHandler {
3480 /* Parts of GraphicProducerWrapper are run on two different threads,
3481 * communicating by sending messages via Looper but also by shared member
3482 * data. Coherence maintenance is subtle and in places implicit (ugh).
3483 *
3484 * Don't rely on Looper's sendMessage/handleMessage providing
3485 * release/acquire semantics for any data not actually in the Message.
3486 * Data going from surfaceflinger to binder threads needs to be
3487 * synchronized explicitly.
3488 *
3489 * Barrier open/wait do provide release/acquire semantics. This provides
3490 * implicit synchronization for data coming back from binder to
3491 * surfaceflinger threads.
3492 */
3493
3494 sp<IGraphicBufferProducer> impl;
3495 sp<Looper> looper;
3496 status_t result;
3497 bool exitPending;
3498 bool exitRequested;
3499 Barrier barrier;
3500 uint32_t code;
3501 Parcel const* data;
3502 Parcel* reply;
3503
3504 enum {
3505 MSG_API_CALL,
3506 MSG_EXIT
3507 };
3508
3509 /*
3510 * Called on surfaceflinger thread. This is called by our "fake"
3511 * BpGraphicBufferProducer. We package the data and reply Parcel and
3512 * forward them to the binder thread.
3513 */
3514 virtual status_t transact(uint32_t code,
3515 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3516 this->code = code;
3517 this->data = &data;
3518 this->reply = reply;
3519 if (exitPending) {
3520 // if we've exited, we run the message synchronously right here.
3521 // note (JH): as far as I can tell from looking at the code, this
3522 // never actually happens. if it does, i'm not sure if it happens
3523 // on the surfaceflinger or binder thread.
3524 handleMessage(Message(MSG_API_CALL));
3525 } else {
3526 barrier.close();
3527 // Prevent stores to this->{code, data, reply} from being
3528 // reordered later than the construction of Message.
3529 atomic_thread_fence(memory_order_release);
3530 looper->sendMessage(this, Message(MSG_API_CALL));
3531 barrier.wait();
3532 }
3533 return result;
3534 }
3535
3536 /*
3537 * here we run on the binder thread. All we've got to do is
3538 * call the real BpGraphicBufferProducer.
3539 */
3540 virtual void handleMessage(const Message& message) {
3541 int what = message.what;
3542 // Prevent reads below from happening before the read from Message
3543 atomic_thread_fence(memory_order_acquire);
3544 if (what == MSG_API_CALL) {
3545 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3546 barrier.open();
3547 } else if (what == MSG_EXIT) {
3548 exitRequested = true;
3549 }
3550 }
3551
3552public:
3553 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3554 : impl(impl),
3555 looper(new Looper(true)),
3556 result(NO_ERROR),
3557 exitPending(false),
3558 exitRequested(false),
3559 code(0),
3560 data(NULL),
3561 reply(NULL)
3562 {}
3563
3564 // Binder thread
3565 status_t waitForResponse() {
3566 do {
3567 looper->pollOnce(-1);
3568 } while (!exitRequested);
3569 return result;
3570 }
3571
3572 // Client thread
3573 void exit(status_t result) {
3574 this->result = result;
3575 exitPending = true;
3576 // Ensure this->result is visible to the binder thread before it
3577 // handles the message.
3578 atomic_thread_fence(memory_order_release);
3579 looper->sendMessage(this, Message(MSG_EXIT));
3580 }
3581};
3582
3583
3584status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3585 const sp<IGraphicBufferProducer>& producer,
3586 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003587 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003588 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3589
3590 if (CC_UNLIKELY(display == 0))
3591 return BAD_VALUE;
3592
3593 if (CC_UNLIKELY(producer == 0))
3594 return BAD_VALUE;
3595
3596 // if we have secure windows on this display, never allow the screen capture
3597 // unless the producer interface is local (i.e.: we can take a screenshot for
3598 // ourselves).
3599 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3600
3601 // Convert to surfaceflinger's internal rotation type.
3602 Transform::orientation_flags rotationFlags;
3603 switch (rotation) {
3604 case ISurfaceComposer::eRotateNone:
3605 rotationFlags = Transform::ROT_0;
3606 break;
3607 case ISurfaceComposer::eRotate90:
3608 rotationFlags = Transform::ROT_90;
3609 break;
3610 case ISurfaceComposer::eRotate180:
3611 rotationFlags = Transform::ROT_180;
3612 break;
3613 case ISurfaceComposer::eRotate270:
3614 rotationFlags = Transform::ROT_270;
3615 break;
3616 default:
3617 rotationFlags = Transform::ROT_0;
3618 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3619 break;
3620 }
3621
3622 class MessageCaptureScreen : public MessageBase {
3623 SurfaceFlinger* flinger;
3624 sp<IBinder> display;
3625 sp<IGraphicBufferProducer> producer;
3626 Rect sourceCrop;
3627 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003628 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003629 bool useIdentityTransform;
3630 Transform::orientation_flags rotation;
3631 status_t result;
3632 bool isLocalScreenshot;
3633 public:
3634 MessageCaptureScreen(SurfaceFlinger* flinger,
3635 const sp<IBinder>& display,
3636 const sp<IGraphicBufferProducer>& producer,
3637 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003638 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003639 bool useIdentityTransform,
3640 Transform::orientation_flags rotation,
3641 bool isLocalScreenshot)
3642 : flinger(flinger), display(display), producer(producer),
3643 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3644 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3645 useIdentityTransform(useIdentityTransform),
3646 rotation(rotation), result(PERMISSION_DENIED),
3647 isLocalScreenshot(isLocalScreenshot)
3648 {
3649 }
3650 status_t getResult() const {
3651 return result;
3652 }
3653 virtual bool handler() {
3654 Mutex::Autolock _l(flinger->mStateLock);
3655 sp<const DisplayDevice> hw(flinger->getDisplayDevice(display));
3656 result = flinger->captureScreenImplLocked(hw, producer,
3657 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3658 useIdentityTransform, rotation, isLocalScreenshot);
3659 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3660 return true;
3661 }
3662 };
3663
3664 // this creates a "fake" BBinder which will serve as a "fake" remote
3665 // binder to receive the marshaled calls and forward them to the
3666 // real remote (a BpGraphicBufferProducer)
3667 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3668
3669 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3670 // which does the marshaling work forwards to our "fake remote" above.
3671 sp<MessageBase> msg = new MessageCaptureScreen(this,
3672 display, IGraphicBufferProducer::asInterface( wrapper ),
3673 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3674 useIdentityTransform, rotationFlags, isLocalScreenshot);
3675
3676 status_t res = postMessageAsync(msg);
3677 if (res == NO_ERROR) {
3678 res = wrapper->waitForResponse();
3679 }
3680 return res;
3681}
3682
3683
3684void SurfaceFlinger::renderScreenImplLocked(
3685 const sp<const DisplayDevice>& hw,
3686 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003687 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003688 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3689{
3690 ATRACE_CALL();
3691 RenderEngine& engine(getRenderEngine());
3692
3693 // get screen geometry
3694 const int32_t hw_w = hw->getWidth();
3695 const int32_t hw_h = hw->getHeight();
3696 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3697 static_cast<int32_t>(reqHeight) != hw_h;
3698
3699 // if a default or invalid sourceCrop is passed in, set reasonable values
3700 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3701 !sourceCrop.isValid()) {
3702 sourceCrop.setLeftTop(Point(0, 0));
3703 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3704 }
3705
3706 // ensure that sourceCrop is inside screen
3707 if (sourceCrop.left < 0) {
3708 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3709 }
3710 if (sourceCrop.right > hw_w) {
3711 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3712 }
3713 if (sourceCrop.top < 0) {
3714 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3715 }
3716 if (sourceCrop.bottom > hw_h) {
3717 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3718 }
3719
3720 // make sure to clear all GL error flags
3721 engine.checkErrors();
3722
3723 // set-up our viewport
3724 engine.setViewportAndProjection(
3725 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3726 engine.disableTexturing();
3727
3728 // redraw the screen entirely...
3729 engine.clearWithColor(0, 0, 0, 1);
3730
Robert Carr1f0a16a2016-10-24 16:27:39 -07003731 // We loop through the first level of layers without traversing,
3732 // as we need to interpret min/max layer Z in the top level Z space.
3733 for (const auto& layer : mDrawingState.layersSortedByZ) {
3734 if (layer->getLayerStack() != hw->getLayerStack()) {
3735 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003736 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003737 const Layer::State& state(layer->getDrawingState());
3738 if (state.z < minLayerZ || state.z > maxLayerZ) {
3739 continue;
3740 }
3741 layer->traverseInZOrder([&](Layer* layer) {
3742 if (!layer->isVisible()) {
3743 return;
3744 }
3745 if (filtering) layer->setFiltering(true);
3746 layer->draw(hw, useIdentityTransform);
3747 if (filtering) layer->setFiltering(false);
3748 });
3749 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003750
3751 // compositionComplete is needed for older driver
3752 hw->compositionComplete();
3753 hw->setViewportAndProjection();
3754}
3755
3756
3757status_t SurfaceFlinger::captureScreenImplLocked(
3758 const sp<const DisplayDevice>& hw,
3759 const sp<IGraphicBufferProducer>& producer,
3760 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003761 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003762 bool useIdentityTransform, Transform::orientation_flags rotation,
3763 bool isLocalScreenshot)
3764{
3765 ATRACE_CALL();
3766
3767 // get screen geometry
3768 uint32_t hw_w = hw->getWidth();
3769 uint32_t hw_h = hw->getHeight();
3770
3771 if (rotation & Transform::ROT_90) {
3772 std::swap(hw_w, hw_h);
3773 }
3774
3775 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3776 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3777 reqWidth, reqHeight, hw_w, hw_h);
3778 return BAD_VALUE;
3779 }
3780
3781 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3782 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3783
3784 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003785 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003786 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003787 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3788 (state.z < minLayerZ || state.z > maxLayerZ)) {
3789 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003790 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003791 layer->traverseInZOrder([&](Layer *layer) {
3792 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3793 layer->isSecure());
3794 });
3795 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003796
3797 if (!isLocalScreenshot && secureLayerIsVisible) {
3798 ALOGW("FB is protected: PERMISSION_DENIED");
3799 return PERMISSION_DENIED;
3800 }
3801
3802 // create a surface (because we're a producer, and we need to
3803 // dequeue/queue a buffer)
3804 sp<Surface> sur = new Surface(producer, false);
3805 ANativeWindow* window = sur.get();
3806
3807 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3808 if (result == NO_ERROR) {
3809 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3810 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3811
3812 int err = 0;
3813 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3814 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3815 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3816 err |= native_window_set_usage(window, usage);
3817
3818 if (err == NO_ERROR) {
3819 ANativeWindowBuffer* buffer;
3820 /* TODO: Once we have the sync framework everywhere this can use
3821 * server-side waits on the fence that dequeueBuffer returns.
3822 */
3823 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3824 if (result == NO_ERROR) {
3825 int syncFd = -1;
3826 // create an EGLImage from the buffer so we can later
3827 // turn it into a texture
3828 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3829 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3830 if (image != EGL_NO_IMAGE_KHR) {
3831 // this binds the given EGLImage as a framebuffer for the
3832 // duration of this scope.
3833 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3834 if (imageBond.getStatus() == NO_ERROR) {
3835 // this will in fact render into our dequeued buffer
3836 // via an FBO, which means we didn't have to create
3837 // an EGLSurface and therefore we're not
3838 // dependent on the context's EGLConfig.
3839 renderScreenImplLocked(
3840 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3841 useIdentityTransform, rotation);
3842
3843 // Attempt to create a sync khr object that can produce a sync point. If that
3844 // isn't available, create a non-dupable sync object in the fallback path and
3845 // wait on it directly.
3846 EGLSyncKHR sync;
3847 if (!DEBUG_SCREENSHOTS) {
3848 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3849 // native fence fd will not be populated until flush() is done.
3850 getRenderEngine().flush();
3851 } else {
3852 sync = EGL_NO_SYNC_KHR;
3853 }
3854 if (sync != EGL_NO_SYNC_KHR) {
3855 // get the sync fd
3856 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3857 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3858 ALOGW("captureScreen: failed to dup sync khr object");
3859 syncFd = -1;
3860 }
3861 eglDestroySyncKHR(mEGLDisplay, sync);
3862 } else {
3863 // fallback path
3864 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3865 if (sync != EGL_NO_SYNC_KHR) {
3866 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3867 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3868 EGLint eglErr = eglGetError();
3869 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3870 ALOGW("captureScreen: fence wait timed out");
3871 } else {
3872 ALOGW_IF(eglErr != EGL_SUCCESS,
3873 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3874 }
3875 eglDestroySyncKHR(mEGLDisplay, sync);
3876 } else {
3877 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3878 }
3879 }
3880 if (DEBUG_SCREENSHOTS) {
3881 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
3882 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
3883 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
3884 hw, minLayerZ, maxLayerZ);
3885 delete [] pixels;
3886 }
3887
3888 } else {
3889 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
3890 result = INVALID_OPERATION;
3891 window->cancelBuffer(window, buffer, syncFd);
3892 buffer = NULL;
3893 }
3894 // destroy our image
3895 eglDestroyImageKHR(mEGLDisplay, image);
3896 } else {
3897 result = BAD_VALUE;
3898 }
3899 if (buffer) {
3900 // queueBuffer takes ownership of syncFd
3901 result = window->queueBuffer(window, buffer, syncFd);
3902 }
3903 }
3904 } else {
3905 result = BAD_VALUE;
3906 }
3907 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
3908 }
3909
3910 return result;
3911}
3912
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003913void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08003914 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003915 if (DEBUG_SCREENSHOTS) {
3916 for (size_t y=0 ; y<h ; y++) {
3917 uint32_t const * p = (uint32_t const *)vaddr + y*s;
3918 for (size_t x=0 ; x<w ; x++) {
3919 if (p[x] != 0xFF000000) return;
3920 }
3921 }
3922 ALOGE("*** we just took a black screenshot ***\n"
3923 "requested minz=%d, maxz=%d, layerStack=%d",
3924 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08003925 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003926 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003927 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003928 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
3929 state.z <= maxLayerZ) {
3930 layer->traverseInZOrder([&](Layer* layer) {
3931 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
3932 layer->isVisible() ? '+' : '-',
3933 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003934 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003935 i++;
3936 });
3937 }
3938 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003939 }
3940}
3941
3942// ---------------------------------------------------------------------------
3943
Robert Carr2047fae2016-11-28 14:09:09 -08003944void SurfaceFlinger::State::traverseInZOrder(const std::function<void(Layer*)>& consume) const {
3945 layersSortedByZ.traverseInZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003946}
3947
Robert Carr2047fae2016-11-28 14:09:09 -08003948void SurfaceFlinger::State::traverseInReverseZOrder(const std::function<void(Layer*)>& consume) const {
3949 layersSortedByZ.traverseInReverseZOrder(consume);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003950}
3951
3952}; // namespace android
3953
3954
3955#if defined(__gl_h_)
3956#error "don't include gl/gl.h in this file"
3957#endif
3958
3959#if defined(__gl2_h_)
3960#error "don't include gl2/gl2.h in this file"
3961#endif