blob: 11fce05b9c192de0167a2fc56a225b9eac8b40e4 [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
Jiyong Park8d455e92017-08-10 20:30:56 +090097extern "C" EGLAPI const char* eglQueryStringImplementationANDROID(EGLDisplay dpy, EGLint name);
Fabien Sanglard9d96de42016-10-11 00:15:18 +000098
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 Sanglardc93afd52017-03-13 13:02:42 -0700113bool SurfaceFlinger::useContextPriority;
Fabien Sanglardc45a7d92017-03-14 13:24:22 -0700114int64_t SurfaceFlinger::dispSyncPresentTimeOffset;
Fabien Sanglarda34ed632017-03-14 11:43:52 -0700115bool SurfaceFlinger::useHwcForRgbToYuv;
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800116uint64_t SurfaceFlinger::maxVirtualDisplaySize;
Fabien Sanglardcbf153b2017-03-10 17:57:12 -0800117bool SurfaceFlinger::hasSyncFramework;
Fabien Sanglard1971b632017-03-10 14:50:03 -0800118int64_t SurfaceFlinger::maxFrameBufferAcquiredBuffers;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000119
120SurfaceFlinger::SurfaceFlinger()
121 : BnSurfaceComposer(),
122 mTransactionFlags(0),
123 mTransactionPending(false),
124 mAnimTransactionPending(false),
125 mLayersRemoved(false),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700126 mLayersAdded(false),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000127 mRepaintEverything(0),
128 mRenderEngine(NULL),
129 mBootTime(systemTime()),
130 mVisibleRegionsDirty(false),
131 mHwWorkListDirty(false),
132 mAnimCompositionPending(false),
133 mDebugRegion(0),
134 mDebugDDMS(0),
135 mDebugDisableHWC(0),
136 mDebugDisableTransformHint(0),
137 mDebugInSwapBuffers(0),
138 mLastSwapBufferTime(0),
139 mDebugInTransaction(0),
140 mLastTransactionTime(0),
141 mBootFinished(false),
142 mForceFullDamage(false),
Robert Carr0d480722017-01-10 16:42:54 -0800143 mInterceptor(this),
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000144 mPrimaryDispSync("PrimaryDispSync"),
145 mPrimaryHWVsyncEnabled(false),
146 mHWVsyncAvailable(false),
147 mDaltonize(false),
148 mHasColorMatrix(false),
149 mHasPoweredOff(false),
150 mFrameBuckets(),
151 mTotalTime(0),
Robert Carr1f0a16a2016-10-24 16:27:39 -0700152 mLastSwapTime(0),
153 mNumLayers(0)
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000154{
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800155 ALOGI("SurfaceFlinger is starting");
156
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800157 vsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
158 &ISurfaceFlingerConfigs::vsyncEventPhaseOffsetNs>(1000000);
159
160 sfVsyncPhaseOffsetNs = getInt64< ISurfaceFlingerConfigs,
161 &ISurfaceFlingerConfigs::vsyncSfEventPhaseOffsetNs>(1000000);
162
Fabien Sanglardc8e387e2017-03-10 10:30:28 -0800163 maxVirtualDisplaySize = getUInt64<ISurfaceFlingerConfigs,
164 &ISurfaceFlingerConfigs::maxVirtualDisplaySize>(0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000165
Fabien Sanglardcbf153b2017-03-10 17:57:12 -0800166 hasSyncFramework = getBool< ISurfaceFlingerConfigs,
167 &ISurfaceFlingerConfigs::hasSyncFramework>(true);
168
Fabien Sanglardc93afd52017-03-13 13:02:42 -0700169 useContextPriority = getBool< ISurfaceFlingerConfigs,
170 &ISurfaceFlingerConfigs::useContextPriority>(false);
171
Fabien Sanglardc45a7d92017-03-14 13:24:22 -0700172 dispSyncPresentTimeOffset = getInt64< ISurfaceFlingerConfigs,
173 &ISurfaceFlingerConfigs::presentTimeOffsetFromVSyncNs>(0);
174
Fabien Sanglarda34ed632017-03-14 11:43:52 -0700175 useHwcForRgbToYuv = getBool< ISurfaceFlingerConfigs,
176 &ISurfaceFlingerConfigs::useHwcForRGBtoYUV>(false);
177
Fabien Sanglard1971b632017-03-10 14:50:03 -0800178 maxFrameBufferAcquiredBuffers = getInt64< ISurfaceFlingerConfigs,
179 &ISurfaceFlingerConfigs::maxFrameBufferAcquiredBuffers>(2);
180
Marissa Wallc9d2db12017-09-18 13:26:15 -0700181 mPrimaryDispSync.init(hasSyncFramework, dispSyncPresentTimeOffset);
182
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000183 char value[PROPERTY_VALUE_MAX];
184
185 property_get("ro.bq.gpu_to_cpu_unsupported", value, "0");
186 mGpuToCpuSupported = !atoi(value);
187
188 property_get("debug.sf.showupdates", value, "0");
189 mDebugRegion = atoi(value);
190
191 property_get("debug.sf.ddms", value, "0");
192 mDebugDDMS = atoi(value);
193 if (mDebugDDMS) {
194 if (!startDdmConnection()) {
195 // start failed, and DDMS debugging not enabled
196 mDebugDDMS = 0;
197 }
198 }
199 ALOGI_IF(mDebugRegion, "showupdates enabled");
200 ALOGI_IF(mDebugDDMS, "DDMS debugging enabled");
201
Fabien Sanglard642b23d2017-02-09 12:29:39 -0800202 property_get("debug.sf.enable_hwc_vds", value, "0");
203 mUseHwcVirtualDisplays = atoi(value);
204 ALOGI_IF(!mUseHwcVirtualDisplays, "Enabling HWC virtual displays");
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800205
Fabien Sanglardc65dafa2017-02-07 14:06:39 -0800206 property_get("ro.sf.disable_triple_buffer", value, "1");
207 mLayerTripleBufferingDisabled = atoi(value);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -0800208 ALOGI_IF(mLayerTripleBufferingDisabled, "Disabling Triple Buffering");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000209}
210
211void SurfaceFlinger::onFirstRef()
212{
213 mEventQueue.init(this);
214}
215
216SurfaceFlinger::~SurfaceFlinger()
217{
218 EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
219 eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
220 eglTerminate(display);
221}
222
223void SurfaceFlinger::binderDied(const wp<IBinder>& /* who */)
224{
225 // the window manager died on us. prepare its eulogy.
226
227 // restore initial conditions (default device unblank, etc)
228 initializeDisplays();
229
230 // restart the boot-animation
231 startBootAnim();
232}
233
Robert Carr1db73f62016-12-21 12:58:51 -0800234static sp<ISurfaceComposerClient> initClient(const sp<Client>& client) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000235 status_t err = client->initCheck();
236 if (err == NO_ERROR) {
Robert Carr1db73f62016-12-21 12:58:51 -0800237 return client;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000238 }
Robert Carr1db73f62016-12-21 12:58:51 -0800239 return nullptr;
240}
241
242sp<ISurfaceComposerClient> SurfaceFlinger::createConnection() {
243 return initClient(new Client(this));
244}
245
246sp<ISurfaceComposerClient> SurfaceFlinger::createScopedConnection(
247 const sp<IGraphicBufferProducer>& gbp) {
248 if (authenticateSurfaceTexture(gbp) == false) {
249 return nullptr;
250 }
251 const auto& layer = (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
252 if (layer == nullptr) {
253 return nullptr;
254 }
255
256 return initClient(new Client(this, layer));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000257}
258
259sp<IBinder> SurfaceFlinger::createDisplay(const String8& displayName,
260 bool secure)
261{
262 class DisplayToken : public BBinder {
263 sp<SurfaceFlinger> flinger;
264 virtual ~DisplayToken() {
265 // no more references, this display must be terminated
266 Mutex::Autolock _l(flinger->mStateLock);
267 flinger->mCurrentState.displays.removeItem(this);
268 flinger->setTransactionFlags(eDisplayTransactionNeeded);
269 }
270 public:
271 explicit DisplayToken(const sp<SurfaceFlinger>& flinger)
272 : flinger(flinger) {
273 }
274 };
275
276 sp<BBinder> token = new DisplayToken(this);
277
278 Mutex::Autolock _l(mStateLock);
279 DisplayDeviceState info(DisplayDevice::DISPLAY_VIRTUAL, secure);
280 info.displayName = displayName;
281 mCurrentState.displays.add(token, info);
282 mInterceptor.saveDisplayCreation(info);
283 return token;
284}
285
286void SurfaceFlinger::destroyDisplay(const sp<IBinder>& display) {
287 Mutex::Autolock _l(mStateLock);
288
289 ssize_t idx = mCurrentState.displays.indexOfKey(display);
290 if (idx < 0) {
291 ALOGW("destroyDisplay: invalid display token");
292 return;
293 }
294
295 const DisplayDeviceState& info(mCurrentState.displays.valueAt(idx));
296 if (!info.isVirtualDisplay()) {
297 ALOGE("destroyDisplay called for non-virtual display");
298 return;
299 }
300 mInterceptor.saveDisplayDeletion(info.displayId);
301 mCurrentState.displays.removeItemsAt(idx);
302 setTransactionFlags(eDisplayTransactionNeeded);
303}
304
305void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type) {
306 ALOGW_IF(mBuiltinDisplays[type],
307 "Overwriting display token for display type %d", type);
308 mBuiltinDisplays[type] = new BBinder();
309 // All non-virtual displays are currently considered secure.
310 DisplayDeviceState info(type, true);
311 mCurrentState.displays.add(mBuiltinDisplays[type], info);
312 mInterceptor.saveDisplayCreation(info);
313}
314
315sp<IBinder> SurfaceFlinger::getBuiltInDisplay(int32_t id) {
316 if (uint32_t(id) >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
317 ALOGE("getDefaultDisplay: id=%d is not a valid default display id", id);
318 return NULL;
319 }
320 return mBuiltinDisplays[id];
321}
322
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000323void SurfaceFlinger::bootFinished()
324{
Wei Wangf9b05ee2017-07-19 20:59:39 -0700325 if (mStartPropertySetThread->join() != NO_ERROR) {
326 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800327 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000328 const nsecs_t now = systemTime();
329 const nsecs_t duration = now - mBootTime;
330 ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );
331 mBootFinished = true;
332
333 // wait patiently for the window manager death
334 const String16 name("window");
335 sp<IBinder> window(defaultServiceManager()->getService(name));
336 if (window != 0) {
337 window->linkToDeath(static_cast<IBinder::DeathRecipient*>(this));
338 }
339
340 // stop boot animation
341 // formerly we would just kill the process, but we now ask it to exit so it
342 // can choose where to stop the animation.
343 property_set("service.bootanim.exit", "1");
344
345 const int LOGTAG_SF_STOP_BOOTANIM = 60110;
346 LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,
347 ns2ms(systemTime(SYSTEM_TIME_MONOTONIC)));
348}
349
350void SurfaceFlinger::deleteTextureAsync(uint32_t texture) {
351 class MessageDestroyGLTexture : public MessageBase {
352 RenderEngine& engine;
353 uint32_t texture;
354 public:
355 MessageDestroyGLTexture(RenderEngine& engine, uint32_t texture)
356 : engine(engine), texture(texture) {
357 }
358 virtual bool handler() {
359 engine.deleteTextures(1, &texture);
360 return true;
361 }
362 };
363 postMessageAsync(new MessageDestroyGLTexture(getRenderEngine(), texture));
364}
365
366class DispSyncSource : public VSyncSource, private DispSync::Callback {
367public:
368 DispSyncSource(DispSync* dispSync, nsecs_t phaseOffset, bool traceVsync,
369 const char* name) :
370 mName(name),
371 mValue(0),
372 mTraceVsync(traceVsync),
373 mVsyncOnLabel(String8::format("VsyncOn-%s", name)),
374 mVsyncEventLabel(String8::format("VSYNC-%s", name)),
375 mDispSync(dispSync),
376 mCallbackMutex(),
377 mCallback(),
378 mVsyncMutex(),
379 mPhaseOffset(phaseOffset),
380 mEnabled(false) {}
381
382 virtual ~DispSyncSource() {}
383
384 virtual void setVSyncEnabled(bool enable) {
385 Mutex::Autolock lock(mVsyncMutex);
386 if (enable) {
387 status_t err = mDispSync->addEventListener(mName, mPhaseOffset,
388 static_cast<DispSync::Callback*>(this));
389 if (err != NO_ERROR) {
390 ALOGE("error registering vsync callback: %s (%d)",
391 strerror(-err), err);
392 }
393 //ATRACE_INT(mVsyncOnLabel.string(), 1);
394 } else {
395 status_t err = mDispSync->removeEventListener(
396 static_cast<DispSync::Callback*>(this));
397 if (err != NO_ERROR) {
398 ALOGE("error unregistering vsync callback: %s (%d)",
399 strerror(-err), err);
400 }
401 //ATRACE_INT(mVsyncOnLabel.string(), 0);
402 }
403 mEnabled = enable;
404 }
405
406 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
407 Mutex::Autolock lock(mCallbackMutex);
408 mCallback = callback;
409 }
410
411 virtual void setPhaseOffset(nsecs_t phaseOffset) {
412 Mutex::Autolock lock(mVsyncMutex);
413
414 // Normalize phaseOffset to [0, period)
415 auto period = mDispSync->getPeriod();
416 phaseOffset %= period;
417 if (phaseOffset < 0) {
418 // If we're here, then phaseOffset is in (-period, 0). After this
419 // operation, it will be in (0, period)
420 phaseOffset += period;
421 }
422 mPhaseOffset = phaseOffset;
423
424 // If we're not enabled, we don't need to mess with the listeners
425 if (!mEnabled) {
426 return;
427 }
428
429 // Remove the listener with the old offset
430 status_t err = mDispSync->removeEventListener(
431 static_cast<DispSync::Callback*>(this));
432 if (err != NO_ERROR) {
433 ALOGE("error unregistering vsync callback: %s (%d)",
434 strerror(-err), err);
435 }
436
437 // Add a listener with the new offset
438 err = mDispSync->addEventListener(mName, mPhaseOffset,
439 static_cast<DispSync::Callback*>(this));
440 if (err != NO_ERROR) {
441 ALOGE("error registering vsync callback: %s (%d)",
442 strerror(-err), err);
443 }
444 }
445
446private:
447 virtual void onDispSyncEvent(nsecs_t when) {
448 sp<VSyncSource::Callback> callback;
449 {
450 Mutex::Autolock lock(mCallbackMutex);
451 callback = mCallback;
452
453 if (mTraceVsync) {
454 mValue = (mValue + 1) % 2;
455 ATRACE_INT(mVsyncEventLabel.string(), mValue);
456 }
457 }
458
459 if (callback != NULL) {
460 callback->onVSyncEvent(when);
461 }
462 }
463
464 const char* const mName;
465
466 int mValue;
467
468 const bool mTraceVsync;
469 const String8 mVsyncOnLabel;
470 const String8 mVsyncEventLabel;
471
472 DispSync* mDispSync;
473
474 Mutex mCallbackMutex; // Protects the following
475 sp<VSyncSource::Callback> mCallback;
476
477 Mutex mVsyncMutex; // Protects the following
478 nsecs_t mPhaseOffset;
479 bool mEnabled;
480};
481
482class InjectVSyncSource : public VSyncSource {
483public:
484 InjectVSyncSource() {}
485
486 virtual ~InjectVSyncSource() {}
487
488 virtual void setCallback(const sp<VSyncSource::Callback>& callback) {
489 std::lock_guard<std::mutex> lock(mCallbackMutex);
490 mCallback = callback;
491 }
492
493 virtual void onInjectSyncEvent(nsecs_t when) {
494 std::lock_guard<std::mutex> lock(mCallbackMutex);
495 mCallback->onVSyncEvent(when);
496 }
497
498 virtual void setVSyncEnabled(bool) {}
499 virtual void setPhaseOffset(nsecs_t) {}
500
501private:
502 std::mutex mCallbackMutex; // Protects the following
503 sp<VSyncSource::Callback> mCallback;
504};
505
Wei Wangf9b05ee2017-07-19 20:59:39 -0700506// Do not call property_set on main thread which will be blocked by init
507// Use StartPropertySetThread instead.
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000508void SurfaceFlinger::init() {
509 ALOGI( "SurfaceFlinger's main thread ready to run. "
510 "Initializing graphics H/W...");
511
512 Mutex::Autolock _l(mStateLock);
513
514 // initialize EGL for the default display
515 mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
516 eglInitialize(mEGLDisplay, NULL, NULL);
517
518 // start the EventThread
519 sp<VSyncSource> vsyncSrc = new DispSyncSource(&mPrimaryDispSync,
520 vsyncPhaseOffsetNs, true, "app");
521 mEventThread = new EventThread(vsyncSrc, *this, false);
522 sp<VSyncSource> sfVsyncSrc = new DispSyncSource(&mPrimaryDispSync,
523 sfVsyncPhaseOffsetNs, true, "sf");
524 mSFEventThread = new EventThread(sfVsyncSrc, *this, true);
525 mEventQueue.setEventThread(mSFEventThread);
526
Tim Murray22752852017-05-04 13:38:49 -0700527 // set EventThread and SFEventThread to SCHED_FIFO to minimize jitter
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000528 struct sched_param param = {0};
529 param.sched_priority = 2;
530 if (sched_setscheduler(mSFEventThread->getTid(), SCHED_FIFO, &param) != 0) {
531 ALOGE("Couldn't set SCHED_FIFO for SFEventThread");
532 }
Tim Murray22752852017-05-04 13:38:49 -0700533 if (sched_setscheduler(mEventThread->getTid(), SCHED_FIFO, &param) != 0) {
534 ALOGE("Couldn't set SCHED_FIFO for EventThread");
535 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000536
537 // Initialize the H/W composer object. There may or may not be an
538 // actual hardware composer underneath.
539 mHwc = new HWComposer(this,
540 *static_cast<HWComposer::EventHandler *>(this));
541
542 // get a RenderEngine for the given display / config (can't fail)
Kalle Raitabbdcf1f2017-05-22 15:47:46 -0700543 mRenderEngine = RenderEngine::create(mEGLDisplay,
544 mHwc->getVisualID(), 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000545
546 // retrieve the EGL context that was selected/created
547 mEGLContext = mRenderEngine->getEGLContext();
548
549 LOG_ALWAYS_FATAL_IF(mEGLContext == EGL_NO_CONTEXT,
550 "couldn't create EGLContext");
551
552 // initialize our non-virtual displays
553 for (size_t i=0 ; i<DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES ; i++) {
554 DisplayDevice::DisplayType type((DisplayDevice::DisplayType)i);
555 // set-up the displays that are already connected
556 if (mHwc->isConnected(i) || type==DisplayDevice::DISPLAY_PRIMARY) {
557 // All non-virtual displays are currently considered secure.
558 bool isSecure = true;
559 createBuiltinDisplayLocked(type);
560 wp<IBinder> token = mBuiltinDisplays[i];
561
562 sp<IGraphicBufferProducer> producer;
563 sp<IGraphicBufferConsumer> consumer;
Mathias Agopian0556d792017-03-22 15:49:32 -0700564 BufferQueue::createBufferQueue(&producer, &consumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000565
566 sp<FramebufferSurface> fbs = new FramebufferSurface(*mHwc, i,
567 consumer);
568 int32_t hwcId = allocateHwcDisplayId(type);
569 sp<DisplayDevice> hw = new DisplayDevice(this,
570 type, hwcId, mHwc->getFormat(hwcId), isSecure, token,
571 fbs, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -0600572 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000573 if (i > DisplayDevice::DISPLAY_PRIMARY) {
574 // FIXME: currently we don't get blank/unblank requests
575 // for displays other than the main display, so we always
576 // assume a connected display is unblanked.
577 ALOGD("marking display %zu as acquired/unblanked", i);
578 hw->setPowerMode(HWC_POWER_MODE_NORMAL);
579 }
580 mDisplays.add(token, hw);
581 }
582 }
583
584 // make the GLContext current so that we can create textures when creating Layers
585 // (which may happens before we render something)
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700586 getDefaultDisplayDeviceLocked()->makeCurrent(mEGLDisplay, mEGLContext);
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000587
588 mEventControlThread = new EventControlThread(this);
589 mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY);
590
591 // set a fake vsync period if there is no HWComposer
592 if (mHwc->initCheck() != NO_ERROR) {
593 mPrimaryDispSync.setPeriod(16666667);
594 }
595
596 // initialize our drawing state
597 mDrawingState = mCurrentState;
598
599 // set initial conditions (e.g. unblank default device)
600 initializeDisplays();
601
602 mRenderEngine->primeCache();
603
Wei Wangf9b05ee2017-07-19 20:59:39 -0700604 // Inform native graphics APIs that the present timestamp is NOT supported:
605 mStartPropertySetThread = new StartPropertySetThread(false);
606 if (mStartPropertySetThread->Start() != NO_ERROR) {
607 ALOGE("Run StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800608 }
609
610 ALOGV("Done initializing");
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000611}
612
613int32_t SurfaceFlinger::allocateHwcDisplayId(DisplayDevice::DisplayType type) {
614 return (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) ?
615 type : mHwc->allocateDisplayId();
616}
617
618void SurfaceFlinger::startBootAnim() {
Wei Wangb254fa32017-01-31 17:43:23 -0800619 // Start boot animation service by setting a property mailbox
620 // if property setting thread is already running, Start() will be just a NOP
Wei Wangf9b05ee2017-07-19 20:59:39 -0700621 mStartPropertySetThread->Start();
Wei Wangb254fa32017-01-31 17:43:23 -0800622 // Wait until property was set
Wei Wangf9b05ee2017-07-19 20:59:39 -0700623 if (mStartPropertySetThread->join() != NO_ERROR) {
624 ALOGE("Join StartPropertySetThread failed!");
Wei Wangb254fa32017-01-31 17:43:23 -0800625 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000626}
627
628size_t SurfaceFlinger::getMaxTextureSize() const {
629 return mRenderEngine->getMaxTextureSize();
630}
631
632size_t SurfaceFlinger::getMaxViewportDims() const {
633 return mRenderEngine->getMaxViewportDims();
634}
635
636// ----------------------------------------------------------------------------
637
638bool SurfaceFlinger::authenticateSurfaceTexture(
639 const sp<IGraphicBufferProducer>& bufferProducer) const {
640 Mutex::Autolock _l(mStateLock);
Robert Carr0d480722017-01-10 16:42:54 -0800641 return authenticateSurfaceTextureLocked(bufferProducer);
642}
643
644bool SurfaceFlinger::authenticateSurfaceTextureLocked(
645 const sp<IGraphicBufferProducer>& bufferProducer) const {
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000646 sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer));
647 return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0;
648}
649
Brian Anderson6b376712017-04-04 10:51:39 -0700650status_t SurfaceFlinger::getSupportedFrameTimestamps(
651 std::vector<FrameEvent>* outSupported) const {
652 *outSupported = {
653 FrameEvent::REQUESTED_PRESENT,
654 FrameEvent::ACQUIRE,
655 FrameEvent::LATCH,
656 FrameEvent::FIRST_REFRESH_START,
657 FrameEvent::LAST_REFRESH_START,
658 FrameEvent::GPU_COMPOSITION_DONE,
659 FrameEvent::DEQUEUE_READY,
660 FrameEvent::RELEASE,
661 };
662 return NO_ERROR;
663}
664
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000665status_t SurfaceFlinger::getDisplayConfigs(const sp<IBinder>& display,
666 Vector<DisplayInfo>* configs) {
667 if ((configs == NULL) || (display.get() == NULL)) {
668 return BAD_VALUE;
669 }
670
671 int32_t type = getDisplayType(display);
672 if (type < 0) return type;
673
674 // TODO: Not sure if display density should handled by SF any longer
675 class Density {
676 static int getDensityFromProperty(char const* propName) {
677 char property[PROPERTY_VALUE_MAX];
678 int density = 0;
679 if (property_get(propName, property, NULL) > 0) {
680 density = atoi(property);
681 }
682 return density;
683 }
684 public:
685 static int getEmuDensity() {
686 return getDensityFromProperty("qemu.sf.lcd_density"); }
687 static int getBuildDensity() {
688 return getDensityFromProperty("ro.sf.lcd_density"); }
689 };
690
691 configs->clear();
692
693 const Vector<HWComposer::DisplayConfig>& hwConfigs =
694 getHwComposer().getConfigs(type);
695 for (size_t c = 0; c < hwConfigs.size(); ++c) {
696 const HWComposer::DisplayConfig& hwConfig = hwConfigs[c];
697 DisplayInfo info = DisplayInfo();
698
699 float xdpi = hwConfig.xdpi;
700 float ydpi = hwConfig.ydpi;
701
702 if (type == DisplayDevice::DISPLAY_PRIMARY) {
703 // The density of the device is provided by a build property
704 float density = Density::getBuildDensity() / 160.0f;
705 if (density == 0) {
706 // the build doesn't provide a density -- this is wrong!
707 // use xdpi instead
708 ALOGE("ro.sf.lcd_density must be defined as a build property");
709 density = xdpi / 160.0f;
710 }
711 if (Density::getEmuDensity()) {
712 // if "qemu.sf.lcd_density" is specified, it overrides everything
713 xdpi = ydpi = density = Density::getEmuDensity();
714 density /= 160.0f;
715 }
716 info.density = density;
717
718 // TODO: this needs to go away (currently needed only by webkit)
719 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
720 info.orientation = hw->getOrientation();
721 } else {
722 // TODO: where should this value come from?
723 static const int TV_DENSITY = 213;
724 info.density = TV_DENSITY / 160.0f;
725 info.orientation = 0;
726 }
727
728 info.w = hwConfig.width;
729 info.h = hwConfig.height;
730 info.xdpi = xdpi;
731 info.ydpi = ydpi;
732 info.fps = float(1e9 / hwConfig.refresh);
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800733 info.appVsyncOffset = vsyncPhaseOffsetNs;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000734
735 // This is how far in advance a buffer must be queued for
736 // presentation at a given time. If you want a buffer to appear
737 // on the screen at time N, you must submit the buffer before
738 // (N - presentationDeadline).
739 //
740 // Normally it's one full refresh period (to give SF a chance to
741 // latch the buffer), but this can be reduced by configuring a
742 // DispSync offset. Any additional delays introduced by the hardware
743 // composer or panel must be accounted for here.
744 //
745 // We add an additional 1ms to allow for processing time and
746 // differences between the ideal and actual refresh rate.
747 info.presentationDeadline =
Fabien Sanglard0cc19382017-03-06 11:54:40 -0800748 hwConfig.refresh - sfVsyncPhaseOffsetNs + 1000000;
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000749
750 // All non-virtual displays are currently considered secure.
751 info.secure = true;
752
753 configs->push_back(info);
754 }
755
756 return NO_ERROR;
757}
758
759status_t SurfaceFlinger::getDisplayStats(const sp<IBinder>& /* display */,
760 DisplayStatInfo* stats) {
761 if (stats == NULL) {
762 return BAD_VALUE;
763 }
764
765 // FIXME for now we always return stats for the primary display
766 memset(stats, 0, sizeof(*stats));
767 stats->vsyncTime = mPrimaryDispSync.computeNextRefresh(0);
768 stats->vsyncPeriod = mPrimaryDispSync.getPeriod();
769 return NO_ERROR;
770}
771
772int SurfaceFlinger::getActiveConfig(const sp<IBinder>& display) {
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -0700773 sp<const DisplayDevice> device(getDisplayDevice(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000774 if (device != NULL) {
775 return device->getActiveConfig();
776 }
777 return BAD_VALUE;
778}
779
780void SurfaceFlinger::setActiveConfigInternal(const sp<DisplayDevice>& hw, int mode) {
781 ALOGD("Set active config mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
782 this);
783 int32_t type = hw->getDisplayType();
784 int currentMode = hw->getActiveConfig();
785
786 if (mode == currentMode) {
787 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
788 return;
789 }
790
791 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
792 ALOGW("Trying to set config for virtual display");
793 return;
794 }
795
796 hw->setActiveConfig(mode);
797 getHwComposer().setActiveConfig(type, mode);
798}
799
800status_t SurfaceFlinger::setActiveConfig(const sp<IBinder>& display, int mode) {
801 class MessageSetActiveConfig: public MessageBase {
802 SurfaceFlinger& mFlinger;
803 sp<IBinder> mDisplay;
804 int mMode;
805 public:
806 MessageSetActiveConfig(SurfaceFlinger& flinger, const sp<IBinder>& disp,
807 int mode) :
808 mFlinger(flinger), mDisplay(disp) { mMode = mode; }
809 virtual bool handler() {
810 Vector<DisplayInfo> configs;
811 mFlinger.getDisplayConfigs(mDisplay, &configs);
812 if (mMode < 0 || mMode >= static_cast<int>(configs.size())) {
813 ALOGE("Attempt to set active config = %d for display with %zu configs",
814 mMode, configs.size());
815 }
816 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
817 if (hw == NULL) {
818 ALOGE("Attempt to set active config = %d for null display %p",
819 mMode, mDisplay.get());
820 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
821 ALOGW("Attempt to set active config = %d for virtual display",
822 mMode);
823 } else {
824 mFlinger.setActiveConfigInternal(hw, mMode);
825 }
826 return true;
827 }
828 };
829 sp<MessageBase> msg = new MessageSetActiveConfig(*this, display, mode);
830 postMessageSync(msg);
831 return NO_ERROR;
832}
833
834status_t SurfaceFlinger::getDisplayColorModes(const sp<IBinder>& display,
835 Vector<android_color_mode_t>* outColorModes) {
836 if (outColorModes == nullptr || display.get() == nullptr) {
837 return BAD_VALUE;
838 }
839
840 int32_t type = getDisplayType(display);
841 if (type < 0) return type;
842
843 std::set<android_color_mode_t> colorModes;
844 for (const HWComposer::DisplayConfig& hwConfig : getHwComposer().getConfigs(type)) {
845 colorModes.insert(hwConfig.colorMode);
846 }
847
848 outColorModes->clear();
849 std::copy(colorModes.cbegin(), colorModes.cend(), std::back_inserter(*outColorModes));
850
851 return NO_ERROR;
852}
853
854android_color_mode_t SurfaceFlinger::getActiveColorMode(const sp<IBinder>& display) {
855 if (display.get() == nullptr) return static_cast<android_color_mode_t>(BAD_VALUE);
856
857 int32_t type = getDisplayType(display);
858 if (type < 0) return static_cast<android_color_mode_t>(type);
859
860 return getHwComposer().getColorMode(type);
861}
862
863status_t SurfaceFlinger::setActiveColorMode(const sp<IBinder>& display,
864 android_color_mode_t colorMode) {
865 if (display.get() == nullptr || colorMode < 0) {
866 return BAD_VALUE;
867 }
868
869 int32_t type = getDisplayType(display);
870 if (type < 0) return type;
871 const Vector<HWComposer::DisplayConfig>& hwConfigs = getHwComposer().getConfigs(type);
872 HWComposer::DisplayConfig desiredConfig = hwConfigs[getHwComposer().getCurrentConfig(type)];
873 desiredConfig.colorMode = colorMode;
874 for (size_t c = 0; c < hwConfigs.size(); ++c) {
875 const HWComposer::DisplayConfig config = hwConfigs[c];
876 if (config == desiredConfig) {
877 return setActiveConfig(display, c);
878 }
879 }
880 return BAD_VALUE;
881}
882
883status_t SurfaceFlinger::clearAnimationFrameStats() {
884 Mutex::Autolock _l(mStateLock);
885 mAnimFrameTracker.clearStats();
886 return NO_ERROR;
887}
888
889status_t SurfaceFlinger::getAnimationFrameStats(FrameStats* outStats) const {
890 Mutex::Autolock _l(mStateLock);
891 mAnimFrameTracker.getStats(outStats);
892 return NO_ERROR;
893}
894
895status_t SurfaceFlinger::getHdrCapabilities(const sp<IBinder>& /*display*/,
896 HdrCapabilities* outCapabilities) const {
897 // HWC1 does not provide HDR capabilities
898 *outCapabilities = HdrCapabilities();
899 return NO_ERROR;
900}
901
902status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
903 if (enable == mInjectVSyncs) {
904 return NO_ERROR;
905 }
906
907 if (enable) {
908 mInjectVSyncs = enable;
909 ALOGV("VSync Injections enabled");
910 if (mVSyncInjector.get() == nullptr) {
911 mVSyncInjector = new InjectVSyncSource();
912 mInjectorEventThread = new EventThread(mVSyncInjector, *this, false);
913 }
914 mEventQueue.setEventThread(mInjectorEventThread);
915 } else {
916 mInjectVSyncs = enable;
917 ALOGV("VSync Injections disabled");
918 mEventQueue.setEventThread(mSFEventThread);
919 mVSyncInjector.clear();
920 }
921 return NO_ERROR;
922}
923
924status_t SurfaceFlinger::injectVSync(nsecs_t when) {
925 if (!mInjectVSyncs) {
926 ALOGE("VSync Injections not enabled");
927 return BAD_VALUE;
928 }
929 if (mInjectVSyncs && mInjectorEventThread.get() != nullptr) {
930 ALOGV("Injecting VSync inside SurfaceFlinger");
931 mVSyncInjector->onInjectSyncEvent(when);
932 }
933 return NO_ERROR;
934}
935
936// ----------------------------------------------------------------------------
937
Jorim Jaggiaaef0982017-06-08 23:55:29 -0700938sp<IDisplayEventConnection> SurfaceFlinger::createDisplayEventConnection(
939 ISurfaceComposer::VsyncSource vsyncSource) {
940 if (vsyncSource == eVsyncSourceSurfaceFlinger) {
941 return mSFEventThread->createEventConnection();
942 } else {
943 return mEventThread->createEventConnection();
944 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +0000945}
946
947// ----------------------------------------------------------------------------
948
949void SurfaceFlinger::waitForEvent() {
950 mEventQueue.waitMessage();
951}
952
953void SurfaceFlinger::signalTransaction() {
954 mEventQueue.invalidate();
955}
956
957void SurfaceFlinger::signalLayerUpdate() {
958 mEventQueue.invalidate();
959}
960
961void SurfaceFlinger::signalRefresh() {
962 mEventQueue.refresh();
963}
964
965status_t SurfaceFlinger::postMessageAsync(const sp<MessageBase>& msg,
966 nsecs_t reltime, uint32_t /* flags */) {
967 return mEventQueue.postMessage(msg, reltime);
968}
969
970status_t SurfaceFlinger::postMessageSync(const sp<MessageBase>& msg,
971 nsecs_t reltime, uint32_t /* flags */) {
972 status_t res = mEventQueue.postMessage(msg, reltime);
973 if (res == NO_ERROR) {
974 msg->wait();
975 }
976 return res;
977}
978
979void SurfaceFlinger::run() {
980 do {
981 waitForEvent();
982 } while (true);
983}
984
985void SurfaceFlinger::enableHardwareVsync() {
986 Mutex::Autolock _l(mHWVsyncLock);
987 if (!mPrimaryHWVsyncEnabled && mHWVsyncAvailable) {
988 mPrimaryDispSync.beginResync();
989 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
990 mEventControlThread->setVsyncEnabled(true);
991 mPrimaryHWVsyncEnabled = true;
992 }
993}
994
995void SurfaceFlinger::resyncToHardwareVsync(bool makeAvailable) {
996 Mutex::Autolock _l(mHWVsyncLock);
997
998 if (makeAvailable) {
999 mHWVsyncAvailable = true;
1000 } else if (!mHWVsyncAvailable) {
1001 // Hardware vsync is not currently available, so abort the resync
1002 // attempt for now
1003 return;
1004 }
1005
1006 const nsecs_t period =
1007 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
1008
1009 mPrimaryDispSync.reset();
1010 mPrimaryDispSync.setPeriod(period);
1011
1012 if (!mPrimaryHWVsyncEnabled) {
1013 mPrimaryDispSync.beginResync();
1014 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, true);
1015 mEventControlThread->setVsyncEnabled(true);
1016 mPrimaryHWVsyncEnabled = true;
1017 }
1018}
1019
1020void SurfaceFlinger::disableHardwareVsync(bool makeUnavailable) {
1021 Mutex::Autolock _l(mHWVsyncLock);
1022 if (mPrimaryHWVsyncEnabled) {
1023 //eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, false);
1024 mEventControlThread->setVsyncEnabled(false);
1025 mPrimaryDispSync.endResync();
1026 mPrimaryHWVsyncEnabled = false;
1027 }
1028 if (makeUnavailable) {
1029 mHWVsyncAvailable = false;
1030 }
1031}
1032
1033void SurfaceFlinger::resyncWithRateLimit() {
1034 static constexpr nsecs_t kIgnoreDelay = ms2ns(500);
1035 if (systemTime() - mLastSwapTime > kIgnoreDelay) {
1036 resyncToHardwareVsync(false);
1037 }
1038}
1039
Steven Thomas3cfac282017-02-06 12:29:30 -08001040void SurfaceFlinger::onVSyncReceived(HWComposer* /*composer*/, int type,
1041 nsecs_t timestamp) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001042 bool needsHwVsync = false;
1043
1044 { // Scope for the lock
1045 Mutex::Autolock _l(mHWVsyncLock);
1046 if (type == 0 && mPrimaryHWVsyncEnabled) {
1047 needsHwVsync = mPrimaryDispSync.addResyncSample(timestamp);
1048 }
1049 }
1050
1051 if (needsHwVsync) {
1052 enableHardwareVsync();
1053 } else {
1054 disableHardwareVsync(false);
1055 }
1056}
1057
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001058void SurfaceFlinger::getCompositorTiming(CompositorTiming* compositorTiming) {
Brian Andersond0010582017-03-07 13:20:31 -08001059 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001060 *compositorTiming = mCompositorTiming;
1061}
1062
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001063void SurfaceFlinger::onHotplugReceived(HWComposer* /*composer*/, int type, bool connected) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001064 if (mEventThread == NULL) {
1065 // This is a temporary workaround for b/7145521. A non-null pointer
1066 // does not mean EventThread has finished initializing, so this
1067 // is not a correct fix.
1068 ALOGW("WARNING: EventThread not started, ignoring hotplug");
1069 return;
1070 }
1071
1072 if (uint32_t(type) < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
1073 Mutex::Autolock _l(mStateLock);
1074 if (connected) {
1075 createBuiltinDisplayLocked((DisplayDevice::DisplayType)type);
1076 } else {
1077 mCurrentState.displays.removeItem(mBuiltinDisplays[type]);
1078 mBuiltinDisplays[type].clear();
1079 }
1080 setTransactionFlags(eDisplayTransactionNeeded);
1081
1082 // Defer EventThread notification until SF has updated mDisplays.
1083 }
1084}
1085
Steven Thomas3cfac282017-02-06 12:29:30 -08001086void SurfaceFlinger::onInvalidateReceived(HWComposer* /*composer*/) {
1087 repaintEverything();
1088}
1089
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001090void SurfaceFlinger::eventControl(int disp, int event, int enabled) {
1091 ATRACE_CALL();
1092 getHwComposer().eventControl(disp, event, enabled);
1093}
1094
1095void SurfaceFlinger::onMessageReceived(int32_t what) {
1096 ATRACE_CALL();
1097 switch (what) {
1098 case MessageQueue::INVALIDATE: {
1099 bool refreshNeeded = handleMessageTransaction();
1100 refreshNeeded |= handleMessageInvalidate();
1101 refreshNeeded |= mRepaintEverything;
1102 if (refreshNeeded) {
1103 // Signal a refresh if a transaction modified the window state,
1104 // a new buffer was latched, or if HWC has requested a full
1105 // repaint
1106 signalRefresh();
1107 }
1108 break;
1109 }
1110 case MessageQueue::REFRESH: {
1111 handleMessageRefresh();
1112 break;
1113 }
1114 }
1115}
1116
1117bool SurfaceFlinger::handleMessageTransaction() {
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08001118 uint32_t transactionFlags = peekTransactionFlags();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001119 if (transactionFlags) {
1120 handleTransaction(transactionFlags);
1121 return true;
1122 }
1123 return false;
1124}
1125
1126bool SurfaceFlinger::handleMessageInvalidate() {
1127 ATRACE_CALL();
1128 return handlePageFlip();
1129}
1130
1131void SurfaceFlinger::handleMessageRefresh() {
1132 ATRACE_CALL();
1133
1134 nsecs_t refreshStartTime = systemTime(SYSTEM_TIME_MONOTONIC);
1135
Brian Andersond6927fb2016-07-23 23:37:30 -07001136 preComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001137 rebuildLayerStacks();
1138 setUpHWComposer();
1139 doDebugFlashRegions();
1140 doComposition();
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001141 postComposition(refreshStartTime);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001142}
1143
1144void SurfaceFlinger::doDebugFlashRegions()
1145{
1146 // is debugging enabled
1147 if (CC_LIKELY(!mDebugRegion))
1148 return;
1149
1150 const bool repaintEverything = mRepaintEverything;
1151 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1152 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1153 if (hw->isDisplayOn()) {
1154 // transform the dirty region into this screen's coordinate space
1155 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1156 if (!dirtyRegion.isEmpty()) {
1157 // redraw the whole screen
1158 doComposeSurfaces(hw, Region(hw->bounds()));
1159
1160 // and draw the dirty region
1161 const int32_t height = hw->getHeight();
1162 RenderEngine& engine(getRenderEngine());
1163 engine.fillRegionWithColor(dirtyRegion, height, 1, 0, 1, 1);
1164
1165 hw->compositionComplete();
1166 hw->swapBuffers(getHwComposer());
1167 }
1168 }
1169 }
1170
1171 postFramebuffer();
1172
1173 if (mDebugRegion > 1) {
1174 usleep(mDebugRegion * 1000);
1175 }
1176
1177 HWComposer& hwc(getHwComposer());
1178 if (hwc.initCheck() == NO_ERROR) {
1179 status_t err = hwc.prepare();
1180 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1181 }
1182}
1183
Brian Andersond6927fb2016-07-23 23:37:30 -07001184void SurfaceFlinger::preComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001185{
1186 bool needExtraInvalidate = false;
Robert Carr2047fae2016-11-28 14:09:09 -08001187 mDrawingState.traverseInZOrder([&](Layer* layer) {
1188 if (layer->onPreComposition(refreshStartTime)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001189 needExtraInvalidate = true;
1190 }
Robert Carr2047fae2016-11-28 14:09:09 -08001191 });
1192
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001193 if (needExtraInvalidate) {
1194 signalLayerUpdate();
1195 }
1196}
1197
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001198void SurfaceFlinger::updateCompositorTiming(
1199 nsecs_t vsyncPhase, nsecs_t vsyncInterval, nsecs_t compositeTime,
1200 std::shared_ptr<FenceTime>& presentFenceTime) {
1201 // Update queue of past composite+present times and determine the
1202 // most recently known composite to present latency.
1203 mCompositePresentTimes.push({compositeTime, presentFenceTime});
1204 nsecs_t compositeToPresentLatency = -1;
1205 while (!mCompositePresentTimes.empty()) {
1206 CompositePresentTime& cpt = mCompositePresentTimes.front();
1207 // Cached values should have been updated before calling this method,
1208 // which helps avoid duplicate syscalls.
1209 nsecs_t displayTime = cpt.display->getCachedSignalTime();
1210 if (displayTime == Fence::SIGNAL_TIME_PENDING) {
1211 break;
1212 }
1213 compositeToPresentLatency = displayTime - cpt.composite;
1214 mCompositePresentTimes.pop();
1215 }
1216
1217 // Don't let mCompositePresentTimes grow unbounded, just in case.
1218 while (mCompositePresentTimes.size() > 16) {
1219 mCompositePresentTimes.pop();
1220 }
1221
Brian Andersond0010582017-03-07 13:20:31 -08001222 setCompositorTimingSnapped(
1223 vsyncPhase, vsyncInterval, compositeToPresentLatency);
1224}
1225
1226void SurfaceFlinger::setCompositorTimingSnapped(nsecs_t vsyncPhase,
1227 nsecs_t vsyncInterval, nsecs_t compositeToPresentLatency) {
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001228 // Integer division and modulo round toward 0 not -inf, so we need to
1229 // treat negative and positive offsets differently.
Brian Andersond0010582017-03-07 13:20:31 -08001230 nsecs_t idealLatency = (sfVsyncPhaseOffsetNs > 0) ?
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001231 (vsyncInterval - (sfVsyncPhaseOffsetNs % vsyncInterval)) :
1232 ((-sfVsyncPhaseOffsetNs) % vsyncInterval);
1233
Brian Andersond0010582017-03-07 13:20:31 -08001234 // Just in case sfVsyncPhaseOffsetNs == -vsyncInterval.
1235 if (idealLatency <= 0) {
1236 idealLatency = vsyncInterval;
1237 }
1238
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001239 // Snap the latency to a value that removes scheduling jitter from the
1240 // composition and present times, which often have >1ms of jitter.
1241 // Reducing jitter is important if an app attempts to extrapolate
1242 // something (such as user input) to an accurate diasplay time.
1243 // Snapping also allows an app to precisely calculate sfVsyncPhaseOffsetNs
1244 // with (presentLatency % interval).
Brian Andersond0010582017-03-07 13:20:31 -08001245 nsecs_t bias = vsyncInterval / 2;
1246 int64_t extraVsyncs =
1247 (compositeToPresentLatency - idealLatency + bias) / vsyncInterval;
1248 nsecs_t snappedCompositeToPresentLatency = (extraVsyncs > 0) ?
1249 idealLatency + (extraVsyncs * vsyncInterval) : idealLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001250
Brian Andersond0010582017-03-07 13:20:31 -08001251 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001252 mCompositorTiming.deadline = vsyncPhase - idealLatency;
1253 mCompositorTiming.interval = vsyncInterval;
Brian Andersond0010582017-03-07 13:20:31 -08001254 mCompositorTiming.presentLatency = snappedCompositeToPresentLatency;
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001255}
1256
1257void SurfaceFlinger::postComposition(nsecs_t refreshStartTime)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001258{
Brian Andersond6927fb2016-07-23 23:37:30 -07001259 const HWComposer& hwc = getHwComposer();
1260 const sp<const DisplayDevice> hw(getDefaultDisplayDevice());
1261
Brian Anderson3d4039d2016-09-23 16:31:30 -07001262 std::shared_ptr<FenceTime> glCompositionDoneFenceTime;
1263 if (getHwComposer().hasGlesComposition(hw->getHwcDisplayId())) {
1264 glCompositionDoneFenceTime =
1265 std::make_shared<FenceTime>(hw->getClientTargetAcquireFence());
1266 mGlCompositionDoneTimeline.push(glCompositionDoneFenceTime);
1267 } else {
1268 glCompositionDoneFenceTime = FenceTime::NO_FENCE;
1269 }
1270 mGlCompositionDoneTimeline.updateSignalTimes();
1271
Brian Anderson4e606e32017-03-16 15:34:57 -07001272 sp<Fence> retireFence = mHwc->getDisplayFence(HWC_DISPLAY_PRIMARY);
1273 auto retireFenceTime = std::make_shared<FenceTime>(retireFence);
Brian Anderson3d4039d2016-09-23 16:31:30 -07001274 mDisplayTimeline.push(retireFenceTime);
1275 mDisplayTimeline.updateSignalTimes();
Brian Andersond6927fb2016-07-23 23:37:30 -07001276
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001277 nsecs_t vsyncPhase = mPrimaryDispSync.computeNextRefresh(0);
1278 nsecs_t vsyncInterval = mPrimaryDispSync.getPeriod();
1279
1280 // We use the refreshStartTime which might be sampled a little later than
1281 // when we started doing work for this frame, but that should be okay
1282 // since updateCompositorTiming has snapping logic.
1283 updateCompositorTiming(
1284 vsyncPhase, vsyncInterval, refreshStartTime, retireFenceTime);
Brian Andersond0010582017-03-07 13:20:31 -08001285 CompositorTiming compositorTiming;
1286 {
1287 std::lock_guard<std::mutex> lock(mCompositorTimingLock);
1288 compositorTiming = mCompositorTiming;
1289 }
Brian Anderson0a61b0c2016-12-07 14:55:56 -08001290
Robert Carr2047fae2016-11-28 14:09:09 -08001291 mDrawingState.traverseInZOrder([&](Layer* layer) {
Brian Anderson4e606e32017-03-16 15:34:57 -07001292 // TODO(brianderson): The retire fence is incorrectly passed in as the
1293 // present fence. Fix this if this file lives on.
Robert Carr2047fae2016-11-28 14:09:09 -08001294 bool frameLatched = layer->onPostComposition(glCompositionDoneFenceTime,
Brian Anderson4e606e32017-03-16 15:34:57 -07001295 retireFenceTime, compositorTiming);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001296 if (frameLatched) {
Robert Carr2047fae2016-11-28 14:09:09 -08001297 recordBufferingStats(layer->getName().string(),
1298 layer->getOccupancyHistory(false));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001299 }
Robert Carr2047fae2016-11-28 14:09:09 -08001300 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001301
Brian Anderson4e606e32017-03-16 15:34:57 -07001302 if (retireFence->isValid()) {
1303 if (mPrimaryDispSync.addPresentFence(retireFence)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001304 enableHardwareVsync();
1305 } else {
1306 disableHardwareVsync(false);
1307 }
1308 }
1309
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08001310 if (!hasSyncFramework) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001311 if (hw->isDisplayOn()) {
1312 enableHardwareVsync();
1313 }
1314 }
1315
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001316 if (mAnimCompositionPending) {
1317 mAnimCompositionPending = false;
1318
Brian Anderson3d4039d2016-09-23 16:31:30 -07001319 if (retireFenceTime->isValid()) {
1320 mAnimFrameTracker.setActualPresentFence(std::move(retireFenceTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001321 } else {
1322 // The HWC doesn't support present fences, so use the refresh
1323 // timestamp instead.
1324 nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY);
1325 mAnimFrameTracker.setActualPresentTime(presentTime);
1326 }
1327 mAnimFrameTracker.advanceFrame();
1328 }
1329
1330 if (hw->getPowerMode() == HWC_POWER_MODE_OFF) {
1331 return;
1332 }
1333
1334 nsecs_t currentTime = systemTime();
1335 if (mHasPoweredOff) {
1336 mHasPoweredOff = false;
1337 } else {
1338 nsecs_t period = mPrimaryDispSync.getPeriod();
1339 nsecs_t elapsedTime = currentTime - mLastSwapTime;
1340 size_t numPeriods = static_cast<size_t>(elapsedTime / period);
1341 if (numPeriods < NUM_BUCKETS - 1) {
1342 mFrameBuckets[numPeriods] += elapsedTime;
1343 } else {
1344 mFrameBuckets[NUM_BUCKETS - 1] += elapsedTime;
1345 }
1346 mTotalTime += elapsedTime;
1347 }
1348 mLastSwapTime = currentTime;
1349}
1350
1351void SurfaceFlinger::rebuildLayerStacks() {
1352 // rebuild the visible layer list per screen
1353 if (CC_UNLIKELY(mVisibleRegionsDirty)) {
1354 ATRACE_CALL();
1355 mVisibleRegionsDirty = false;
1356 invalidateHwcGeometry();
1357
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001358 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1359 Region opaqueRegion;
1360 Region dirtyRegion;
1361 Vector< sp<Layer> > layersSortedByZ;
1362 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1363 const Transform& tr(hw->getTransform());
1364 const Rect bounds(hw->getBounds());
1365 if (hw->isDisplayOn()) {
Chia-I Wuab0c3192017-08-01 11:29:00 -07001366 computeVisibleRegions(hw, dirtyRegion, opaqueRegion);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001367
Robert Carr2047fae2016-11-28 14:09:09 -08001368 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001369 if (layer->getLayerStack() == hw->getLayerStack()) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001370 Region drawRegion(tr.transform(
1371 layer->visibleNonTransparentRegion));
1372 drawRegion.andSelf(bounds);
1373 if (!drawRegion.isEmpty()) {
1374 layersSortedByZ.add(layer);
1375 }
1376 }
Robert Carr2047fae2016-11-28 14:09:09 -08001377 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001378 }
1379 hw->setVisibleLayersSortedByZ(layersSortedByZ);
1380 hw->undefinedRegion.set(bounds);
1381 hw->undefinedRegion.subtractSelf(tr.transform(opaqueRegion));
1382 hw->dirtyRegion.orSelf(dirtyRegion);
1383 }
1384 }
1385}
1386
1387void SurfaceFlinger::setUpHWComposer() {
1388 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1389 bool dirty = !mDisplays[dpy]->getDirtyRegion(false).isEmpty();
1390 bool empty = mDisplays[dpy]->getVisibleLayersSortedByZ().size() == 0;
1391 bool wasEmpty = !mDisplays[dpy]->lastCompositionHadVisibleLayers;
1392
1393 // If nothing has changed (!dirty), don't recompose.
1394 // If something changed, but we don't currently have any visible layers,
1395 // and didn't when we last did a composition, then skip it this time.
1396 // The second rule does two things:
1397 // - When all layers are removed from a display, we'll emit one black
1398 // frame, then nothing more until we get new layers.
1399 // - When a display is created with a private layer stack, we won't
1400 // emit any black frames until a layer is added to the layer stack.
1401 bool mustRecompose = dirty && !(empty && wasEmpty);
1402
1403 ALOGV_IF(mDisplays[dpy]->getDisplayType() == DisplayDevice::DISPLAY_VIRTUAL,
1404 "dpy[%zu]: %s composition (%sdirty %sempty %swasEmpty)", dpy,
1405 mustRecompose ? "doing" : "skipping",
1406 dirty ? "+" : "-",
1407 empty ? "+" : "-",
1408 wasEmpty ? "+" : "-");
1409
1410 mDisplays[dpy]->beginFrame(mustRecompose);
1411
1412 if (mustRecompose) {
1413 mDisplays[dpy]->lastCompositionHadVisibleLayers = !empty;
1414 }
1415 }
1416
1417 HWComposer& hwc(getHwComposer());
1418 if (hwc.initCheck() == NO_ERROR) {
1419 // build the h/w work list
1420 if (CC_UNLIKELY(mHwWorkListDirty)) {
1421 mHwWorkListDirty = false;
1422 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1423 sp<const DisplayDevice> hw(mDisplays[dpy]);
1424 const int32_t id = hw->getHwcDisplayId();
1425 if (id >= 0) {
1426 const Vector< sp<Layer> >& currentLayers(
1427 hw->getVisibleLayersSortedByZ());
1428 const size_t count = currentLayers.size();
1429 if (hwc.createWorkList(id, count) == NO_ERROR) {
1430 HWComposer::LayerListIterator cur = hwc.begin(id);
1431 const HWComposer::LayerListIterator end = hwc.end(id);
1432 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1433 const sp<Layer>& layer(currentLayers[i]);
1434 layer->setGeometry(hw, *cur);
1435 if (mDebugDisableHWC || mDebugRegion || mDaltonize || mHasColorMatrix) {
1436 cur->setSkip(true);
1437 }
1438 }
1439 }
1440 }
1441 }
1442 }
1443
1444 // set the per-frame data
1445 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1446 sp<const DisplayDevice> hw(mDisplays[dpy]);
1447 const int32_t id = hw->getHwcDisplayId();
1448 if (id >= 0) {
1449 const Vector< sp<Layer> >& currentLayers(
1450 hw->getVisibleLayersSortedByZ());
1451 const size_t count = currentLayers.size();
1452 HWComposer::LayerListIterator cur = hwc.begin(id);
1453 const HWComposer::LayerListIterator end = hwc.end(id);
1454 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1455 /*
1456 * update the per-frame h/w composer data for each layer
1457 * and build the transparent region of the FB
1458 */
1459 const sp<Layer>& layer(currentLayers[i]);
1460 layer->setPerFrameData(hw, *cur);
1461 }
1462 }
1463 }
1464
1465 // If possible, attempt to use the cursor overlay on each display.
1466 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1467 sp<const DisplayDevice> hw(mDisplays[dpy]);
1468 const int32_t id = hw->getHwcDisplayId();
1469 if (id >= 0) {
1470 const Vector< sp<Layer> >& currentLayers(
1471 hw->getVisibleLayersSortedByZ());
1472 const size_t count = currentLayers.size();
1473 HWComposer::LayerListIterator cur = hwc.begin(id);
1474 const HWComposer::LayerListIterator end = hwc.end(id);
1475 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1476 const sp<Layer>& layer(currentLayers[i]);
1477 if (layer->isPotentialCursor()) {
1478 cur->setIsCursorLayerHint();
1479 break;
1480 }
1481 }
1482 }
1483 }
1484
1485 status_t err = hwc.prepare();
1486 ALOGE_IF(err, "HWComposer::prepare failed (%s)", strerror(-err));
1487
1488 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1489 sp<const DisplayDevice> hw(mDisplays[dpy]);
1490 hw->prepareFrame(hwc);
1491 }
1492 }
1493}
1494
1495void SurfaceFlinger::doComposition() {
1496 ATRACE_CALL();
1497 const bool repaintEverything = android_atomic_and(0, &mRepaintEverything);
1498 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1499 const sp<DisplayDevice>& hw(mDisplays[dpy]);
1500 if (hw->isDisplayOn()) {
1501 // transform the dirty region into this screen's coordinate space
1502 const Region dirtyRegion(hw->getDirtyRegion(repaintEverything));
1503
1504 // repaint the framebuffer (if needed)
1505 doDisplayComposition(hw, dirtyRegion);
1506
1507 hw->dirtyRegion.clear();
1508 hw->flip(hw->swapRegion);
1509 hw->swapRegion.clear();
1510 }
1511 // inform the h/w that we're done compositing
1512 hw->compositionComplete();
1513 }
1514 postFramebuffer();
1515}
1516
1517void SurfaceFlinger::postFramebuffer()
1518{
1519 ATRACE_CALL();
1520
1521 const nsecs_t now = systemTime();
1522 mDebugInSwapBuffers = now;
1523
1524 HWComposer& hwc(getHwComposer());
1525 if (hwc.initCheck() == NO_ERROR) {
1526 if (!hwc.supportsFramebufferTarget()) {
1527 // EGL spec says:
1528 // "surface must be bound to the calling thread's current context,
1529 // for the current rendering API."
1530 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1531 }
1532 hwc.commit();
1533 }
1534
1535 // make the default display current because the VirtualDisplayDevice code cannot
1536 // deal with dequeueBuffer() being called outside of the composition loop; however
1537 // the code below can call glFlush() which is allowed (and does in some case) call
1538 // dequeueBuffer().
1539 getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext);
1540
1541 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1542 sp<const DisplayDevice> hw(mDisplays[dpy]);
1543 const Vector< sp<Layer> >& currentLayers(hw->getVisibleLayersSortedByZ());
1544 hw->onSwapBuffersCompleted(hwc);
1545 const size_t count = currentLayers.size();
1546 int32_t id = hw->getHwcDisplayId();
1547 if (id >=0 && hwc.initCheck() == NO_ERROR) {
1548 HWComposer::LayerListIterator cur = hwc.begin(id);
1549 const HWComposer::LayerListIterator end = hwc.end(id);
1550 for (size_t i = 0; cur != end && i < count; ++i, ++cur) {
1551 currentLayers[i]->onLayerDisplayed(hw, &*cur);
1552 }
1553 } else {
1554 for (size_t i = 0; i < count; i++) {
1555 currentLayers[i]->onLayerDisplayed(hw, NULL);
1556 }
1557 }
1558 }
1559
1560 mLastSwapBufferTime = systemTime() - now;
1561 mDebugInSwapBuffers = 0;
1562
1563 uint32_t flipCount = getDefaultDisplayDevice()->getPageFlipCount();
1564 if (flipCount % LOG_FRAME_STATS_PERIOD == 0) {
1565 logFrameStats();
1566 }
1567}
1568
1569void SurfaceFlinger::handleTransaction(uint32_t transactionFlags)
1570{
1571 ATRACE_CALL();
1572
1573 // here we keep a copy of the drawing state (that is the state that's
1574 // going to be overwritten by handleTransactionLocked()) outside of
1575 // mStateLock so that the side-effects of the State assignment
1576 // don't happen with mStateLock held (which can cause deadlocks).
1577 State drawingState(mDrawingState);
1578
1579 Mutex::Autolock _l(mStateLock);
1580 const nsecs_t now = systemTime();
1581 mDebugInTransaction = now;
1582
1583 // Here we're guaranteed that some transaction flags are set
1584 // so we can call handleTransactionLocked() unconditionally.
1585 // We call getTransactionFlags(), which will also clear the flags,
1586 // with mStateLock held to guarantee that mCurrentState won't change
1587 // until the transaction is committed.
1588
1589 transactionFlags = getTransactionFlags(eTransactionMask);
1590 handleTransactionLocked(transactionFlags);
1591
1592 mLastTransactionTime = systemTime() - now;
1593 mDebugInTransaction = 0;
1594 invalidateHwcGeometry();
1595 // here the transaction has been committed
1596}
1597
1598void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags)
1599{
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001600 // Notify all layers of available frames
Robert Carr2047fae2016-11-28 14:09:09 -08001601 mCurrentState.traverseInZOrder([](Layer* layer) {
1602 layer->notifyAvailableFrames();
1603 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001604
1605 /*
1606 * Traversal of the children
1607 * (perform the transaction for each of them if needed)
1608 */
1609
1610 if (transactionFlags & eTraversalNeeded) {
Robert Carr2047fae2016-11-28 14:09:09 -08001611 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001612 uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);
Robert Carr2047fae2016-11-28 14:09:09 -08001613 if (!trFlags) return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001614
1615 const uint32_t flags = layer->doTransaction(0);
1616 if (flags & Layer::eVisibleRegion)
1617 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001618 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001619 }
1620
1621 /*
1622 * Perform display own transactions if needed
1623 */
1624
1625 if (transactionFlags & eDisplayTransactionNeeded) {
1626 // here we take advantage of Vector's copy-on-write semantics to
1627 // improve performance by skipping the transaction entirely when
1628 // know that the lists are identical
1629 const KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);
1630 const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);
1631 if (!curr.isIdenticalTo(draw)) {
1632 mVisibleRegionsDirty = true;
1633 const size_t cc = curr.size();
1634 size_t dc = draw.size();
1635
1636 // find the displays that were removed
1637 // (ie: in drawing state but not in current state)
1638 // also handle displays that changed
1639 // (ie: displays that are in both lists)
1640 for (size_t i=0 ; i<dc ; i++) {
1641 const ssize_t j = curr.indexOfKey(draw.keyAt(i));
1642 if (j < 0) {
1643 // in drawing state but not in current state
1644 if (!draw[i].isMainDisplay()) {
1645 // Call makeCurrent() on the primary display so we can
1646 // be sure that nothing associated with this display
1647 // is current.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001648 const sp<const DisplayDevice> defaultDisplay(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001649 defaultDisplay->makeCurrent(mEGLDisplay, mEGLContext);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001650 sp<DisplayDevice> hw(getDisplayDeviceLocked(draw.keyAt(i)));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001651 if (hw != NULL)
1652 hw->disconnect(getHwComposer());
1653 if (draw[i].type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES)
1654 mEventThread->onHotplugReceived(draw[i].type, false);
1655 mDisplays.removeItem(draw.keyAt(i));
1656 } else {
1657 ALOGW("trying to remove the main display");
1658 }
1659 } else {
1660 // this display is in both lists. see if something changed.
1661 const DisplayDeviceState& state(curr[j]);
1662 const wp<IBinder>& display(curr.keyAt(j));
1663 const sp<IBinder> state_binder = IInterface::asBinder(state.surface);
1664 const sp<IBinder> draw_binder = IInterface::asBinder(draw[i].surface);
1665 if (state_binder != draw_binder) {
1666 // changing the surface is like destroying and
1667 // recreating the DisplayDevice, so we just remove it
1668 // from the drawing state, so that it get re-added
1669 // below.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001670 sp<DisplayDevice> hw(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001671 if (hw != NULL)
1672 hw->disconnect(getHwComposer());
1673 mDisplays.removeItem(display);
1674 mDrawingState.displays.removeItemsAt(i);
1675 dc--; i--;
1676 // at this point we must loop to the next item
1677 continue;
1678 }
1679
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001680 const sp<DisplayDevice> disp(getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001681 if (disp != NULL) {
1682 if (state.layerStack != draw[i].layerStack) {
1683 disp->setLayerStack(state.layerStack);
1684 }
1685 if ((state.orientation != draw[i].orientation)
1686 || (state.viewport != draw[i].viewport)
1687 || (state.frame != draw[i].frame))
1688 {
1689 disp->setProjection(state.orientation,
1690 state.viewport, state.frame);
1691 }
1692 if (state.width != draw[i].width || state.height != draw[i].height) {
1693 disp->setDisplaySize(state.width, state.height);
1694 }
1695 }
1696 }
1697 }
1698
1699 // find displays that were added
1700 // (ie: in current state but not in drawing state)
1701 for (size_t i=0 ; i<cc ; i++) {
1702 if (draw.indexOfKey(curr.keyAt(i)) < 0) {
1703 const DisplayDeviceState& state(curr[i]);
1704
1705 sp<DisplaySurface> dispSurface;
1706 sp<IGraphicBufferProducer> producer;
1707 sp<IGraphicBufferProducer> bqProducer;
1708 sp<IGraphicBufferConsumer> bqConsumer;
Mathias Agopian0556d792017-03-22 15:49:32 -07001709 BufferQueue::createBufferQueue(&bqProducer, &bqConsumer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001710
1711 int32_t hwcDisplayId = -1;
1712 if (state.isVirtualDisplay()) {
1713 // Virtual displays without a surface are dormant:
1714 // they have external state (layer stack, projection,
1715 // etc.) but no internal state (i.e. a DisplayDevice).
1716 if (state.surface != NULL) {
1717
1718 int width = 0;
1719 int status = state.surface->query(
1720 NATIVE_WINDOW_WIDTH, &width);
1721 ALOGE_IF(status != NO_ERROR,
1722 "Unable to query width (%d)", status);
1723 int height = 0;
1724 status = state.surface->query(
1725 NATIVE_WINDOW_HEIGHT, &height);
1726 ALOGE_IF(status != NO_ERROR,
1727 "Unable to query height (%d)", status);
1728 if (mUseHwcVirtualDisplays &&
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08001729 (SurfaceFlinger::maxVirtualDisplaySize == 0 ||
1730 (width <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize) &&
1731 height <= static_cast<int>(SurfaceFlinger::maxVirtualDisplaySize)))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001732 hwcDisplayId = allocateHwcDisplayId(state.type);
1733 }
1734
1735 sp<VirtualDisplaySurface> vds = new VirtualDisplaySurface(
1736 *mHwc, hwcDisplayId, state.surface,
1737 bqProducer, bqConsumer, state.displayName);
1738
1739 dispSurface = vds;
1740 producer = vds;
1741 }
1742 } else {
1743 ALOGE_IF(state.surface!=NULL,
1744 "adding a supported display, but rendering "
1745 "surface is provided (%p), ignoring it",
1746 state.surface.get());
1747 hwcDisplayId = allocateHwcDisplayId(state.type);
1748 // for supported (by hwc) displays we provide our
1749 // own rendering surface
1750 dispSurface = new FramebufferSurface(*mHwc, state.type,
1751 bqConsumer);
1752 producer = bqProducer;
1753 }
1754
1755 const wp<IBinder>& display(curr.keyAt(i));
1756 if (dispSurface != NULL) {
1757 sp<DisplayDevice> hw = new DisplayDevice(this,
1758 state.type, hwcDisplayId,
1759 mHwc->getFormat(hwcDisplayId), state.isSecure,
1760 display, dispSurface, producer,
Courtney Goeltzenleuchter4f20f9c2017-04-06 08:18:34 -06001761 mRenderEngine->getEGLConfig(), false);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001762 hw->setLayerStack(state.layerStack);
1763 hw->setProjection(state.orientation,
1764 state.viewport, state.frame);
1765 hw->setDisplayName(state.displayName);
1766 mDisplays.add(display, hw);
1767 if (state.isVirtualDisplay()) {
1768 if (hwcDisplayId >= 0) {
1769 mHwc->setVirtualDisplayProperties(hwcDisplayId,
1770 hw->getWidth(), hw->getHeight(),
1771 hw->getFormat());
1772 }
1773 } else {
1774 mEventThread->onHotplugReceived(state.type, true);
1775 }
1776 }
1777 }
1778 }
1779 }
1780 }
1781
1782 if (transactionFlags & (eTraversalNeeded|eDisplayTransactionNeeded)) {
1783 // The transform hint might have changed for some layers
1784 // (either because a display has changed, or because a layer
1785 // as changed).
1786 //
1787 // Walk through all the layers in currentLayers,
1788 // and update their transform hint.
1789 //
1790 // If a layer is visible only on a single display, then that
1791 // display is used to calculate the hint, otherwise we use the
1792 // default display.
1793 //
1794 // NOTE: we do this here, rather than in rebuildLayerStacks() so that
1795 // the hint is set before we acquire a buffer from the surface texture.
1796 //
1797 // NOTE: layer transactions have taken place already, so we use their
1798 // drawing state. However, SurfaceFlinger's own transaction has not
1799 // happened yet, so we must use the current state layer list
1800 // (soon to become the drawing state list).
1801 //
1802 sp<const DisplayDevice> disp;
1803 uint32_t currentlayerStack = 0;
Robert Carr2047fae2016-11-28 14:09:09 -08001804 bool first = true;
1805 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001806 // NOTE: we rely on the fact that layers are sorted by
1807 // layerStack first (so we don't have to traverse the list
1808 // of displays for every layer).
Robert Carr1f0a16a2016-10-24 16:27:39 -07001809 uint32_t layerStack = layer->getLayerStack();
Robert Carr2047fae2016-11-28 14:09:09 -08001810 if (first || currentlayerStack != layerStack) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001811 currentlayerStack = layerStack;
1812 // figure out if this layerstack is mirrored
1813 // (more than one display) if so, pick the default display,
1814 // if not, pick the only display it's on.
1815 disp.clear();
1816 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1817 sp<const DisplayDevice> hw(mDisplays[dpy]);
1818 if (hw->getLayerStack() == currentlayerStack) {
1819 if (disp == NULL) {
1820 disp = hw;
1821 } else {
1822 disp = NULL;
1823 break;
1824 }
1825 }
1826 }
1827 }
1828 if (disp == NULL) {
1829 // NOTE: TEMPORARY FIX ONLY. Real fix should cause layers to
1830 // redraw after transform hint changes. See bug 8508397.
1831
1832 // could be null when this layer is using a layerStack
1833 // that is not visible on any display. Also can occur at
1834 // screen off/on times.
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07001835 disp = getDefaultDisplayDeviceLocked();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001836 }
1837 layer->updateTransformHint(disp);
Robert Carr2047fae2016-11-28 14:09:09 -08001838
1839 first = false;
1840 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001841 }
1842
1843
1844 /*
1845 * Perform our own transaction if needed
1846 */
Robert Carr1f0a16a2016-10-24 16:27:39 -07001847
1848 if (mLayersAdded) {
1849 mLayersAdded = false;
1850 // Layers have been added.
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001851 mVisibleRegionsDirty = true;
1852 }
1853
1854 // some layers might have been removed, so
1855 // we need to update the regions they're exposing.
1856 if (mLayersRemoved) {
1857 mLayersRemoved = false;
1858 mVisibleRegionsDirty = true;
Robert Carr2047fae2016-11-28 14:09:09 -08001859 mDrawingState.traverseInZOrder([&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07001860 if (mLayersPendingRemoval.indexOf(layer) >= 0) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001861 // this layer is not visible anymore
1862 // TODO: we could traverse the tree from front to back and
1863 // compute the actual visible region
1864 // TODO: we could cache the transformed region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001865 Region visibleReg;
1866 visibleReg.set(layer->computeScreenBounds());
Chia-I Wuab0c3192017-08-01 11:29:00 -07001867 invalidateLayerStack(layer, visibleReg);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001868 }
Robert Carr2047fae2016-11-28 14:09:09 -08001869 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001870 }
1871
1872 commitTransaction();
1873
1874 updateCursorAsync();
1875}
1876
1877void SurfaceFlinger::updateCursorAsync()
1878{
1879 HWComposer& hwc(getHwComposer());
1880 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
1881 sp<const DisplayDevice> hw(mDisplays[dpy]);
1882 const int32_t id = hw->getHwcDisplayId();
1883 if (id < 0) {
1884 continue;
1885 }
1886 const Vector< sp<Layer> >& currentLayers(
1887 hw->getVisibleLayersSortedByZ());
1888 const size_t count = currentLayers.size();
1889 HWComposer::LayerListIterator cur = hwc.begin(id);
1890 const HWComposer::LayerListIterator end = hwc.end(id);
1891 for (size_t i=0 ; cur!=end && i<count ; ++i, ++cur) {
1892 if (cur->getCompositionType() != HWC_CURSOR_OVERLAY) {
1893 continue;
1894 }
1895 const sp<Layer>& layer(currentLayers[i]);
1896 Rect cursorPos = layer->getPosition(hw);
1897 hwc.setCursorPositionAsync(id, cursorPos);
1898 break;
1899 }
1900 }
1901}
1902
1903void SurfaceFlinger::commitTransaction()
1904{
1905 if (!mLayersPendingRemoval.isEmpty()) {
1906 // Notify removed layers now that they can't be drawn from
Robert Carr1f0a16a2016-10-24 16:27:39 -07001907 for (const auto& l : mLayersPendingRemoval) {
1908 recordBufferingStats(l->getName().string(),
1909 l->getOccupancyHistory(true));
1910 l->onRemoved();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001911 }
1912 mLayersPendingRemoval.clear();
1913 }
1914
1915 // If this transaction is part of a window animation then the next frame
1916 // we composite should be considered an animation as well.
1917 mAnimCompositionPending = mAnimTransactionPending;
1918
1919 mDrawingState = mCurrentState;
Robert Carr1f0a16a2016-10-24 16:27:39 -07001920 mDrawingState.traverseInZOrder([](Layer* layer) {
1921 layer->commitChildList();
1922 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001923 mTransactionPending = false;
1924 mAnimTransactionPending = false;
1925 mTransactionCV.broadcast();
1926}
1927
Chia-I Wuab0c3192017-08-01 11:29:00 -07001928void SurfaceFlinger::computeVisibleRegions(const sp<const DisplayDevice>& displayDevice,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001929 Region& outDirtyRegion, Region& outOpaqueRegion)
1930{
1931 ATRACE_CALL();
1932
1933 Region aboveOpaqueLayers;
1934 Region aboveCoveredLayers;
1935 Region dirty;
1936
1937 outDirtyRegion.clear();
1938
Robert Carr2047fae2016-11-28 14:09:09 -08001939 mDrawingState.traverseInReverseZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001940 // start with the whole surface at its current location
1941 const Layer::State& s(layer->getDrawingState());
1942
1943 // only consider the layers on the given layer stack
Chia-I Wuab0c3192017-08-01 11:29:00 -07001944 if (layer->getLayerStack() != displayDevice->getLayerStack())
Robert Carr2047fae2016-11-28 14:09:09 -08001945 return;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001946
1947 /*
1948 * opaqueRegion: area of a surface that is fully opaque.
1949 */
1950 Region opaqueRegion;
1951
1952 /*
1953 * visibleRegion: area of a surface that is visible on screen
1954 * and not fully transparent. This is essentially the layer's
1955 * footprint minus the opaque regions above it.
1956 * Areas covered by a translucent surface are considered visible.
1957 */
1958 Region visibleRegion;
1959
1960 /*
1961 * coveredRegion: area of a surface that is covered by all
1962 * visible regions above it (which includes the translucent areas).
1963 */
1964 Region coveredRegion;
1965
1966 /*
1967 * transparentRegion: area of a surface that is hinted to be completely
1968 * transparent. This is only used to tell when the layer has no visible
1969 * non-transparent regions and can be removed from the layer list. It
1970 * does not affect the visibleRegion of this layer or any layers
1971 * beneath it. The hint may not be correct if apps don't respect the
1972 * SurfaceView restrictions (which, sadly, some don't).
1973 */
1974 Region transparentRegion;
1975
1976
1977 // handle hidden surfaces by setting the visible region to empty
1978 if (CC_LIKELY(layer->isVisible())) {
1979 const bool translucent = !layer->isOpaque(s);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001980 Rect bounds(layer->computeScreenBounds());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001981 visibleRegion.set(bounds);
Robert Carr1f0a16a2016-10-24 16:27:39 -07001982 Transform tr = layer->getTransform();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001983 if (!visibleRegion.isEmpty()) {
1984 // Remove the transparent area from the visible region
1985 if (translucent) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001986 if (tr.preserveRects()) {
1987 // transform the transparent region
1988 transparentRegion = tr.transform(s.activeTransparentRegion);
1989 } else {
1990 // transformation too complex, can't do the
1991 // transparent region optimization.
1992 transparentRegion.clear();
1993 }
1994 }
1995
1996 // compute the opaque region
Robert Carr1f0a16a2016-10-24 16:27:39 -07001997 const int32_t layerOrientation = tr.getOrientation();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00001998 if (s.alpha==255 && !translucent &&
1999 ((layerOrientation & Transform::ROT_INVALID) == false)) {
2000 // the opaque region is the layer's footprint
2001 opaqueRegion = visibleRegion;
2002 }
2003 }
2004 }
2005
2006 // Clip the covered region to the visible region
2007 coveredRegion = aboveCoveredLayers.intersect(visibleRegion);
2008
2009 // Update aboveCoveredLayers for next (lower) layer
2010 aboveCoveredLayers.orSelf(visibleRegion);
2011
2012 // subtract the opaque region covered by the layers above us
2013 visibleRegion.subtractSelf(aboveOpaqueLayers);
2014
2015 // compute this layer's dirty region
2016 if (layer->contentDirty) {
2017 // we need to invalidate the whole region
2018 dirty = visibleRegion;
2019 // as well, as the old visible region
2020 dirty.orSelf(layer->visibleRegion);
2021 layer->contentDirty = false;
2022 } else {
2023 /* compute the exposed region:
2024 * the exposed region consists of two components:
2025 * 1) what's VISIBLE now and was COVERED before
2026 * 2) what's EXPOSED now less what was EXPOSED before
2027 *
2028 * note that (1) is conservative, we start with the whole
2029 * visible region but only keep what used to be covered by
2030 * something -- which mean it may have been exposed.
2031 *
2032 * (2) handles areas that were not covered by anything but got
2033 * exposed because of a resize.
2034 */
2035 const Region newExposed = visibleRegion - coveredRegion;
2036 const Region oldVisibleRegion = layer->visibleRegion;
2037 const Region oldCoveredRegion = layer->coveredRegion;
2038 const Region oldExposed = oldVisibleRegion - oldCoveredRegion;
2039 dirty = (visibleRegion&oldCoveredRegion) | (newExposed-oldExposed);
2040 }
2041 dirty.subtractSelf(aboveOpaqueLayers);
2042
2043 // accumulate to the screen dirty region
2044 outDirtyRegion.orSelf(dirty);
2045
2046 // Update aboveOpaqueLayers for next (lower) layer
2047 aboveOpaqueLayers.orSelf(opaqueRegion);
2048
2049 // Store the visible region in screen space
2050 layer->setVisibleRegion(visibleRegion);
2051 layer->setCoveredRegion(coveredRegion);
2052 layer->setVisibleNonTransparentRegion(
2053 visibleRegion.subtract(transparentRegion));
Robert Carr2047fae2016-11-28 14:09:09 -08002054 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002055
2056 outOpaqueRegion = aboveOpaqueLayers;
2057}
2058
Chia-I Wuab0c3192017-08-01 11:29:00 -07002059void SurfaceFlinger::invalidateLayerStack(const sp<const Layer>& layer, const Region& dirty) {
2060 uint32_t layerStack = layer->getLayerStack();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002061 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
2062 const sp<DisplayDevice>& hw(mDisplays[dpy]);
2063 if (hw->getLayerStack() == layerStack) {
2064 hw->dirtyRegion.orSelf(dirty);
2065 }
2066 }
2067}
2068
2069bool SurfaceFlinger::handlePageFlip()
2070{
Brian Andersond6927fb2016-07-23 23:37:30 -07002071 nsecs_t latchTime = systemTime();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002072 Region dirtyRegion;
2073
2074 bool visibleRegions = false;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002075 bool frameQueued = false;
2076
2077 // Store the set of layers that need updates. This set must not change as
2078 // buffers are being latched, as this could result in a deadlock.
2079 // Example: Two producers share the same command stream and:
2080 // 1.) Layer 0 is latched
2081 // 2.) Layer 0 gets a new frame
2082 // 2.) Layer 1 gets a new frame
2083 // 3.) Layer 1 is latched.
2084 // Display is now waiting on Layer 1's frame, which is behind layer 0's
2085 // second frame. But layer 0's second frame could be waiting on display.
2086 Vector<Layer*> layersWithQueuedFrames;
Robert Carr2047fae2016-11-28 14:09:09 -08002087 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002088 if (layer->hasQueuedFrame()) {
2089 frameQueued = true;
2090 if (layer->shouldPresentNow(mPrimaryDispSync)) {
Robert Carr2047fae2016-11-28 14:09:09 -08002091 layersWithQueuedFrames.push_back(layer);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002092 } else {
2093 layer->useEmptyDamage();
2094 }
2095 } else {
2096 layer->useEmptyDamage();
2097 }
Robert Carr2047fae2016-11-28 14:09:09 -08002098 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002099 for (size_t i = 0, count = layersWithQueuedFrames.size() ; i<count ; i++) {
2100 Layer* layer = layersWithQueuedFrames[i];
Brian Andersond6927fb2016-07-23 23:37:30 -07002101 const Region dirty(layer->latchBuffer(visibleRegions, latchTime));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002102 layer->useSurfaceDamage();
Chia-I Wuab0c3192017-08-01 11:29:00 -07002103 invalidateLayerStack(layer, dirty);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002104 }
2105
2106 mVisibleRegionsDirty |= visibleRegions;
2107
2108 // If we will need to wake up at some time in the future to deal with a
2109 // queued frame that shouldn't be displayed during this vsync period, wake
2110 // up during the next vsync period to check again.
2111 if (frameQueued && layersWithQueuedFrames.empty()) {
2112 signalLayerUpdate();
2113 }
2114
2115 // Only continue with the refresh if there is actually new work to do
2116 return !layersWithQueuedFrames.empty();
2117}
2118
2119void SurfaceFlinger::invalidateHwcGeometry()
2120{
2121 mHwWorkListDirty = true;
2122}
2123
2124
2125void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& hw,
2126 const Region& inDirtyRegion)
2127{
2128 // We only need to actually compose the display if:
2129 // 1) It is being handled by hardware composer, which may need this to
2130 // keep its virtual display state machine in sync, or
2131 // 2) There is work to be done (the dirty region isn't empty)
2132 bool isHwcDisplay = hw->getHwcDisplayId() >= 0;
2133 if (!isHwcDisplay && inDirtyRegion.isEmpty()) {
2134 return;
2135 }
2136
2137 Region dirtyRegion(inDirtyRegion);
2138
2139 // compute the invalid region
2140 hw->swapRegion.orSelf(dirtyRegion);
2141
2142 uint32_t flags = hw->getFlags();
2143 if (flags & DisplayDevice::SWAP_RECTANGLE) {
2144 // we can redraw only what's dirty, but since SWAP_RECTANGLE only
2145 // takes a rectangle, we must make sure to update that whole
2146 // rectangle in that case
2147 dirtyRegion.set(hw->swapRegion.bounds());
2148 } else {
2149 if (flags & DisplayDevice::PARTIAL_UPDATES) {
2150 // We need to redraw the rectangle that will be updated
2151 // (pushed to the framebuffer).
2152 // This is needed because PARTIAL_UPDATES only takes one
2153 // rectangle instead of a region (see DisplayDevice::flip())
2154 dirtyRegion.set(hw->swapRegion.bounds());
2155 } else {
2156 // we need to redraw everything (the whole screen)
2157 dirtyRegion.set(hw->bounds());
2158 hw->swapRegion = dirtyRegion;
2159 }
2160 }
2161
2162 if (CC_LIKELY(!mDaltonize && !mHasColorMatrix)) {
2163 if (!doComposeSurfaces(hw, dirtyRegion)) return;
2164 } else {
2165 RenderEngine& engine(getRenderEngine());
2166 mat4 colorMatrix = mColorMatrix;
2167 if (mDaltonize) {
2168 colorMatrix = colorMatrix * mDaltonizer();
2169 }
2170 mat4 oldMatrix = engine.setupColorTransform(colorMatrix);
2171 doComposeSurfaces(hw, dirtyRegion);
2172 engine.setupColorTransform(oldMatrix);
2173 }
2174
2175 // update the swap region and clear the dirty region
2176 hw->swapRegion.orSelf(dirtyRegion);
2177
2178 // swap buffers (presentation)
2179 hw->swapBuffers(getHwComposer());
2180}
2181
2182bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& hw, const Region& dirty)
2183{
2184 RenderEngine& engine(getRenderEngine());
2185 const int32_t id = hw->getHwcDisplayId();
2186 HWComposer& hwc(getHwComposer());
2187 HWComposer::LayerListIterator cur = hwc.begin(id);
2188 const HWComposer::LayerListIterator end = hwc.end(id);
2189
2190 bool hasGlesComposition = hwc.hasGlesComposition(id);
2191 if (hasGlesComposition) {
2192 if (!hw->makeCurrent(mEGLDisplay, mEGLContext)) {
2193 ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s",
2194 hw->getDisplayName().string());
2195 eglMakeCurrent(mEGLDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
2196 if(!getDefaultDisplayDevice()->makeCurrent(mEGLDisplay, mEGLContext)) {
2197 ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting.");
2198 }
2199 return false;
2200 }
2201
2202 // Never touch the framebuffer if we don't have any framebuffer layers
2203 const bool hasHwcComposition = hwc.hasHwcComposition(id);
2204 if (hasHwcComposition) {
2205 // when using overlays, we assume a fully transparent framebuffer
2206 // NOTE: we could reduce how much we need to clear, for instance
2207 // remove where there are opaque FB layers. however, on some
2208 // GPUs doing a "clean slate" clear might be more efficient.
2209 // We'll revisit later if needed.
2210 engine.clearWithColor(0, 0, 0, 0);
2211 } else {
2212 // we start with the whole screen area
2213 const Region bounds(hw->getBounds());
2214
2215 // we remove the scissor part
2216 // we're left with the letterbox region
2217 // (common case is that letterbox ends-up being empty)
2218 const Region letterbox(bounds.subtract(hw->getScissor()));
2219
2220 // compute the area to clear
2221 Region region(hw->undefinedRegion.merge(letterbox));
2222
2223 // but limit it to the dirty region
2224 region.andSelf(dirty);
2225
2226 // screen is already cleared here
2227 if (!region.isEmpty()) {
2228 // can happen with SurfaceView
2229 drawWormhole(hw, region);
2230 }
2231 }
2232
2233 if (hw->getDisplayType() != DisplayDevice::DISPLAY_PRIMARY) {
2234 // just to be on the safe side, we don't set the
2235 // scissor on the main display. It should never be needed
2236 // anyways (though in theory it could since the API allows it).
2237 const Rect& bounds(hw->getBounds());
2238 const Rect& scissor(hw->getScissor());
2239 if (scissor != bounds) {
2240 // scissor doesn't match the screen's dimensions, so we
2241 // need to clear everything outside of it and enable
2242 // the GL scissor so we don't draw anything where we shouldn't
2243
2244 // enable scissor for this frame
2245 const uint32_t height = hw->getHeight();
2246 engine.setScissor(scissor.left, height - scissor.bottom,
2247 scissor.getWidth(), scissor.getHeight());
2248 }
2249 }
2250 }
2251
2252 /*
2253 * and then, render the layers targeted at the framebuffer
2254 */
2255
2256 const Vector< sp<Layer> >& layers(hw->getVisibleLayersSortedByZ());
2257 const size_t count = layers.size();
2258 const Transform& tr = hw->getTransform();
2259 if (cur != end) {
2260 // we're using h/w composer
2261 for (size_t i=0 ; i<count && cur!=end ; ++i, ++cur) {
2262 const sp<Layer>& layer(layers[i]);
2263 const Region clip(dirty.intersect(tr.transform(layer->visibleRegion)));
2264 if (!clip.isEmpty()) {
2265 switch (cur->getCompositionType()) {
2266 case HWC_CURSOR_OVERLAY:
2267 case HWC_OVERLAY: {
2268 const Layer::State& state(layer->getDrawingState());
2269 if ((cur->getHints() & HWC_HINT_CLEAR_FB)
2270 && i
2271 && layer->isOpaque(state) && (state.alpha == 0xFF)
2272 && hasGlesComposition) {
2273 // never clear the very first layer since we're
2274 // guaranteed the FB is already cleared
Fabien Sanglard17487192016-12-07 13:03:32 -08002275 layer->clearWithOpenGL(hw);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002276 }
2277 break;
2278 }
2279 case HWC_FRAMEBUFFER: {
2280 layer->draw(hw, clip);
2281 break;
2282 }
2283 case HWC_FRAMEBUFFER_TARGET: {
2284 // this should not happen as the iterator shouldn't
2285 // let us get there.
2286 ALOGW("HWC_FRAMEBUFFER_TARGET found in hwc list (index=%zu)", i);
2287 break;
2288 }
2289 }
2290 }
2291 layer->setAcquireFence(hw, *cur);
2292 }
2293 } else {
2294 // we're not using h/w composer
2295 for (size_t i=0 ; i<count ; ++i) {
2296 const sp<Layer>& layer(layers[i]);
2297 const Region clip(dirty.intersect(
2298 tr.transform(layer->visibleRegion)));
2299 if (!clip.isEmpty()) {
2300 layer->draw(hw, clip);
2301 }
2302 }
2303 }
2304
2305 // disable scissor at the end of the frame
2306 engine.disableScissor();
2307 return true;
2308}
2309
2310void SurfaceFlinger::drawWormhole(const sp<const DisplayDevice>& hw, const Region& region) const {
2311 const int32_t height = hw->getHeight();
2312 RenderEngine& engine(getRenderEngine());
2313 engine.fillRegionWithColor(region, height, 0, 0, 0, 0);
2314}
2315
2316status_t SurfaceFlinger::addClientLayer(const sp<Client>& client,
2317 const sp<IBinder>& handle,
2318 const sp<IGraphicBufferProducer>& gbc,
Robert Carr1f0a16a2016-10-24 16:27:39 -07002319 const sp<Layer>& lbc,
2320 const sp<Layer>& parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002321{
2322 // add this layer to the current state list
2323 {
2324 Mutex::Autolock _l(mStateLock);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002325 if (mNumLayers >= MAX_LAYERS) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002326 return NO_MEMORY;
2327 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002328 if (parent == nullptr) {
2329 mCurrentState.layersSortedByZ.add(lbc);
2330 } else {
Chia-I Wufae51c42017-06-15 12:53:59 -07002331 if (mCurrentState.layersSortedByZ.indexOf(parent) < 0) {
2332 ALOGE("addClientLayer called with a removed parent");
2333 return NAME_NOT_FOUND;
2334 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002335 parent->addChild(lbc);
2336 }
Chia-I Wufae51c42017-06-15 12:53:59 -07002337
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002338 mGraphicBufferProducerList.add(IInterface::asBinder(gbc));
Robert Carr1f0a16a2016-10-24 16:27:39 -07002339 mLayersAdded = true;
2340 mNumLayers++;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002341 }
2342
2343 // attach this layer to the client
2344 client->attachLayer(handle, lbc);
2345
2346 return NO_ERROR;
2347}
2348
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002349status_t SurfaceFlinger::removeLayer(const sp<Layer>& layer, bool topLevelOnly) {
Robert Carr7f9b8992017-03-10 11:08:39 -08002350 Mutex::Autolock _l(mStateLock);
2351
Robert Carr1f0a16a2016-10-24 16:27:39 -07002352 const auto& p = layer->getParent();
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002353 ssize_t index;
2354 if (p != nullptr) {
2355 if (topLevelOnly) {
2356 return NO_ERROR;
2357 }
2358
Chia-I Wufae51c42017-06-15 12:53:59 -07002359 sp<Layer> ancestor = p;
2360 while (ancestor->getParent() != nullptr) {
2361 ancestor = ancestor->getParent();
2362 }
2363 if (mCurrentState.layersSortedByZ.indexOf(ancestor) < 0) {
2364 ALOGE("removeLayer called with a layer whose parent has been removed");
2365 return NAME_NOT_FOUND;
2366 }
2367
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002368 index = p->removeChild(layer);
2369 } else {
2370 index = mCurrentState.layersSortedByZ.remove(layer);
2371 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002372
Robert Carr136e2f62017-02-08 17:54:29 -08002373 // As a matter of normal operation, the LayerCleaner will produce a second
2374 // attempt to remove the surface. The Layer will be kept alive in mDrawingState
2375 // so we will succeed in promoting it, but it's already been removed
2376 // from mCurrentState. As long as we can find it in mDrawingState we have no problem
2377 // otherwise something has gone wrong and we are leaking the layer.
2378 if (index < 0 && mDrawingState.layersSortedByZ.indexOf(layer) < 0) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07002379 ALOGE("Failed to find layer (%s) in layer parent (%s).",
2380 layer->getName().string(),
2381 (p != nullptr) ? p->getName().string() : "no-parent");
2382 return BAD_VALUE;
Robert Carr136e2f62017-02-08 17:54:29 -08002383 } else if (index < 0) {
2384 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002385 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07002386
2387 mLayersPendingRemoval.add(layer);
2388 mLayersRemoved = true;
Chia-I Wufae51c42017-06-15 12:53:59 -07002389 mNumLayers -= 1 + layer->getChildrenCount();
Robert Carr1f0a16a2016-10-24 16:27:39 -07002390 setTransactionFlags(eTransactionNeeded);
2391 return NO_ERROR;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002392}
2393
Fabien Sanglardc8251eb2016-12-07 13:59:48 -08002394uint32_t SurfaceFlinger::peekTransactionFlags() {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002395 return android_atomic_release_load(&mTransactionFlags);
2396}
2397
2398uint32_t SurfaceFlinger::getTransactionFlags(uint32_t flags) {
2399 return android_atomic_and(~flags, &mTransactionFlags) & flags;
2400}
2401
2402uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) {
2403 uint32_t old = android_atomic_or(flags, &mTransactionFlags);
2404 if ((old & flags)==0) { // wake the server up
2405 signalTransaction();
2406 }
2407 return old;
2408}
2409
2410void SurfaceFlinger::setTransactionState(
2411 const Vector<ComposerState>& state,
2412 const Vector<DisplayState>& displays,
2413 uint32_t flags)
2414{
2415 ATRACE_CALL();
2416 Mutex::Autolock _l(mStateLock);
2417 uint32_t transactionFlags = 0;
2418
2419 if (flags & eAnimation) {
2420 // For window updates that are part of an animation we must wait for
2421 // previous animation "frames" to be handled.
2422 while (mAnimTransactionPending) {
2423 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2424 if (CC_UNLIKELY(err != NO_ERROR)) {
2425 // just in case something goes wrong in SF, return to the
2426 // caller after a few seconds.
2427 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out "
2428 "waiting for previous animation frame");
2429 mAnimTransactionPending = false;
2430 break;
2431 }
2432 }
2433 }
2434
2435 size_t count = displays.size();
2436 for (size_t i=0 ; i<count ; i++) {
2437 const DisplayState& s(displays[i]);
2438 transactionFlags |= setDisplayStateLocked(s);
2439 }
2440
2441 count = state.size();
2442 for (size_t i=0 ; i<count ; i++) {
2443 const ComposerState& s(state[i]);
2444 // Here we need to check that the interface we're given is indeed
2445 // one of our own. A malicious client could give us a NULL
2446 // IInterface, or one of its own or even one of our own but a
2447 // different type. All these situations would cause us to crash.
2448 //
2449 // NOTE: it would be better to use RTTI as we could directly check
2450 // that we have a Client*. however, RTTI is disabled in Android.
2451 if (s.client != NULL) {
2452 sp<IBinder> binder = IInterface::asBinder(s.client);
2453 if (binder != NULL) {
Fabien Sanglard45b20252017-01-18 16:43:18 -08002454 if (binder->queryLocalInterface(ISurfaceComposerClient::descriptor) != NULL) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002455 sp<Client> client( static_cast<Client *>(s.client.get()) );
2456 transactionFlags |= setClientStateLocked(client, s.state);
2457 }
2458 }
2459 }
2460 }
2461
2462 // If a synchronous transaction is explicitly requested without any changes,
2463 // force a transaction anyway. This can be used as a flush mechanism for
2464 // previous async transactions.
2465 if (transactionFlags == 0 && (flags & eSynchronous)) {
2466 transactionFlags = eTransactionNeeded;
2467 }
2468
2469 if (transactionFlags) {
2470 if (mInterceptor.isEnabled()) {
2471 mInterceptor.saveTransaction(state, mCurrentState.displays, displays, flags);
2472 }
2473
2474 // this triggers the transaction
2475 setTransactionFlags(transactionFlags);
2476
2477 // if this is a synchronous transaction, wait for it to take effect
2478 // before returning.
2479 if (flags & eSynchronous) {
2480 mTransactionPending = true;
2481 }
2482 if (flags & eAnimation) {
2483 mAnimTransactionPending = true;
2484 }
2485 while (mTransactionPending) {
2486 status_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));
2487 if (CC_UNLIKELY(err != NO_ERROR)) {
2488 // just in case something goes wrong in SF, return to the
2489 // called after a few seconds.
2490 ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");
2491 mTransactionPending = false;
2492 break;
2493 }
2494 }
2495 }
2496}
2497
2498uint32_t SurfaceFlinger::setDisplayStateLocked(const DisplayState& s)
2499{
2500 ssize_t dpyIdx = mCurrentState.displays.indexOfKey(s.token);
2501 if (dpyIdx < 0)
2502 return 0;
2503
2504 uint32_t flags = 0;
2505 DisplayDeviceState& disp(mCurrentState.displays.editValueAt(dpyIdx));
2506 if (disp.isValid()) {
2507 const uint32_t what = s.what;
2508 if (what & DisplayState::eSurfaceChanged) {
2509 if (IInterface::asBinder(disp.surface) != IInterface::asBinder(s.surface)) {
2510 disp.surface = s.surface;
2511 flags |= eDisplayTransactionNeeded;
2512 }
2513 }
2514 if (what & DisplayState::eLayerStackChanged) {
2515 if (disp.layerStack != s.layerStack) {
2516 disp.layerStack = s.layerStack;
2517 flags |= eDisplayTransactionNeeded;
2518 }
2519 }
2520 if (what & DisplayState::eDisplayProjectionChanged) {
2521 if (disp.orientation != s.orientation) {
2522 disp.orientation = s.orientation;
2523 flags |= eDisplayTransactionNeeded;
2524 }
2525 if (disp.frame != s.frame) {
2526 disp.frame = s.frame;
2527 flags |= eDisplayTransactionNeeded;
2528 }
2529 if (disp.viewport != s.viewport) {
2530 disp.viewport = s.viewport;
2531 flags |= eDisplayTransactionNeeded;
2532 }
2533 }
2534 if (what & DisplayState::eDisplaySizeChanged) {
2535 if (disp.width != s.width) {
2536 disp.width = s.width;
2537 flags |= eDisplayTransactionNeeded;
2538 }
2539 if (disp.height != s.height) {
2540 disp.height = s.height;
2541 flags |= eDisplayTransactionNeeded;
2542 }
2543 }
2544 }
2545 return flags;
2546}
2547
2548uint32_t SurfaceFlinger::setClientStateLocked(
2549 const sp<Client>& client,
2550 const layer_state_t& s)
2551{
2552 uint32_t flags = 0;
2553 sp<Layer> layer(client->getLayerUser(s.surface));
2554 if (layer != 0) {
2555 const uint32_t what = s.what;
2556 bool geometryAppliesWithResize =
2557 what & layer_state_t::eGeometryAppliesWithResize;
2558 if (what & layer_state_t::ePositionChanged) {
2559 if (layer->setPosition(s.x, s.y, !geometryAppliesWithResize)) {
2560 flags |= eTraversalNeeded;
2561 }
2562 }
2563 if (what & layer_state_t::eLayerChanged) {
2564 // NOTE: index needs to be calculated before we update the state
Robert Carr1f0a16a2016-10-24 16:27:39 -07002565 const auto& p = layer->getParent();
2566 if (p == nullptr) {
2567 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
2568 if (layer->setLayer(s.z) && idx >= 0) {
2569 mCurrentState.layersSortedByZ.removeAt(idx);
2570 mCurrentState.layersSortedByZ.add(layer);
2571 // we need traversal (state changed)
2572 // AND transaction (list changed)
2573 flags |= eTransactionNeeded|eTraversalNeeded;
2574 }
2575 } else {
2576 if (p->setChildLayer(layer, s.z)) {
2577 flags |= eTransactionNeeded|eTraversalNeeded;
2578 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002579 }
2580 }
2581 if (what & layer_state_t::eSizeChanged) {
2582 if (layer->setSize(s.w, s.h)) {
2583 flags |= eTraversalNeeded;
2584 }
2585 }
2586 if (what & layer_state_t::eAlphaChanged) {
2587 if (layer->setAlpha(uint8_t(255.0f*s.alpha+0.5f)))
2588 flags |= eTraversalNeeded;
2589 }
2590 if (what & layer_state_t::eMatrixChanged) {
2591 if (layer->setMatrix(s.matrix))
2592 flags |= eTraversalNeeded;
2593 }
2594 if (what & layer_state_t::eTransparentRegionChanged) {
2595 if (layer->setTransparentRegionHint(s.transparentRegion))
2596 flags |= eTraversalNeeded;
2597 }
2598 if (what & layer_state_t::eFlagsChanged) {
2599 if (layer->setFlags(s.flags, s.mask))
2600 flags |= eTraversalNeeded;
2601 }
2602 if (what & layer_state_t::eCropChanged) {
2603 if (layer->setCrop(s.crop, !geometryAppliesWithResize))
2604 flags |= eTraversalNeeded;
2605 }
2606 if (what & layer_state_t::eFinalCropChanged) {
Robert Carr6fb9ca72017-03-22 18:23:23 -07002607 if (layer->setFinalCrop(s.finalCrop, !geometryAppliesWithResize))
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002608 flags |= eTraversalNeeded;
2609 }
2610 if (what & layer_state_t::eLayerStackChanged) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002611 ssize_t idx = mCurrentState.layersSortedByZ.indexOf(layer);
Robert Carr1f0a16a2016-10-24 16:27:39 -07002612 // We only allow setting layer stacks for top level layers,
2613 // everything else inherits layer stack from its parent.
2614 if (layer->hasParent()) {
2615 ALOGE("Attempt to set layer stack on layer with parent (%s) is invalid",
2616 layer->getName().string());
2617 } else if (idx < 0) {
2618 ALOGE("Attempt to set layer stack on layer without parent (%s) that "
2619 "that also does not appear in the top level layer list. Something"
2620 " has gone wrong.", layer->getName().string());
2621 } else if (layer->setLayerStack(s.layerStack)) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002622 mCurrentState.layersSortedByZ.removeAt(idx);
2623 mCurrentState.layersSortedByZ.add(layer);
2624 // we need traversal (state changed)
2625 // AND transaction (list changed)
2626 flags |= eTransactionNeeded|eTraversalNeeded;
2627 }
2628 }
2629 if (what & layer_state_t::eDeferTransaction) {
Robert Carr0d480722017-01-10 16:42:54 -08002630 if (s.barrierHandle != nullptr) {
2631 layer->deferTransactionUntil(s.barrierHandle, s.frameNumber);
2632 } else if (s.barrierGbp != nullptr) {
2633 const sp<IGraphicBufferProducer>& gbp = s.barrierGbp;
2634 if (authenticateSurfaceTextureLocked(gbp)) {
2635 const auto& otherLayer =
2636 (static_cast<MonitoredProducer*>(gbp.get()))->getLayer();
2637 layer->deferTransactionUntil(otherLayer, s.frameNumber);
2638 } else {
2639 ALOGE("Attempt to defer transaction to to an"
2640 " unrecognized GraphicBufferProducer");
2641 }
2642 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002643 // We don't trigger a traversal here because if no other state is
2644 // changed, we don't want this to cause any more work
2645 }
Robert Carr1db73f62016-12-21 12:58:51 -08002646 if (what & layer_state_t::eReparentChildren) {
2647 if (layer->reparentChildren(s.reparentHandle)) {
2648 flags |= eTransactionNeeded|eTraversalNeeded;
2649 }
2650 }
Robert Carr9524cb32017-02-13 11:32:32 -08002651 if (what & layer_state_t::eDetachChildren) {
2652 layer->detachChildren();
2653 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002654 if (what & layer_state_t::eOverrideScalingModeChanged) {
2655 layer->setOverrideScalingMode(s.overrideScalingMode);
2656 // We don't trigger a traversal here because if no other state is
2657 // changed, we don't want this to cause any more work
2658 }
2659 }
2660 return flags;
2661}
2662
2663status_t SurfaceFlinger::createLayer(
2664 const String8& name,
2665 const sp<Client>& client,
2666 uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
Albert Chaulk479c60c2017-01-27 14:21:34 -05002667 uint32_t windowType, uint32_t ownerUid, sp<IBinder>* handle,
2668 sp<IGraphicBufferProducer>* gbp, sp<Layer>* parent)
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002669{
2670 if (int32_t(w|h) < 0) {
2671 ALOGE("createLayer() failed, w or h is negative (w=%d, h=%d)",
2672 int(w), int(h));
2673 return BAD_VALUE;
2674 }
2675
2676 status_t result = NO_ERROR;
2677
2678 sp<Layer> layer;
2679
Cody Northropbc755282017-03-31 12:00:08 -06002680 String8 uniqueName = getUniqueLayerName(name);
2681
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002682 switch (flags & ISurfaceComposerClient::eFXSurfaceMask) {
2683 case ISurfaceComposerClient::eFXSurfaceNormal:
2684 result = createNormalLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002685 uniqueName, w, h, flags, format,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002686 handle, gbp, &layer);
2687 break;
2688 case ISurfaceComposerClient::eFXSurfaceDim:
2689 result = createDimLayer(client,
Cody Northropbc755282017-03-31 12:00:08 -06002690 uniqueName, w, h, flags,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002691 handle, gbp, &layer);
2692 break;
2693 default:
2694 result = BAD_VALUE;
2695 break;
2696 }
2697
2698 if (result != NO_ERROR) {
2699 return result;
2700 }
2701
Albert Chaulk479c60c2017-01-27 14:21:34 -05002702 layer->setInfo(windowType, ownerUid);
2703
Robert Carr1f0a16a2016-10-24 16:27:39 -07002704 result = addClientLayer(client, *handle, *gbp, layer, *parent);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002705 if (result != NO_ERROR) {
2706 return result;
2707 }
2708 mInterceptor.saveSurfaceCreation(layer);
2709
2710 setTransactionFlags(eTransactionNeeded);
2711 return result;
2712}
2713
Cody Northropbc755282017-03-31 12:00:08 -06002714String8 SurfaceFlinger::getUniqueLayerName(const String8& name)
2715{
2716 bool matchFound = true;
2717 uint32_t dupeCounter = 0;
2718
2719 // Tack on our counter whether there is a hit or not, so everyone gets a tag
2720 String8 uniqueName = name + "#" + String8(std::to_string(dupeCounter).c_str());
2721
2722 // Loop over layers until we're sure there is no matching name
2723 while (matchFound) {
2724 matchFound = false;
2725 mDrawingState.traverseInZOrder([&](Layer* layer) {
2726 if (layer->getName() == uniqueName) {
2727 matchFound = true;
2728 uniqueName = name + "#" + String8(std::to_string(++dupeCounter).c_str());
2729 }
2730 });
2731 }
2732
2733 ALOGD_IF(dupeCounter > 0, "duplicate layer name: changing %s to %s", name.c_str(), uniqueName.c_str());
2734
2735 return uniqueName;
2736}
2737
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002738status_t SurfaceFlinger::createNormalLayer(const sp<Client>& client,
2739 const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
2740 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2741{
2742 // initialize the surfaces
2743 switch (format) {
2744 case PIXEL_FORMAT_TRANSPARENT:
2745 case PIXEL_FORMAT_TRANSLUCENT:
2746 format = PIXEL_FORMAT_RGBA_8888;
2747 break;
2748 case PIXEL_FORMAT_OPAQUE:
2749 format = PIXEL_FORMAT_RGBX_8888;
2750 break;
2751 }
2752
2753 *outLayer = new Layer(this, client, name, w, h, flags);
2754 status_t err = (*outLayer)->setBuffers(w, h, format, flags);
2755 if (err == NO_ERROR) {
2756 *handle = (*outLayer)->getHandle();
2757 *gbp = (*outLayer)->getProducer();
2758 }
2759
2760 ALOGE_IF(err, "createNormalLayer() failed (%s)", strerror(-err));
2761 return err;
2762}
2763
2764status_t SurfaceFlinger::createDimLayer(const sp<Client>& client,
2765 const String8& name, uint32_t w, uint32_t h, uint32_t flags,
2766 sp<IBinder>* handle, sp<IGraphicBufferProducer>* gbp, sp<Layer>* outLayer)
2767{
2768 *outLayer = new LayerDim(this, client, name, w, h, flags);
2769 *handle = (*outLayer)->getHandle();
2770 *gbp = (*outLayer)->getProducer();
2771 return NO_ERROR;
2772}
2773
2774status_t SurfaceFlinger::onLayerRemoved(const sp<Client>& client, const sp<IBinder>& handle)
2775{
Robert Carr9524cb32017-02-13 11:32:32 -08002776 // called by a client when it wants to remove a Layer
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002777 status_t err = NO_ERROR;
2778 sp<Layer> l(client->getLayerUser(handle));
2779 if (l != NULL) {
2780 mInterceptor.saveSurfaceDeletion(l);
2781 err = removeLayer(l);
2782 ALOGE_IF(err<0 && err != NAME_NOT_FOUND,
2783 "error removing layer=%p (%s)", l.get(), strerror(-err));
2784 }
2785 return err;
2786}
2787
2788status_t SurfaceFlinger::onLayerDestroyed(const wp<Layer>& layer)
2789{
2790 // called by ~LayerCleaner() when all references to the IBinder (handle)
2791 // are gone
Robert Carr9524cb32017-02-13 11:32:32 -08002792 sp<Layer> l = layer.promote();
2793 if (l == nullptr) {
2794 // The layer has already been removed, carry on
2795 return NO_ERROR;
Robert Carr9524cb32017-02-13 11:32:32 -08002796 }
Chia-I Wu515dc9c2017-06-15 12:53:59 -07002797 // If we have a parent, then we can continue to live as long as it does.
2798 return removeLayer(l, true);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002799}
2800
2801// ---------------------------------------------------------------------------
2802
2803void SurfaceFlinger::onInitializeDisplays() {
2804 // reset screen orientation and use primary layer stack
2805 Vector<ComposerState> state;
2806 Vector<DisplayState> displays;
2807 DisplayState d;
2808 d.what = DisplayState::eDisplayProjectionChanged |
2809 DisplayState::eLayerStackChanged;
2810 d.token = mBuiltinDisplays[DisplayDevice::DISPLAY_PRIMARY];
2811 d.layerStack = 0;
2812 d.orientation = DisplayState::eOrientationDefault;
2813 d.frame.makeInvalid();
2814 d.viewport.makeInvalid();
2815 d.width = 0;
2816 d.height = 0;
2817 displays.add(d);
2818 setTransactionState(state, displays, 0);
2819 setPowerModeInternal(getDisplayDevice(d.token), HWC_POWER_MODE_NORMAL);
2820
2821 const nsecs_t period =
2822 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
2823 mAnimFrameTracker.setDisplayRefreshPeriod(period);
Brian Andersond0010582017-03-07 13:20:31 -08002824
2825 // Use phase of 0 since phase is not known.
2826 // Use latency of 0, which will snap to the ideal latency.
2827 setCompositorTimingSnapped(0, period, 0);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002828}
2829
2830void SurfaceFlinger::initializeDisplays() {
2831 class MessageScreenInitialized : public MessageBase {
2832 SurfaceFlinger* flinger;
2833 public:
2834 explicit MessageScreenInitialized(SurfaceFlinger* flinger) : flinger(flinger) { }
2835 virtual bool handler() {
2836 flinger->onInitializeDisplays();
2837 return true;
2838 }
2839 };
2840 sp<MessageBase> msg = new MessageScreenInitialized(this);
2841 postMessageAsync(msg); // we may be called from main thread, use async message
2842}
2843
2844void SurfaceFlinger::setPowerModeInternal(const sp<DisplayDevice>& hw,
2845 int mode) {
2846 ALOGD("Set power mode=%d, type=%d flinger=%p", mode, hw->getDisplayType(),
2847 this);
2848 int32_t type = hw->getDisplayType();
2849 int currentMode = hw->getPowerMode();
2850
2851 if (mode == currentMode) {
2852 ALOGD("Screen type=%d is already mode=%d", hw->getDisplayType(), mode);
2853 return;
2854 }
2855
2856 hw->setPowerMode(mode);
2857 if (type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {
2858 ALOGW("Trying to set power mode for virtual display");
2859 return;
2860 }
2861
2862 if (mInterceptor.isEnabled()) {
2863 Mutex::Autolock _l(mStateLock);
2864 ssize_t idx = mCurrentState.displays.indexOfKey(hw->getDisplayToken());
2865 if (idx < 0) {
2866 ALOGW("Surface Interceptor SavePowerMode: invalid display token");
2867 return;
2868 }
2869 mInterceptor.savePowerModeUpdate(mCurrentState.displays.valueAt(idx).displayId, mode);
2870 }
2871
2872 if (currentMode == HWC_POWER_MODE_OFF) {
2873 // Turn on the display
2874 getHwComposer().setPowerMode(type, mode);
Matthew Bouyack38d49612017-05-12 12:49:32 -07002875 if (type == DisplayDevice::DISPLAY_PRIMARY &&
2876 mode != HWC_POWER_MODE_DOZE_SUSPEND) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002877 // FIXME: eventthread only knows about the main display right now
2878 mEventThread->onScreenAcquired();
2879 resyncToHardwareVsync(true);
2880 }
2881
2882 mVisibleRegionsDirty = true;
2883 mHasPoweredOff = true;
2884 repaintEverything();
2885
2886 struct sched_param param = {0};
2887 param.sched_priority = 1;
2888 if (sched_setscheduler(0, SCHED_FIFO, &param) != 0) {
2889 ALOGW("Couldn't set SCHED_FIFO on display on");
2890 }
2891 } else if (mode == HWC_POWER_MODE_OFF) {
2892 // Turn off the display
2893 struct sched_param param = {0};
2894 if (sched_setscheduler(0, SCHED_OTHER, &param) != 0) {
2895 ALOGW("Couldn't set SCHED_OTHER on display off");
2896 }
2897
2898 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2899 disableHardwareVsync(true); // also cancels any in-progress resync
2900
2901 // FIXME: eventthread only knows about the main display right now
2902 mEventThread->onScreenReleased();
2903 }
2904
2905 getHwComposer().setPowerMode(type, mode);
2906 mVisibleRegionsDirty = true;
2907 // from this point on, SF will stop drawing on this display
Matthew Bouyack38d49612017-05-12 12:49:32 -07002908 } else if (mode == HWC_POWER_MODE_DOZE ||
2909 mode == HWC_POWER_MODE_NORMAL) {
Zheng Zhang8a43fe62017-03-17 11:19:39 +01002910 // Update display while dozing
2911 getHwComposer().setPowerMode(type, mode);
2912 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2913 // FIXME: eventthread only knows about the main display right now
2914 mEventThread->onScreenAcquired();
2915 resyncToHardwareVsync(true);
2916 }
2917 } else if (mode == HWC_POWER_MODE_DOZE_SUSPEND) {
2918 // Leave display going to doze
2919 if (type == DisplayDevice::DISPLAY_PRIMARY) {
2920 disableHardwareVsync(true); // also cancels any in-progress resync
2921 // FIXME: eventthread only knows about the main display right now
2922 mEventThread->onScreenReleased();
2923 }
2924 getHwComposer().setPowerMode(type, mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002925 } else {
Matthew Bouyack38d49612017-05-12 12:49:32 -07002926 ALOGE("Attempting to set unknown power mode: %d\n", mode);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00002927 getHwComposer().setPowerMode(type, mode);
2928 }
2929}
2930
2931void SurfaceFlinger::setPowerMode(const sp<IBinder>& display, int mode) {
2932 class MessageSetPowerMode: public MessageBase {
2933 SurfaceFlinger& mFlinger;
2934 sp<IBinder> mDisplay;
2935 int mMode;
2936 public:
2937 MessageSetPowerMode(SurfaceFlinger& flinger,
2938 const sp<IBinder>& disp, int mode) : mFlinger(flinger),
2939 mDisplay(disp) { mMode = mode; }
2940 virtual bool handler() {
2941 sp<DisplayDevice> hw(mFlinger.getDisplayDevice(mDisplay));
2942 if (hw == NULL) {
2943 ALOGE("Attempt to set power mode = %d for null display %p",
2944 mMode, mDisplay.get());
2945 } else if (hw->getDisplayType() >= DisplayDevice::DISPLAY_VIRTUAL) {
2946 ALOGW("Attempt to set power mode = %d for virtual display",
2947 mMode);
2948 } else {
2949 mFlinger.setPowerModeInternal(hw, mMode);
2950 }
2951 return true;
2952 }
2953 };
2954 sp<MessageBase> msg = new MessageSetPowerMode(*this, display, mode);
2955 postMessageSync(msg);
2956}
2957
2958// ---------------------------------------------------------------------------
2959
2960status_t SurfaceFlinger::dump(int fd, const Vector<String16>& args)
2961{
2962 String8 result;
2963
2964 IPCThreadState* ipc = IPCThreadState::self();
2965 const int pid = ipc->getCallingPid();
2966 const int uid = ipc->getCallingUid();
2967 if ((uid != AID_SHELL) &&
2968 !PermissionCache::checkPermission(sDump, pid, uid)) {
2969 result.appendFormat("Permission Denial: "
2970 "can't dump SurfaceFlinger from pid=%d, uid=%d\n", pid, uid);
2971 } else {
2972 // Try to get the main lock, but give up after one second
2973 // (this would indicate SF is stuck, but we want to be able to
2974 // print something in dumpsys).
2975 status_t err = mStateLock.timedLock(s2ns(1));
2976 bool locked = (err == NO_ERROR);
2977 if (!locked) {
2978 result.appendFormat(
2979 "SurfaceFlinger appears to be unresponsive (%s [%d]), "
2980 "dumping anyways (no locks held)\n", strerror(-err), err);
2981 }
2982
2983 bool dumpAll = true;
2984 size_t index = 0;
2985 size_t numArgs = args.size();
2986 if (numArgs) {
2987 if ((index < numArgs) &&
2988 (args[index] == String16("--list"))) {
2989 index++;
2990 listLayersLocked(args, index, result);
2991 dumpAll = false;
2992 }
2993
2994 if ((index < numArgs) &&
2995 (args[index] == String16("--latency"))) {
2996 index++;
2997 dumpStatsLocked(args, index, result);
2998 dumpAll = false;
2999 }
3000
3001 if ((index < numArgs) &&
3002 (args[index] == String16("--latency-clear"))) {
3003 index++;
3004 clearStatsLocked(args, index, result);
3005 dumpAll = false;
3006 }
3007
3008 if ((index < numArgs) &&
3009 (args[index] == String16("--dispsync"))) {
3010 index++;
3011 mPrimaryDispSync.dump(result);
3012 dumpAll = false;
3013 }
3014
3015 if ((index < numArgs) &&
3016 (args[index] == String16("--static-screen"))) {
3017 index++;
3018 dumpStaticScreenStats(result);
3019 dumpAll = false;
3020 }
3021
3022 if ((index < numArgs) &&
Brian Andersond6927fb2016-07-23 23:37:30 -07003023 (args[index] == String16("--frame-events"))) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003024 index++;
Brian Andersond6927fb2016-07-23 23:37:30 -07003025 dumpFrameEventsLocked(result);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003026 dumpAll = false;
3027 }
3028 }
3029
3030 if (dumpAll) {
3031 dumpAllLocked(args, index, result);
3032 }
3033
3034 if (locked) {
3035 mStateLock.unlock();
3036 }
3037 }
3038 write(fd, result.string(), result.size());
3039 return NO_ERROR;
3040}
3041
3042void SurfaceFlinger::listLayersLocked(const Vector<String16>& /* args */,
3043 size_t& /* index */, String8& result) const
3044{
Robert Carr2047fae2016-11-28 14:09:09 -08003045 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003046 result.appendFormat("%s\n", layer->getName().string());
Robert Carr2047fae2016-11-28 14:09:09 -08003047 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003048}
3049
3050void SurfaceFlinger::dumpStatsLocked(const Vector<String16>& args, size_t& index,
3051 String8& result) const
3052{
3053 String8 name;
3054 if (index < args.size()) {
3055 name = String8(args[index]);
3056 index++;
3057 }
3058
3059 const nsecs_t period =
3060 getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY);
3061 result.appendFormat("%" PRId64 "\n", period);
3062
3063 if (name.isEmpty()) {
3064 mAnimFrameTracker.dumpStats(result);
3065 } else {
Robert Carr2047fae2016-11-28 14:09:09 -08003066 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003067 if (name == layer->getName()) {
3068 layer->dumpFrameStats(result);
3069 }
Robert Carr2047fae2016-11-28 14:09:09 -08003070 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003071 }
3072}
3073
3074void SurfaceFlinger::clearStatsLocked(const Vector<String16>& args, size_t& index,
3075 String8& /* result */)
3076{
3077 String8 name;
3078 if (index < args.size()) {
3079 name = String8(args[index]);
3080 index++;
3081 }
3082
Robert Carr2047fae2016-11-28 14:09:09 -08003083 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003084 if (name.isEmpty() || (name == layer->getName())) {
3085 layer->clearFrameStats();
3086 }
Robert Carr2047fae2016-11-28 14:09:09 -08003087 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003088
3089 mAnimFrameTracker.clearStats();
3090}
3091
3092// This should only be called from the main thread. Otherwise it would need
3093// the lock and should use mCurrentState rather than mDrawingState.
3094void SurfaceFlinger::logFrameStats() {
Robert Carr2047fae2016-11-28 14:09:09 -08003095 mDrawingState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003096 layer->logFrameStats();
Robert Carr2047fae2016-11-28 14:09:09 -08003097 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003098
3099 mAnimFrameTracker.logAndResetStats(String8("<win-anim>"));
3100}
3101
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003102void SurfaceFlinger::appendSfConfigString(String8& result) const
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003103{
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003104 result.append(" [sf");
Fabien Sanglardc93afd52017-03-13 13:02:42 -07003105 result.appendFormat(" HAS_CONTEXT_PRIORITY=%d", useContextPriority);
3106
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003107 if (isLayerTripleBufferingDisabled())
3108 result.append(" DISABLE_TRIPLE_BUFFERING");
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003109
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003110 result.appendFormat(" PRESENT_TIME_OFFSET=%" PRId64, dispSyncPresentTimeOffset);
Fabien Sanglarda34ed632017-03-14 11:43:52 -07003111 result.appendFormat(" FORCE_HWC_FOR_RBG_TO_YUV=%d", useHwcForRgbToYuv);
Fabien Sanglardc8e387e2017-03-10 10:30:28 -08003112 result.appendFormat(" MAX_VIRT_DISPLAY_DIM=%" PRIu64, maxVirtualDisplaySize);
Fabien Sanglardcbf153b2017-03-10 17:57:12 -08003113 result.appendFormat(" RUNNING_WITHOUT_SYNC_FRAMEWORK=%d", !hasSyncFramework);
Fabien Sanglard1971b632017-03-10 14:50:03 -08003114 result.appendFormat(" NUM_FRAMEBUFFER_SURFACE_BUFFERS=%" PRId64,
3115 maxFrameBufferAcquiredBuffers);
Fabien Sanglard63a5fcd2016-12-29 15:13:07 -08003116 result.append("]");
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003117}
3118
3119void SurfaceFlinger::dumpStaticScreenStats(String8& result) const
3120{
3121 result.appendFormat("Static screen stats:\n");
3122 for (size_t b = 0; b < NUM_BUCKETS - 1; ++b) {
3123 float bucketTimeSec = mFrameBuckets[b] / 1e9;
3124 float percent = 100.0f *
3125 static_cast<float>(mFrameBuckets[b]) / mTotalTime;
3126 result.appendFormat(" < %zd frames: %.3f s (%.1f%%)\n",
3127 b + 1, bucketTimeSec, percent);
3128 }
3129 float bucketTimeSec = mFrameBuckets[NUM_BUCKETS - 1] / 1e9;
3130 float percent = 100.0f *
3131 static_cast<float>(mFrameBuckets[NUM_BUCKETS - 1]) / mTotalTime;
3132 result.appendFormat(" %zd+ frames: %.3f s (%.1f%%)\n",
3133 NUM_BUCKETS - 1, bucketTimeSec, percent);
3134}
3135
Brian Andersond6927fb2016-07-23 23:37:30 -07003136void SurfaceFlinger::dumpFrameEventsLocked(String8& result) {
3137 result.appendFormat("Layer frame timestamps:\n");
3138
3139 const LayerVector& currentLayers = mCurrentState.layersSortedByZ;
3140 const size_t count = currentLayers.size();
3141 for (size_t i=0 ; i<count ; i++) {
3142 currentLayers[i]->dumpFrameEvents(result);
3143 }
3144}
3145
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003146void SurfaceFlinger::recordBufferingStats(const char* layerName,
3147 std::vector<OccupancyTracker::Segment>&& history) {
3148 Mutex::Autolock lock(mBufferingStatsMutex);
3149 auto& stats = mBufferingStats[layerName];
3150 for (const auto& segment : history) {
3151 if (!segment.usedThirdBuffer) {
3152 stats.twoBufferTime += segment.totalTime;
3153 }
3154 if (segment.occupancyAverage < 1.0f) {
3155 stats.doubleBufferedTime += segment.totalTime;
3156 } else if (segment.occupancyAverage < 2.0f) {
3157 stats.tripleBufferedTime += segment.totalTime;
3158 }
3159 ++stats.numSegments;
3160 stats.totalTime += segment.totalTime;
3161 }
3162}
3163
3164void SurfaceFlinger::dumpBufferingStats(String8& result) const {
3165 result.append("Buffering stats:\n");
3166 result.append(" [Layer name] <Active time> <Two buffer> "
3167 "<Double buffered> <Triple buffered>\n");
3168 Mutex::Autolock lock(mBufferingStatsMutex);
3169 typedef std::tuple<std::string, float, float, float> BufferTuple;
3170 std::map<float, BufferTuple, std::greater<float>> sorted;
3171 for (const auto& statsPair : mBufferingStats) {
3172 const char* name = statsPair.first.c_str();
3173 const BufferingStats& stats = statsPair.second;
3174 if (stats.numSegments == 0) {
3175 continue;
3176 }
3177 float activeTime = ns2ms(stats.totalTime) / 1000.0f;
3178 float twoBufferRatio = static_cast<float>(stats.twoBufferTime) /
3179 stats.totalTime;
3180 float doubleBufferRatio = static_cast<float>(
3181 stats.doubleBufferedTime) / stats.totalTime;
3182 float tripleBufferRatio = static_cast<float>(
3183 stats.tripleBufferedTime) / stats.totalTime;
3184 sorted.insert({activeTime, {name, twoBufferRatio,
3185 doubleBufferRatio, tripleBufferRatio}});
3186 }
3187 for (const auto& sortedPair : sorted) {
3188 float activeTime = sortedPair.first;
3189 const BufferTuple& values = sortedPair.second;
3190 result.appendFormat(" [%s] %.2f %.3f %.3f %.3f\n",
3191 std::get<0>(values).c_str(), activeTime,
3192 std::get<1>(values), std::get<2>(values),
3193 std::get<3>(values));
3194 }
3195 result.append("\n");
3196}
3197
3198void SurfaceFlinger::dumpAllLocked(const Vector<String16>& args, size_t& index,
3199 String8& result) const
3200{
3201 bool colorize = false;
3202 if (index < args.size()
3203 && (args[index] == String16("--color"))) {
3204 colorize = true;
3205 index++;
3206 }
3207
3208 Colorizer colorizer(colorize);
3209
3210 // figure out if we're stuck somewhere
3211 const nsecs_t now = systemTime();
3212 const nsecs_t inSwapBuffers(mDebugInSwapBuffers);
3213 const nsecs_t inTransaction(mDebugInTransaction);
3214 nsecs_t inSwapBuffersDuration = (inSwapBuffers) ? now-inSwapBuffers : 0;
3215 nsecs_t inTransactionDuration = (inTransaction) ? now-inTransaction : 0;
3216
3217 /*
3218 * Dump library configuration.
3219 */
3220
3221 colorizer.bold(result);
3222 result.append("Build configuration:");
3223 colorizer.reset(result);
3224 appendSfConfigString(result);
3225 appendUiConfigString(result);
3226 appendGuiConfigString(result);
3227 result.append("\n");
3228
3229 colorizer.bold(result);
3230 result.append("Sync configuration: ");
3231 colorizer.reset(result);
3232 result.append(SyncFeatures::getInstance().toString());
3233 result.append("\n");
3234
3235 colorizer.bold(result);
3236 result.append("DispSync configuration: ");
3237 colorizer.reset(result);
3238 result.appendFormat("app phase %" PRId64 " ns, sf phase %" PRId64 " ns, "
Fabien Sanglardc45a7d92017-03-14 13:24:22 -07003239 "present offset %" PRId64 " ns (refresh %" PRId64 " ns)",
3240 vsyncPhaseOffsetNs, sfVsyncPhaseOffsetNs, dispSyncPresentTimeOffset,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003241 mHwc->getRefreshPeriod(HWC_DISPLAY_PRIMARY));
3242 result.append("\n");
3243
3244 // Dump static screen stats
3245 result.append("\n");
3246 dumpStaticScreenStats(result);
3247 result.append("\n");
3248
3249 dumpBufferingStats(result);
3250
3251 /*
3252 * Dump the visible layer list
3253 */
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003254 colorizer.bold(result);
Robert Carr1f0a16a2016-10-24 16:27:39 -07003255 result.appendFormat("Visible layers (count = %zu)\n", mNumLayers);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003256 colorizer.reset(result);
Robert Carr2047fae2016-11-28 14:09:09 -08003257 mCurrentState.traverseInZOrder([&](Layer* layer) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003258 layer->dump(result, colorizer);
Robert Carr2047fae2016-11-28 14:09:09 -08003259 });
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003260
3261 /*
3262 * Dump Display state
3263 */
3264
3265 colorizer.bold(result);
3266 result.appendFormat("Displays (%zu entries)\n", mDisplays.size());
3267 colorizer.reset(result);
3268 for (size_t dpy=0 ; dpy<mDisplays.size() ; dpy++) {
3269 const sp<const DisplayDevice>& hw(mDisplays[dpy]);
3270 hw->dump(result);
3271 }
3272
3273 /*
3274 * Dump SurfaceFlinger global state
3275 */
3276
3277 colorizer.bold(result);
3278 result.append("SurfaceFlinger global state:\n");
3279 colorizer.reset(result);
3280
3281 HWComposer& hwc(getHwComposer());
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003282 sp<const DisplayDevice> hw(getDefaultDisplayDeviceLocked());
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003283
3284 colorizer.bold(result);
3285 result.appendFormat("EGL implementation : %s\n",
3286 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_VERSION));
3287 colorizer.reset(result);
3288 result.appendFormat("%s\n",
3289 eglQueryStringImplementationANDROID(mEGLDisplay, EGL_EXTENSIONS));
3290
3291 mRenderEngine->dump(result);
3292
3293 hw->undefinedRegion.dump(result, "undefinedRegion");
3294 result.appendFormat(" orientation=%d, isDisplayOn=%d\n",
3295 hw->getOrientation(), hw->isDisplayOn());
3296 result.appendFormat(
3297 " last eglSwapBuffers() time: %f us\n"
3298 " last transaction time : %f us\n"
3299 " transaction-flags : %08x\n"
3300 " refresh-rate : %f fps\n"
3301 " x-dpi : %f\n"
3302 " y-dpi : %f\n"
3303 " gpu_to_cpu_unsupported : %d\n"
3304 ,
3305 mLastSwapBufferTime/1000.0,
3306 mLastTransactionTime/1000.0,
3307 mTransactionFlags,
3308 1e9 / hwc.getRefreshPeriod(HWC_DISPLAY_PRIMARY),
3309 hwc.getDpiX(HWC_DISPLAY_PRIMARY),
3310 hwc.getDpiY(HWC_DISPLAY_PRIMARY),
3311 !mGpuToCpuSupported);
3312
3313 result.appendFormat(" eglSwapBuffers time: %f us\n",
3314 inSwapBuffersDuration/1000.0);
3315
3316 result.appendFormat(" transaction time: %f us\n",
3317 inTransactionDuration/1000.0);
3318
3319 /*
3320 * VSYNC state
3321 */
3322 mEventThread->dump(result);
3323
3324 /*
3325 * Dump HWComposer state
3326 */
3327 colorizer.bold(result);
3328 result.append("h/w composer state:\n");
3329 colorizer.reset(result);
3330 result.appendFormat(" h/w composer %s and %s\n",
3331 hwc.initCheck()==NO_ERROR ? "present" : "not present",
3332 (mDebugDisableHWC || mDebugRegion || mDaltonize
3333 || mHasColorMatrix) ? "disabled" : "enabled");
3334 hwc.dump(result);
3335
3336 /*
3337 * Dump gralloc state
3338 */
3339 const GraphicBufferAllocator& alloc(GraphicBufferAllocator::get());
3340 alloc.dump(result);
3341}
3342
3343const Vector< sp<Layer> >&
3344SurfaceFlinger::getLayerSortedByZForHwcDisplay(int id) {
3345 // Note: mStateLock is held here
3346 wp<IBinder> dpy;
3347 for (size_t i=0 ; i<mDisplays.size() ; i++) {
3348 if (mDisplays.valueAt(i)->getHwcDisplayId() == id) {
3349 dpy = mDisplays.keyAt(i);
3350 break;
3351 }
3352 }
3353 if (dpy == NULL) {
3354 ALOGE("getLayerSortedByZForHwcDisplay: invalid hwc display id %d", id);
3355 // Just use the primary display so we have something to return
3356 dpy = getBuiltInDisplay(DisplayDevice::DISPLAY_PRIMARY);
3357 }
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003358 return getDisplayDeviceLocked(dpy)->getVisibleLayersSortedByZ();
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003359}
3360
3361bool SurfaceFlinger::startDdmConnection()
3362{
3363 void* libddmconnection_dso =
3364 dlopen("libsurfaceflinger_ddmconnection.so", RTLD_NOW);
3365 if (!libddmconnection_dso) {
3366 return false;
3367 }
3368 void (*DdmConnection_start)(const char* name);
3369 DdmConnection_start =
3370 (decltype(DdmConnection_start))dlsym(libddmconnection_dso, "DdmConnection_start");
3371 if (!DdmConnection_start) {
3372 dlclose(libddmconnection_dso);
3373 return false;
3374 }
3375 (*DdmConnection_start)(getServiceName());
3376 return true;
3377}
3378
3379status_t SurfaceFlinger::onTransact(
3380 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
3381{
3382 switch (code) {
3383 case CREATE_CONNECTION:
3384 case CREATE_DISPLAY:
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003385 case BOOT_FINISHED:
3386 case CLEAR_ANIMATION_FRAME_STATS:
3387 case GET_ANIMATION_FRAME_STATS:
3388 case SET_POWER_MODE:
3389 case GET_HDR_CAPABILITIES:
3390 {
3391 // codes that require permission check
3392 IPCThreadState* ipc = IPCThreadState::self();
3393 const int pid = ipc->getCallingPid();
3394 const int uid = ipc->getCallingUid();
3395 if ((uid != AID_GRAPHICS && uid != AID_SYSTEM) &&
3396 !PermissionCache::checkPermission(sAccessSurfaceFlinger, pid, uid)) {
3397 ALOGE("Permission Denial: "
3398 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3399 return PERMISSION_DENIED;
3400 }
3401 break;
3402 }
Robert Carr1db73f62016-12-21 12:58:51 -08003403 /*
3404 * Calling setTransactionState is safe, because you need to have been
3405 * granted a reference to Client* and Handle* to do anything with it.
3406 *
3407 * Creating a scoped connection is safe, as per discussion in ISurfaceComposer.h
3408 */
3409 case SET_TRANSACTION_STATE:
3410 case CREATE_SCOPED_CONNECTION:
3411 {
3412 break;
3413 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003414 case CAPTURE_SCREEN:
3415 {
3416 // codes that require permission check
3417 IPCThreadState* ipc = IPCThreadState::self();
3418 const int pid = ipc->getCallingPid();
3419 const int uid = ipc->getCallingUid();
3420 if ((uid != AID_GRAPHICS) &&
3421 !PermissionCache::checkPermission(sReadFramebuffer, pid, uid)) {
3422 ALOGE("Permission Denial: "
3423 "can't read framebuffer pid=%d, uid=%d", pid, uid);
3424 return PERMISSION_DENIED;
3425 }
3426 break;
3427 }
3428 }
3429
3430 status_t err = BnSurfaceComposer::onTransact(code, data, reply, flags);
3431 if (err == UNKNOWN_TRANSACTION || err == PERMISSION_DENIED) {
3432 CHECK_INTERFACE(ISurfaceComposer, data, reply);
3433 if (CC_UNLIKELY(!PermissionCache::checkCallingPermission(sHardwareTest))) {
3434 IPCThreadState* ipc = IPCThreadState::self();
3435 const int pid = ipc->getCallingPid();
3436 const int uid = ipc->getCallingUid();
3437 ALOGE("Permission Denial: "
3438 "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
3439 return PERMISSION_DENIED;
3440 }
3441 int n;
3442 switch (code) {
3443 case 1000: // SHOW_CPU, NOT SUPPORTED ANYMORE
3444 case 1001: // SHOW_FPS, NOT SUPPORTED ANYMORE
3445 return NO_ERROR;
3446 case 1002: // SHOW_UPDATES
3447 n = data.readInt32();
3448 mDebugRegion = n ? n : (mDebugRegion ? 0 : 1);
3449 invalidateHwcGeometry();
3450 repaintEverything();
3451 return NO_ERROR;
3452 case 1004:{ // repaint everything
3453 repaintEverything();
3454 return NO_ERROR;
3455 }
3456 case 1005:{ // force transaction
3457 setTransactionFlags(
3458 eTransactionNeeded|
3459 eDisplayTransactionNeeded|
3460 eTraversalNeeded);
3461 return NO_ERROR;
3462 }
3463 case 1006:{ // send empty update
3464 signalRefresh();
3465 return NO_ERROR;
3466 }
3467 case 1008: // toggle use of hw composer
3468 n = data.readInt32();
3469 mDebugDisableHWC = n ? 1 : 0;
3470 invalidateHwcGeometry();
3471 repaintEverything();
3472 return NO_ERROR;
3473 case 1009: // toggle use of transform hint
3474 n = data.readInt32();
3475 mDebugDisableTransformHint = n ? 1 : 0;
3476 invalidateHwcGeometry();
3477 repaintEverything();
3478 return NO_ERROR;
3479 case 1010: // interrogate.
3480 reply->writeInt32(0);
3481 reply->writeInt32(0);
3482 reply->writeInt32(mDebugRegion);
3483 reply->writeInt32(0);
3484 reply->writeInt32(mDebugDisableHWC);
3485 return NO_ERROR;
3486 case 1013: {
3487 Mutex::Autolock _l(mStateLock);
3488 sp<const DisplayDevice> hw(getDefaultDisplayDevice());
3489 reply->writeInt32(hw->getPageFlipCount());
3490 return NO_ERROR;
3491 }
3492 case 1014: {
3493 // daltonize
3494 n = data.readInt32();
3495 switch (n % 10) {
3496 case 1:
3497 mDaltonizer.setType(ColorBlindnessType::Protanomaly);
3498 break;
3499 case 2:
3500 mDaltonizer.setType(ColorBlindnessType::Deuteranomaly);
3501 break;
3502 case 3:
3503 mDaltonizer.setType(ColorBlindnessType::Tritanomaly);
3504 break;
3505 }
3506 if (n >= 10) {
3507 mDaltonizer.setMode(ColorBlindnessMode::Correction);
3508 } else {
3509 mDaltonizer.setMode(ColorBlindnessMode::Simulation);
3510 }
3511 mDaltonize = n > 0;
3512 invalidateHwcGeometry();
3513 repaintEverything();
3514 return NO_ERROR;
3515 }
3516 case 1015: {
3517 // apply a color matrix
3518 n = data.readInt32();
3519 mHasColorMatrix = n ? 1 : 0;
3520 if (n) {
3521 // color matrix is sent as mat3 matrix followed by vec3
3522 // offset, then packed into a mat4 where the last row is
3523 // the offset and extra values are 0
3524 for (size_t i = 0 ; i < 4; i++) {
3525 for (size_t j = 0; j < 4; j++) {
3526 mColorMatrix[i][j] = data.readFloat();
3527 }
3528 }
3529 } else {
3530 mColorMatrix = mat4();
3531 }
3532 invalidateHwcGeometry();
3533 repaintEverything();
3534 return NO_ERROR;
3535 }
3536 // This is an experimental interface
3537 // Needs to be shifted to proper binder interface when we productize
3538 case 1016: {
3539 n = data.readInt32();
3540 mPrimaryDispSync.setRefreshSkipCount(n);
3541 return NO_ERROR;
3542 }
3543 case 1017: {
3544 n = data.readInt32();
3545 mForceFullDamage = static_cast<bool>(n);
3546 return NO_ERROR;
3547 }
3548 case 1018: { // Modify Choreographer's phase offset
3549 n = data.readInt32();
3550 mEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3551 return NO_ERROR;
3552 }
3553 case 1019: { // Modify SurfaceFlinger's phase offset
3554 n = data.readInt32();
3555 mSFEventThread->setPhaseOffset(static_cast<nsecs_t>(n));
3556 return NO_ERROR;
3557 }
3558 case 1020: { // Layer updates interceptor
3559 n = data.readInt32();
3560 if (n) {
3561 ALOGV("Interceptor enabled");
3562 mInterceptor.enable(mDrawingState.layersSortedByZ, mDrawingState.displays);
3563 }
3564 else{
3565 ALOGV("Interceptor disabled");
3566 mInterceptor.disable();
3567 }
3568 return NO_ERROR;
3569 }
3570 case 1021: { // Disable HWC virtual displays
3571 n = data.readInt32();
3572 mUseHwcVirtualDisplays = !n;
3573 return NO_ERROR;
3574 }
3575 }
3576 }
3577 return err;
3578}
3579
3580void SurfaceFlinger::repaintEverything() {
3581 android_atomic_or(1, &mRepaintEverything);
3582 signalTransaction();
3583}
3584
3585// ---------------------------------------------------------------------------
3586// Capture screen into an IGraphiBufferProducer
3587// ---------------------------------------------------------------------------
3588
3589/* The code below is here to handle b/8734824
3590 *
3591 * We create a IGraphicBufferProducer wrapper that forwards all calls
3592 * from the surfaceflinger thread to the calling binder thread, where they
3593 * are executed. This allows the calling thread in the calling process to be
3594 * reused and not depend on having "enough" binder threads to handle the
3595 * requests.
3596 */
3597class GraphicProducerWrapper : public BBinder, public MessageHandler {
3598 /* Parts of GraphicProducerWrapper are run on two different threads,
3599 * communicating by sending messages via Looper but also by shared member
3600 * data. Coherence maintenance is subtle and in places implicit (ugh).
3601 *
3602 * Don't rely on Looper's sendMessage/handleMessage providing
3603 * release/acquire semantics for any data not actually in the Message.
3604 * Data going from surfaceflinger to binder threads needs to be
3605 * synchronized explicitly.
3606 *
3607 * Barrier open/wait do provide release/acquire semantics. This provides
3608 * implicit synchronization for data coming back from binder to
3609 * surfaceflinger threads.
3610 */
3611
3612 sp<IGraphicBufferProducer> impl;
3613 sp<Looper> looper;
3614 status_t result;
3615 bool exitPending;
3616 bool exitRequested;
3617 Barrier barrier;
3618 uint32_t code;
3619 Parcel const* data;
3620 Parcel* reply;
3621
3622 enum {
3623 MSG_API_CALL,
3624 MSG_EXIT
3625 };
3626
3627 /*
3628 * Called on surfaceflinger thread. This is called by our "fake"
3629 * BpGraphicBufferProducer. We package the data and reply Parcel and
3630 * forward them to the binder thread.
3631 */
3632 virtual status_t transact(uint32_t code,
3633 const Parcel& data, Parcel* reply, uint32_t /* flags */) {
3634 this->code = code;
3635 this->data = &data;
3636 this->reply = reply;
3637 if (exitPending) {
3638 // if we've exited, we run the message synchronously right here.
3639 // note (JH): as far as I can tell from looking at the code, this
3640 // never actually happens. if it does, i'm not sure if it happens
3641 // on the surfaceflinger or binder thread.
3642 handleMessage(Message(MSG_API_CALL));
3643 } else {
3644 barrier.close();
3645 // Prevent stores to this->{code, data, reply} from being
3646 // reordered later than the construction of Message.
3647 atomic_thread_fence(memory_order_release);
3648 looper->sendMessage(this, Message(MSG_API_CALL));
3649 barrier.wait();
3650 }
3651 return result;
3652 }
3653
3654 /*
3655 * here we run on the binder thread. All we've got to do is
3656 * call the real BpGraphicBufferProducer.
3657 */
3658 virtual void handleMessage(const Message& message) {
3659 int what = message.what;
3660 // Prevent reads below from happening before the read from Message
3661 atomic_thread_fence(memory_order_acquire);
3662 if (what == MSG_API_CALL) {
3663 result = IInterface::asBinder(impl)->transact(code, data[0], reply);
3664 barrier.open();
3665 } else if (what == MSG_EXIT) {
3666 exitRequested = true;
3667 }
3668 }
3669
3670public:
3671 explicit GraphicProducerWrapper(const sp<IGraphicBufferProducer>& impl)
3672 : impl(impl),
3673 looper(new Looper(true)),
3674 result(NO_ERROR),
3675 exitPending(false),
3676 exitRequested(false),
3677 code(0),
3678 data(NULL),
3679 reply(NULL)
3680 {}
3681
3682 // Binder thread
3683 status_t waitForResponse() {
3684 do {
3685 looper->pollOnce(-1);
3686 } while (!exitRequested);
3687 return result;
3688 }
3689
3690 // Client thread
3691 void exit(status_t result) {
3692 this->result = result;
3693 exitPending = true;
3694 // Ensure this->result is visible to the binder thread before it
3695 // handles the message.
3696 atomic_thread_fence(memory_order_release);
3697 looper->sendMessage(this, Message(MSG_EXIT));
3698 }
3699};
3700
3701
3702status_t SurfaceFlinger::captureScreen(const sp<IBinder>& display,
3703 const sp<IGraphicBufferProducer>& producer,
3704 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003705 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003706 bool useIdentityTransform, ISurfaceComposer::Rotation rotation) {
3707
3708 if (CC_UNLIKELY(display == 0))
3709 return BAD_VALUE;
3710
3711 if (CC_UNLIKELY(producer == 0))
3712 return BAD_VALUE;
3713
3714 // if we have secure windows on this display, never allow the screen capture
3715 // unless the producer interface is local (i.e.: we can take a screenshot for
3716 // ourselves).
3717 bool isLocalScreenshot = IInterface::asBinder(producer)->localBinder();
3718
3719 // Convert to surfaceflinger's internal rotation type.
3720 Transform::orientation_flags rotationFlags;
3721 switch (rotation) {
3722 case ISurfaceComposer::eRotateNone:
3723 rotationFlags = Transform::ROT_0;
3724 break;
3725 case ISurfaceComposer::eRotate90:
3726 rotationFlags = Transform::ROT_90;
3727 break;
3728 case ISurfaceComposer::eRotate180:
3729 rotationFlags = Transform::ROT_180;
3730 break;
3731 case ISurfaceComposer::eRotate270:
3732 rotationFlags = Transform::ROT_270;
3733 break;
3734 default:
3735 rotationFlags = Transform::ROT_0;
3736 ALOGE("Invalid rotation passed to captureScreen(): %d\n", rotation);
3737 break;
3738 }
3739
3740 class MessageCaptureScreen : public MessageBase {
3741 SurfaceFlinger* flinger;
3742 sp<IBinder> display;
3743 sp<IGraphicBufferProducer> producer;
3744 Rect sourceCrop;
3745 uint32_t reqWidth, reqHeight;
Robert Carrae060832016-11-28 10:51:00 -08003746 int32_t minLayerZ,maxLayerZ;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003747 bool useIdentityTransform;
3748 Transform::orientation_flags rotation;
3749 status_t result;
3750 bool isLocalScreenshot;
3751 public:
3752 MessageCaptureScreen(SurfaceFlinger* flinger,
3753 const sp<IBinder>& display,
3754 const sp<IGraphicBufferProducer>& producer,
3755 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003756 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003757 bool useIdentityTransform,
3758 Transform::orientation_flags rotation,
3759 bool isLocalScreenshot)
3760 : flinger(flinger), display(display), producer(producer),
3761 sourceCrop(sourceCrop), reqWidth(reqWidth), reqHeight(reqHeight),
3762 minLayerZ(minLayerZ), maxLayerZ(maxLayerZ),
3763 useIdentityTransform(useIdentityTransform),
3764 rotation(rotation), result(PERMISSION_DENIED),
3765 isLocalScreenshot(isLocalScreenshot)
3766 {
3767 }
3768 status_t getResult() const {
3769 return result;
3770 }
3771 virtual bool handler() {
3772 Mutex::Autolock _l(flinger->mStateLock);
Stephen Kiazyk7d3dcb92017-04-05 16:46:49 -07003773 sp<const DisplayDevice> hw(flinger->getDisplayDeviceLocked(display));
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003774 result = flinger->captureScreenImplLocked(hw, producer,
3775 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3776 useIdentityTransform, rotation, isLocalScreenshot);
3777 static_cast<GraphicProducerWrapper*>(IInterface::asBinder(producer).get())->exit(result);
3778 return true;
3779 }
3780 };
3781
3782 // this creates a "fake" BBinder which will serve as a "fake" remote
3783 // binder to receive the marshaled calls and forward them to the
3784 // real remote (a BpGraphicBufferProducer)
3785 sp<GraphicProducerWrapper> wrapper = new GraphicProducerWrapper(producer);
3786
3787 // the asInterface() call below creates our "fake" BpGraphicBufferProducer
3788 // which does the marshaling work forwards to our "fake remote" above.
3789 sp<MessageBase> msg = new MessageCaptureScreen(this,
3790 display, IGraphicBufferProducer::asInterface( wrapper ),
3791 sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ,
3792 useIdentityTransform, rotationFlags, isLocalScreenshot);
3793
3794 status_t res = postMessageAsync(msg);
3795 if (res == NO_ERROR) {
3796 res = wrapper->waitForResponse();
3797 }
3798 return res;
3799}
3800
3801
3802void SurfaceFlinger::renderScreenImplLocked(
3803 const sp<const DisplayDevice>& hw,
3804 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003805 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003806 bool yswap, bool useIdentityTransform, Transform::orientation_flags rotation)
3807{
3808 ATRACE_CALL();
3809 RenderEngine& engine(getRenderEngine());
3810
3811 // get screen geometry
3812 const int32_t hw_w = hw->getWidth();
3813 const int32_t hw_h = hw->getHeight();
3814 const bool filtering = static_cast<int32_t>(reqWidth) != hw_w ||
3815 static_cast<int32_t>(reqHeight) != hw_h;
3816
3817 // if a default or invalid sourceCrop is passed in, set reasonable values
3818 if (sourceCrop.width() == 0 || sourceCrop.height() == 0 ||
3819 !sourceCrop.isValid()) {
3820 sourceCrop.setLeftTop(Point(0, 0));
3821 sourceCrop.setRightBottom(Point(hw_w, hw_h));
3822 }
3823
3824 // ensure that sourceCrop is inside screen
3825 if (sourceCrop.left < 0) {
3826 ALOGE("Invalid crop rect: l = %d (< 0)", sourceCrop.left);
3827 }
3828 if (sourceCrop.right > hw_w) {
3829 ALOGE("Invalid crop rect: r = %d (> %d)", sourceCrop.right, hw_w);
3830 }
3831 if (sourceCrop.top < 0) {
3832 ALOGE("Invalid crop rect: t = %d (< 0)", sourceCrop.top);
3833 }
3834 if (sourceCrop.bottom > hw_h) {
3835 ALOGE("Invalid crop rect: b = %d (> %d)", sourceCrop.bottom, hw_h);
3836 }
3837
3838 // make sure to clear all GL error flags
3839 engine.checkErrors();
3840
3841 // set-up our viewport
3842 engine.setViewportAndProjection(
3843 reqWidth, reqHeight, sourceCrop, hw_h, yswap, rotation);
3844 engine.disableTexturing();
3845
3846 // redraw the screen entirely...
3847 engine.clearWithColor(0, 0, 0, 1);
3848
Robert Carr1f0a16a2016-10-24 16:27:39 -07003849 // We loop through the first level of layers without traversing,
3850 // as we need to interpret min/max layer Z in the top level Z space.
3851 for (const auto& layer : mDrawingState.layersSortedByZ) {
3852 if (layer->getLayerStack() != hw->getLayerStack()) {
3853 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003854 }
Robert Carr1f0a16a2016-10-24 16:27:39 -07003855 const Layer::State& state(layer->getDrawingState());
3856 if (state.z < minLayerZ || state.z > maxLayerZ) {
3857 continue;
3858 }
Dan Stoza412903f2017-04-27 13:42:17 -07003859 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003860 if (!layer->isVisible()) {
3861 return;
3862 }
3863 if (filtering) layer->setFiltering(true);
3864 layer->draw(hw, useIdentityTransform);
3865 if (filtering) layer->setFiltering(false);
3866 });
3867 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003868
3869 // compositionComplete is needed for older driver
3870 hw->compositionComplete();
3871 hw->setViewportAndProjection();
3872}
3873
3874
3875status_t SurfaceFlinger::captureScreenImplLocked(
3876 const sp<const DisplayDevice>& hw,
3877 const sp<IGraphicBufferProducer>& producer,
3878 Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight,
Robert Carrae060832016-11-28 10:51:00 -08003879 int32_t minLayerZ, int32_t maxLayerZ,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003880 bool useIdentityTransform, Transform::orientation_flags rotation,
3881 bool isLocalScreenshot)
3882{
3883 ATRACE_CALL();
3884
3885 // get screen geometry
3886 uint32_t hw_w = hw->getWidth();
3887 uint32_t hw_h = hw->getHeight();
3888
3889 if (rotation & Transform::ROT_90) {
3890 std::swap(hw_w, hw_h);
3891 }
3892
3893 if ((reqWidth > hw_w) || (reqHeight > hw_h)) {
3894 ALOGE("size mismatch (%d, %d) > (%d, %d)",
3895 reqWidth, reqHeight, hw_w, hw_h);
3896 return BAD_VALUE;
3897 }
3898
3899 reqWidth = (!reqWidth) ? hw_w : reqWidth;
3900 reqHeight = (!reqHeight) ? hw_h : reqHeight;
3901
3902 bool secureLayerIsVisible = false;
Robert Carr1f0a16a2016-10-24 16:27:39 -07003903 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003904 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07003905 if ((layer->getLayerStack() != hw->getLayerStack()) ||
3906 (state.z < minLayerZ || state.z > maxLayerZ)) {
3907 continue;
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003908 }
Dan Stoza412903f2017-04-27 13:42:17 -07003909 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer *layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07003910 secureLayerIsVisible = secureLayerIsVisible || (layer->isVisible() &&
3911 layer->isSecure());
3912 });
3913 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00003914
3915 if (!isLocalScreenshot && secureLayerIsVisible) {
3916 ALOGW("FB is protected: PERMISSION_DENIED");
3917 return PERMISSION_DENIED;
3918 }
3919
3920 // create a surface (because we're a producer, and we need to
3921 // dequeue/queue a buffer)
3922 sp<Surface> sur = new Surface(producer, false);
3923 ANativeWindow* window = sur.get();
3924
3925 status_t result = native_window_api_connect(window, NATIVE_WINDOW_API_EGL);
3926 if (result == NO_ERROR) {
3927 uint32_t usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
3928 GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_TEXTURE;
3929
3930 int err = 0;
3931 err = native_window_set_buffers_dimensions(window, reqWidth, reqHeight);
3932 err |= native_window_set_scaling_mode(window, NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW);
3933 err |= native_window_set_buffers_format(window, HAL_PIXEL_FORMAT_RGBA_8888);
3934 err |= native_window_set_usage(window, usage);
3935
3936 if (err == NO_ERROR) {
3937 ANativeWindowBuffer* buffer;
3938 /* TODO: Once we have the sync framework everywhere this can use
3939 * server-side waits on the fence that dequeueBuffer returns.
3940 */
3941 result = native_window_dequeue_buffer_and_wait(window, &buffer);
3942 if (result == NO_ERROR) {
3943 int syncFd = -1;
3944 // create an EGLImage from the buffer so we can later
3945 // turn it into a texture
3946 EGLImageKHR image = eglCreateImageKHR(mEGLDisplay, EGL_NO_CONTEXT,
3947 EGL_NATIVE_BUFFER_ANDROID, buffer, NULL);
3948 if (image != EGL_NO_IMAGE_KHR) {
3949 // this binds the given EGLImage as a framebuffer for the
3950 // duration of this scope.
3951 RenderEngine::BindImageAsFramebuffer imageBond(getRenderEngine(), image);
3952 if (imageBond.getStatus() == NO_ERROR) {
3953 // this will in fact render into our dequeued buffer
3954 // via an FBO, which means we didn't have to create
3955 // an EGLSurface and therefore we're not
3956 // dependent on the context's EGLConfig.
3957 renderScreenImplLocked(
3958 hw, sourceCrop, reqWidth, reqHeight, minLayerZ, maxLayerZ, true,
3959 useIdentityTransform, rotation);
3960
3961 // Attempt to create a sync khr object that can produce a sync point. If that
3962 // isn't available, create a non-dupable sync object in the fallback path and
3963 // wait on it directly.
3964 EGLSyncKHR sync;
3965 if (!DEBUG_SCREENSHOTS) {
3966 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_NATIVE_FENCE_ANDROID, NULL);
3967 // native fence fd will not be populated until flush() is done.
3968 getRenderEngine().flush();
3969 } else {
3970 sync = EGL_NO_SYNC_KHR;
3971 }
3972 if (sync != EGL_NO_SYNC_KHR) {
3973 // get the sync fd
3974 syncFd = eglDupNativeFenceFDANDROID(mEGLDisplay, sync);
3975 if (syncFd == EGL_NO_NATIVE_FENCE_FD_ANDROID) {
3976 ALOGW("captureScreen: failed to dup sync khr object");
3977 syncFd = -1;
3978 }
3979 eglDestroySyncKHR(mEGLDisplay, sync);
3980 } else {
3981 // fallback path
3982 sync = eglCreateSyncKHR(mEGLDisplay, EGL_SYNC_FENCE_KHR, NULL);
3983 if (sync != EGL_NO_SYNC_KHR) {
3984 EGLint result = eglClientWaitSyncKHR(mEGLDisplay, sync,
3985 EGL_SYNC_FLUSH_COMMANDS_BIT_KHR, 2000000000 /*2 sec*/);
3986 EGLint eglErr = eglGetError();
3987 if (result == EGL_TIMEOUT_EXPIRED_KHR) {
3988 ALOGW("captureScreen: fence wait timed out");
3989 } else {
3990 ALOGW_IF(eglErr != EGL_SUCCESS,
3991 "captureScreen: error waiting on EGL fence: %#x", eglErr);
3992 }
3993 eglDestroySyncKHR(mEGLDisplay, sync);
3994 } else {
3995 ALOGW("captureScreen: error creating EGL fence: %#x", eglGetError());
3996 }
3997 }
3998 if (DEBUG_SCREENSHOTS) {
3999 uint32_t* pixels = new uint32_t[reqWidth*reqHeight];
4000 getRenderEngine().readPixels(0, 0, reqWidth, reqHeight, pixels);
4001 checkScreenshot(reqWidth, reqHeight, reqWidth, pixels,
4002 hw, minLayerZ, maxLayerZ);
4003 delete [] pixels;
4004 }
4005
4006 } else {
4007 ALOGE("got GL_FRAMEBUFFER_COMPLETE_OES error while taking screenshot");
4008 result = INVALID_OPERATION;
4009 window->cancelBuffer(window, buffer, syncFd);
4010 buffer = NULL;
4011 }
4012 // destroy our image
4013 eglDestroyImageKHR(mEGLDisplay, image);
4014 } else {
4015 result = BAD_VALUE;
4016 }
4017 if (buffer) {
4018 // queueBuffer takes ownership of syncFd
4019 result = window->queueBuffer(window, buffer, syncFd);
4020 }
4021 }
4022 } else {
4023 result = BAD_VALUE;
4024 }
4025 native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL);
4026 }
4027
4028 return result;
4029}
4030
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004031void SurfaceFlinger::checkScreenshot(size_t w, size_t s, size_t h, void const* vaddr,
Robert Carrae060832016-11-28 10:51:00 -08004032 const sp<const DisplayDevice>& hw, int32_t minLayerZ, int32_t maxLayerZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004033 if (DEBUG_SCREENSHOTS) {
4034 for (size_t y=0 ; y<h ; y++) {
4035 uint32_t const * p = (uint32_t const *)vaddr + y*s;
4036 for (size_t x=0 ; x<w ; x++) {
4037 if (p[x] != 0xFF000000) return;
4038 }
4039 }
4040 ALOGE("*** we just took a black screenshot ***\n"
4041 "requested minz=%d, maxz=%d, layerStack=%d",
4042 minLayerZ, maxLayerZ, hw->getLayerStack());
Robert Carr2047fae2016-11-28 14:09:09 -08004043 size_t i = 0;
Robert Carr1f0a16a2016-10-24 16:27:39 -07004044 for (const auto& layer : mDrawingState.layersSortedByZ) {
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004045 const Layer::State& state(layer->getDrawingState());
Robert Carr1f0a16a2016-10-24 16:27:39 -07004046 if (layer->getLayerStack() == hw->getLayerStack() && state.z >= minLayerZ &&
4047 state.z <= maxLayerZ) {
Dan Stoza412903f2017-04-27 13:42:17 -07004048 layer->traverseInZOrder(LayerVector::StateSet::Drawing, [&](Layer* layer) {
Robert Carr1f0a16a2016-10-24 16:27:39 -07004049 ALOGE("%c index=%zu, name=%s, layerStack=%d, z=%d, visible=%d, flags=%x, alpha=%x",
4050 layer->isVisible() ? '+' : '-',
4051 i, layer->getName().string(), layer->getLayerStack(), state.z,
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004052 layer->isVisible(), state.flags, state.alpha);
Robert Carr1f0a16a2016-10-24 16:27:39 -07004053 i++;
4054 });
4055 }
4056 }
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004057 }
4058}
4059
4060// ---------------------------------------------------------------------------
4061
Dan Stoza412903f2017-04-27 13:42:17 -07004062void SurfaceFlinger::State::traverseInZOrder(const LayerVector::Visitor& visitor) const {
4063 layersSortedByZ.traverseInZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004064}
4065
Dan Stoza412903f2017-04-27 13:42:17 -07004066void SurfaceFlinger::State::traverseInReverseZOrder(const LayerVector::Visitor& visitor) const {
4067 layersSortedByZ.traverseInReverseZOrder(stateSet, visitor);
Fabien Sanglard9d96de42016-10-11 00:15:18 +00004068}
4069
4070}; // namespace android
4071
4072
4073#if defined(__gl_h_)
4074#error "don't include gl/gl.h in this file"
4075#endif
4076
4077#if defined(__gl2_h_)
4078#error "don't include gl2/gl2.h in this file"
4079#endif